Запись геометрий
С помощью курсоров insert и update можно получить скрипты, которые будут создавать новые или обновлять существующие объекты в классах пространственных объектов. Чтобы определить объект, скрипт создает объект point, заполняет его свойства и размещает его в массиве (array). Затем массив можно будет использовать для настройки геометрии объектов с помощью классов геометрии Polygon, Polyline, PointGeometry или MultiPoint.
import arcpy
fc = "c:/data/gdb.gdb/roads"
cursor = arcpy.da.InsertCursor(fc, ["SHAPE@"])
array = arcpy.Array([arcpy.Point(5997611.48964, 2069897.7022),
arcpy.Point(5997577.46097, 2069905.81145)])
polyline = arcpy.Polyline(array)
cursor.insertRow([polyline])
Как показано выше, одиночная часть геометрии определяется массивом точек. Аналогичным образом составной объект определяется массивом массивов точек, как видно в приведенном ниже примере с использованием того же самого курсора.
firstPart = arcpy.Array([arcpy.Point(5997624.6225, 2069868.8208),
arcpy.Point(5997674.94199, 2069833.81741)])
secondPart = arcpy.Array([arcpy.Point(5997616.44497, 2069862.32774),
arcpy.Point(5997670.57373, 2069824.67456)])
array = arcpy.Array([firstPart, secondPart])
multipartFeature = arcpy.Polyline(array)
cursor.insertRow([newGeometry2])
При записи точечных пространственных объектов только одиночные объекты point используются для настройки геометрии точечных объектов. Не менее эффективно можно создавать точки (point) с помощью обозначения SHAPE@XY (а при необходимости также с помощью обозначений SHAPE@M и SHAPE@Z).
import arcpy
# fc is a point feature class
#
fc = "c:/data/gdb.gdb/stops"
cursor = arcpy.da.InsertCursor(fc, ["SHAPE@XY"])
xy = (5997594.4753, 2069901.75682)
cursor.insertRow([xy])
Перед записью в класс пространственных объектов вся геометрия проверяется. Такие проблемы, как неправильная ориентация кольца или самопересечения в полигонах, в числе прочих, исправляются в процессе упрощения геометрии перед вставкой.
Следующий пример иллюстрирует чтение набора координат (определенных в списке coordsList), содержащего серию линейных координат, и использование их для создания нового класса пространственных объектов.
# Create a new line feature class using a text file of coordinates.
# Each coordinate entry is semicolon delimited in the format of ID;X;Y
import arcpy
import os
# List of coordinates (ID, X, Y)
#
coordsList = [[1, -61845879.0968, 45047635.4861],
[1, -3976119.96791, 46073695.0451],
[1, 1154177.8272, -25134838.3511],
[1, -62051091.0086, -26160897.9101],
[2, 17365918.8598, 44431999.7507],
[2, 39939229.1582, 45252847.3979],
[2, 41170500.6291, 27194199.1591],
[2, 17981554.5952, 27809834.8945],
[3, 15519011.6535, 11598093.8619],
[3, 52046731.9547, 13034577.2446],
[3, 52867579.6019, -16105514.2317],
[3, 17160706.948, -16515938.0553]]
# The output feature class to be created
#
outFC = arcpy.GetParameterAsText(0)
# Get the template feature class
#
template = arcpy.GetParameterAsText(1)
cur = None
try:
# Create the output feature class
#
arcpy.CreateFeatureclass_management(os.path.dirname(outFC),
os.path.basename(outFC),
"POLYLINE", template)
# Open an insert cursor for the new feature class
#
cur = arcpy.da.InsertCursor(outFC, ["SHAPE@"])
# Create an array object needed to create features
#
array = arcpy.Array()
# Initialize a variable for keeping track of a feature's ID.
#
ID = -1
for coords in coordsList:
if ID == -1:
ID = coords[0]
# Add the point to the feature's array of points
# If the ID has changed, create a new feature
#
if ID != coords[0]:
cur.insertRow([arcpy.Polyline(array)])
array.removeAll()
array.add(arcpy.Point(coords[1], coords[2], ID=coords[0]))
ID = coords[0]
# Add the last feature
#
cur.insertRow([arcpy.Polyline(array)])
except Exception as e:
print e.message
finally:
# Cleanup the cursor if necessary
#
if cur:
del cur
Для создания составных полигональных и полилинейных объектов, а также полигональных объектов с внутренними кольцами, необходимо создать массив массивов, а затем передать их в классы Polygon и Polyline.