Saya mencoba untuk membuat alat gertakan titik akhir polyline di Python menggunakan ArcGIS 10. menggunakan kursor pencarian Saya membaca nilai-nilai ke array objek garis (yang berisi id fitur garis, dan dua objek "EndPoint" - pertama dan terakhir - yang berisi koordinat X dan Y masing-masing), lalu proses beberapa interpolasi data dari poin untuk memberikan semua poin nilai yang benar.
Sejauh ini, bagian itu berfungsi dengan sempurna. Namun, ketika saya mencoba untuk kembali dan mengedit shapefile, saya dapat melihat data yang saya ubah, tetapi sepertinya saya tidak dapat mengeditnya.
Berikut adalah kode untuk memperbarui bidang:
# --------------------------
#
# Update the file with the new EPs
#
# --------------------------
# Create update cursor
#
rows = arcpy.UpdateCursor(outputDirectory + "\\" + trails_fc + ".shp")
# Enter for loop for each feature/row
#
i = 0
for row in rows:
# Create the geometry object
#
feat = row.getValue(shapefieldname)
partnum = 0
if feat.getPart(partnum)[0].X != allLines[i].startEP.x:
arcpy.AddMessage("Change: " + str(feat.getPart(partnum)[0].X) + " to " + str(allLines[i].startEP.x) )
feat.getPart(partnum)[0].X = allLines[i].startEP.x
rows.updateRow(row)
arcpy.AddMessage("Now is: " + str(feat.getPart(partnum)[0].X))
i+=1
Pembacaan saya terdiri dari pernyataan seperti ini:
Ubah: -105.512166832 menjadi -105.699533165 Sekarang adalah: -105.512166832
Untuk beberapa alasan, baris tidak diperbarui. Dan untuk kehidupan saya, saya tidak dapat menemukan tutorial atau instruksi tentang cara mengedit titik tertentu dalam polyline. Saya hanya dapat menemukan cara mengedit titik sebagai bidang dalam titik pembentukan.
Adakah yang punya ide?
sumber
Jawaban:
Sayangnya, Anda tidak dapat secara langsung menetapkan nilai baru ke geometri fitur yang ada - alih-alih, Anda harus membuat objek geometri baru, dan memperbarui bidang bentuk fitur dengan objek baru itu. Untungnya, objek array memiliki
replace
metode. Jadi, alih-alih mencoba langsung memodifikasi koordinat X dari titik di dalam array, Anda perlu:arcpy.Point
objek baru dengan koordinat yang benar (sepertinya Anda sudah melakukan ini)replace
metode untuk mengatur titik yang diinginkan dalam array Anda dengan titik Anda yang dimodifikasisetValue
untuk memperbarui bidang Shape dengan Polyline baru Anda yang benarupdateRow
untuk menyisipkan baris yang diubah ke dalam dataset.Secara konkret:
Perhatikan bahwa
replace
metode ini mengambil indeks dan nilai. Sayangnya itu tidak menerima mis -1 sebagai indeks ke titik terakhir dalam array. Namun Anda bisa mengatakannyamy_array[my_array.count]
.Sepertinya Anda mengkomputasi koordinat X di tempat lain dan mengambilnya nanti. Jika ini masalahnya, saya mungkin akan pergi ke seluruh babi dan membuat objek Polyline baru dengan poin yang benar untuk setiap baris saat Anda menghitung koordinat yang benar. Ini kemungkinan akan lebih mudah & bersih. Dengan begitu kode Anda bisa lebih seperti
Yang, setidaknya bagi saya, sedikit lebih jelas ... tapi itu gaya!
Edit untuk ditambahkan:
Saya tidak bisa memasukkan ini dalam komentar. Tanpa melihat kode Anda, sulit untuk mengatakan di mana kode itu jatuh. Inilah skrip teruji lengkap yang berfungsi untuk saya. Semoga ini bisa dijadikan referensi. Perhatikan bahwa di sini saya menghitung geometri baru langsung dari yang lama, daripada melakukan dua lintasan; itu mungkin atau mungkin tidak mungkin tergantung pada bagaimana Anda melakukan perhitungan posisi snap Anda. Juga kali ini saya membangun array baru berdasarkan yang lama daripada menggunakan
replace
metode, jika itu diperlukan.Semoga itu membantu menjernihkannya.
sumber