10 votos

¿Cómo se especifica la unidad de medida al acceder al atributo "longitud" del objeto Geometry()?

Con la herramienta CalculateField_management se puede especificar la unidad de medida al calcular la longitud de la forma:

#Calculate polyline lengths in miles
polylines = "C:\sampleShape.shp"
arcpy.CalculateField_management(polylines, "shapeLen", "!Shape.length@MILES!", "PYTHON_9.3")

Me gustaría hacer lo mismo dentro de un cursor utilizando el 'SHAPE@LENGTH' de cada característica, con la longitud devuelta en una unidad de mi elección:

#hypothetical example 1
with arcpy.da.UpdateCursor(polylines, field_names=["SHAPE@LENGTH.FEET", "shapeLen"]) as upCurs:
    for row in upCurs:
        row[1] = row[0]
        upCurs.updateRow(row)

O posiblemente utilizando el objeto geométrico (menos eficiente) @SHAPE?:

#hypothetical example 2
with arcpy.da.UpdateCursor(polylines, field_names=["@SHAPE", "shapeLen"]) as upCurs:
    for row in upCurs:
        row[1] = row[0].length@FEET
        upCurs.updateRow(row)

¿Hay alguna forma de hacerlo?

7voto

Paul Puntos 555

Por ahora tendrás que usar una solución, la longitud siempre estará en la unidad lineal de la referencia espacial de la geometría. Conociendo el factor de conversión de pies a metros y el metersPerUnit debería servirle para la mayor parte del camino, o añadiendo un campo y utilizando la propiedad shape.length@feet como mencionas antes. Otra opción sería especificar la referencia espacial del cursor como un sistema de coordenadas geográficas (como WGS84) y no un sistema de coordenadas proyectadas. Entonces el Geometry.getLength() y geometry.getArea() devolverán números en metros, que puedes convertir de nuevo a pies con bastante facilidad.

Acabamos de añadir un segundo argumento opcional al Geometry.getLength / getArea en la 10.2.1 para especificar las unidades, así que cuando se envíe y cuando te llegue deberías tener una forma directa de hacerlo, pero por ahora deberías usar otra solución.

6voto

Örjan Jämte Puntos 3127

Con los objetos geométricos, el método getLength() siempre devuelve una distancia en metros, como se ve aquí . Esto podría ser deseable si sólo está convirtiendo a millas o pies, por ejemplo. Sería relativamente sencillo convertir de metros a cualquiera de las otras distancias lineales.

Si quiere la longitud en grados decimales, la cosa se complica un poco, ya que la entrada debe estar en un Sistema de Coordenadas Geográficas (SCG). Puede ser que quiera pasar un Objeto SpatialReference a su cursor, discutido aquí .

Por ejemplo, tengo un archivo shape de polilíneas en NAD_1983_StatePlane_Louisiana_South_FIPS_1702_Feet, un sistema de coordenadas proyectado (PCS).

Con este código, puedo acceder a la longitud de cada objeto en grados decimales:

spatref = arcpy.SpatialReference(4326) #EPSG code for WGS84
length = [row[0] for row in arcpy.da.SearchCursor("layer", "SHAPE@LENGTH", spatial_reference=spatref)]

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