Użyj Pythona, aby dodać warstwy do spisu treści

13

Od pewnego czasu walczę z dodawaniem warstw do spisu treści. Udało mi się dodać pojedyncze warstwy, ale muszę przejść przez folder i dodać wszystkie warstwy. Pliki kształtów, których w ogóle nie mogę dodać. Tylko pliki warstw. Poniżej znajduje się kod miejsca, w którym jestem:

for layer in shp_List:
mxd = arcpy.mapping.MapDocument("CURRENT")
dataFrame = arcpy.mapping.ListDataFrames(mxd, "*")[0]

outlayer = lyr
layerfile = os.path.join(base_Folder, lyr + ".lyr")

arcpy.MakeFeatureLayer_management(layer, outlayer)
arcpy.SaveToLayerFile_management(outlayer, layerfile, "ABSOLUTE")
addlayer = arcpy.mapping.Layer(layerfile)
arcpy.mapping.AddLayer(dataFrame, addlayer, "BOTTOM")



#addLayer = arcpy.mapping.Layer(layer)
#arcpy.mapping.AddLayer(dataFrame, addLayer, "BOTTOM")
#arcpy.RefreshTOC()
#arcpy.RefreshActiveView()
del addlayer, mxd

Powyższy kod doda każdą warstwę do spisu treści, a następnie irytująco ją usunie i doda następną. Po zakończeniu całego skryptu w spisie treści nie ma już nic. Próbowałem dodać ten skrypt do modelu i utworzyć pochodny parametr wyjściowy, który jest następnie dodawany jako parametr modelu z zaznaczoną opcją „dodaj do wyświetlania”. Sprawdziłem również opcje geoprzetwarzania, aby upewnić się, że pole do dodania do wyświetlania jest zaznaczone. Korzystam z Arc 10 (bez dodatków Service Pack). Czy ktoś może pomóc?

Oliver Burdekin
źródło

Odpowiedzi:

11

Musisz utworzyć obiekty MapDocument i DataFrame poza pętlą przebiegającą przez twoje warstwy. W przeciwnym razie za każdym razem zaczynasz od oryginalnej mapy.

więc poprawię w tym kodzie:

mxd = arcpy.mapping.MapDocument("CURRENT")
dataFrame = arcpy.mapping.ListDataFrames(mxd, "*")[0]

for layer in shp_List:

    outlayer = layer + "_lyr" 
    layerfile = os.path.join(base_Folder, layer + ".lyr")

    arcpy.MakeFeatureLayer_management(layer, outlayer)
    arcpy.SaveToLayerFile_management(outlayer, layerfile, "ABSOLUTE")
    addlayer = arcpy.mapping.Layer(layerfile)
    arcpy.mapping.AddLayer(dataFrame, addlayer, "BOTTOM")



    #addLayer = arcpy.mapping.Layer(layer)
    #arcpy.mapping.AddLayer(dataFrame, addLayer, "BOTTOM")
arcpy.RefreshTOC()
arcpy.RefreshActiveView()
    #del addlayer, mxd

Aby zapętlić listę plików mxd w tym samym folderze skryptu, możesz to zrobić w następujący sposób:

for mxd_name in mxd_names:
    mxd = arcpy.mapping.MapDocument(os.path.dirname(os.path.realpath(__file__))+"\\"+mxd_name+".mxd")
   dataFrame = arcpy.mapping.ListDataFrames(mxd, "*")[0]
geogeek
źródło
2
Szukałem uwag @ geogeek, ale wydają się one nieobecne. W każdym razie, jak pokazuje jego poprawiony kod, musisz utworzyć obiekty MapDocument i DataFrame poza pętlą przebiegającą przez twoje warstwy. W przeciwnym razie za każdym razem zaczynasz od oryginalnej mapy.
PolyGeo
1
Dzięki za wyjaśnienie PolyGeo. Wprowadziłem zmiany. Jednak teraz tylko ostatni plik na liście pozostaje w spisie treści. Wszystkie pozostałe pojawiają się, a następnie znikają. Flummoxed. :)
Oliver Burdekin
1
Mam to działa! Wszystko w wcięciu, prawda? Pojawiające się nazwy warstw są wciąż dość proste, ale to tylko estetyka. Wielkie dzięki za pomoc, podglądacze!
Oliver Burdekin
1
geogeek, jak to zrobić dla kilku MXD?
newGIS
1
udzieliłem odpowiedzi w mojej edycji
geogeek