¿Cómo especificar la unidad de medida al acceder al atributo 'length' del objeto Geometry ()?

10

Usando 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 usando 'SHAPE @ LENGTH' de cada función, con la longitud devuelta en una unidad de mi elección:

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

¿O posiblemente utilizando el objeto de geometría @SHAPE (menos eficiente) ?:

#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 manera de hacer esto?

Axel Esteban
fuente

Respuestas:

7

Por ahora necesitará usar una solución alternativa, la longitud siempre estará en la unidad lineal de la referencia espacial de la geometría. Conocer el factor de conversión de pies a metros y la metersPerUnitpropiedad debería ayudarlo la mayor parte del camino, o agregar un campo y usar la calculadora de campo shape.length@feetcomo mencionó anteriormente. Otra opción sería especificar la referencia espacial del cursor como un sistema de coordenadas geográficas (como WGS84) y no como un sistema de coordenadas proyectado. A continuación, el Geometry.getLength()y geometry.getArea()métodos volverá números en metros, que se puede convertir de nuevo a los pies con bastante facilidad.

Acabamos de agregar un segundo argumento opcional a los métodos Geometry.getLength/getArea en 10.2.1 para especificar las unidades, por lo que cada vez que se envíe y cada vez que llegue a usted debería tener una forma directa de hacerlo, pero por ahora debería usar otra solución.

Jason Scheirer
fuente
6

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

Si desea su longitud en grados decimales, eso se vuelve un poco más complicado ya que la entrada debe estar en un Sistema de coordenadas geográficas (GCS). Es posible que desee considerar pasar un objeto SpatialReference a su cursor, discutido aquí .

Por ejemplo, tengo un archivo de forma de polilínea en NAD_1983_StatePlane_Louisiana_South_FIPS_1702_Feet, un Sistema de coordenadas proyectadas (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)]
Paul
fuente