Definire le proiezioni per più shapefile in ArcMap?


29

Ho oltre 100 file di forma che non hanno file .prj e quindi quando li porto in ArcMap 10 mostrano il sistema di coordinate come sconosciuto. So che tutto il sistema di coordinate dei file di forma è GCS WGS 1984. So anche che posso usare lo strumento Define Projection GP per assegnare individualmente il sistema di coordinate a ciascun file, ma ci vorrà per sempre.

Speravo che ci fosse uno strumento GP per definirli in batch, ma non ne vedo uno. Poi stavo pensando che forse avrei potuto usare Python per farlo, quindi ho cercato nel menu di aiuto e ho trovato uno script ma mi dà un errore.

Ecco il codice python che ho provato (questo è per un singolo file shp, quindi avrei ancora il dolore di digitare il nome per ogni 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)

Ma se voglio definire la proiezione per file multi raster, cosa posso fare?

Risposte:


29

Penso che state pensando troppo a questo ...

  1. Fare clic con il tasto destro del mouse sullo strumento "Definisci proiezione" nella casella degli strumenti,
  2. seleziona "Batch",
  3. trascina i livelli nella colonna "Set di dati di input",
  4. fare clic con il tasto destro del mouse sulla prima casella "Sistema di coordinate" per compilare la proiezione corretta,
  5. quindi fai clic con il pulsante destro del mouse sulla proiezione che hai appena selezionato e scegli "Riempi" che riempirà per te tutto il resto delle proiezioni.
  6. Premi "OK" e il gioco è fatto.

testo alternativo


Questo genera effettivamente il file helper .PRJ di Shapefile nella cartella del sistema operativo o semplicemente annota un attributo di livello? E dovresti anche avviare ArcGIS. Lo script Python che Jay ha realizzato farà il suo lavoro completamente al di fuori di ArcGIS, con alcuni risultati - ottimo per esigenze non ESRI.
V Stuart Foote,

Sì, lo strumento "Definisci proiezione" scrive un file PRJ per tutti gli shapefile che vengono elaborati attraverso di esso. Mentre sono d'accordo che lo script Python pubblicato da Jay probabilmente funzionerà alla grande, lo scripting è spesso al di fuori del set di competenze di uno specialista GIS medio, mentre l'utilità a pulsante "Definisci proiezione" non lo è.
Ryan Dalton,

1
Grazie Ryan, non ho idea che potresti fare clic con il pulsante destro del mouse sullo strumento GP per ottenere più opzioni. Questo è un bel trucco ed era proprio quello che stavo cercando. Molto apprezzato.
Wilbev,

13

Se si trovano nella stessa directory, qualcosa del genere funzionerebbe (basta sostituire i percorsi, magari aggiungere qualche gestione delle eccezioni):

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

Ho provato questo percorso perché voglio imparare ad usare di più su Python ma non ci sono riuscito. Si sta sbagliando sul nome 'os'. Ho incollato nel messaggio di errore qui sotto. Qualche idea di cosa potrebbe essere sbagliato?
Wilbev,

Ci dispiace che sia stato aggiunto prima di aver incollato l'errore, eccolo qui: Errore di runtime <type 'exceptions.NameError'>: il nome 'os' non è definito
wilbev

oops ... le importazioni sarebbero d'aiuto !: import os, shutil (vedi la risposta aggiornata). docs.python.org/tutorial/stdlib.html dovresti farlo.
Jay Cummins,

9

Basta fare copie del .prj e rinominare. Ad esempio, se hai 3 shapefile:

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

Definisci la proiezione per one.shp e avrai one.prj nella directory. Copia one.prj nella directory di two.shp e rinomina in two.prj, ripeti per tutti gli shapefile. .Prj è solo un file di testo. Finché c'è un .prj nella stessa directory di un .shp e con lo stesso nome, il software lo prenderà. Automatizza con qualsiasi strumento tu abbia familiarità con la copia e la ridenominazione dei file.


4

Modificare:

Probabilmente il metodo più semplice sarebbe. Inseriscili tutti e assegna i CR corretti al documento. Sarebbero "non proiettati" ma seduti nel posto giusto. Quindi esporta (più) in una nuova posizione.

Vedo uno strumento GP per la proiezione batch.

batch proj

Potrebbe non essere esposto in arcpia. ??

Penso che vorrei creare un pgdb, (File, personal o persino sde) e quindi creare un fds (set di dati di funzionalità).

Assegna i CR appropriati a quei FDS.

Importa i file di forma (multipli). [tutti i fc in un fd ereditano i crs del fds].

Quindi è possibile esportare in file di forma (multipli).

Questo sarebbe al posto della proiezione batch, e sono sicuro che potrebbe essere copiato.


Sebbene questo metodo funzioni, ci vuole molto più tempo di quanto suggerito da Ryan Dalton. L'importazione di oltre 100 file di forme in una classe di funzionalità è molto lenta.
Wilbev,


1

Ecco cosa uso ... definirà solo la proiezione per i file raster che non hanno una proiezione. Spero che sia d'aiuto. Crea inoltre un elenco di file senza proiezione ai fini della garanzia della qualità.

Per i tuoi vettori ha solo bisogno di una leggera 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; 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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.