Jak określić jednostkę miary podczas uzyskiwania dostępu do atrybutu „długość” obiektu Geometry ()?

10

Za pomocą narzędzia CalculateField_management można określić jednostkę miary podczas obliczania długości kształtu:

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

Chciałbym zrobić to samo w obrębie kursora za pomocą „SHAPE @ LENGTH” każdej funkcji, przy czym długość jest zwracana w wybranej przeze mnie jednostce:

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

A może używając (mniej wydajnego) obiektu geometrii @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)

Czy jest jakiś sposób, aby to zrobić?

Axel Esteban
źródło

Odpowiedzi:

7

Na razie musisz użyć obejścia, długość zawsze będzie w jednostce liniowej odniesienia przestrzennego geometrii. Znajomość przelicznika stóp na metry i metersPerUnitwłaściwość powinna pomóc ci w większości przypadków, lub dodanie pola i użycie kalkulatora pola, shape.length@feetjak wspomniano wcześniej. Inną opcją byłoby określenie odniesienia przestrzennego kursora jako geograficznego układu współrzędnych (takiego jak WGS84), a nie rzutowanego układu współrzędnych. Wtedy Geometry.getLength()i geometry.getArea()metody powróci numerów w metrach, które można ponownie przekonwertować do stóp dość łatwo.

Właśnie dodaliśmy opcjonalny drugi argument do Geometry.getLength/getArea metod w 10.2.1, aby określić jednostki, więc za każdym razem, gdy zostanie wysłany i za każdym razem, gdy dotrze do ciebie, powinieneś mieć bezpośredni sposób, aby to zrobić, ale na razie powinieneś użyć innego obejścia.

Jason Scheirer
źródło
6

W przypadku obiektów geometrycznych metoda getLength () zawsze zwraca odległość w metrach, jak pokazano tutaj . Może to być pożądane, jeśli na przykład konwertujesz tylko na mile lub stopy. Przekształcenie z liczników na dowolne inne odległości liniowe byłoby stosunkowo proste.

Jeśli chcesz mieć długość w stopniach dziesiętnych, staje się to nieco trudniejsze, ponieważ dane wejściowe muszą znajdować się w układzie współrzędnych geograficznych (GCS). Być może warto przyjrzeć się przekazywaniu obiektu SpatialReference do kursora omówionego tutaj .

Na przykład mam plik kształtu polilinii w NAD_1983_StatePlane_Louisiana_South_FIPS_1702_Feet, rzutowanym układzie współrzędnych (PCS).

Za pomocą tego kodu mogę uzyskać dostęp do długości każdego obiektu w stopniach dziesiętnych:

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