Menentukan proyeksi untuk beberapa shapefile di ArcMap?

29

Saya memiliki lebih dari 100 file bentuk yang tidak memiliki file .prj dan dengan demikian ketika saya membawa mereka ke dalam ArcMap 10 mereka menunjukkan sistem koordinat sebagai tidak diketahui. Saya tahu semua bentuk file sistem koordinat adalah GCS WGS 1984. Saya juga tahu saya bisa menggunakan alat Tentukan Proyeksi GP untuk secara individual menetapkan sistem koordinat untuk setiap file tetapi itu akan memakan waktu selamanya.

Saya berharap ada alat GP untuk batch mendefinisikan ini tetapi saya tidak melihatnya. Selanjutnya saya berpikir mungkin saya bisa menggunakan python untuk melakukan ini sehingga saya mencari di menu bantuan dan menemukan skrip tetapi itu memberi saya kesalahan.

Berikut adalah kode python yang saya coba (ini untuk satu file shp jadi saya masih kesulitan mengetikkan nama untuk setiap file:

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)
wilbev
sumber
Tetapi jika saya ingin mendefinisikan proyeksi untuk file multi raster, apa yang bisa saya lakukan?

Jawaban:

29

Saya pikir kalian terlalu memikirkan yang satu ini ...

  1. Klik kanan pada alat "Tentukan Proyeksi" di kotak alat,
  2. pilih "Batch",
  3. drag-and-drop layer Anda ke kolom "Input Dataset",
  4. klik kanan di kotak "Sistem Koordinat" pertama untuk mengisi proyeksi yang benar,
  5. kemudian klik kanan pada proyeksi yang baru saja Anda pilih dan pilih "Isi" yang akan mengisi semua proyeksi lainnya untuk Anda.
  6. Tekan "OK" dan Anda selesai.

teks alternatif

Ryan Dalton
sumber
Apakah itu benar-benar menghasilkan file pembantu Shapefile .PRJ di folder OS, atau hanya membubuhi keterangan atribut lapisan? Dan Anda harus meluncurkan ArcGIS juga. Skrip Python yang disiapkan Jay akan bekerja sepenuhnya di luar ArcGIS, dengan hasil tertentu - bagus untuk kebutuhan non-ESRI.
V Stuart Foote
Ya, alat "Tentukan Proyeksi" menulis file PRJ untuk semua shapefile yang diproses melaluinya. Sementara saya setuju skrip python yang diposkan Jay mungkin akan bekerja dengan baik, skrip sering kali berada di luar keahlian spesialis GIS rata-rata, sedangkan utilitas tombol "Tentukan Proyeksi" tidak.
RyanDalton
1
Terima kasih Ryan, saya tidak tahu bahwa Anda dapat mengklik kanan pada alat GP untuk mendapatkan lebih banyak opsi. Itu adalah trik yang bagus dan hanya apa yang saya cari. Sangat dihargai.
wilbev
13

Jika mereka berada di direktori yang sama, sesuatu seperti ini akan berfungsi (ganti saja jalur Anda, mungkin tambahkan beberapa penanganan pengecualian):

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))
Jay Cummins
sumber
Saya mencoba rute ini karena saya ingin belajar menggunakan Python lebih banyak tetapi saya tidak berhasil. Itu salah pada nama 'os'. Saya menempelkan pesan kesalahan di bawah ini. Ada ide apa yang salah?
wilbev
Maaf yang ditambahkan sebelum saya menempelkan kesalahan, ini dia: Runtime error <type 'exceptionions.NameError'>: nama 'os' tidak didefinisikan
wilbev
oops ... impor akan membantu !: import os, shutil (lihat yang diperbarui jawabannya). docs.python.org/tutorial/stdlib.html harus Anda di sana.
Jay Cummins
9

Cukup buat salinan .prj dan ganti nama. Jadi, misalnya, jika Anda memiliki 3 shapefile:

  • satu.shp,
  • two.shp,
  • three.shp.

Tentukan proyeksi untuk one.shp dan Anda akan memiliki one.prj di direktori. Salin one.prj ke direktori two.shp dan ganti nama menjadi two.prj, ulangi untuk semua shapefile. .Prj hanyalah sebuah file teks. Selama ada .prj di direktori yang sama dengan .shp dan dengan nama yang sama, perangkat lunak akan mengambilnya. Otomatiskan dengan alat apa pun yang Anda kenal untuk menyalin dan mengganti nama file.

Sean
sumber
4

Edit:

Mungkin metode yang paling mudah adalah. Bawa semuanya masuk dan tetapkan CR yang benar untuk dokumen tersebut. Mereka akan "tidak diproyeksikan" tetapi duduk di tempat yang tepat. Kemudian cukup ekspor (beberapa) ke lokasi baru.

Saya melihat alat GP untuk proyeksi batch.

proj batch

Ini mungkin tidak terpapar dalam busur. ??

Saya pikir saya akan membuat pgdb, (File, personal atau bahkan sde) dan kemudian membuat fds (fitur data set).

Tetapkan CR yang sesuai untuk fds itu.

Impor file bentuk (banyak). [semua fc dalam fds mewarisi crs dari fds].

Kemudian Anda dapat mengekspor ke bentuk file (banyak).

Ini akan menjadi pengganti proyeksi batch, dan saya yakin bisa dituliskan.

Brad Nesom
sumber
Meskipun metode ini berhasil, dibutuhkan jauh lebih lama dari yang disarankan Ryan Dalton. Impor lebih dari 100 file bentuk ke kelas fitur sangat lambat.
wilbev
1

Inilah yang saya gunakan ... itu hanya akan menentukan proyeksi untuk file raster yang tidak memiliki proyeksi. Semoga ini bisa membantu. Itu juga membuat daftar file tanpa proyeksi untuk tujuan Jaminan Kualitas.

Untuk vektor Anda, hanya perlu sedikit mod - 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; [email protected], [email protected]

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)
GeorgeC
sumber