Можно ли программно идентифицировать поле соединения , которое используется для объединения двух наборов данных в ArcMap? В настоящее время я использую ArcGIS 10.0, SP5 и предпочитаю решение ArcPy , однако я не буду против других решений, если решение ArcPy недоступно.
Один из методов, который я пробовал, заключался в том, чтобы пройтись по всем полям и найти соответствующее «baseName», но это всего лишь «обоснованное предположение», когда вы надеетесь, что имена полей в обеих базах данных совпадают.
Для графического представления того, что мне нужно, я в основном хочу определить «Поле входного соединения» и «Поле выходного соединения», как это видно в диалоговом окне «Добавить объединение», но, конечно же, постфактум.
Это вопрос к тегу « Можно ли программно обнаружить« Присоединение »? , но в этом случае я хочу расширить функциональность, чтобы идентифицировать поля, которые используются для объединения двух (или более) наборов данных вместе.
источник
Ответы:
Вот подход ArcObjects, основанный на этом примере , для перечисления всех соединений в слое и перечисления их имен таблиц назначения и исходных таблиц, а также первичных и внешних ключей:
ILayer
одно или несколько объединенийILayer
кIDisplayTable
IDisplayTable.DisplayTable
собственность кIRelQueryTable
IRelQueryTable
:RelQueryTable
«SDestinationTable
иSourceTable
свойстваOriginPrimaryKey
иOriginForeignKey
свойстваIRelQueryTable.RelationshipClass
собственности.RelQueryTable
«sSourceTable
недвижимостиЭтот сценарий Python (с использованием comtypes и этого вспомогательного модуля ) будет проходить через все объединения, от самого раннего до самого раннего, и печатать имена таблиц назначения и исходной таблицы, первичный ключ источника и внешний ключ источника для каждого соединения:
Пример вывода для исходного слоя с тремя объединениями:
Для получения дополнительной информации см. Как получить доступ к ArcObjects из Python?
источник
"global name 'esriGeoDatabase' is not defined"
. Где / Как это должно быть определено в коде, предшествующем строкеwhile CType(table, esriGeoDatabase.IRelQueryTable)
?esriGeoDatabase = GetESRIModule("esriGeoDatabase")
.layerList = arcpy.mapping.ListLayers(mxd)
вlistJoins(table)
код, но он пропускает приwhile
утверждении.app.Document
возвращается с'NoneType' object has no attribute 'Document'
Поместите все данные полей в строки, (после их упорядочивания) сравните их с функцией нечеткого сравнения и выберите тех, кто дал наилучшее совпадение или совпадение с определенной точностью.
Это решение, когда некоторые данные не подходят. Если вы считаете, что оба столбца всегда подходят, просто упорядочите и сравните для идеального соответствия с обычной функцией сравнения.
источник
Попробуй это:
Используйте инструмент XSLT Transformation из набора инструментов метаданных, чтобы записать файл метаданных xml / html для рассматриваемого набора данных.
Используйте анализатор HTML для чтения в файле метаданных и поиска поля соединения из истории геообработки инструмента Поле соединения
Пример вывода из инструмента XSLT Transformation
источник
Имена соединенных таблиц находятся в объекте IFeatureLayer - IFeatureLayerDefinition в виде строки, которая, я думаю, вероятно, содержит объединяющий SQL и, следовательно, имена полей.
http://edndoc.esri.com/arcobjects/8.3/diagrams/Map%20Layer%20Object%20Model.pdf
Или вы имеете в виду, если вы не можете получить доступ к этому объекту?
источник
IFeatureLayerDefinition
не содержит "SQL соединения", у него есть толькоDefinitionExpression
свойство, отображающее запрос определения векторного слоя, если он установлен, - это предложение WHERE, которое ограничивает отображаемые строки.RelationshipClass
свойство, но я думаю, что это только самое последнее соединение. Вы должны использоватьIRelQueryTable
вместо этого, чтобы получить их все.чтобы найти подходящие поля независимо от имени поля, вы можете сделать что-то вроде этого:
источник