Как указать единицу измерения при доступе к атрибуту «длина» объекта Geometry ()?

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)

Есть ли способ сделать это?

Аксель Эстебан
источник

Ответы:

7

Сейчас вам нужно использовать обходной путь, длина которого всегда будет в линейной единице пространственной привязки геометрии. Зная коэффициент пересчета футов в метры и metersPerUnitсвойства, вы получите большую часть пути, или добавив поле и используя калькулятор поля, shape.length@feetкак вы упоминали ранее. Другой вариант - указать пространственную привязку курсора как географическую систему координат (например, WGS84), а не как проецируемую систему координат. Тогда Geometry.getLength()и geometry.getArea()методы будут возвращать число в метрах, которые вы можете снова преобразовать к ногам довольно легко.

Мы просто добавили необязательный второй аргумент в методы Geometry.getLength/getArea в 10.2.1, чтобы указать единицы измерения, поэтому всякий раз, когда он доставляется и когда он к вам попадает, у вас должен быть прямой способ сделать это, но сейчас вы должны использовать другой обходной путь.

Джейсон Шайрер
источник
6

Для объектов геометрии метод getLength () всегда возвращает расстояние в метрах, как показано здесь . Это может быть желательно, если вы, например, переводите только в мили или футы. Было бы относительно просто преобразовать метры в любое другое линейное расстояние.

Если вы хотите, чтобы ваша длина в десятичных градусах, это становится немного сложнее, поскольку входные данные должны быть в географической системе координат (GCS). Возможно, вы захотите посмотреть, как передается объект SpatialReference вашему курсору, обсуждаемый здесь .

Например, у меня есть шейп-файл полилинии в NAD_1983_StatePlane_Louisiana_South_FIPS_1702_Feet, проецированной системе координат (PCS).

С помощью этого кода я могу получить доступ к длине каждого объекта в десятичных градусах:

spatref = arcpy.SpatialReference(4326) #EPSG code for WGS84
length = [row[0] for row in arcpy.da.SearchCursor("layer", "SHAPE@LENGTH", spatial_reference=spatref)]
Павел
источник