Sejauh ini, Mengakses ArcObjects dari Python? adalah T&J saya yang paling banyak dibaca dan direferensikan di GIS Stack Exchange. Terlepas dari keberhasilan itu, itu mungkin salah satu area terlemah saya dalam hal penggunaan aktual. Sebagian besar dari pertunjukan yang buruk itu berasal dari kemampuan saya yang buruk untuk membaca dan memahami dokumen ArcObjects .
Jadi, untuk tugas apa pun, apa saja panduan untuk menerjemahkan .net / c ++ / java / ... dokumen dan contoh ke dalam persamaan python mereka? (bahasa manakah yang paling cocok untuk bekerja?) dan dari mana indeks atau halaman arahan terbaik untuk memulai? hal-hal apa yang harus difokuskan, dan kemungkinan setidaknya sama pentingnya, apa yang dapat diabaikan dengan bebas?
Asumsikan audiens Anda setidaknya sedikit melek python, dan buta huruf dalam bahasa pengembangan lainnya. Arahkan kami melalui latihan pengkodean kecil, dari ide awal dan penelitian hingga hasil python yang bekerja.
sumber
Jawaban:
Saya juga tidak terlalu kuat di bidang ini, tetapi saya telah memodifikasi modul Snippets dan membuat beberapa pembungkus untuk tugas yang sangat sederhana. Saya punya contoh hanya menambahkan elemen garis. Contoh di bawah blok utama membentuk segitiga ke tampilan tata letak tepat di luar dokumen.
Saya menggunakan skrip ini bersama dengan kursor pencarian lain dan tidak jelas untuk membuat tabel grafik dalam tata letak dari setiap baris dan elemen teks, tetapi itu dengan cepat menjauh dari contoh "sederhana". Kode di bawah ini cukup sederhana dan menggunakan snippet versi yang dimodifikasi:
Edit:
@ mat wilkie
Adapun untuk mencari tahu impor, di situlah Anda harus melihat Diagram Model ArcObjects atau melihat namespace mana Kelas atau Antarmuka tertentu dipanggil dari dalam. NET SDK help docs. Dalam beberapa kasus, lebih dari satu namespace dapat digunakan karena warisan.
Saya bukan ahli dalam ArcObjects, jadi biasanya saya perlu waktu untuk mencari tahu kapan harus membuang sesuatu dengan CType (). Sebagian besar dari ini, saya telah mengambil dari sampel online. Juga, sintaks dari contoh VB.NET tampaknya lebih dekat dengan apa yang Anda lakukan dengan Python, tetapi contoh C # lebih masuk akal bagi saya dalam hal keterbacaan (jika itu masuk akal). Tapi, sebagai patokan saya biasanya mengikuti dua langkah ini:
Tidak yakin apakah saya menggunakan terminologi yang tepat atau tidak ... Saya terutama pengembang Python yang "mencoba-coba" di beberapa ArcObjects ... Saya hanya menyentuh ujung gunung es.
Juga, fungsi pembantu ini akan memuat semua Perpustakaan Objek ArcObjects (.olb):
sumber
import comtypes.gen.esriArcMapUI as esriArcMapUI
dan kemudian menggunakanpMxDoc = CType(pDoc, esriArcMapUI.IMxDocument)
(dan mengungkap sintaks dalam pernyataan itu)?Dalam posting lain, terkait tapi sedikit berbeda, saya memberikan jawaban yang mungkin menarik bagi pengguna python mencoba untuk membungkus kepala mereka di sekitar Esri ArcObjects membantu dokumen ..
Saya datang dari sisi lain: Saya sudah tahu ArcObjects lama (lama sekali) bahkan sebelum saya mendengar tentang python dan terima kasih untuk posting seperti ini saya dapat memasukkan beberapa ArcObjects kritis dalam skrip mudah python (lihat posting ini sebagai contoh ). Saya ingat frustrasi mencoba memahami warisan, metode, dan properti; dilema seperti saya punya X yang semacam terkait dengan Y ... jadi bagaimana saya dapatkan dari X ke Y.Method ()?
Jawabannya adalah untuk melihat CoClasses yang mengimplementasikan antarmuka (lihat teks lengkap di sini ) .. untuk contoh dasar, jika saya ingin melihat apakah sebuah layer memiliki kueri definisi, dan jika demikian apa itu:
Dalam C #:
Alih-alih
ctype
(yang menonjol dalam VB) C # menggunakan()
atauas
untuk casting, misalnyaIObject x = (IObject)y;
(secara fundamental) sama denganIObject x = y as IObject;
yang akandim x as IObject = ctype(y,IObject)
di VB.Saya dapat mengatakan bahwa saya memerlukan IFeatureLayer untuk sampai ke IFeatureLayerDefinition karena:
Dan ketika Anda membaca dokumen bantuan untuk IFeatureLayer, Anda melihat:
Yang menunjukkan bahwa itu aman untuk pergi ILayer-> IFeatureLayer-> IFeatureLayerDef, asalkan ILayer adalah tipe FeatureLayer (atau CoClasses lainnya).
Jadi ada apa dengan aku dan tidak? Antarmuka I berarti, itu bit yang berfungsi, tanpa I adalah CoClass ( tipe ), jadi apa pun yang ingin Anda gunakan benar-benar harus dimulai dengan I dan jika Anda membuat yang baru atau memeriksa jenisnya lalu lewati I. Antarmuka dapat memiliki banyak CoClasses dan CoClass dapat mendukung banyak antarmuka, tetapi antarmuka itulah yang sebenarnya berfungsi.
Dengan python:
Sampel ini melakukan sedikit lebih banyak daripada C karena menemukan jalannya ke aplikasi saat ini, yang hanya akan tersedia di jendela python atau addin, jika Anda mencoba menjalankan ini dari baris perintah, aplikasi tersebut Null dan skrip kemudian akan macet dengan pengecualian referensi nol.
sumber