ArcGIS Desktop

  • ArcGIS Pro
  • ArcMap

  • My Profile
  • Справка
  • Sign Out
ArcGIS Desktop

ArcGIS Online

Картографическая платформа вашей организации

ArcGIS Desktop

Полноценная профессиональная ГИС

ArcGIS Enterprise

ГИС предприятия

ArcGIS for Developers

Инструменты для встраивания приложений с местоположениями

ArcGIS Solutions

Бесплатные шаблоны карт и приложений для отрасли

ArcGIS Marketplace

Получение приложения и данных для вашей организации.

  • Документация
  • Поддержка
Esri
  • Войти
user
  • Мой профиль
  • Выход

ArcMap

  • На главную
  • Начало работы
  • Карта
  • Анализ
  • Управление данными
  • Инструменты
  • Дополнительные модули

Запись геометрий

  • Создание геометрии на основе списка координат

Используя курсоры 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)])
spatial_reference = arcpy.SpatialReference(4326)
polyline = arcpy.Polyline(array, spatial_reference)
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]) spatial_reference = arcpy.SpatialReference(4326) multipartFeature = arcpy.Polyline(array, spatial_reference)
cursor.insertRow([multipartFeature])

При записи точечных объектов для задания геометрии точечного объекта используется только один объект точки. Легче (и эффективнее) точки могут быть созданы с помощью токена 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])

Все геометрии перед записью в качестве класса пространственного объекта проверяются. Такие проблемы как неправильная ориентация кольца или самопересечения в полигонах, в числе прочих, исправляются в процессе упрощения геометрии перед вставкой.

Следующий пример иллюстрирует чтение набора координат (определенных в coords_list), содержащего серию линейных координат, и использование их для создания нового класса пространственных объектов.

# 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)
coords_list = [[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)
    # Access spatial reference of template to define spatial
    # reference of geometries
    spatial_reference = arcpy.Describe(template).spatialReference
    # 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 coords_list: 
        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
    polyline = arcpy.Polyline(array, spatial_reference)
    cur.insertRow([polyline])
except Exception as e:
    print(e)
finally:
    # Cleanup the cursor if necessary
    if cur:
        del cur

Составные полигональные и полилинейные объекты, а также полигональные объекты с внутренними контурами, могут быть созданы путем создания массива массивов, а затем передачи его в классы Polygon и Polyline.

Создание геометрии на основе списка координат

Геометрию объекта также можно создать на основе списка координат. Этот подход повышает производительность, так как позволяет избежать сложностей при создании геометрии объектов. Однако это работает только для объектов, состоящих из одной части и, в случае с полигонов, для объектов без «дырок» внутри. Используемые единицы должны соответствовать единицам пространственной привязки класса объектов.

В примере ниже создается один полигональный объект на основании списка пар координат x,y.

import arcpy
import os
coordinates = [(-117.2000424, 34.0555514), 
               (-117.2000788, 34.0592066), 
               (-117.1957315, 34.0592309), 
               (-117.1956951, 34.0556001)]
# Create a feature class with a spatial reference of GCS WGS 1984
result = arcpy.management.CreateFeatureclass(
    arcpy.env.scratchGDB, 
    "esri_square", "POLYGON", spatial_reference=4326)
feature_class = result[0]
# Write feature to new feature class
with arcpy.da.InsertCursor(feature_class, ['SHAPE@']) as cursor:
    cursor.insertRow([coordinates])

Связанные разделы

  • Доступ к данным с помощью курсоров
  • Определение запроса в Python
  • Считывание геометрии
  • Использование объектов геометрии с инструментами геообработки

ArcGIS Desktop

  • На главную
  • Документация
  • Поддержка

ArcGIS Platform

  • ArcGIS Online
  • ArcGIS Desktop
  • ArcGIS Enterprise
  • ArcGIS for Developers
  • ArcGIS Solutions
  • ArcGIS Marketplace

Об Esri

  • О нас
  • Карьера
  • Блог Esri
  • Конференция пользователей
  • Саммит разработчиков
Esri
Расскажите нам, что вы думаете.
Copyright © 2019 Esri. | Конфиденциальность | Правовая информация