Di bawah ini adalah kode yang saya gunakan untuk mereplikasi tombol "tabel terkait" di ArcMap. Di ArcMap tombol itu memilih fitur dalam satu kelas fitur atau tabel berdasarkan pemilihan fitur di kelas atau tabel fitur terkait lainnya.
Di ArcMap saya dapat menggunakan tombol itu untuk "mendorong" pilihan saya ke tabel terkait dalam hitungan detik. Saya tidak dapat menemukan apa pun yang ada di dalam untuk arcpy yang mereplikasi tombol jadi saya menggunakan beberapa loop bersarang untuk melakukan tugas yang sama.
Kode di bawah ini loop melalui tabel "perawatan". Untuk setiap perawatan, itu loop melalui daftar "pohon". Ketika kecocokan ditemukan antara bidang ID pengobatan dan pohon, pilihan terjadi di lapisan pohon. Setelah kecocokan ditemukan untuk perawatan, kode tidak melanjutkan mencari lapisan pohon untuk kecocokan tambahan. Itu kembali ke tabel perawatan, memilih perawatan berikutnya dan lagi mencari melalui kelas fitur pohon.
Kode itu sendiri berfungsi dengan baik, tetapi lambat sekali. "Tabel perawatan" dalam kasus ini memiliki 16.000 catatan. Kelas fitur "tree" memiliki 60.000 catatan.
Apakah ada cara lain yang lebih efisien untuk menciptakan kembali apa yang dilakukan ESRI ketika mendorong seleksi dari satu meja ke meja lainnya? Haruskah saya membuat indeks untuk tabel? CATATAN: Data ini disimpan dalam SDE.
# Create search cursor to loop through the treatments
treatments = arcpy.SearchCursor(treatment_tv)
treatment_field = "Facility_ID"
for treatment in treatments:
#Get ID of treatment
treatment_ID = treatment.getValue(treatment_field)
# Create search cursor for looping through the trees
trees = arcpy.SearchCursor(tree_fl)
tree_field = "FACILITYID"
for tree in trees:
# Get FID of tree
tree_FID = tree.getValue(tree_field)
if tree_FID == treatment_FID:
query = "FACILITYID = " + str(tree_FID)
arcpy.SelectLayerByAttribute_management(tree_fl, "REMOVE_FROM_SELECTION", query)
break
Jawaban:
Pertama, ya Anda pasti ingin memastikan bidang kunci utama dan asing Anda diindeks di kedua tabel. Ini memungkinkan DBMS merencanakan dan menjalankan kueri terhadap bidang-bidang ini dengan lebih efisien.
Kedua, Anda memanggil
SelectLayerByAttribute_management
lingkaran ketat, bersarang (sekali per pohon per perawatan). Ini sangat tidak efisien, karena beberapa alasan:Alih-alih, perbaiki kode Anda sehingga Anda menelepon
SelectLayerByAttribute_management
sekali saja dengan alasan dibangun untuk memilih semua catatan terkait.Meminjam fungsi dari jawaban lain untuk logika konstruksi karena itu, saya membayangkan itu akan terlihat seperti ini:
Anda bisa menyebutnya seperti ini:
selectRelatedRecords(treatment_tv, tree_fl, "Facility_ID", "FACILITYID")
Catatan:
Ini menggunakan
arcpy.da.SearchCursor
, hanya tersedia di 10.1. Seperti @PolyGeo sebutkan, kursor ini jauh lebih cepat dari pendahulunya (arcpy.SearchCursor
). Itu bisa dengan mudah dimodifikasi untuk menggunakan SearchCursor lama:Jika geodatabase SDE Anda menggunakan Oracle, berhati-hatilah bahwa
IN
pernyataan yang digunakan dalam fungsi dari jawaban yang ditautkan terbatas pada 1000 elemen. Satu solusi yang mungkin dijelaskan dalam jawaban ini , tetapi Anda harus memodifikasi fungsi untuk membaginya menjadi beberapaIN
pernyataan panjang 1000 bukannya satu.sumber
Solusi di atas berfungsi baik untuk saya dan sangat cepat. Menggunakan kode di atas dan kode referensi dari posting lain ini adalah bagaimana saya membangunnya:
sumber