ArcMap'te çoklu şekil dosyaları için projeksiyonları tanımlama?


29

.Prj dosyası olmayan 100'ün üzerinde şekil dosyam var ve bu yüzden onları ArcMap 10'a getirdiğimde koordinat sistemini bilinmeyen olarak gösteriyorlar. Tüm şekil dosyaları koordinat sisteminin GCS WGS 1984 olduğunu biliyorum. Ayrıca koordinat sistemini ayrı ayrı her bir dosyaya atamak için Projection GP Define aracını kullanabileceğimi biliyorum ama bu sonsuza kadar sürecek.

Bunları toplu olarak tanımlayan bir GP aracı olduğunu umuyordum ama bir tane göremiyorum. Sonra belki bunu yapmak için python kullanabileceğimi düşünüyordum, bu yüzden yardım menüsüne baktım ve bir betik buldum ama bu bana bir hata verdi.

İşte denediğim python kodu (bu tek bir shp dosyası içindir, bu yüzden hala her dosya için isim yazarken acı çekeceğim:

import arcpy
infc = r"C:\Documents and Settings\User\My Documents\ArcGIS\shpfiles\Site_2.shp"
prjfile = r"<install directory>\Coordinate Systems\Geographic Coordinate Systems\World\WGS 1984.prj"
arcpy.DefineProjection_management(infc, prjfile)

Ancak çoklu raster dosyalar için projeksiyon tanımlamak istersem ne yapabilirim?

Yanıtlar:


29

Bence siz bunu düşününce ...

  1. Araç kutusundaki "Projeksiyonu Tanımla" aracına sağ tıklayın,
  2. "Toplu" seçeneğini seçin,
  3. katmanlarınızı "Giriş Veri Kümesi" sütununa sürükleyip bırakın,
  4. Doğru projeksiyonu doldurmak için ilk "Koordinat Sistemi" kutusuna sağ tıklayın,
  5. daha sonra, sadece seçtiğiniz projeksiyonu sağ tıklayın ve sizin için kalan projeksiyonların hepsini dolduracak olan “Doldur” seçeneğini seçin.
  6. "Tamam" a basarsanız işiniz biter

alt metin


Bu aslında OS klasöründe Shapefile .PRJ yardımcı dosyasını oluşturur mu, yoksa sadece bir katman niteliğini ekler mi? ArcGIS'i de başlatmak zorunda kalacaksın. Jay'in hazırladığı Python betiği, çalışmalarını tamamen ArcGIS dışında gerçekleştirecek ve belli sonuçlarla - ESRI dışı ihtiyaçlar için iyi olacaktır.
V Stuart Foote

Evet, "Projeksiyonu Tanımla" aracı, içinden işlenen tüm şekil dosyaları için bir PRJ dosyası yazar. Jay'in gönderdiği python betiğinin muhtemelen harika çalışacağını kabul etmeme rağmen, betikleme genellikle ortalama bir GIS uzmanının beceri setinin dışında kalırken, "Define Projection" ("Projeksiyonu Tanımla") aracı çalışmıyor.
RyanDalton

1
Teşekkürler Ryan, daha fazla seçenek elde etmek için GP aracına sağ tıklayabileceğiniz konusunda hiçbir fikrim yok. Bu güzel bir numara ve aradığım şeydi. Çok takdir.
wilbev

13

Aynı dizindeyse, bunun gibi bir şey işe yarayabilir (yalnızca yollarınızı değiştirin, belki bazı istisnalar işleme ekleyin):

import os, shutil

wgs84prjpath='c:/Program Files/ArcGIS/Desktop10.0/Coordinate Systems/Geographic Coordinate Systems/World/WGS 1984.prj'

def definewgs84(shpfilepath):
    tgtpath = os.path.splitext(shpfilepath)[0] + '.prj'
    shutil.copyfile(wgs84prjpath,tgtpath)


yourshapefiledirectory='C:/temp/'
extension='shp'

shpfileslist = [file for file in os.listdir(yourshapefiledirectory) if file.lower().endswith(extension)]

for filename in shpfileslist:
    definewgs84(os.path.join(yourshapefiledirectory,filename))

Bu rotayı denedim çünkü Python'a daha fazla kullanmayı öğrenmek istiyordum ancak başarılı olamadım. 'Os' adına hata yapıyor. Aşağıdaki hata iletisine yapıştırdım. Herhangi bir fikir yanlış olabilir?
wilbev

Ben yanlışlıkla yapıştırılan Maalesef işlem ekledi var ki işte burada: Süre hatası <type 'exceptions.NameError'>: adı 'os' tanımlı değil
wilbev

ayy, ... ithalat yardımcı olur !: import os, shutil (cevabın güncellenen kısmına bakınız). docs.python.org/tutorial/stdlib.html orada olmalısınız.
Jay Cummins,

9

Sadece .prj'nin kopyalarını alın ve yeniden adlandırın. Öyleyse, örneğin, 3 şekil dosyanız varsa:

  • , one.shp
  • two.shp,
  • three.shp.

One.shp için projeksiyonu tanımladığınızda dizinde one.prj olacaktır. One.prj dosyasını two.shp dizinine kopyalayın ve two.prj olarak yeniden adlandırın, tüm shapefiles için tekrarlayın. .Prj sadece bir metin dosyasıdır. Bir .pp ile aynı dizinde ve aynı adı taşıyan bir .prj olduğu sürece, yazılım onu ​​alacaktır. Dosyaları kopyalamak ve yeniden adlandırmak için aşina olduğunuz araçlarla otomatikleştirin.


4

Düzenle:

Muhtemelen en kolay yöntem olurdu. Hepsini getir ve belgeye doğru crs atayın. “Projeden kaldırılmamış” olacaklardı ancak doğru yerde oturuyorlardı. Ardından, yalnızca yeni bir konuma (çoklu) verin.

Toplu projeksiyon için bir GP aracı görüyorum.

toplu proje

Arktikte maruz kalmayabilir. ??

Sanırım bir pgdb, (Dosya, kişisel ve hatta sde) ve sonra bir fds (özellik veri seti) yaratacağım.

Bu fds için uygun crs atayın.

Şekil dosyalarını içe aktarın (çoklu). [Bir fds içindeki tüm fc, fds'ın cr'larını devralır].

Sonra şekil dosyasına verebilirsiniz (çoklu).

Bu, toplu projeksiyon yerine olur ve eminim komut dosyası yazılabilir.


Bu yöntem işe yaramasına rağmen, Ryan Dalton'un önerdiğinden daha uzun sürüyor. 100'den fazla şekil dosyasının bir özellik sınıfına alınması çok yavaş.
wilbev


1

İşte kullandığım şey ... sadece projeksiyon olmayan raster dosyalarının projeksiyonunu tanımlar. Umarım yardımcı olur. Ayrıca, Kalite Güvencesi amacıyla yansıtma yapmadan dosyaların bir listesini oluşturur.

Vektörlerin için sadece hafif bir mod gerekiyor - FileList = arcpy.ListFeatureClasses ()

# Defines projection for all rasters with undefined projection
# CAUTION - make sure you know that the projection you are defining is the correct one
# for all files in the current directory.

#Licence: Creative Commons
#Created by: George Corea; georgec@atgis.com.au, coreagc@gmail.com

import arcpy, glob, os, sys, arcgisscripting
from arcpy import env, mapping
path = os.getcwd()
env.workspace = path
env.overwriteOutput = True

print 'Reading files from ' + path
os.chdir(path)
prjFile=r'C:\\Python26\\GDA_1994_MGA_Zone_55.prj'

x=0
z=x+1
NoProjCount=0
FileList= arcpy.ListRasters()
for File in FileList:
    desc = arcpy.Describe(File)
    SR = desc.spatialReference
    if SR.name == "Unknown":
        print "Projection of " + str(File) + " is " + SR.name + " so defining projection."
        f = open('NoProjection.txt', 'a')
        f.write(str(File)+"\n")
        f.close()
        arcpy.DefineProjection_management(File, prjFile) 
        NoProjCount=NoProjCount+1
    else:    
        print File + " is projected " + str(SR.name)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.