Definieren von Projektionen für mehrere Shapefiles in ArcMap?

29

Ich habe über 100 Shape-Dateien, die keine .prj-Datei haben. Wenn ich sie in ArcMap 10 bringe, wird das Koordinatensystem daher als unbekannt angezeigt. Ich weiß, dass das Koordinatensystem aller Formdateien GCS WGS 1984 ist. Ich weiß auch, dass ich mit dem GP-Tool "Projektion definieren" das Koordinatensystem jeder Datei einzeln zuweisen kann, aber das wird ewig dauern.

Ich hatte gehofft, dass es ein GP-Tool gibt, mit dem sich diese stapelweise definieren lassen, aber ich sehe keines. Als nächstes dachte ich, ich könnte vielleicht Python verwenden, also habe ich im Hilfemenü ein Skript gefunden, aber es gibt mir einen Fehler.

Hier ist der Python-Code, den ich ausprobiert habe (dies ist für eine einzelne shp-Datei, so dass ich immer noch die Mühe habe, den Namen für jede Datei einzugeben:

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
quelle
Was kann ich tun, wenn ich die Projektion für Multi-Raster-Dateien definieren möchte?

Antworten:

29

Ich denke ihr überdenkt diesen einen ...

  1. Klicken Sie mit der rechten Maustaste auf das Tool "Define Projection" in der Toolbox.
  2. Wählen Sie "Charge",
  3. Ziehen Sie Ihre Ebenen per Drag & Drop in die Spalte "Input Dataset".
  4. Klicken Sie mit der rechten Maustaste in das erste Feld "Koordinatensystem", um die richtige Projektion auszufüllen.
  5. Klicken Sie dann mit der rechten Maustaste auf die gerade ausgewählte Projektion und wählen Sie "Ausfüllen", um alle übrigen Projektionen für Sie auszufüllen.
  6. Klicken Sie auf "OK" und Sie sind fertig.

Alt-Text

RyanDalton
quelle
Erzeugt das tatsächlich die Hilfedatei Shapefile .PRJ im Betriebssystemordner oder kommentiert es einfach ein Ebenenattribut? Und Sie müssen auch ArcGIS starten. Das von Jay erstellte Python-Skript wird seine Arbeit vollständig außerhalb von ArcGIS ausführen, mit bestimmten Ergebnissen - gut für Nicht-ESRI-Anforderungen.
V Stuart Foote
Ja, das Tool "Define Projection" schreibt eine PRJ-Datei für alle Shapefiles, die durch dieses Tool verarbeitet werden. Ich bin damit einverstanden, dass das von Jay gepostete Python-Skript wahrscheinlich sehr gut funktioniert. Allerdings liegt das Skripting häufig außerhalb der Fähigkeiten eines durchschnittlichen GIS-Spezialisten, wohingegen das Drucktasten-Dienstprogramm "Define Projection" dies nicht tut.
RyanDalton
1
Danke Ryan, ich habe keine Ahnung, dass Sie mit der rechten Maustaste auf das GP-Tool klicken können, um weitere Optionen zu erhalten. Das ist ein schöner Trick und genau das, wonach ich gesucht habe. Sehr geschätzt.
Wilbev
13

Wenn sie sich im selben Verzeichnis befinden, würde so etwas funktionieren (ersetzen Sie einfach Ihre Pfade, fügen Sie möglicherweise eine Ausnahmebehandlung hinzu):

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
quelle
Ich habe diese Route ausprobiert, weil ich mehr über Python lernen möchte, aber es gelang mir nicht. Der Name 'os' ist fehlerhaft. Ich habe die folgende Fehlermeldung eingefügt. Irgendwelche Ideen, was falsch sein könnte?
Wilbev
Sorry, das wurde hinzugefügt, bevor ich den Fehler eingefügt habe, hier ist es: Laufzeitfehler <Typ 'Ausnahmen.NameError'>: Name 'os' ist nicht definiert
Wilbev
hoppla ... die importe würden helfen !: import os, shutil (siehe die aktualisierte antwort). docs.python.org/tutorial/stdlib.html sollten Sie da sein.
Jay Cummins
9

Einfach Kopien der .prj erstellen und umbenennen. Also zB wenn Sie 3 Shapefiles haben:

  • one.shp,
  • two.shp,
  • drei.shp.

Definieren Sie die Projektion für one.shp und Sie haben one.prj im Verzeichnis. Kopieren Sie one.prj in das Verzeichnis two.shp und benennen Sie es in two.prj um. Wiederholen Sie diesen Vorgang für alle Shapefiles. Die .prj ist nur eine Textdatei. Solange sich eine .prj-Datei im selben Verzeichnis wie eine .shp-Datei mit demselben Namen befindet, wird sie von der Software abgerufen. Automatisieren Sie mit allen Tools, die Sie zum Kopieren und Umbenennen von Dateien kennen.

Sean
quelle
4

Bearbeiten:

Die wahrscheinlich einfachste Methode wäre. Bringen Sie sie alle ein und weisen Sie dem Dokument die richtigen crs zu. Sie würden "unprojektiert" sein, aber am richtigen Ort sitzen. Dann exportieren Sie einfach (mehrere) an einen neuen Speicherort.

Ich sehe ein GP-Tool für die Stapelprojektion.

batch proj

Es darf nicht bogenförmig belichtet werden. ??

Ich denke, ich würde eine pgdb erstellen (Datei, persönlich oder sogar sde) und dann einen fds (Feature-Datensatz) erstellen.

Weisen Sie diesem fds das entsprechende crs zu.

Importieren Sie die Formdateien (mehrere). [alle fc in einem fds erben die crs des fds].

Dann können Sie in eine Formdatei exportieren (mehrere).

Dies würde die Stapelprojektion ersetzen, und ich bin sicher, dass Skripte erstellt werden könnten.

Brad Nesom
quelle
Obwohl diese Methode funktioniert, dauert sie viel länger als von Ryan Dalton vorgeschlagen. Der Import von über 100 Formdateien in eine Feature-Class ist sehr langsam.
Wilbev
1

Hier ist, was ich benutze ... es wird nur die Projektion für Rasterdateien definieren, die keine Projektion haben. Ich hoffe es hilft. Es wird auch eine Liste der Dateien ohne Projektion für Qualitätssicherungszwecke erstellt.

Für deine Vektoren wird nur ein kleiner Mod benötigt - 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
quelle