Desafortunadamente, no puede asignar directamente nuevos valores a la geometría existente de una entidad; más bien, debe crear un nuevo objeto de geometría y actualizar el campo de forma de la entidad con ese nuevo objeto. Afortunadamente, los objetos de matriz tienen un replace
método. Entonces, en lugar de intentar modificar directamente la coordenada X del punto dentro de la matriz, debe:
- Cree un nuevo
arcpy.Point
objeto con las coordenadas correctas (parece que ya lo ha hecho)
- Obtenga una copia del objeto de matriz almacenado en el campo Forma de la fila
- Use el
replace
método para establecer el punto deseado en su matriz con su punto modificado
- Hacer un nuevo objeto Polyline con esa matriz
- Use el
setValue
método del objeto de fila para actualizar el campo Forma con su nueva polilínea correcta
- Use el
updateRow
método del objeto cursor para insertar la fila modificada en el conjunto de datos.
Concretamente:
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)
Tenga en cuenta que el replace
método toma un índice y un valor. Desafortunadamente, no acepta, por ejemplo, -1 como índice del último punto de la matriz. Sin embargo puedes decir my_array[my_array.count]
.
Parece que está precalculando las coordenadas X en otro lugar y recuperándolas más tarde. Si este es el caso, probablemente iría por completo y crearía nuevos objetos de polilínea con los puntos correctos para cada línea mientras calcula las coordenadas correctas. Esto probablemente será más fácil y más limpio. De esa manera su código podría ser más como
row_num = 0
for r in cur:
r.setValue(shapeField,correct_geometry_list[row_num])
cur.updateRow(r)
row_num += 1
Lo cual, al menos para mí, es un poco más claro ... ¡pero eso es estilístico!
Editar para agregar:
No podría encajar esto en un comentario. Sin ver su código, es difícil saber dónde podría estar cayendo. Aquí hay un script completo probado que funciona para mí. Esperemos que sirva de referencia. Tenga en cuenta que aquí estoy calculando la nueva geometría directamente de la anterior, en lugar de hacer dos pasadas; eso puede o no ser posible dependiendo de cómo esté haciendo sus cálculos de posición de ajuste. También esta vez estoy construyendo una nueva matriz basada en la anterior en lugar de usar el replace
método, en caso de que sea necesario.
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
Esperemos que eso ayude a aclararlo.