Thật không may, bạn không thể gán trực tiếp các giá trị mới cho hình dạng hiện có của một tính năng - thay vào đó, bạn phải tạo một đối tượng hình học mới và cập nhật trường hình dạng của đối tượng đó với đối tượng mới đó. May mắn thay, các đối tượng mảng có một replace
phương thức. Vì vậy, thay vì cố gắng sửa đổi trực tiếp tọa độ X của điểm bên trong mảng, bạn cần phải:
- Tạo một
arcpy.Point
đối tượng mới với tọa độ chính xác (có vẻ như bạn có thể đã làm điều này rồi)
- Nhận một bản sao của đối tượng mảng được lưu trữ trong trường Hình dạng của hàng
- Sử dụng
replace
phương pháp để đặt điểm mong muốn trong mảng của bạn với điểm đã sửa đổi
- Tạo một đối tượng Polyline mới với mảng đó
- Sử dụng
setValue
phương thức của đối tượng hàng để cập nhật trường Hình dạng với Polyline mới, chính xác của bạn
- Sử dụng
updateRow
phương thức của đối tượng con trỏ để chèn hàng đã thay đổi vào tập dữ liệu.
Cụ thể:
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)
Lưu ý replace
phương thức lấy một chỉ mục và một giá trị. Thật không may, nó không chấp nhận ví dụ -1 như một chỉ mục đến điểm cuối cùng trong mảng. Tuy nhiên bạn có thể nói my_array[my_array.count]
.
Có vẻ như bạn đang tính toán tọa độ X ở một nơi khác và truy xuất chúng sau này. Nếu đây là trường hợp, có lẽ tôi sẽ đi cả con lợn và tạo các đối tượng Polyline mới với các điểm chính xác cho mỗi dòng trong khi bạn đang tính toán tọa độ chính xác. Điều này có thể sẽ dễ dàng hơn & sạch hơn. Bằng cách đó, mã của bạn có thể giống như
row_num = 0
for r in cur:
r.setValue(shapeField,correct_geometry_list[row_num])
cur.updateRow(r)
row_num += 1
Mà, ít nhất là đối với tôi, rõ ràng hơn một chút ... nhưng đó là phong cách!
Chỉnh sửa để thêm:
Tôi không thể phù hợp với điều này trong một bình luận. Không nhìn thấy mã của bạn, thật khó để biết nó có thể rơi ở đâu. Đây là một kịch bản thử nghiệm hoàn chỉnh phù hợp với tôi. Hy vọng nó sẽ phục vụ như là một tài liệu tham khảo. Lưu ý rằng ở đây tôi đang tính toán hình học mới trực tiếp từ hình cũ, thay vì thực hiện hai lần chuyền; điều đó có thể hoặc không thể tùy thuộc vào cách bạn thực hiện các tính toán vị trí chụp nhanh của mình. Ngoài ra, lần này tôi đang xây dựng một mảng hoàn toàn mới dựa trên mảng cũ thay vì sử dụng replace
phương thức này, trong trường hợp cần thiết.
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
Hy vọng rằng sẽ giúp làm sáng tỏ nó.