Добавление шейп-файла или класса объектов в качестве слоя в ArcGIS Desktop с использованием Python / ArcPy?

20

Я пытаюсь автоматизировать различные задачи в ArcGIS Desktop (в основном используя ArcMap) с помощью Python, и мне все еще нужен способ добавить шейп-файл к текущей карте. (А потом делать что-то с этим, но это другая история).

Лучшее, что я могу сделать, это добавить файл слоя к текущей карте, используя следующее («addLayer» - объект файла слоя):

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

Однако мои необработанные данные всегда будут шейп-файлами, поэтому я должен иметь возможность их открывать. (Эквивалентно: преобразовать шейп-файл в файл слоя, не открывая его, но я бы предпочел этого не делать).

Том W
источник

Ответы:

30

Вот что я нашел сработало:

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

Фрейм данных (переменная df), в который этот код поместит новый слой, является первым фреймом данных в документе карты. Также обратите внимание, что этот код добавляет данные в виде нового слоя в нижней части оглавления. Вы также можете использовать другие параметры размещения, такие как «AUTO_ARRANGE» и «TOP».

Кентон W
источник
2
Другим вариантом для указания dataframe является использование активного dataframe: df = mxd.activeDataFrame вместо df = arcpy.mapping.ListDataFrames (mxd) [0] - также вам не нужно указывать «*» в вызове listdataframe ,
JBalk
10

Создать слой элементов (управление данными) http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//00170000006p000000.htm

Я только что попробовал это в окне Python в ArcMap, и оно добавилось прямо к моей карте (мне не нужно было получать мой фрейм данных и вызывать AddLayer).

arcpy.MakeFeatureLayer_management('r:/temp/a.shp','test') альтернативный текст

Джей Камминс
источник
Это прекрасно работает в ближайшем окне ... но когда я пробую тот же код в файле скрипта и запускаю его, ничего не происходит! (Код выполняется без сообщений об ошибках, но в ToC ничего не появляется) Кроме того, если я удаляю слой из ToC, а затем снова пытаюсь запустить код в ближайшем окне, я получаю ошибку типа «файл уже существует». Где хранится файл «тестового» слоя?
Том W
Вы установили SP1?
Джейсон Шейрер
1
@Tom W: Я в основном нуб с python и arcpy. Но я не думаю, что файл слоя физически создан. Если вы хотите файл слой, вы должны сделать это и передать имя слоя в качестве параметра: arcpy.SaveToLayerFile_management('test', 'r:/temp/evilmonkey.lyr', 'ABSOLUTE') Если вы не хотите сохранить слой , и вы просто хотите его нет, arcpy.Delete_management('test').
Джей Камминс
@ Tom W: просто перечитайте свой комментарий. Вы пытаетесь добавить слой в ArcMap из отдельной оболочки Python (не из непосредственного окна)? Я не думал, что вы могли бы сделать это (но я не авторитет в этом ... может быть, вы можете).
Джей Камминс
1
@Tom W: Я знаю об этой ошибке слоя, поэтому я позаботился о том, чтобы был установлен SP1. Чтобы добавить слой в оглавление, как вы описываете, вам нужно, чтобы ваш скрипт имел производный выходной векторный слой и установил в качестве значения имя слоя, который вы создали. Инструменты GP в ArcMap пытаются защитить оглавление от паразитных слоев (временных FC и т. Д.) В инструментах GP, поэтому вам необходимо определить в параметрах инструмента-сценария, что ваш новый векторный слой останется в оглавлении после завершения. То, где слой находится на диске, скорее всего, является источником данных FC, поэтому класс объектов назван так же, как слой в вашей рабочей области.
Джейсон Шейрер