3 votos

Actualizar campos con propiedades de geometría (coordenada X y coordenada Y del "verdadero" centroide)

He estado tratando de tomar las coordenadas X e Y del verdadero centroide de un archivo de figura poligonal que tengo llamado HamDA.shp y agregar dichas coordenadas a dos campos flotantes llamados X e Y (con una precisión de 12 y una escala de 2) que existen dentro de HamDA.shp.

Sé que necesito usar un Cursor de Actualización para lograr esta tarea, pero no estoy completamente seguro de cómo configurarlo correctamente.

Esto es lo que tengo hasta ahora:

import arcpy
arcpy.env.workspace = "C:/Users/Alex/SampleData"
fc = "HamDA.shp" 

vertexarray = arcpy.Array()
with arcpy.da.UpdateCursor(fc,["SHAPE@"]) as cursor:
    for row in cursor:
        for vertex in row[0]:
            vertexarray.add(vertex.X,vertex.Y)
            cursor.updateRow(vertexarray)

2voto

Spyros Puntos 56

También puedes usar simplemente la herramienta Agregar atributos de geometría.

Tienes la opción de agregar las coordenadas CENTROIDE o CENTROIDE_DENTRO.

Si realmente quieres usar un cursor, debes utilizar el token SHAPE@TRUECENTROIDE, el cual devuelve una tupla con las coordenadas X, Y. Luego llama a X e Y por sus índices:

with arcpy.da.SearchCursor(fc, "SHAPE@TRUECENTROIDE") as cur:
    for row in cur:
        print """X = {}, Y = {}""".format(row[0][0], row[0][1])

1voto

Anton8000 Puntos 165

No estoy seguro de lo que quieres decir con verdadero centroide, pero esto funcionará en centroides "normales". Utilizo los tokens SHAPE@X y SHAPE@Y para obtener las coordenadas del centroide de cada elemento y luego las añado en dos columnas:

import arcpy

arcpy.env.workspace = "C:/Users/Alex/SampleData"
fc = "HamDA.shp"

arcpy.AddField_management(in_table='fc', field_name='CentroidX', field_type='DOUBLE')
arcpy.AddField_management(in_table='fc', field_name='CentroidY', field_type='DOUBLE')

with arcpy.da.UpdateCursor(fc,['SHAPE@X','SHAPE@Y','CentroidX','CentroidY']) as cursor:
    for row in cursor:
        row[2]=row[0]
        row[3]=row[1]
        cursor.updateRow(row)

1voto

Paul Lalonde Puntos 3940

No olvides eliminar la fila y el cursor. Utiliza Shape@XY y llama a x e y utilizando sus índices. Puedes utilizar x e y por separado.

import arcpy
arcpy.env.workspace = "C:/Users/Alex/SampleData"
fc = "HamDA.shp" 

vertexarray = arcpy.Array()
with arcpy.da.UpdateCursor(fc,["SHAPE@XY","X","Y"]) as cursor:
    for row in cursor:
        row[1] = row[0][0]
        row[2]= row[0][1]
        cursor.updateRow(row)
del row
del cursor

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X