Зміна шляху до джерела даних, що включає набір даних функції у файлах * .lyr за допомогою ArcPy?


11

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

Я стежив за оновленням та виправленням джерел даних за допомогою arcpy.mapping якнайкраще, але все, що я отримую, - це недобре, Runtime error <type 'exceptions.ValueError'>: Layer: Unexpected errorщо не підказує мені, щоб вирішити, що трапилось чи що не так.

Тут код (спрощений для тестування файлу з одним шаром):

import arcpy, os

fname = r'K:\Layers\xxx.lyr'
lyr = arcpy.mapping.Layer(fname)
oldpath = lyr.workspacePath
print 'oldpath: ', oldpath
lyr.findAndReplaceWorkspacePath(oldpath, r'C:\some\other.gdb')
print 'newpath: ', lyr.workspacePath

та результати:

oldpath:  K:\Canvec_Utility\Temp.gdb
Traceback (most recent call last):
  File "x10x.py", line 12, in <module>
    lyr.findAndReplaceWorkspacePath(oldpath, r'C:\some\other.gdb')
  File "C:\ESRI\ArcGIS\Desktop10.0\arcpy\arcpy\utils.py", line 181, in fn_
    return fn(*args, **kw)
  File "C:\ESRI\ArcGIS\Desktop10.0\arcpy\arcpy\_mapping.py", line 601, in findAndReplaceWorkspacePath
    return convertArcObjectToPythonObject(self._arc_object.findAndReplaceWorkspacePath(*gp_fixargs((find_workspace_path, replace_workspace_path, validate), True
)))
ValueError: Layer: Unexpected error

((переміщено розділ "оновлення" у відповідь))


Runtime error...цитував вище з інтерактивною оболонки Python в ARCCATALOG, який не дає відслідковує. Результати із зворотним відстеженням копіюються з командної оболонки.
matt wilkie

1
Чи переміщуєте ви дані чи з набору даних про функції, а також з робочої області?
geographika

@geographika: так, FDS змінюється так само, як і робоча область. Мене введено в оману документацією, в якій сказано, що не вказано FDS, і що mxd та lyr їх ігнорують. З іншого боку, валідація не ігнорує їх або, принаймні, не повністю (див. Мою відповідь).
matt wilkie

Відповіді:


7

Схоже, що правильний метод, який потрібно використовувати при переключенні наборів даних робочих просторів І функцій, - це lyr.replaceDataSource () . Ось мій робочий сценарій:

''' Change the datasource path for the given layer file '''

import arcpy, os

# layer file to re-path
fname = arcpy.GetParameterAsText(0)
# new path to workspace containing the feature class
target_wspace = arcpy.GetParameterAsText(1)
# where to save the layer files
savedir = arcpy.GetParameterAsText(2)

lyr = arcpy.mapping.Layer(fname)

fixed_fname = os.path.join(savedir, lyr.longName)

print '\nOld layer properties (%s)' % (fname)
print 'workspace:\t', lyr.workspacePath
print 'full path:\t', lyr.dataSource

try:
    lyr.replaceDataSource(target_wspace, 'FILEGDB_WORKSPACE', lyr.datasetName, True)
    lyr.saveACopy(fixed_fname)
except:
    print arcpy.GetMessages()

print '\nNew layer properties (%s)' % (fixed_fname)
print 'workspace:\t', lyr.workspacePath
print 'full path:\t', lyr.dataSource

del lyr

Під час тестування здається, що перевірка цього методу знову відрізняється: він підтверджує, що нове робоче поле є дійсним, але ігнорує клас функції та набори даних, тобто означає, що він не поверне помилку, якщо цільовий ФК не присутній.

З іншого боку, якщо цільовий FC присутній, навіть усередині іншого набору даних, новий шлях до джерела даних відповідно адаптується незалежно від того, чи підтверджено правдиве чи неправдиве.

Оновлення: тепер на Github для легшого обміну та перегляду.


Чи працює це, коли я хочу замінити файл .lyr source shp на новий? Я отримую ValueError: Layer: Несподівана помилка.
GeorgeC

@GeorgeC - Я знаю, що це стара публікація, але якщо хтось знайде це через пошукову систему, рішення цієї помилки, ймовірно, випаде .shp з імені набору даних. IOW третій аргумент для заміниDataSource повинен бути "newfile", а не "newfile.shp"
perrygeo

6

Недоцільне unexpected errorв цьому випадку означає щось на кшталт "нового шляху не існує" . Необов'язковий validateпараметр за замовчуванням відповідає True, якщо не вказано. Якщо помилково, скрипт завершується без помилок, але отримані файли шару все-таки були зламані, навіть незважаючи на те, що шлях призначення та клас функцій існують.

...    
lyr.findAndReplaceWorkspacePath(oldpath, r'C:\some\other.gdb', False)
...

результат

oldpath:  K:\code\Canvec\Scripts\Temp.gdb
newpath:  C:\some\other.gdb

На додаток до того, що спочатку не знали, чи підтверджено дефолт до істини, помилка чи хоча б якась химерна поведінка ускладнювали усунення несправностей. Оновлення та виправлення джерел даних за допомогою arcpy.mapping говорить Не включати назви наборів даних функцій у шлях робочої області. Набори даних про особливості є частиною робочої області. Якщо, наприклад, клас об’єктів переміщено з окремого класу об'єктів у набір даних про особливості, документ із картою все одно відкриється, без шару порушується " та " Якщо шар або таблиця в документі з картою або файлом шару переміщується в або з набору даних про функції, їх посилання не повинні бути розірвані. "

Виявляється, перевірка має дещо інший кут на це. Так, неважливо, де в новій базі даних геоданих (робочої області) знаходиться цільовий клас функцій , на верхньому рівні або в зовсім іншому наборі даних. Однак цільова робоча область повинна містити набір даних з тим самим іменем або перевірити помилки .

Розбиті та «зафіксовані» шари, як вони виглядають в Арккаталог та Аркмап

Джерела :

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