Удаление векторного слоя с помощью скрипта ArcPy?

13

У меня есть скрипт на основе ArcPy, где я пытаюсь пересечь два слоя, где один слой должен иметь свой центроид в другом слое.

Поскольку мне нужно знать, что один слой (Feature_layer ниже) включает в себя центроид другого, я использую инструмент arcpy.SelectLayerByLocation_management ().

У меня нет открытого документа карты (* .mxd), поэтому для этого мне нужно использовать Make Feature Layer для подачи в него.

В документации отмечается, что векторный слой исчезнет при выходе из программы, но мне нужно, чтобы он исчез раньше, так как он находится в цикле, подобном приведенному ниже.

for feature_class in large_list_of_feature_classes:
    some_function(feature_class)

def some_function():
    feature = "{path to feature class}"
    feature_layer = "feature_layer"
    HUCs_layer = "all_HUCs" #HUCs being Hydrologic Unit Codes

    arcpy.MakeFeatureLayer_management(feature, feature_layer)
    arcpy.MakeFeatureLayer_management(feature, HUCs_layer)      
    arcpy.SelectLayerByLocation_management(HUCs_layer, "HAVE_THEIR_CENTER_IN", feature_layer, selection_type="NEW_SELECTION")

    arcpy.CopyFeatures_management(HUCs_layer, selection_name)

Я ищу функцию для удаления векторных слоев, но я не смог ее найти.

Я понимаю, что мог бы добавить сюда какой-то счет или что-то, чтобы сделать каждый из них уникальным в рамках программы, но это не идеально, если нет способа удалить слои объектов.

nicksan
источник

Ответы:

21

Инструмент Удалить должен принять имя векторного слоя, чтобы удалить его из оглавления.

Навсегда удаляет данные с диска. Можно удалить все типы географических данных, поддерживаемых ArcGIS, а также наборы инструментов и рабочие пространства (папки, базы геоданных). Если указанный элемент является рабочим пространством, все содержащиеся в нем элементы также удаляются.

и в разделе Синтаксис перечислены типы данных, которые можно удалить как:

Элемент данных; Graph; Слой ; Табличное представление

Джейсон Шайрер
источник
я не знаю, почему я должен использовать инструмент удаления дважды, чтобы быть уверенным, что слои объектов удалены, и иногда эта функция дает ошибки, несмотря на то, что слой объектов на самом деле не удален, эта ошибка возникает, когда я пытаюсь удалить и создать слои объектов с тем же именем
Geogeek
2
Это на самом деле не связано, но именно так работает геообработка - он ожидает, что каждый слой будет иметь уникальное имя, потому что именно так он к ним относится.
Джейсон Шайрер
1
Возможно, использование инструмента «Удалить» для удаления слоя из оглавления может быть лучше задокументировано на resources.arcgis.com/en/help/main/10.1/index.html#//… - он говорит, что Layer - это тип данных, который может удалить, но никаких других ссылок на слои не делается, и его вступительное предложение «Окончательно удаляет данные с диска» отпугнуло бы многих пользователей от попытки удаления, чтобы удалить слой.
PolyGeo
7

Вы можете вызвать arcpy.mapping.RemoveLayer, чтобы удалить слой из оглавления.

Предоставляет возможность удалить слой внутри фрейма данных в документе карты (.mxd).

Джеймс Шек
источник
Спасибо за предложение - я не уточнил, что искал что-то для этого вне контекста сопоставления - это всего лишь сценарий анализа, и у меня нет (или, по крайней мере, не знаю) явного оглавления. Предложение Джейсона ниже работает, хотя. Благодарность! Это все еще будет полезной функцией для меня позже.
Nicksan
3

Это то, что я использую для удаления слоев.

arcpy.mapping.RemoveLayer ("DataFrame", "Имя слоя")

Или зацикливание:

mxd = arcpy.mapping.MapDocument("CURRENT")
for df in arcpy.mapping.ListDataFrames(mxd):
    for lyr in arcpy.mapping.ListLayers(mxd, "", df):
        arcpy.mapping.RemoveLayer(df, lyr)
волосатый
источник
3

Используйте, mxd.save()если вы используете документ карты, который не CURRENTгарантирует, что слой не исчезнет. Также добавьте оператор печати в ваш скрипт:

mxd = arcpy.mapping.MapDocument("CURRENT")
df = arcpy.mapping.ListDataFrames(mxd)[0]

for i in arcpy.mapping.ListLayers(mxd , "TerraColor_SanFrancisco_US_15m.tif"):
    print "Deleting layer", i
    arcpy.mapping.RemoveLayer(df , i)

arcpy.RefreshActiveView()

Просто чтобы убедиться, что он вообще находит слой для удаления.

Джейсон Шайрер
источник
-1

попробуй это:

import arcpy
from arcpy import env
env.workspace = r"F:\Projects\ohad\derech_atankim\gis"   
for mxdname in arcpy.ListFiles("*.mxd"):
    print mxdname 
    mxd = arcpy.mapping.MapDocument(r"F:\Projects\ohad\derech_atankim\gis\\" + mxdname)
    df = arcpy.mapping.ListDataFrames(mxd, "Layers")[0]
    for lyr in arcpy.mapping.ListLayers(mxd, "", df):
        if lyr.dataSource == r"F:\Projects\ohad\derech_atankim\gis\layers\roads.lyr":
            arcpy.mapping.RemoveLayer(df, lyr)
    mxd.save()
del mxd
newGIS
источник