Usunąć warstwę obiektów za pomocą skryptu ArcPy?

13

Mam skrypt oparty na ArcPy, w którym próbuję przeciąć dwie warstwy, przy czym jedna warstwa musi mieć środek ciężkości w drugiej warstwie.

Ponieważ muszę wiedzieć, że jedna warstwa (warstwa_operatora poniżej) zawiera środek ciężkości drugiej, używam narzędzia arcpy.SelectLayerByLocation_management ().

Nie mam otwartego dokumentu mapy (* .mxd), więc aby to zrobić, muszę użyć opcji Utwórz warstwę obiektów, aby go wprowadzić.

Dokumentacja zauważa, że ​​warstwa funkcji zniknie po wyjściu z programu, ale muszę ją wcześniej usunąć, ponieważ mam ją w pętli podobnej do poniższej

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)

Szukam funkcji do usuwania warstw obiektów i nie udało mi się jej znaleźć.

Zdaję sobie sprawę, że mógłbym wprowadzić tam jakąś liczbę lub coś, co sprawi, że każdy będzie wyjątkowy w zakresie programu, ale nie jest to idealne, chyba że nie ma sposobu na usunięcie warstw cech.

Nicksan
źródło

Odpowiedzi:

21

Narzędzie Usuń powinno zaakceptować nazwę warstwy obiektów, aby usunąć ją ze spisu treści.

Trwale usuwa dane z dysku. Wszystkie typy danych geograficznych obsługiwanych przez ArcGIS, a także skrzynki narzędziowe i obszary robocze (foldery, geobazy) można usunąć. Jeśli określony element jest obszarem roboczym, wszystkie zawarte elementy również zostaną usunięte.

i w sekcji Składnia zawiera listę typów danych, które można usunąć jako:

Element danych; Wykres; Warstwa ; Widok tabeli

Jason Scheirer
źródło
nie wiem, dlaczego powinienem użyć narzędzia usuwania dwa razy, aby upewnić się, że warstwy funkcji zostały usunięte, a czasami ta funkcja powoduje błędy, mimo że warstwa funkcji nie została tak naprawdę usunięta, błędy te występują, gdy próbuję usunąć i utworzyć warstwy funkcji o tej samej nazwie
geogeek
2
To nie jest tak naprawdę powiązane, ale tak działa geoprzetwarzanie - oczekuje, że każda warstwa będzie miała unikalną nazwę, ponieważ tak się do nich odnosi.
Jason Scheirer
1
Być może użycie narzędzia Usuń do usunięcia warstwy z spisu treści można lepiej udokumentować na stronie resources.arcgis.com/en/help/main/10.1/index.html#//… - mówi, że warstwa jest typem danych, który może zostać usunięte, ale nie ma żadnych innych odniesień do warstw, a zdanie otwierające „Trwale usuwa dane z dysku” odstraszyłoby wielu użytkowników od próby usunięcia Usuń w celu usunięcia warstwy.
PolyGeo
7

Możesz wywołać arcpy.mapping.RemoveLayer, aby usunąć warstwę ze spisu treści.

Zapewnia możliwość usunięcia warstwy w ramce danych w dokumencie mapy (.mxd).

James Schek
źródło
Dzięki za sugestię - nie wyjaśniłem, że szukam czegoś do zrobienia poza kontekstem mapowania - to tylko skrypt analityczny i nie mam (a przynajmniej nie wiem) wyraźnej spisu treści. Poniższa sugestia Jasona zadziałała. Dzięki! W dalszym ciągu będzie to dla mnie przydatna funkcja.
nicksan
3

Tego używam do usuwania warstw.

arcpy.mapping.RemoveLayer („DataFrame”, „Nazwa warstwy”)

Lub zapętlanie:

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)
Włochaty
źródło
3

Użyj, mxd.save()jeśli używasz dokumentu mapy, który nie ma CURRENTna celu upewnienia się, że warstwa pozostała. Dodaj również instrukcję skryptową do skryptu:

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

Aby mieć pewność, że w ogóle znajdzie warstwę do usunięcia.

Jason Scheirer
źródło
-1

Spróbuj tego:

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
źródło