Виявлення приєднання програмно за допомогою ArcPy?


10

У мене є якийсь код Python, який запускається в рамках проекту ArcMap. Будь-які приєднання, які, можливо, створив користувач у проекті, повинні бути видалені, щоб мій код запустився. На жаль, код, який видаляє з'єднання… arcpy.RemoveJoin_management ("layer1", "layer2") ... також порушує деякі властивості шару, які є критичними для моєї програми (виділені поля, поля лише для читання тощо).

Якщо з'єднання видалено, клацнувши правою кнопкою миші шар в ArcMap та вибравши «Видалити приєднання», властивості шару залишаються неушкодженими.

Якщо я можу виявити, що приєднання існує з мого коду, я просто вийду з коду і покажу повідомлення про те, що користувач повинен вручну видалити свої об'єднання, перш ніж спробувати запустити код. Отже ... Чи можна виявити приєднання програмно?


Я трохи розгубився з тим, як виконання RemoveJoin через arcpy викликає проблеми. Як ідеться про зруйнування поля лише для читання? Також, чи використання інструменту "Remove Join" в ArcMap викликає ті самі проблеми?
Нафан

Може бути, іншим способом вирішити це було б зробити ваш пітон-код нечутливим до приєднання?
Дан С.

@ Nathanus - Посібник Видалити приєднання в ArcMap не порушує властивості мого шару, як це робить інструмент GP. Ось відповідна цитата довідки ESRI: "Оскільки ці інструменти виконують фактичну позакупову обробку з'єднання дещо інакше, ніж діалогове вікно" Дані об'єднання ", використовуйте інструменти, якщо у цьому діалоговому вікні виникнуть несподівані проблеми з функцією приєднання. "
BrianPeasley

@ Dan S. - Я використовую в своєму коді вставні курсори та інше. Я поняття не маю, як би я міг зробити свій код нечутливим до об'єднань.
BrianPeasley

1
ну, варто було запитати. ;) forums.esri.com/Thread.asp?c=93&f=1729&t=293173, мабуть, означає, що ви, можливо, зможете оновити значення в об'єднаній таблиці, встановивши префіксацію назв стовпців за назвою таблиці; можливо, це також спрацює над вставкою?
Дан С.

Відповіді:


8

Шкода, що в класі arcpy.Layer немає властивості hasJoin . Я думаю, ви можете протестувати на приєднання, хоча подивившись назви полів. Ось простий доказ концепції для даних у базі даних геоданих:

import arcpy, arcpy.mapping as arc

def joinCheck(lyr):
  fList = arcpy.Describe(lyr).fields
  for f in fList:
    if f.name.find(lyr.datasetName) > -1:
      return True
  return False

arcpy.env.workspace = r'<path_to_your_gdb>'
mxd = arc.MapDocument(r'<path_to_your_mxd>')
lyrs = arc.ListLayers(mxd)
for lyr in lyrs:
  # ignore group layers
  if not lyr.isGroupLayer:
    hasJoin = joinCheck(lyr)
    if hasJoin:
      print '\nFound a join: %s.' % lyr.datasetName
    else:
      print '\nNo join found on %s.' % lyr.datasetName

Це виглядає перспективно! Я не розумію м'яса того, що він робить: "якщо f.name.find (lyr.datasetName)> -1:", але я спробую це через кілька днів і звітую (я збираюся засніжувати в & втратити силу!) ... Дякую!
BrianPeasley

Радий допомогти. Ознайомтесь із вбудованим методом пошуку для рядків python: docs.python.org/library/string.html, а також doc для об’єктів поля arcpy : help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#/ Поле /… Я б сказав, дайте цей код знімати ваші дані та подивіться, чи працює він.
Дерек Свінглі

2
Я в кінцевому підсумку використовував функцію, дуже схожу на цю, і вона чудово працює ... Для кожного шару в моєму документі я перебираю список полів і використовую Python, щоб визначити, чи є в точці поля "крапка".
BrianPeasley

"Точка" у підході до імені поля - це вибір за допомогою модуля arcpy.mp (pro), оскільки
Aamir Suleman

1

Я думаю, що ви побачите, що немає бронезахисного способу зробити це з об’єктами GP, вам потрібно буде використовувати ArcObjects та comtypes. Ось декілька обговорень з форумів ESRI щодо труднощів у перевірці приєднання до стандартних інструментів / об’єктів GP: https://geonet.esri.com/thread/20317


ArcObjects та comtypes не збираються вирішувати цей проект, вони мені чужі, і цей проект має відбутися вчора. Дякуємо, що вказали мені на цю тему на форумі! Я спробую запропоновану там ідею: "... перевірити, чи не призвело б до будь-якого з fieldname.split (".) У двох частинах, першою з яких стала таблиця
приєднання
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.