访问Geometry()对象的'length'属性时如何指定度量单位?


10

使用CalculateField_management工具,可以在计算形状长度时指定度量单位:

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

我想使用每个功能的'SHAPE @ LENGTH'在光标内执行相同的操作,并以我选择的单位返回长度:

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

还是可以使用(效率较低的)@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)

有什么办法可以做到这一点?

Answers:


7

现在,您需要使用一种解决方法,该长度将始终以几何空间参考的线性单位为单位。了解英尺到米的转换因子以及该metersPerUnit属性应该可以帮助您了解大部分方法,或者添加一个字段并使用字段计算器,shape.length@feet就像您之前提到的那样。另一种选择是将光标的空间参考指定为地理坐标系(例如WGS84),而不是投影坐标系。然后Geometry.getLength()geometry.getArea()方法将返回以米为单位的数字,您可以再次轻松将其转换为英尺。

我们只是在10.2.1 的Geometry.getLength/getArea方法中添加了一个可选的第二个参数来指定单位,因此,无论何时发货,只要您到了,就应该有直接的方法,但是现在您应该使用另一种解决方法。


6

随着几何对象的的getLength()方法总是返回米的距离,看到这里。例如,如果仅转换为英里或英尺,那可能是理想的。从米转换为任何其他线性距离将相对简单。

如果您希望以十进制度数表示长度,则由于输入必须位于地理坐标系(GCS)中而变得有些棘手。您可能想研究将SpatialReference对象传递给光标的方法,在此进行了讨论。

例如,我在投影坐标系(PCS)NAD_1983_StatePlane_Louisiana_South_FIPS_1702_Feet中有一个折线shapefile。

通过此代码,我可以访问每个对象的长度(以十进制为单位):

spatref = arcpy.SpatialReference(4326) #EPSG code for WGS84
length = [row[0] for row in arcpy.da.SearchCursor("layer", "SHAPE@LENGTH", spatial_reference=spatref)]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.