Wie wird die Maßeinheit angegeben, wenn auf das Attribut 'Länge' des Geometry () -Objekts zugegriffen wird?

10

Mit dem Tool CalculateField_management kann die Maßeinheit bei der Berechnung der Formlänge angegeben werden:

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

Ich möchte dasselbe innerhalb eines Cursors mit der 'SHAPE @ LENGTH' jedes Features tun, wobei die Länge in einer Einheit meiner Wahl zurückgegeben wird:

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

Oder möglicherweise mithilfe des (weniger effizienten) @ SHAPE-Geometrieobjekts?:

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

Gibt es eine Möglichkeit, dies zu tun?

Axel Esteban
quelle

Antworten:

7

Für den Moment müssen Sie eine Problemumgehung verwenden. Die Länge wird immer in der linearen Einheit des Raumbezugs der Geometrie angegeben. Wenn Sie den Umrechnungsfaktor für Fuß in Meter und die metersPerUnitEigenschaft kennen, sollten Sie den größten Teil des Weges zurücklegen oder ein Feld hinzufügen und den shape.length@feetzuvor erwähnten Feldrechner verwenden. Eine andere Möglichkeit wäre, den Raumbezug des Cursors als geografisches Koordinatensystem (wie WGS84) und nicht als projiziertes Koordinatensystem anzugeben. Dann wird das Geometry.getLength()und geometry.getArea()werden Methoden geben Zahlen in Metern, die Sie wieder auf die Füße ziemlich leicht umwandeln kann.

Wir haben gerade ein optionales zweites Argument zu den Geometry.getLength/getArea -Methoden in 10.2.1 hinzugefügt, um die Einheiten anzugeben. Wann immer es ausgeliefert wird und wann immer es bei Ihnen ankommt, sollten Sie eine direkte Möglichkeit haben, dies zu tun, aber für den Moment sollten Sie eine andere Problemumgehung verwenden.

Jason Scheirer
quelle
6

Bei Geometrieobjekten gibt die Methode getLength () immer einen Abstand in Metern zurück, wie hier dargestellt . Dies kann wünschenswert sein, wenn Sie beispielsweise nur in Meilen oder Fuß umrechnen. Es wäre relativ einfach, von Metern in einen der anderen linearen Abstände umzurechnen.

Wenn Sie Ihre Länge in Dezimalgraden angeben möchten, wird dies etwas schwieriger, da die Eingabe in einem geografischen Koordinatensystem (GCS) erfolgen muss. Möglicherweise möchten Sie ein SpatialReference-Objekt an Ihren Cursor übergeben, das hier erläutert wird .

Zum Beispiel habe ich ein Polylinien-Shapefile in NAD_1983_StatePlane_Louisiana_South_FIPS_1702_Feet, einem projizierten Koordinatensystem (PCS).

Mit diesem Code kann ich auf die Länge jedes Objekts in Dezimalgraden zugreifen:

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