Apakah mungkin untuk secara terprogram mengidentifikasi Field Gabung yang sedang digunakan untuk Tabel Gabung dua dataset bersama di ArcMap? Saat ini saya menggunakan ArcGIS 10.0, SP5 dan lebih suka solusi ArcPy , namun saya tidak akan menentang solusi lain, jika solusi ArcPy tidak tersedia.
Salah satu metode yang saya coba adalah mengulang-ulang semua bidang dan mencari "baseName" yang cocok, tapi itu hanya "tebakan terpelajar" di mana Anda berharap bahwa nama-nama bidang di kedua basis data sama.
Untuk representasi grafis dari apa yang saya cari, pada dasarnya saya ingin mengidentifikasi "Input Join Field" dan "Output Join Field" seperti yang terlihat dalam dialog "Add Join", tapi tentu saja setelahnya, tentu saja.
Ini adalah pertanyaan tag-on untuk Bisakah “Bergabung” dideteksi secara terprogram? , tetapi dalam kasus ini saya ingin memperluas fungsionalitas untuk mengidentifikasi FIELD (s) yang digunakan untuk menggabungkan dua (atau lebih) dataset bersama.
sumber
Jawaban:
Berikut ini adalah pendekatan ArcObjects, yang didasarkan pada contoh ini , untuk menghitung semua gabungan pada layer dan daftar tujuan dan nama tabel sumber dan kunci utama dan asing:
ILayer
yang memiliki satu atau lebih gabunganILayer
keIDisplayTable
IDisplayTable.DisplayTable
properti keIRelQueryTable
IRelQueryTable
:RelQueryTable
'sDestinationTable
danSourceTable
sifatOriginPrimaryKey
danOriginForeignKey
propertiIRelQueryTable.RelationshipClass
properti.RelQueryTable
'sSourceTable
propertiSkrip Python ini (menggunakan comtypes dan modul helper ini ) akan melewati semua gabungan , dari yang terbaru hingga yang paling awal, dan mencetak nama tabel tujuan dan sumber, kunci primer asal dan kunci asing asal untuk setiap bergabung:
Contoh output, diberi layer sumber dengan tiga gabungan:
Untuk info lebih lanjut, lihat Bagaimana cara mengakses ArcObjects dari Python?
sumber
"global name 'esriGeoDatabase' is not defined"
. Di mana / Bagaimana seharusnya didefinisikan dalam kode sebelum bariswhile CType(table, esriGeoDatabase.IRelQueryTable)
?esriGeoDatabase = GetESRIModule("esriGeoDatabase")
.layerList = arcpy.mapping.ListLayers(mxd)
ke dalamlistJoins(table)
kode, tetapi tidak muncul padawhile
pernyataan.app.Document
kembali dengan'NoneType' object has no attribute 'Document'
Masukkan semua data bidang dalam string, (setelah dipesan) membandingkannya dengan fungsi fuzzcompare dan memilih orang-orang yang memberikan kecocokan terbaik atau kecocokan dengan ketepatan tertentu.
Solusi ini adalah ketika beberapa data tidak cocok. Jika menurut Anda kedua kolom akan selalu pas, maka pesan saja dan bandingkan untuk pasangan yang cocok dengan fungsi perbandingan biasa.
sumber
Coba ini:
Gunakan alat Transformasi XSLT dari perangkat Metadata untuk menulis file metadata xml / html untuk dataset yang dimaksud.
Gunakan parser HTML untuk membaca dalam file metadata dan mencari bidang gabungan dari riwayat geoproses alat Gabung Bidang ini
Sampel keluaran dari alat Transformasi XSLT
sumber
Nama tabel yang tergabung ada di objek IFeatureLayer - IFeatureLayerDefinition sebagai string .. yang menurut saya mungkin berisi SQL join dan dengan demikian nama bidang.
http://edndoc.esri.com/arcobjects/8.3/diagrams/Map%20Layer%20Object%20Model.pdf
Atau maksud Anda jika Anda tidak dapat mengakses objek itu?
sumber
IFeatureLayerDefinition
tidak mengandung "join SQL", itu hanya memilikiDefinitionExpression
properti yang mengekspos permintaan definisi layer fitur, jika diatur, yang merupakan klausa WHERE yang membatasi baris yang ditampilkan.RelationshipClass
properti, tetapi saya pikir ini hanya memperlihatkan bergabung paling baru. Anda harus menggunakanIRelQueryTable
sebagai gantinya untuk mendapatkan semuanya.untuk menemukan bidang yang cocok terlepas dari nama bidang, Anda dapat melakukan sesuatu seperti ini:
sumber