Я пытаюсь вычислить площадь многоугольника в моем скрипте Python. Я создаю новый многоугольник из слияния двух вместе, и я хотел бы добавить область полученного многоугольника к полю в выходном файле. Многоугольник хранится в обычном шейп-файле и проецируется. Площадь желательно в единицах карты.
Я бы подумал, что это довольно распространенная и простая задача, но, несмотря на большое количество Google, я до сих пор не смог найти работающие решения.
Я планировал использовать arcpy.updateCursor
для вставки значения после его вычисления (на этом этапе в FC есть только одна особенность), поэтому проще всего будет вернуть его в виде переменной. Любое альтернативное решение, которое выполняет ту же задачу (получение значения площади в правильном поле), также будет работать.
Я также попробовал Калькулятор поля от Python. Модифицированный со страниц справки я думал, что следующее будет работать, но пока не повезло.
arcpy.AddField_management(tempPgs, "Shape_area", 'DOUBLE')
exp = "float(!SHAPE.AREA!.split())"
arcpy.CalculateField_management(tempPgs, "Shape_area", exp)
Запуск ArcGIS Basic 10.1 SP1 с Python 2.7 в Windows 7.
Соответствующие части моего текущего кода выглядят так:
#/.../
arcpy.Copy_management(inpgs, outpgs)
arcpy.AddField_management(outpgs, 'Shape_area', 'LONG')
fields = AM.FieldLst(outpgs)
#/.../
# Identify and search for shapes smaller than minimum area
where1 = '"' + 'Shape_Area' + '" < ' + str(msz)
polyrows = arcpy.SearchCursor(inpgs, where1)
for prow in polyrows:
grd1 = prow.GridID # GridID on the current polygon
grd2 = nDD.get(grd1) # GridID on the polygon downstream
# Update features
if grd2
geometry1 = prow.Shape
geometry2 = geometryDictionary[grd2]
# Update temporary features
arcpy.Merge_management([geometry1, geometry2], tempMerged)
arcpy.Dissolve_management(tempMerged, tempPgs)
fds = AM.FieldLst(tempPgs)
for field in fields[2:]:
arcpy.AddField_management(tempPgs, field, 'DOUBLE')
for fd in fds[2:]:
arcpy.DeleteField_management(tempPgs, fd)
exp = "float(!SHAPE.AREA!.split())"
arcpy.CalculateField_management(tempPgs, "Shape_area", exp)
# Append them to output FC
try:
arcpy.Append_management(tempPgs, outpgs, "TEST")
except arcgisscripting.ExecuteError:
arcpy.Append_management(tempPgs, outpgs, "NO_TEST")
elif ...
else ...
источник
SHAPE@AREA
как часть вашего курсора, чтобы прочитать область; но структура кода зависит от того, находится ли ваша область в тех единицах, которые вы хотите выписать.Ответы:
Существует три различных способа найти и сохранить область многоугольника в классе пространственных объектов с помощью arcpy: 1) калькулятор поля, 2) «классические» курсоры arcpy и 3)
arcpy.da
курсоры. Часть этого заимствована из моего предыдущего ответа об использовании SearchCursor .1. Полевой калькулятор
При использовании полевого калькулятора существует три различных типа выражений, которые используют разные анализаторы выражений. Это указано в третьем параметре инструмента геообработки Calculate Field . При доступе к свойствам объекта Geometry с использованием like in
!shape.area!
, вы должны использовать анализатор Python 9.3.Выражение, которое вы имели до того,
split()
команду для результата!SHAPE.AREA!
. Это возвращаетlist
объект Python , который нельзя преобразовать вfloat
объект.В своем выражении вы можете указать единицу возвращаемой области, используя
@SQUAREKILOMETERS
флаг, заменяяSQUAREKILOMETERS
единицы на странице справки « Рассчитать поле» .Вот код Python, который я бы использовал для этого метода:
2. Arc 10.0 - «Классические» курсоры
При использовании классических курсоров (то есть
arcpy.UpdateCursor
) объект курсора является итеративным, содержащимrow
объекты. Вы должны использоватьgetValue
иsetValue
методы , чтобы получить геометрию из ряда (как объекта геометрии и установите значение площади вrow
качестве поплавка.Ваша выходная строка хранится во временном пустом месте, пока вы не вызовете
updateRow
метод на курсоре. Это сохраняет новые данные в фактический набор данных.Вот код Python, который я бы использовал для этого метода:
3. Arc 10.1 - курсоры arcpy.da
При использовании новых курсоров в модуле доступа к данным (т. Е.
arcpy.da.UpdateCursor
) Необходимо передать список имен полей в качестве второго параметра в конструкторе курсора. Это требует дополнительной работы заранее, но получающиесяrow
объекты представляют собой списки Python, что упрощает чтение и запись данных при переборе строк курсора.arcpy.da.UpdateCursor
также имеет лучшую производительность, чемarcpy.UpdateCursor
частично, потому что пропускает неважные поля, особенно геометрию.При чтении геометрии, вы можете выбрать один из нескольких геометрических лексем, например
SHAPE@TRUECENTROID
,SHAPE@AREA
, илиSHAPE@
. Использование «более простого» токена значительно повышает производительность по сравнению с темSHAPE@
, который содержит всю информацию о геометрии. Полный список токенов находится наarcpy.da.UpdateCursor
странице справки.Как и прежде, ваша выходная строка хранится во временном временном пространстве, пока вы не вызовете
updateRow
метод для курсора. Это сохраняет новые данные в фактический набор данных.Вот код Python, который я бы использовал для этого метода:
источник
row[1] = row[0]
какarea
атрибута больше нет . Вы также можете использовать курсор в качестве диспетчера контекста вwith
выражении и не беспокоиться об удалении чего-либо.