Обнаружение Присоединиться программно, используя ArcPy?

10

У меня есть некоторый код Python, который запускается из проекта ArcMap. Любые объединения, которые пользователь, возможно, создал в проекте, должны быть удалены, чтобы мой код работал. К сожалению, код, который удаляет соединение… arcpy.RemoveJoin_management («layer1», «layer2»)… также нарушает некоторые свойства слоя, которые важны для моего приложения (выделенные поля, поля только для чтения и т. Д.).

Если объединения удаляются, если щелкнуть правой кнопкой мыши слой в ArcMap и выбрать «Удалить объединения», свойства слоя останутся без изменений.

Если я могу обнаружить, что соединение существует из моего кода, я просто выйду из кода и покажу сообщение, что пользователь должен вручную удалить свои объединения перед попыткой выполнения кода. Итак ... Может ли соединение быть обнаружено программно?

BrianPeasley
источник
Я немного растерялся из-за того, что удаление RemoveJoin через arcpy вызывает проблемы. Как происходит разрушение поля только для чтения? Кроме того, использование инструмента «Удалить объединение» в ArcMap вызывает те же проблемы?
Натанус
Может быть, еще один способ решить эту проблему - сделать ваш код на Python нечувствительным к соединениям?
Дан С.
@ 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
Дерек Суингли
источник
Это выглядит многообещающе! Я не понимаю суть того, что он делает: «if f.name.find (lyr.datasetName)> -1:», но я попробую это через несколько дней и сообщу (у меня скоро будет снег) в & потерять власть!) ... Спасибо!
BrianPeasley
Рад помочь. Проверьте встроенный метод поиска для строк Python: docs.python.org/library/string.html, а также документ для объектов поля arcpy : help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#/ Поле /… Я бы сказал, чтобы этот код был проверен с вашими данными и посмотреть, работает ли он.
Дерек Свингли
1
В итоге я использовал функцию, очень похожую на эту, и она прекрасно работает ... Для каждого слоя в моем документе я перебираю список полей и использую Python, чтобы определить, есть ли «точка» в имени поля.
BrianPeasley
1

Я думаю, вы обнаружите, что не существует пуленепробиваемого способа сделать это с объектами GP, вам нужно использовать ArcObjects и comtypes. Вот некоторые обсуждения на форумах ESRI о трудностях проверки соединений с помощью стандартных инструментов / объектов GP: https://geonet.esri.com/thread/20317

blah238
источник
ArcObjects и comtypes не будут решением для этого проекта, они чужды мне, и этот проект должен выйти вчера. Спасибо, что указал мне на эту ветку форума! Я собираюсь попробовать идею, представленную там: «... проверим, приведет ли любое из fieldname.split (».) К
двум