SearchCursor
Краткая информация
Объект SearchCursor устанавливает доступ только для чтения к записям класса пространственных объектов или таблицы.
Возвращает итератор кортежей. Порядок значений в кортеже совпадает с порядком полей, указанных аргументом field_names.
Дополнительные сведения о доступе к данным посредством курсоров
Обсуждение
Доступ к свойствам объекта Geometry может быть получен путем указания токена SHAPE@ в списке полей.
Курсоры поиска могут быть итерированы с помощью цикла for. Курсоры поиска также поддерживают выражения with для сброса итераций и снятия блокировок. Однако использование выражения del удаляет объект или заводит курсор в функцию для того, чтобы объект-курсор вышел из области применения, нужно принять во внимание настройки безопасности в случае блокировок.
Записи, возвращаемые курсором SearchCursor, могут быть отфильтрованы по атрибутивному и/или пространственному критерию.
Доступ к полной геометрии SHAPE@ – это затратная операция. Если требуется только простая информация о геометрии, например, координат x и y точки, используйте для более быстрого и эффективного доступа такие токены, как SHAPE@XY, SHAPE@Z и SHAPE@M.
Синтаксис
SearchCursor(in_table, field_names, {where_clause}, {spatial_reference}, {explode_to_points}, {sql_clause}, {datum_transformation}, {spatial_filter}, {spatial_relationship}, {search_order})
| Имя | Объяснение | Тип данных |
|---|---|---|
|
in_table |
Входной класс объектов, слой, таблица или табличное представление. |
String |
|
field_names |
Список (или кортеж) имен полей. Для одного поля можно использовать строку вместо списка строк. Используйте звездочку ( Доступ к дополнительной информации можно получить, используя токены (такие как
|
String |
|
where_clause (Дополнительный) |
Возвращается дополнительное выражение, которое ограничивает записи. Более подробно об условиях WHERE и выражений SQL см. Основы SQL для выражений запроса, применяемых в ArcGIS. (Значение по умолчанию — None) |
String |
|
spatial_reference (Дополнительный) |
Пространственная привязка класса объектов. Когда этот аргумент задан, объект будет спроецирован (или преобразован) из пространственной привязки входных данных. Если не указан, то будет использоваться пространственная привязка входных классов пространственных объектов. Допустимыми значениями этого аргумента являются объект If a spatial reference is specified, but the input feature class has an unknown spatial reference, neither a projection nor transformation can be completed. The geometry returned by the cursor will have coordinates matching the input, with a spatial reference updated to the one specified. (Значение по умолчанию — None) |
SpatialReference |
|
explode_to_points (Дополнительный) |
Разбивает объект на отдельные точки или вершины. Если для (Значение по умолчанию — False) |
Boolean |
|
sql_clause (Дополнительный) |
Пара префикса и постфикса SQL, объединенная в списке или кортеже. SQL-префикс поддерживает Use
Use
Use
Префикс SQL располагается в первой позиции и будет вставлен между ключевым словом Постфикс SQL располагается во второй позиции и добавляется к инструкции Примечание:
(Значение по умолчанию — (None, None)) |
tuple |
|
datum_transformation (Дополнительный) |
Когда курсор проецирует объекты из одной пространственной привязки в другую, если пространственные привязки не имеют общих данных, следует указать соответствующее преобразование датума. Функция Более подробно о преобразовании датума (Значение по умолчанию — None) |
String |
|
spatial_filter (Дополнительный) |
Объект геометрии для пространственной фильтрации объекта. Если указан этот аргумент, курсор будет ограничивать возвращаемые объекты, основываясь на указанной геометрии и значении spatial_relationship. (Значение по умолчанию — None) |
Geometry |
|
spatial_relationship (Дополнительный) |
Пространственное отношение между входной и запрашиваемой геометрией в аргументе
(Значение по умолчанию — INTERSECTS) |
String |
|
search_order (Дополнительный) |
Порядок, в котором СУБД будет применять пространственный поиск. Это свойство влияет только на данные многопользовательской базы геоданных и применимо только при указании аргумента
(Значение по умолчанию — ATTRIBUTEFIRST) |
String |
Свойства
| Имя | Объяснение | Тип данных |
|---|---|---|
|
fields (Только для чтения) |
Кортеж имен полей, используемых курсором. В кортеж будут включены все поля и токены, указанные с помощью аргумента Порядок имен полей в свойстве Если аргумент |
tuple |
Методы
reset()
Метод reset возвращает курсор обратно к первой строке.
Пример кода
Использует SearchCursor для прохода по классу объектов и печати определенных значений полей и координат x,y точки.
import arcpy
fc = 'c:/data/base.gdb/well'
fields = ['WELL_ID', 'WELL_TYPE', 'SHAPE@XY']
# For each row, print the WELL_ID and WELL_TYPE fields, and
# the feature's x,y coordinates
with arcpy.da.SearchCursor(fc, fields) as cursor:
for row in cursor:
print(f'{row[0]}, {row[1]}, {row[2]}')
Использует SearchCursor для возврата набора уникальных значений полей.
import arcpy
fc = 'c:/data/base.gdb/well'
field = 'Diameter'
# Use SearchCursor with list comprehension to return a
# unique set of values in the specified field
values = [row[0] for row in arcpy.da.SearchCursor(fc, field)]
unique_values = set(values)
print(unique_values)
Использует SearchCursor для возврата атрибутов с помощью токенов.
import arcpy
fc = 'c:/data/base.gdb/well'
# For each row, print the Object ID field, and use the SHAPE@AREA
# token to access geometry properties
with arcpy.da.SearchCursor(fc, ['OID@', 'SHAPE@AREA']) as cursor:
for row in cursor:
print(f'Feature {row[0]} has an area of {row[1]}')
Использует SearchCursor с выражением where для определения объектов, соответствующих определенным критериям.
import arcpy
fc = 'c:/base/data.gdb/roads'
class_field = 'Road Class'
name_field = 'Name'
# Create an expression with proper delimiters
delimited_field = arcpy.AddFieldDelimiters(fc, name_field)
expression = f'{delimited_field} = 2'
# Create a search cursor using an SQL expression
with arcpy.da.SearchCursor(
fc, [class_field, name_field], where_clause=expression
) as cursor:
for row in cursor:
# Print the name of the residential road
print(row[1])
Использует SearchCursor и метода Python sorted для сортировки строк.
Сведения о дополнительных опциях сортировки см. в разделе Sorting Mini-HOW TO для Python.
import arcpy
fc = 'c:/data/base.gdb/well'
fields = ['WELL_ID', 'WELL_TYPE']
# Use Python's sorted method to sort rows
for row in sorted(arcpy.da.SearchCursor(fc, fields)):
print(f'{row[0]}, {row[1]}')
Вы также можете выполнить сортировку, используя sql_clause, если данные поддерживают команду SQL ORDER BY.
Примечание:
Запрос ORDER BY поддерживается только при работе с базами данных. Другие источники данных, такие как таблицы dBASE, эти команды не поддерживаются.
import arcpy
fc = 'c:/data/base.gdb/well'
fields = ['WELL_ID', 'WELL_TYPE']
# Use ORDER BY sql clause to sort field values
with arcpy.da.SearchCursor(fc, fields, sql_clause=(None, "ORDER BY WELL_ID, WELL_TYPE")) as cursor:
for row in cursor:
print(f'{row[0]}, {row[1]}')
Используйте команду SQL TOP, чтобы ограничить число возвращаемых записей.
Примечание:
Команда TOP поддерживается только базами данных SQL Server.
import arcpy
fc = 'c:/data/base.gdb/well'
fields = ['WELL_ID', 'WELL_TYPE']
# Use SQL TOP to sort field values
with arcpy.da.SearchCursor(fc, fields, sql_clause=('TOP 3', None)):
for row in cursor:
print(f'{row[0]}, {row[1]}')
Использует SearchCursor с пространственным фильтром с объектом геометрии.
import arcpy
arr = arcpy.Array(
[arcpy.Point(342917.4, 553980.8), arcpy.Point(366915.9, 594749.1)]
)
new_road = arcpy.Polyline(arr, spatial_reference=arcpy.SpatialReference(26971))
fc = r"C:\data\chicago.gdb\houses"
fields = ["ADDRESS", "OCCUPIED"]
with arcpy.da.SearchCursor(
fc, fields, where_clause="OCCUPIED != 'Vacant'", spatial_filter=new_road
) as cursor:
for row in cursor:
print(f'{row[0]}: {row[1]}')
Использует SearchCursor с пространственным фильтром с объектом геометрии другого класса пространственных объектов.
import arcpy
fc = r"c:\connections\sqlserver.sde\DBO.ShipPositions"
fields = ["OBJECTID", "SHIP_NAME"]
searchPoly = [row[0] for row in arcpy.da.SearchCursor("searchArea", ["SHAPE@"])][0]
with arcpy.da.SearchCursor(
fc, fields, spatial_filter=searchPoly, search_order="SPATIALFIRST"
) as cursor:
for row in cursor:
print(f'{row[0]}: {row[1]}')