Як вказати одиницю виміру при доступі до атрибута "довжина" об'єкта 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)]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.