Hinzufügen von Shapefile oder Feature-Class als Layer in ArcGIS Desktop mit Python / ArcPy?

20

Ich versuche, verschiedene Aufgaben in ArcGIS Desktop (im Allgemeinen mit ArcMap) mit Python zu automatisieren, und ich benötige immer wieder eine Möglichkeit, der aktuellen Karte ein Shapefile hinzuzufügen. (Und dann mach was draus, aber das ist eine andere Geschichte).

Das Beste, was ich bisher tun kann, ist, der aktuellen Karte eine Layer- Datei hinzuzufügen , indem Sie Folgendes verwenden ("addLayer" ist ein Layer-Dateiobjekt):

def AddLayerFromLayerFile(addLayer):
 import arcpy
 mxd = arcpy.mapping.MapDocument("CURRENT")
 df = arcpy.mapping.ListDataFrames(mxd, "Layers")[0]
 arcpy.mapping.AddLayer(df, addLayer, "AUTO_ARRANGE")
 arcpy.RefreshActiveView()
 arcpy.RefreshTOC()
 del mxd, df, addLayer

Da meine Rohdaten jedoch immer Shapefiles sind, muss ich sie öffnen können. (Äquivalent: Konvertieren Sie ein Shapefile in eine Layer-Datei, ohne es zu öffnen, aber ich würde es vorziehen, dies nicht zu tun.)

Tom W
quelle

Antworten:

30

Folgendes hat funktioniert:

import arcpy
from arcpy import env

# get the map document
mxd = arcpy.mapping.MapDocument("CURRENT")

# get the data frame
df = arcpy.mapping.ListDataFrames(mxd,"*")[0]

# create a new layer
newlayer = arcpy.mapping.Layer(path_to_shapefile_or_feature_class)

# add the layer to the map at the bottom of the TOC in data frame 0
arcpy.mapping.AddLayer(df, newlayer,"BOTTOM")

Der Datenrahmen (Variable df), in den dieser Code die neue Ebene einfügt, ist der erste Datenrahmen im Kartendokument. Beachten Sie auch, dass dieser Code die Daten als neue Ebene am unteren Rand des Inhaltsverzeichnisses hinzufügt. Sie können auch die anderen Anordnungsoptionen "AUTO_ARRANGE" und "TOP" verwenden.

Kenton W
quelle
2
Eine weitere Option zum Angeben des Datenrahmens ist die Verwendung des aktiven Datenrahmens: df = mxd.activeDataFrame anstelle von df = arcpy.mapping.ListDataFrames (mxd) [0] - Sie benötigen auch nicht das "*" im Aufruf von listdataframe .
Jbalk
10

Feature-Layer erstellen (Datenverwaltung) http://help.arcgis.com/de/arcgisdesktop/10.0/help/index.html#//00170000006p000000.htm

Ich habe es gerade im Python-Fenster von ArcMap ausprobiert und es wird direkt zu meiner Karte hinzugefügt (ich musste meinen Datenrahmen nicht abrufen und AddLayer aufrufen).

arcpy.MakeFeatureLayer_management('r:/temp/a.shp','test') Alt-Text

Jay Cummins
quelle
Das funktioniert im direkten Fenster sehr gut ... aber wenn ich den gleichen Code in einer Skriptdatei versuche und sie ausführe, passiert nichts! (Der Code wird ohne Fehlermeldungen ausgeführt, es wird jedoch nichts im ToC angezeigt.) Wenn ich die Ebene aus dem ToC entferne und dann versuche, den Code im unmittelbaren Fenster erneut auszuführen, wird der Fehler "Datei existiert bereits" ausgegeben. Wo wird die "Test" -Layer-Datei gespeichert?
Tom W
Haben Sie SP1 installiert?
Jason Scheirer
1
@ Tom W: Ich bin so ziemlich ein Noob mit Python und Arcpy. Aber ich glaube nicht, dass eine Layer-Datei physisch erstellt wird. Wenn Sie eine Layer - Datei wollen, müssen Sie es machen und den Ebenennamen als Parameter übergeben: arcpy.SaveToLayerFile_management('test', 'r:/temp/evilmonkey.lyr', 'ABSOLUTE') Wenn Sie nicht über die Ebene speichern möchten , und Sie nur wollen es weg, arcpy.Delete_management('test').
Jay Cummins
@ Tom W: Lies einfach deinen Kommentar noch einmal. Versuchen Sie, ArcMap einen Layer aus einer separaten Python-Shell (nicht dem unmittelbaren Fenster) hinzuzufügen? Ich hätte nicht gedacht, dass Sie das schaffen könnten (aber ich bin in diesem Punkt nicht autorisiert ... vielleicht können Sie das).
Jay Cummins
1
@ Tom W: Ich kenne diesen Layer-Fehler, weshalb ich dafür gesorgt habe, dass SP1 installiert wurde. Um den Layer wie beschrieben zum Inhaltsverzeichnis hinzuzufügen, muss Ihr Skript über einen abgeleiteten Ausgabe-Feature-Layer verfügen und den Wert auf den Namen des von Ihnen erstellten Layers festlegen. Die GP-Tools in ArcMap versuchen, das Inhaltsverzeichnis vor unechten Layern (temporäre FCs usw.) in den GP-Tools zu schützen. Daher müssen Sie in den Parametern des Skript-Tools definieren, dass Ihr neuer Feature-Layer nach Abschluss des Vorgangs im Inhaltsverzeichnis verbleibt. Wenn sich die Ebene auf der Festplatte befindet, handelt es sich wahrscheinlich um die Datenquelle der FC, sodass eine Feature-Class denselben Namen hat wie die Ebene in Ihrem Arbeitsbereich.
Jason Scheirer