Ajouter un fichier de formes ou une classe d'entités en tant que couche dans ArcGIS Desktop à l'aide de Python / ArcPy?

20

J'essaie d'automatiser diverses tâches dans ArcGIS Desktop (en utilisant ArcMap en général) avec Python, et j'ai toujours besoin d'un moyen d'ajouter un fichier de formes à la carte actuelle. (Et puis faites-y des trucs, mais c'est une autre histoire).

Le mieux que je puisse faire jusqu'à présent est d'ajouter un fichier de couche à la carte actuelle, en utilisant ce qui suit ("addLayer" est un objet de fichier de couche):

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

Cependant, mes données brutes seront toujours des fichiers de formes, je dois donc pouvoir les ouvrir. (De manière équivalente: convertissez un fichier de formes en fichier de calque sans l'ouvrir, mais je préférerais ne pas le faire).

Tom W
la source

Réponses:

30

Voici ce que j'ai trouvé efficace:

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

Le cadre de données (variable df) dans lequel ce code placera la nouvelle couche est le premier cadre de données dans le document ArcMap. Notez également que ce code ajoute les données en tant que nouvelle couche au bas de la table des matières. Vous pouvez également utiliser les autres options d'agencement, qui sont "AUTO_ARRANGE" et "TOP".

Kenton W
la source
2
Une autre option pour spécifier la trame de données consiste à utiliser la trame de données active: df = mxd.activeDataFrame au lieu de df = arcpy.mapping.ListDataFrames (mxd) [0] - également, vous n'avez pas besoin du "*" dans l'appel listdataframe .
jbalk
10

Make Feature Layer (Data Management) http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//00170000006p000000.htm

Je viens de l'essayer dans la fenêtre Python d'ArcMap et il s'ajoute directement à ma carte (je n'ai pas eu à récupérer mon dataframe et appeler AddLayer).

arcpy.MakeFeatureLayer_management('r:/temp/a.shp','test') texte alternatif

Jay Cummins
la source
Cela fonctionne très bien dans la fenêtre immédiate ... mais quand j'essaie le même code dans un fichier de script et l'exécute, rien ne se passe! (Le code s'exécute sans messages d'erreur, mais rien n'apparaît dans le ToC) De plus, si je supprime la couche du ToC, puis réessaye d'exécuter le code dans la fenêtre immédiate, j'obtiens une erreur de type "le fichier existe déjà". Où est enregistré le fichier de calque "test"?
Tom W
Avez-vous installé SP1?
Jason Scheirer
1
@ Tom W: Je suis à peu près un noob avec python et arcpy. Mais je ne pense pas qu'un fichier de couches soit créé physiquement. Si vous voulez un fichier de couche, vous devez le faire et passer le nom de la couche comme paramètre: arcpy.SaveToLayerFile_management('test', 'r:/temp/evilmonkey.lyr', 'ABSOLUTE') Si vous ne voulez pas enregistrer la couche et que vous voulez juste allé, arcpy.Delete_management('test').
Jay Cummins
@Tom W: relisez simplement votre commentaire. Essayez-vous d'ajouter une couche à ArcMap à partir d'un shell python distinct (pas la fenêtre immédiate)? Je ne pensais pas que vous pouviez faire ça (mais je n'ai aucune autorité sur ce point ... peut-être que vous pouvez).
Jay Cummins
1
@ Tom W: Je connais ce bug de couche, c'est pourquoi je m'assurais que SP1 était installé. Pour ajouter la couche à la table des matières comme vous le décrivez, vous avez besoin de votre script pour avoir une couche d'entités de sortie dérivée et définissez la valeur sur le nom de la couche que vous avez créée. Les outils GP d'ArcMap tentent de protéger la table des matières des couches parasites (FC temporaires, etc.) dans les outils GP, vous devez donc définir dans les paramètres de l'outil de script que votre nouvelle couche d'entités restera dans la table des matières une fois terminée. L'endroit où la couche réside sur le disque est probablement la source de données du FC, donc une classe d'entités nommée de la même manière que la couche sur votre espace de travail.
Jason Scheirer