Pertanyaan ini dapat mengekspos ketidaktahuan saya pada pemrograman tapi saya ingin tahu tentang bagaimana orang menggunakan struktur data python yang berbeda dalam ArcPy.
Halaman ini mencantumkan struktur data dalam Python. Saya mengerti bagaimana daftar dapat diimplementasikan dalam GIS (daftar kelas fitur, daftar jenis fitur, daftar bingkai data, dll). Saya mengerti bagaimana set dapat digunakan juga (untuk menghapus duplikat). Bagaimana orang-orang mengimplementasikan tupel, kamus, dan struktur data lainnya dalam ArcPy? Juga, apakah ada contoh daftar dan set lain yang belum saya daftarkan?
Selain itu, tidak diragukan lagi, orang-orang membuat kelas khusus di ArcPy. Dalam situasi dan situasi apa Anda membutuhkan ini? Bisakah Anda memberikan contoh? Adakah yang membuat kelas khusus yang diwarisi dari kelas arcpy bawaan?
Saya tidak memerlukan jawaban untuk semua pertanyaan ini, saya hanya ingin tahu bagaimana orang menggunakan Python di GIS dan alur kerja apa yang membutuhkan penyesuaian ini.
sumber
Jawaban:
Banyak fungsi arcpy yang mengambil banyak input menerima objek daftar Python.
Misalnya
Dissolve_management
fungsi menerima daftar nama bidang untuk dibubarkan pada:Sebuah tuple dapat digunakan sebagai pengganti daftar ketika Anda tidak perlu mengubah urutan atau jumlah elemen, karena tupel tidak dapat diubah . Mereka adalah struktur data yang berguna untuk potongan data yang heterogen tetapi terkait, seperti elemen cap waktu atau koordinat suatu titik. Anda akan sering melihat daftar tupel, di mana tupel berfungsi sebagai catatan berbeda dengan sejumlah atribut tetap, sementara daftar dapat dengan mudah mengubah ukuran, dipesan ulang (disortir), dll. Lihat pertanyaan StackOverflow ini untuk informasi lebih lanjut tentang penggunaannya daftar vs tupel.
Kamus dapat digunakan sebagai tabel pencarian cepat untuk menyimpan satu set pasangan nilai kunci yang relatif kecil namun sering digunakan ke dalam memori. Saya melihat contoh yang menarik dari ini di forum ArcGIS: http://forums.arcgis.com/threads/55099-Update-cursor-with-joined-tables-work-around-w-dictionaries
Penggunaan kamus mereka sebagai gantinya mempercepat perhitungan mereka dari 3,5 jam menjadi 15 menit.
Contoh yang lebih sederhana adalah jika Anda memiliki sejuta catatan alamat dengan atribut dengan nama negara disingkat (CA), tetapi untuk tujuan tampilan Anda ingin mengeja nama yang tepat (California), Anda bisa menggunakan kamus ini sebagai tabel pencarian saat mengisi bidang nama negara penuh.
Saya belum menemukan kebutuhan untuk menulis kelas dengan Python untuk digunakan di arcpy sendiri, tetapi itu tidak berarti tidak ada use case seperti itu. Kelas mungkin berguna ketika Anda memiliki serangkaian fungsi terkait erat (perilaku) yang beroperasi pada beberapa input (data), dan Anda ingin dapat menggunakan data dan perilaku tersebut dengan cara yang berorientasi objek, tetapi ini lebih kemungkinan akan menjadi logika bisnis khusus dan tidak terkait dengan arcpy.
sumber
Blah238 membahas topik ini dengan baik, jadi saya hanya akan menambahkan beberapa contoh dari karya saya sendiri. Saya mengembangkan banyak data bandara, dan salah satu hal yang harus saya lakukan adalah membaca secara teratur di sepanjang titik garis tengah landasan yang disurvei dari landasan. Anda akan berpikir bahwa poin-poin ini sudah dalam urutan (dalam database GIS), tetapi jarang. Poin garis tengah terjadi setiap 10 kaki di sepanjang garis tengah dan diapit di kedua sisi oleh dua baris titik survei yang berjarak 10 kaki. Anda mendapatkan gambar: sejumlah besar poin ... dan biasanya semua dicampur dalam basis data bersama. Dengan apa yang saya lakukan dalam skrip saya, biasanya paling mudah untuk hanya memilih titik tengah berdasarkan atribut (atau jika perlu spasial), membaca koordinat untuk masing-masing, dan membuang hasilnya ke dalam daftar Python. Saya kemudian bisa mengurutkan, pop, membalikkan, dll.
Demikian juga, saya menggunakan kamus Python secara luas (mungkin jauh lebih banyak dari yang disetujui). Saya harus membuat set vektor unit 3D untuk setiap ujung landasan di bandara, dan saya mengaksesnya secara konstan dalam skrip dan melakukan ini di banyak skrip saya. Saya juga menyimpan banyak set data yang diakses secara teratur dalam kamus. Seperti daftar, mereka cepat dan fleksibel. Sangat dianjurkan.
Sejauh kelas berjalan, seperti Blah238, saya belum menemukan kebutuhan untuk membuatnya. Mungkin ada beberapa kasus di mana kelas akan lebih disukai dalam skrip saya, tetapi saya benar-benar belum dapat mengidentifikasi tempat-tempat itu. Seseorang dengan pengalaman pemrograman yang lebih banyak mungkin akan menemukannya dengan cepat.
sumber
Saya juga suka kamus - gunakan mereka sepanjang waktu. Metode ini mendapatkan beberapa properti referensi spasial dan menyimpan semuanya dalam sebuah dikt:
Cuplikan metode ini mengekstrak geometri titik dari dua kacamata fitur, kemudian saya gunakan geometri untuk melakukan beberapa trigonometri:
BANYAK dari apa yang saya kerjakan saat ini melibatkan penggalian koordinat dan atribut dari kelas fitur vektor dan raster sehingga data dapat didorong ke perangkat lunak lain yang bahkan tidak tahu apa data GIS. Jadi, saya banyak menggunakan daftar dan kamus untuk ini.
sumber
Baca ini sambil menyusun jawaban dan harus mengedit ..
Saya bukan ahli Python tapi saya pikir ide di balik menggunakan kelas adalah bahwa Anda dapat instantiate objek yang memiliki banyak metode siap untuk pergi yang berhubungan dengan struktur data serta memusatkan metode Anda. Ada juga beberapa manfaat ruang lingkup variabel dengan kelas vs modul, tautan di atas sampai ke titik ini agak.
Saya memiliki kelas bernama featureLayer (mungkin bukan pythonic-ly bernama ... masih belajar). dapat saya lakukan
Definisi untuk melakukan ini adalah metode kelas yang hanya mengulangi fitur, bagian, dan simpul. Kemudian saya dapat mengubah objek poin saya menjadi instance featureLayer dan melakukan hal-hal lain yang dimiliki kelas saya.
Saya pikir jika dibangun dengan benar, kelas harus menambah fungsionalitas. Sebagai contoh, segera saya akan mulai refactoring sehingga saya memiliki kelas featureLayer yang memiliki metode dan atribut yang dimiliki semua lapisan fitur. Kemudian mewarisi darinya untuk membangun instance class featureLayerStrict yang akan mewarisi semua atribut / metode featureLayers tetapi akan instantiate dengan tipe geometri tertentu seperti poligon.
sumber
Saya bekerja terutama di VB. Net tetapi menemukan diri saya menggunakan python dan arcpy semakin banyak. Di VB saya suka dan mencoba menggunakan Enums karena membuat membaca kode lebih jelas. Versi python sebelumnya tidak mengimplementasikan Enums sehingga peretasan dilakukan untuk membuat Kelas yang mengekspos beberapa properti, banyak contoh dibahas pada Stack Overflow . Sekarang terlihat seperti versi terbaru dari implementasi python yang dibahas di sini .
sumber