Czy jest możliwe programowe zidentyfikowanie pola łączenia, które jest używane do łączenia tabeli dwóch zestawów danych w ArcMap? Obecnie używam ArcGIS 10.0, SP5 i wolę rozwiązanie ArcPy , jednak nie sprzeciwiałbym się innym rozwiązaniom, jeśli rozwiązanie ArcPy nie jest dostępne.
Jedną z metod, które wypróbowałem, było zapętlenie wszystkich pól i poszukiwanie pasującego „baseName”, ale jest to tylko „wyuczone przypuszczenie”, w którym masz nadzieję, że nazwy pól w obu bazach danych są takie same.
Aby przedstawić graficznie to, czego szukam, zasadniczo chcę zidentyfikować „wejściowe pole łączenia” i „wyjściowe pole łączenia”, jak widać w oknie dialogowym „Dodaj łączenie”, ale oczywiście po fakcie.
To jest pytanie do tagu. Czy program „Dołącz” może zostać wykryty programowo? , ale w tym przypadku chcę rozszerzyć funkcjonalność w celu identyfikacji FIELD (ów) używanych do łączenia dwóch (lub więcej) zestawów danych razem.
źródło
Odpowiedzi:
Oto podejście ArcObjects, oparte na tym przykładzie , w celu wyliczenia wszystkich złączeń na warstwie i wyświetlenia ich nazw miejsc docelowych i tabel źródłowych oraz kluczy podstawowych i obcych:
ILayer
który ma jedno lub więcej złączeńILayer
doIDisplayTable
IDisplayTable.DisplayTable
właściwość doIRelQueryTable
IRelQueryTable
:RelQueryTable
„sDestinationTable
iSourceTable
właściwościOriginPrimaryKey
iOriginForeignKey
właściwościIRelQueryTable.RelationshipClass
nieruchomości.RelQueryTable
„sSourceTable
nieruchomościTen skrypt w języku Python (wykorzystujący komty i ten moduł pomocniczy ) przejdzie przez wszystkie złączenia, od najnowszego do najwcześniejszego, i wydrukuje nazwy tabeli docelowej i źródłowej, pierwotny klucz źródłowy i początkowy klucz obcy dla każdego złączenia:
Przykładowe dane wyjściowe, biorąc pod uwagę warstwę źródłową z trzema połączeniami:
Aby uzyskać więcej informacji, zobacz Jak uzyskać dostęp do ArcObjects z Python?
źródło
"global name 'esriGeoDatabase' is not defined"
. Gdzie / jak należy to zdefiniować w kodzie poprzedzającym wierszwhile CType(table, esriGeoDatabase.IRelQueryTable)
?esriGeoDatabase = GetESRIModule("esriGeoDatabase")
.layerList = arcpy.mapping.ListLayers(mxd)
dolistJoins(table)
kodu, ale pomija onwhile
instrukcję.app.Document
wraca z'NoneType' object has no attribute 'Document'
Umieść wszystkie dane pól w ciągach, (po ich zamówieniu) porównaj je z funkcją fuzzycompare i wybierz te, które dały najlepsze dopasowanie lub dopasowanie, z określoną precyzją.
To rozwiązanie występuje, gdy niektóre dane nie pasują. Jeśli uważasz, że obie kolumny zawsze pasują, po prostu zamów i porównaj, aby uzyskać idealne dopasowanie za pomocą zwykłej funkcji porównania.
źródło
Spróbuj tego:
Użyj narzędzia Przekształcenie XSLT z zestawu narzędzi Metadane, aby zapisać plik metadanych xml / html dla danego zestawu danych.
Użyj parsera HTML, aby odczytać plik metadanych i wyszukać pole złączenia z historii geoprzetwarzania narzędzia Połącz pole
Przykładowe dane wyjściowe z narzędzia Transformacja XSLT
źródło
Połączone nazwy tabel znajdują się w obiekcie IFeatureLayer - IFeatureLayerDefinition jako ciąg znaków, który, jak sądzę, prawdopodobnie zawiera sprzężony SQL, a tym samym nazwy pól.
http://edndoc.esri.com/arcobjects/8.3/diagrams/Map%20Layer%20Object%20Model.pdf
Czy masz na myśli, że nie możesz uzyskać dostępu do tego obiektu?
źródło
IFeatureLayerDefinition
nie zawiera „dołączenia SQL”, ma jedynieDefinitionExpression
właściwość ujawniającą zapytanie definicji warstwy obiektów, jeśli jest ustawione, co jest klauzulą WHERE ograniczającą liczbę wyświetlanych wierszy.RelationshipClass
właściwość, ale myślę, że ujawnia to tylko ostatnie sprzężenie. Musisz użyćIRelQueryTable
zamiast tego, aby uzyskać je wszystkie.aby znaleźć pasujące pola niezależnie od nazwy pola, możesz zrobić coś takiego:
źródło