Відновлення джерел даних у кількох MXD за допомогою ArcPy?


14

У мене є близько 50 mxd з усіма розбитими шарами, які я переживав і вручну скидав.

Дані було переміщено з іншого комп'ютера, і структура папки була змінена, так що це не просто простий процес зміни (приклад):

"F: \ Дані \ Rivers.shp" до "C: \ Data \ Rivers.shp"

це більше схоже на:

"F: \ Data \ Rivers.shp" до C: \ Data \ Park \ Water \ Rivers.shp

і так далі для всіх видів даних (межі, покриття veg, дороги тощо), кожен у своїй підпапці.

Я хочу зробити сценарій, який я можу запускати повторно кожного разу, коли я відкриваю один з цих 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.

Однак вищезазначений сценарій навіть не фіксує шар Річки.

Як я можу змусити його працювати, а також додати до ремонту інших шарів, які мають різні шляхи до файлів?

Відповіді:


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, які ви можете просто скопіювати / вставити та змінити відповідно до ваших конкретних потреб.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.