Estoy tratando de hacer una herramienta de ajuste de punto final de polilínea en Python usando ArcGIS 10. usando un Cursor de búsqueda que leí en los valores a una matriz de objetos de línea (que contienen el ID de entidad de la línea y dos objetos "EndPoint" - primero y último, que contiene las coordenadas X e Y de cada uno), luego procese algunos datos de interpolación de los puntos para dar a todos los puntos sus valores correctos.
Hasta ahora, esa parte funciona perfectamente. Sin embargo, cuando intento volver y editar el archivo de forma, puedo ver los datos que estoy cambiando, pero parece que no puedo editarlo.
Aquí está el código para actualizar los campos:
# --------------------------
#
# 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
Mi lectura consta de declaraciones como esta:
Cambiar: -105.512166832 a -105.699533165 Ahora es: -105.512166832
Por alguna razón, las filas no se actualizan. Y para mi vida, no puedo encontrar un tutorial o instrucciones sobre cómo editar un punto en particular en una polilínea. Solo puedo encontrar cómo editar un punto como un campo en un archivo de forma de puntos.
¿Alguien tiene alguna idea?
fuente
Respuestas:
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:arcpy.Point
objeto con las coordenadas correctas (parece que ya lo ha hecho)replace
método para establecer el punto deseado en su matriz con su punto modificadosetValue
método del objeto de fila para actualizar el campo Forma con su nueva polilínea correctaupdateRow
método del objeto cursor para insertar la fila modificada en el conjunto de datos.Concretamente:
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 decirmy_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
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.Esperemos que eso ayude a aclararlo.
fuente