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

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

Доступ к данным с помощью курсоров

  • Объект курсора
  • Доступ к значениям поля и их установка
  • Курсоры и блокировка
  • Поля Cursors и BLOB

Курсор – это объект доступа к данным, который может использоваться как для итерации набора строк в таблице, так и для вставки новых строк в таблицу. Курсоры могут быть трех форм: поиска, вставки или обновления. Как правило, курсоры используются для считывания существующей геометрии и записи новых геометрий.

Каждый тип курсора создается соответствующей функцией ArcPy (SearchCursor, InsertCursor или UpdateCursor) в таблице, представлении таблицы, классе объектов или векторном слое. Курсор поиска может использоваться для быстрой выборки строк. Курсор обновления может использоваться для позиционного обновления и удаления строк, тогда как курсор вставки – для вставки строк в таблицу или в класс объекта.

КурсорОписание

arcpy.da.InsertCursor(in_table, field_names)

Вставляет строки

arcpy.da.SearchCursor(in_table, field_names, {where_clause}, {spatial_reference}, {explode_to_points}, {sql_clause})

Доступ только для чтения

arcpy.da.UpdateCursor(in_table, field_names, {where_clause}, {spatial_reference}, {explode_to_points}, {sql_clause})

Обновляет или удаляет строки

Функции курсора доступа к данным (arcpy.da)
Прежние версии:

В ArcGIS 10.1 был добавлен новый модуль доступа к данным (arcpy.da). Существовавшие ранее курсоры (которые до сих пор числятся под arcpy) все еще функционируют и действительны; однако, новые курсоры arcpy.da обладают значительно более высоким быстродействием. В большинстве случаев в справочной системе демонстрируется использование курсоров arcpy.da. Более подробную информацию о классической модели курсора смотрите в таблице ниже.

КурсорОписание

arcpy.InsertCursor(dataset, {spatial_reference})

Вставляет строки

arcpy.SearchCursor(dataset, {where_clause}, {spatial_reference}, {fields}, {sort_fields})

Доступ только для чтения

arcpy.UpdateCursor(dataset, {where_clause}, {spatial_reference}, {fields}, {sort_fields})

Обновляет или удаляет строки

Функции курсора (arcpy)
Примечание:

Курсоры учитывают запросы и определяющие запрос представления слоев/таблиц и выборок. Объект курсора содержит в этом случае только те строки, которые бы использовались любыми инструментами геообработки в это время.

Курсоры можно перемещать только в направлении вперед. Их нельзя передвинуть назад и выбрать строки, которые уже были выбраны. Если скрипт требует выполнения многократных проходов данных, то может быть вызван метод курсора reset.

Итерацию курсоров поиска или обновления можно произвести с помощью цикла for. Доступ к следующей строке можно получить явным использованием встроенного метода Python возврата следующей строки next. При использовании метода next для курсора для получения всех строк таблицы, содержащих N строк, скрипт должен выполнить N вызовов метода next. Вызов next за последней выбранной строкой в наборе результатов выдает исключение StopIteration.

import arcpy

cursor = arcpy.da.SearchCursor(fc, ['fieldA', 'fieldB'])
for row in cursor:
    print(row)

Курсоры поиска и обновления также поддерживают выражение with.

import arcpy

with arcpy.da.SearchCursor(fc, ['fieldA', 'fieldB']) as cursor:
    for row in cursor:
        print(row)

Все строки, извлеченные из таблицы, выдаются в виде списка значений поля. Значения будут возвращаться в том же порядке, который предустановлен в аргументе курсора field_names. Свойство курсора fields может также использоваться для подтверждения порядка значений поля.

Объект курсора

SearchCursor, UpdateCursor и InsertCursor создают объект курсора, который может использоваться для итерации записей. Методы объекта курсора, созданного различными функциями курсора, различаются в зависимости от типа созданного курсора.

В таблице ниже представлены методы, поддерживаемые каждым типом курсора:

Тип курсораМетодВлияние на положение

arcpy.da.SearchCursor

reset()

Сбрасывает курсор в исходное положение

arcpy.da.InsertCursor

insertRow()

Вставляет строку в таблицу

arcpy.da.UpdateCursor

updateRow()

Обновляет текущую строку

deleteRow()

Удаляет строку из таблицы

reset()

Сбрасывает курсор в исходное положение

insertRow

Курсор вставки используется для создания новых строк и их вставки. После создания курсора метод insertRow используется для вставки списка или кортежа (tuple) значений, которые формируют новую строку. Любому полю в таблице, не включенному в курсор, назначается значение поля по умолчанию.

import arcpy

# Create insert cursor for table
#
cursor = arcpy.da.InsertCursor("c:/base/data.gdb/roads_lut", 
                               ["roadID", "distance"])

# Create 25 new rows. Set the initial row ID and distance values
#
for i in range(0,25):
    cursor.insertRow([i, 100])

updateRow

Метод updateRow используется для обновления строки в текущем положении курсора обновления. После возврата строки из объекта курсора можно требуемым образом изменить строку и вызвать updateRow для передачи измененной строки.

import arcpy

# Create update cursor for feature class
#
with arcpy.da.UpdateCursor("c:/base/data.gdb/roads",
                           ["roadtype", "distance"]) as cursor:
    for row in cursor:
        # Update the values in the distance field by multiplying 
        #   the roadtype by 100. Road type is either 1, 2, 3 or 4.
        #
        row[1] = row[0] * 100
        cursor.updateRow(row)

deleteRow

Метод deleteRow используется для удаления строки в текущем положении курсора обновления. После выбора строки необходимо вызвать метод deleteRow для курсора для удаления строки.

import arcpy

# Create update cursor for feature class
#
with arcpy.da.UpdateCursor("c:/base/data.gdb/roads", 
                          ["roadtype"]) as cursor:
    # Delete all rows that have a roads type of 4
    #
    for row in cursor:
        if row[0] == 4:
            cursor.deleteRow()

Доступ к значениям поля и их установка

Для каждого курсора используемые поля предоставляются списком или кортежем имен полей. При возврате строки из курсора строка возвращается как список значений полей, соответствующих положению указателя.

В примере ниже доступ к имени и количеству населения штата осуществляется по местоположению.

import arcpy

fc = "c:/base/data.gdb/USA/States"

# Use SearchCursor to access state name and the population count
#
with arcpy.da.SearchCursor(fc, ['STATE_NAME', 'POP2000']) as cursor:
    for row in cursor:
        # Access and print the row values by index position.
        #   state name: row[0]
        #   population: row[1]
        #
        print('{} has a population of {}'.format(row[0], row[1]))
Подсказка:

Несмотря на то, что доступ ко всем полям можно получить с помощью звездочки (*), делать это обычно не рекомендуется. Чем больше заданно полей, тем медленнее работает курсор. Включение в список только тех полей, которые будут использоваться, улучшает производительность курсора.

Можно также использоваться маркеры (token) в качестве сокращений вместо имен полей. Все таблицы включают поле ObjectID, которое может иметь множество различных имен в зависимости от типа данных. Простым классам объектов обычно (но не всегда) требуется поле геометрии, с именем Shape. Для доступа к полю ObjectID может быть использован токен OID@, а токен SHAPE@ (возвращающий объект геометрии) может быть использован для доступа к полю геометрии класса объекта без наличия предварительных сведений об имени поля.

Курсор поиска для мультиточечного класса объектов
import arcpy

infc = arcpy.GetParameterAsText(0)

# Enter for loop for each feature
#
for row in arcpy.da.SearchCursor(infc, ["OID@", "SHAPE@"]):
    # Print the current multipoint's ID
    #
    print("Feature {}:".format(row[0]))

    # For each point in the multipoint feature,
    #  print the x,y coordinates
    #
    for pnt in row[1]:
        print("{}, {}".format(pnt.X, pnt.Y))

Дополнительные маркеры геометрии можно использовать для доступа к конкретным сведениям о геометрии. Доступ к полной геометрии более затратен по времени. Если требуются только конкретные свойства геометрии, используйте маркеры, чтобы предоставить быстрый доступ к свойствам геометрии. Например, SHAPE@XY возвратит кортеж координат x,y, представляющий центроиды объектов.

Курсоры и блокировка

Курсоры вставки и обновления соблюдают блокировки таблицы, установленные приложениями ArcGIS. Блокировки предохраняют сложные процессы от изменения одной и той же таблицы одновременно. Существует два типа блокировок: общие и эксклюзивные.

  • Общая блокировка применяется в любое время к таблице или набору данных, к которым производится доступ. Несколько общих блокировок может быть создано для таблицы, но если имеется общая блокировка, то создание эксклюзивной блокировки запрещается. Например, создание общей блокировки происходит при отображении класса объектов в ArcMap и просмотре таблицы в ArcCatalog.
  • Эксклюзивные блокировки применяются при внесении изменений в таблицу или класс объекта. К примеру, создание эксклюзивной блокировки ArcGIS происходит при редактировании и сохранении класса объекта в ArcMap, изменении схемы таблицы в ArcCatalog или использовании курсора вставки для класса объекта в Python IDE, например, PythonWin.

Курсоры обновления и вставки не могут быть созданы для таблицы или класса объектов при наличии эксклюзивной блокировки для набора данных. Функции UpdateCursor или InsertCursor выдают ошибку из-за эксклюзивной блокировки набора данных. Если эти функции успешно создают курсор, то они используют эксклюзивную блокировку для набора данных так, чтобы два скрипта не могли создать курсор обновления или вставки для того же набора данных.

В Python блокировка сохраняется до тех пор, пока курсор не будет снят. Иначе все другие приложения или скрипты могли бы неоправданно перекрывать доступ к набору данных. Курсор может быть освобожден одним из следующего:

  • Включением курсора в выражение with, что гарантирует снятие блокировок вне зависимости от того, удачно или неудачно завершилась работа курсора.
  • Вызов reset() курсора
  • Завершение работы курсора
  • Прямое удаление курсора с помощью выражения Python del

В сеансе редактирования в ArcMap создается общая блокировка данных на время сеанса. Эксклюзивная блокировка применяется при сохранении изменений. Если уже существует эксклюзивная блокировка, то набор данных нельзя редактировать.

Поля Cursors и BLOB

Большой двоичный объект (BLOB) представляет собой некоторую часть данных, хранимую в виде длинной последовательности двоичных чисел. ArcGIS хранит в виде больших двоичных объектов (BLOB) аннотации и объекты-размеры (dimension), а также такие элементы, как изображения, мультимедиа или фрагменты кода. Курсор можно использовать для загрузки или просмотра содержимого поля BLOB.

В Python поля типа BLOB могут содержать строки, bytearray и memoryviews. При чтении полей BLOB возвращается объект memoryview.

import arcpy
data = open("c:/images/image1.png", "rb").read()
ic = arcpy.da.InsertCursor("c:/data/fgdb.gdb/fc", ['imageblob'])
ic.insertRow([data])

import arcpy
sc = arcpy.da.SearchCursor("c:/data/fgdb.gdb/fc", ["imageblob"])
memview = sc.next()[0]
open("c:/images/image1_copy.png", "wb").write(memview.tobytes())

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

  • Считывание геометрии
  • Запись геометрий
  • Настройка пространственной привязки курсора

ArcGIS Desktop

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

ArcGIS Platform

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

Об Esri

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