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 replacemetode. Jadi, alih-alih mencoba langsung memodifikasi koordinat X dari titik di dalam array, Anda perlu:
- Buat
arcpy.Pointobjek baru dengan koordinat yang benar (sepertinya Anda sudah melakukan ini)
- Dapatkan salinan objek array yang tersimpan di bidang Bentuk baris
- Gunakan
replacemetode untuk mengatur titik yang diinginkan dalam array Anda dengan titik Anda yang dimodifikasi
- Buat objek Polyline baru dengan array itu
- Gunakan metode objek baris
setValueuntuk memperbarui bidang Shape dengan Polyline baru Anda yang benar
- Gunakan metode objek kursor
updateRowuntuk menyisipkan baris yang diubah ke dalam dataset.
Secara konkret:
for r in cur:
ary = r.getValue("SHAPE").getPart(0)
ary.replace(0,correct_point_object) # first arg 0 replaces the first point in the line
newLine = arcpy.Polyline(ary)
r.setValue("SHAPE",newLine)
cur.updateRow(r)
Perhatikan bahwa replacemetode ini mengambil indeks dan nilai. Sayangnya itu tidak menerima mis -1 sebagai indeks ke titik terakhir dalam array. Namun Anda bisa mengatakannya my_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
row_num = 0
for r in cur:
r.setValue(shapeField,correct_geometry_list[row_num])
cur.updateRow(r)
row_num += 1
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 replacemetode, jika itu diperlukan.
import arcpy
def offsetPoint(old_point,X_distance,Y_distance):
"""Trivial function to offset a point - replace with what you're
actually doing."""
new_point = arcpy.Point(old_point.X+X_distance,
old_point.Y+Y_distance)
return new_point
def offsetFirstPointInLine(line_geom,X_distance,Y_distance):
"""Takes a Polyline geometry object and returns a new Polyline with
the first point of the first part offset by the distance given."""
array = line_geom.getPart(0)
first_point = array[0]
new_point = offsetPoint(first_point,X_distance,Y_distance)
# Build a new array with your new point in the 0th position, and
# the rest of the points from the old array.
new_array = arcpy.Array([new_point]+
[array.getObject(x) for x in range(1,array.count)])
# Then make a new Polyline object with that array.
new_line = arcpy.Polyline(new_array)
return new_line
fc = r"C:\Users\student\Documents\ArcGIS\Default.gdb\SomeStorms"
cur = arcpy.UpdateCursor(fc)
for r in cur:
geom = r.getValue("SHAPE")
r.setValue("SHAPE",offsetFirstPointInLine(geom,-45000,-5000))
cur.updateRow(r)
del r,cur
Semoga itu membantu menjernihkannya.