Saya mencoba menghitung luas poligon dalam skrip Python saya. Saya membuat poligon baru dari menggabungkan keduanya, dan saya ingin menambahkan area poligon yang dihasilkan ke bidang di file output. Poligon disimpan dalam bentuk biasa, dan diproyeksikan. Area sebaiknya dalam unit peta.
Saya akan berpikir ini menjadi tugas yang cukup umum dan sederhana, tetapi meskipun banyak Googleing saya belum dapat menemukan solusi yang berfungsi sejauh ini.
Saya berencana menggunakan arcpy.updateCursor
untuk memasukkan nilai setelah dihitung (hanya ada satu fitur di FC pada tahap ini), jadi yang paling mudah adalah jika dapat dikembalikan sebagai variabel. Solusi alternatif apa pun yang menyelesaikan tugas yang sama (memasukkan nilai area ke bidang yang benar) juga akan berfungsi.
Saya juga telah mencoba kalkulator Field dari Python. Dimodifikasi dari halaman bantuan saya pikir berikut ini akan berhasil, tetapi sejauh ini tidak berhasil.
arcpy.AddField_management(tempPgs, "Shape_area", 'DOUBLE')
exp = "float(!SHAPE.AREA!.split())"
arcpy.CalculateField_management(tempPgs, "Shape_area", exp)
Menjalankan ArcGIS Basic 10.1 SP1 dengan Python 2.7 di Windows 7.
Bagian yang relevan dari kode saya saat ini terlihat seperti ini:
#/.../
arcpy.Copy_management(inpgs, outpgs)
arcpy.AddField_management(outpgs, 'Shape_area', 'LONG')
fields = AM.FieldLst(outpgs)
#/.../
# Identify and search for shapes smaller than minimum area
where1 = '"' + 'Shape_Area' + '" < ' + str(msz)
polyrows = arcpy.SearchCursor(inpgs, where1)
for prow in polyrows:
grd1 = prow.GridID # GridID on the current polygon
grd2 = nDD.get(grd1) # GridID on the polygon downstream
# Update features
if grd2
geometry1 = prow.Shape
geometry2 = geometryDictionary[grd2]
# Update temporary features
arcpy.Merge_management([geometry1, geometry2], tempMerged)
arcpy.Dissolve_management(tempMerged, tempPgs)
fds = AM.FieldLst(tempPgs)
for field in fields[2:]:
arcpy.AddField_management(tempPgs, field, 'DOUBLE')
for fd in fds[2:]:
arcpy.DeleteField_management(tempPgs, fd)
exp = "float(!SHAPE.AREA!.split())"
arcpy.CalculateField_management(tempPgs, "Shape_area", exp)
# Append them to output FC
try:
arcpy.Append_management(tempPgs, outpgs, "TEST")
except arcgisscripting.ExecuteError:
arcpy.Append_management(tempPgs, outpgs, "NO_TEST")
elif ...
else ...
sumber
SHAPE@AREA
sebagai bagian dari kursor untuk membaca area tersebut; tetapi struktur kode tergantung pada apakah area Anda berada dalam unit yang sama dengan apa yang ingin Anda tulis.Jawaban:
Ada tiga cara berbeda untuk menemukan dan menyimpan area poligon ke dalam kelas fitur dengan arcpy: 1) bidang kalkulator, 2) kursor "klasik", dan 3)
arcpy.da
kursor. Beberapa dari ini dipinjam dari jawaban saya sebelumnya tentang menggunakan SearchCursor .1. Kalkulator bidang
Saat menggunakan kalkulator bidang, ada tiga tipe ekspresi berbeda yang menggunakan parser ekspresi berbeda. Ini ditentukan dalam parameter ketiga dari alat geoprocessing Bidang Hitung . Saat mengakses properti dari objek Geometry menggunakan like in
!shape.area!
, Anda harus menggunakan parser Python 9.3.Ekspresi yang sebelumnya Anda lakukan
split()
perintah pada hasil!SHAPE.AREA!
. Ini mengembalikanlist
objek Python , yang tidak bisa dilemparkan kefloat
objek.Dalam ekspresi Anda, Anda dapat menentukan unit area yang dikembalikan dengan menggunakan
@SQUAREKILOMETERS
bendera, menggantikanSQUAREKILOMETERS
dengan unit pada halaman bantuan Hitung Bidang .Berikut kode Python yang akan saya gunakan untuk metode ini:
2. Arc 10.0 - kursor "Klasik"
Saat menggunakan kursor klasik (yaitu
arcpy.UpdateCursor
) objek kursor adalah objek berisi iterablerow
. Anda perlu menggunakangetValue
dansetValue
metode untuk mendapatkan geometri dari baris (sebagai objek geometri dan mengatur nilai area kerow
sebagai float.Baris output Anda disimpan dalam ruang awal sementara sampai Anda memanggil
updateRow
metode pada kursor. Ini menyimpan data baru ke dalam dataset aktual.Berikut kode Python yang akan saya gunakan untuk metode ini:
3. Arc 10.1 - kursor arcpy.da
Saat menggunakan kursor baru dalam modul akses data (yaitu
arcpy.da.UpdateCursor
), Anda harus memasukkan daftar nama bidang sebagai parameter kedua dalam konstruktor kursor. Ini membutuhkan beberapa pekerjaan di muka, tetapirow
objek yang dihasilkan adalah daftar Python, yang membuatnya lebih mudah untuk membaca dan menulis data saat iterasi melalui baris kursor.arcpy.da.UpdateCursor
juga memiliki kinerja yang lebih baik daripadaarcpy.UpdateCursor
, sebagian karena melompati bidang yang tidak penting, terutama geometri.Ketika membaca geometri, Anda dapat memilih salah satu dari sejumlah token geometri, misalnya
SHAPE@TRUECENTROID
,SHAPE@AREA
atauSHAPE@
. Menggunakan token "sederhana" sangat meningkatkan kinerja dibandingkan denganSHAPE@
, yang berisi semua informasi geometri. Daftar token lengkap ada diarcpy.da.UpdateCursor
halaman bantuan.Seperti sebelumnya, baris output Anda disimpan dalam ruang awal sementara hingga Anda memanggil
updateRow
metode pada kursor. Ini menyimpan data baru ke dalam dataset aktual.Berikut kode Python yang akan saya gunakan untuk metode ini:
sumber
row[1] = row[0]
karena tidak ada lagiarea
atribut. Anda juga dapat menggunakan kursor sebagai manajer konteks dalamwith
pernyataan dan tidak perlu khawatir menghapus apa pun.