Naprawiasz źródła danych na wielu dyskach MXD za pomocą ArcPy?

14

Mam około 50 MXD ze wszystkimi uszkodzonymi warstwami, przez które przechodziłem i ręcznie resetowałem.

Dane zostały przeniesione z innego komputera, a struktura folderów została zmieniona, więc nie jest to zwykły proces zmiany (przykład):

„F: \ Data \ Rivers.shp” na „C: \ Data \ Rivers.shp”

jest bardziej jak:

„F: \ Data \ Rivers.shp” do C: \ Data \ Park \ Water \ Rivers.shp

i tak dalej dla wszystkich rodzajów danych (granice, pokrycie warzyw, drogi itp.), każdy w swoim własnym podfolderze.

Chcę utworzyć skrypt, który będę mógł uruchamiać wielokrotnie za każdym razem, gdy otworzę jeden z tych plików MXD, który przynajmniej naprawi niektóre z bardziej popularnych warstw, które znajdują się w większości plików MXD, a następnie będę mógł ręcznie naprawić resztę. W ten sposób mogę przynajmniej zaoszczędzić trochę czasu.

Używam czegoś w stylu:

import arcpy
mxd = arcpy.mapping.MapDocument("CURRENT")

for lyr in arcpy.mapping.ListLayers(mxd):
    if lyr == "Rivers": #Should this be the layner name in TOC or FC name?
        lyr.replaceDataSource(r"C:\Data\Park\Water", "SHAPEFILE_WORKSPACE", "Rivers")

Pomysł polega na tym, aby w jakiś sposób dodać wiele skryptów „zamień” powyżej dla innych popularnych warstw, które znajdują się w mxd's.

Jednak powyższy skrypt nawet nie naprawia warstwy Rivers.

Jak mogę go uruchomić, a także dodać inne warstwy do naprawy, które mają różne ścieżki plików?

Chaz
źródło

Odpowiedzi:

14

Twój skrypt jest na dobrej drodze. Wygląda na to, problem tkwi w jaki sposób są porównując Layerobiekt, do nazwy z Layerw spisie treści .

Gdy używasz funkcji ListLayers , zwracany jest Layerobiekt. Nie można wówczas porównać to do text string, aby zobaczyć, czy są one równe, trzeba uzyskać dostęp do nazwy z Layerzamiast.

import arcpy
mxd = arcpy.mapping.MapDocument("CURRENT")

for lyr in arcpy.mapping.ListLayers(mxd):
    if lyr.name.lower() == "rivers": #This should be the Layer name in the TOC?
        lyr.replaceDataSource(r"C:\Data\Park\Water", "SHAPEFILE_WORKSPACE", "Rivers")

Aby dodać więcej selektorów, wystarczy rozwinąć if/thenczęść kodu, aby wyszukać różne nazwy warstw.

for lyr in arcpy.mapping.ListLayers(mxd):
    if lyr.name.lower() == "rivers": #This should be the Layer name in the TOC?
        lyr.replaceDataSource(r"C:\Data\Park\Water", "SHAPEFILE_WORKSPACE", "Rivers")
    elif lyr.name.lower() == "streets":
        lyr.replaceDataSource(r"C:\Data\Facilities\Streets", "SHAPEFILE WORKSPACE", "Streets")

Po prostu kontynuuj modyfikowanie nameselektora, aby znaleźć konkretną unikalną warstwę .mxd, i dodaj replaceDataSourcefunkcję do obsługi. Zauważ, że użyłem tej lowerfunkcji podczas testowania nazwy. Jest to również wykorzystywane przez ESRI w dokumentach pomocniczych, przy czym przyczyną jest prawdopodobnie to, że eliminuje to ryzyko niespójności wielkich liter, powodując niedopasowanie w nazwie warstwy.

Oto artykuł Pomocy ESRI dotyczący aktualizacji i naprawy źródeł danych za pomocą Arcpy Mapping

Pliki pomocy dla ArcGIS są ogólnie bardzo przydatne, ponieważ zawierają jasne objaśnienia oraz wiele próbek kodu w języku Python, które można po prostu skopiować / wkleić i zmodyfikować zgodnie z własnymi potrzebami.

Uzyskaj przestrzenny
źródło