Como especificar a unidade de medida ao acessar o atributo 'length' do objeto Geometry ()?

10

Usando a ferramenta CalculateField_management, é possível especificar a unidade de medida ao calcular o comprimento da forma:

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

Gostaria de fazer a mesma coisa em um cursor usando o 'SHAPE @ LENGTH' de cada recurso, com o comprimento retornado em uma unidade de minha escolha:

#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)

Ou, possivelmente, usando o objeto de geometria @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)

Existe alguma maneira de fazer isso?

Axel Esteban
fonte

Respostas:

7

Por enquanto, você precisará usar uma solução alternativa, o comprimento sempre estará na unidade linear da referência espacial da geometria. Conhecer o fator de conversão para pés em metros e a metersPerUnitpropriedade deve levá-lo ao longo do caminho, ou adicionar um campo e usar a calculadora de campos shape.length@feetcomo você mencionou antes. Outra opção seria especificar a referência espacial do cursor como um sistema de coordenadas geográficas (como WGS84) e não como um sistema de coordenadas projetado. Os métodos Geometry.getLength()e geometry.getArea()retornarão números em metros, que você poderá converter novamente em pés com bastante facilidade.

Acabamos de adicionar um segundo argumento opcional aos métodos Geometry.getLength/getArea em 10.2.1 para especificar as unidades; portanto, sempre que for enviado e sempre que chegar a você, você deve ter uma maneira direta de fazê-lo, mas por enquanto você deve usar outra solução alternativa.

Jason Scheirer
fonte
6

Com objetos de geometria, o método getLength () sempre retorna uma distância em metros, como visto aqui . Isso pode ser desejável se você estiver apenas convertendo em milhas ou pés, por exemplo. Seria relativamente simples converter de metros para qualquer uma das outras distâncias lineares.

Se você deseja o seu comprimento em graus decimais, isso se torna um pouco mais complicado, pois a entrada deve estar em um Sistema de coordenadas geográficas (GCS). Você pode querer passar um objeto SpatialReference para o cursor, discutido aqui .

Por exemplo, eu tenho um shapefile de polilinha no NAD_1983_StatePlane_Louisiana_South_FIPS_1702_Feet, um Sistema de coordenadas projetadas (PCS).

Com esse código, eu posso acessar o comprimento de cada objeto em graus decimais:

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