Восстановление источников данных в нескольких MXD с использованием ArcPy?

14

У меня есть около 50 mxd со всеми сломанными слоями, которые я проходил и сбрасывал вручную.

Данные были перенесены с другого компьютера, а структура папок была изменена, поэтому это не просто процесс изменения (пример):

«F: \ Data \ Rivers.shp» в «C: \ Data \ Rivers.shp»

это больше похоже на:

«F: \ Data \ Rivers.shp» в C: \ Data \ Park \ Water \ Rivers.shp

и так далее для всех видов данных (границы, растительный покров, дороги и т. д.), каждый из которых находится в отдельной подпапке.

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

Я использовал что-то вроде:

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

Тогда идея заключается в том, чтобы как-то добавить несколько сценариев «замены» в приведенном выше описании для других общих слоев, которые есть в моем mxd.

Однако приведенный выше скрипт даже не исправляет слой Rivers.

Как я могу заставить его работать, а также добавить в другие слои для ремонта, которые имеют разные пути к файлам?

Чез
источник

Ответы:

14

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

Когда вы используете функцию ListLayers , то, что возвращается, является Layerобъектом. Вы не можете сравнить это к , text stringчтобы увидеть , если они равны, вы должны получить доступ к имени из Layerвместо.

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

Чтобы добавить больше селекторов, вы просто расширяете if/thenчасть кода, чтобы искать разные имена слоев.

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

Просто продолжайте изменять nameселектор, чтобы найти какой-то конкретный уникальный слой в вашем .mxd, и добавьте replaceDataSourceфункцию для его обработки. Обратите внимание, что я использовал эту lowerфункцию при тестировании имени. Это также используется ESRI в их справочных документах, вероятно, из-за того, что он устраняет вероятность несоответствий в использовании заглавных букв, что приводит к несоответствию имени слоя.

Вот справочная статья ESRI об обновлении и исправлении источников данных с помощью Arcpy Mapping

Файлы справки для ArcGIS в целом очень полезны, так как содержат четкие пояснения и множество примеров кода Python, которые вы можете просто скопировать / вставить и изменить в соответствии с вашими потребностями.

Получить Пространственный
источник