Bagaimana orang menggunakan struktur dan kelas data Python di ArcPy?


16

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.


4
Pertanyaan yang menarik tetapi ini tidak memiliki jawaban yang pasti. Harus menjadi wiki komunitas.
RK

Jawaban:


14

Banyak fungsi arcpy yang mengambil banyak input menerima objek daftar Python.

Misalnya Dissolve_managementfungsi menerima daftar nama bidang untuk dibubarkan pada:

arcpy.Dissolve_management("taxlots", "C:/output/output.gdb/taxlots_dissolved",
    ["LANDUSE", "TAXCODE"], "", "SINGLE_PART", "DISSOLVE_LINES")

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.


7

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.


5

Saya juga suka kamus - gunakan mereka sepanjang waktu. Metode ini mendapatkan beberapa properti referensi spasial dan menyimpan semuanya dalam sebuah dikt:

def get_coord_sys(self, in_dataset):
    """Get and return info on dataset coord sys/projection"""
    spatial_ref = arcpy.Describe(in_dataset).spatialReference
    # Get spatial ref props and put in dictionary
    spat_ref_dict = {}
    spat_ref_dict["name"] = spatial_ref.name
    spat_ref_dict["type"] = spatial_ref.type
    spat_ref_dict["gcs_code"] = spatial_ref.GCSCode
    spat_ref_dict["gcs_name"] = spatial_ref.GCSName
    spat_ref_dict["pcs_code"] = spatial_ref.PCSCode
    spat_ref_dict["pcs_name"] = spatial_ref.PCSName
    return spat_ref_dict

Cuplikan metode ini mengekstrak geometri titik dari dua kacamata fitur, kemudian saya gunakan geometri untuk melakukan beberapa trigonometri:

def build_fields_of_view(self):
        """For all KOPs in a study area, build left, right, center FoV triangles"""
        try:    
            fcs = {os.path.join(self.gdb, "WindFarmArray"):[], os.path.join(self.gdb, "KOPs"):[]}
            # Build a dict of WTG and KOP array geometries, looks like:
            #  {'KOPs': [[1, -10049.2697098718, 10856.699451165374], 
            #            [2, 6690.4377855260946, 15602.12386816188]], 
            #   'WindFarmArray': [[1, 5834.9321158060666, 7909.3822339441513], 
            #                     [2, 6111.1759513214511, 7316.9684107396561]]}
            for k, v in fcs.iteritems():
                rows = arcpy.SearchCursor(k, "", self.sr)
                for row in rows:
                    geom = row.shape
                    point = geom.getPart()
                    id = row.getValue("OBJECTID")
                    v.append([id, point.X, point.Y])   

            kops = fcs[os.path.join(self.gdb, "KOPs")] # KOP array
            wtgs = fcs[os.path.join(self.gdb, "WindFarmArray")] # WTG array

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.


Terima kasih atas jawabannya. Mengapa kamus merupakan pilihan yang lebih baik daripada struktur data lain dalam kasus ini?
Fezter

Saya hanya ingin dapat memanggil nilai saya dengan kunci saya.
Chad Cooper

2
alasan lain dicts mungkin lebih disukai adalah karena mereka membaca jauh lebih cepat daripada daftar karena mereka tidak dipesan. karenanya, daftar yang sangat panjang mungkin memerlukan sedikit waktu untuk diproses jika mereka memiliki banyak entri.
ndimhypervol

@ gotanuki Benar, dan jika Anda perlu menggunakan daftar besar, gunakan tuple sebagai gantinya, karena mereka lebih cepat dari daftar juga.
Chad Cooper

2

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

sys.path.append(r"\\Path\To\Scripts")
import gpFuncs as gpF
fc = arcpy.GetParameterAsText(0)
featureLayer = gpF.featureLayer(fc)
points = featureLayer.featureVerticesToPoints(featureid, "", first_and_last)

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.


4
Lihatlah panduan gaya Python (alias PEP 8) untuk konvensi penamaan.
blah238

0

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 .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.