Выборка добавленных в слой объектов
-
- Участник
- Сообщения: 85
- Зарегистрирован: 21 ноя 2010, 17:36
- Репутация: 32
Выборка добавленных в слой объектов
Привет!
Есть ли какой-то быстрый способ добавить в выборку объекты, записанные в слой через Append?
Т.е. желаемый результат - выполнение Append'a слоя А в слой Б и FeatureLayer со всеми этими объектами из Б. Или набор ObjectID дописанных объектов. Всё осложняется тем, что эта операция должна быть быстрой (поэтому, например, Select by Location не годится).
Не обязательно дописывать объекты именно Append'ом (можно через курсоры, ...).
В доступе есть arcpy. ArcObjects нет(
Есть ли какой-то быстрый способ добавить в выборку объекты, записанные в слой через Append?
Т.е. желаемый результат - выполнение Append'a слоя А в слой Б и FeatureLayer со всеми этими объектами из Б. Или набор ObjectID дописанных объектов. Всё осложняется тем, что эта операция должна быть быстрой (поэтому, например, Select by Location не годится).
Не обязательно дописывать объекты именно Append'ом (можно через курсоры, ...).
В доступе есть arcpy. ArcObjects нет(
-
- Активный участник
- Сообщения: 244
- Зарегистрирован: 03 мар 2015, 10:01
- Репутация: 24
- Откуда: Санкт-Петербург
Re: Выборка добавленных в слой объектов
В Model builder есть инструмент "Выбрать", так что можно загнать в модель Append, а затем Select Data. Правда не уверена, можно ли им воспользоваться именно применительно к объектам изначального слоя. надо пробовать)
-
- Активный участник
- Сообщения: 163
- Зарегистрирован: 28 июн 2012, 01:02
- Репутация: 84
- Откуда: Vladivostok
Re: Выборка добавленных в слой объектов
Не претендую на оптимальное решение, но как вариант...
Если можно курсоры, то arcpy.da.SearchCursor весьма гибко позволяет использовать SQL запросы. После операции Append сортируем слой А по ObjectID в обратном порядке и берем первые N записей, где N равно количеству записей в слое Б. Получаем либо как список ObjectID, либо как объекты с атрибутами.
Примерно так для энтерпрайз базы:
Но "TOP is only supported by SQL Server and MS Access databases", поэтому файловые базы и шейпы в пролете. Для файловых баз можно так:Но и тут есть проблема с шейпами: "DISTINCT, ORDER BY, and ALL are only supported when working with databases. They are not supported by other data sources (such as dBASE or INFO tables)". Поэтому для шейп-файлов:По производительности, на мой взгляд, будет сильно зависеть от количества объектов в данных.
Если можно курсоры, то arcpy.da.SearchCursor весьма гибко позволяет использовать SQL запросы. После операции Append сортируем слой А по ObjectID в обратном порядке и берем первые N записей, где N равно количеству записей в слое Б. Получаем либо как список ObjectID, либо как объекты с атрибутами.
Примерно так для энтерпрайз базы:
Код: Выделить всё
layer = r'' # layer path
n = 5
oid_field = arcpy.Describe(layer).OIDFieldName
prefix = 'TOP {n}'.format(n=n)
postfix = 'ORDER BY {oid} DESC'.format(oid=oid_field)
sql_clause = (prefix, postfix)
with arcpy.da.SearchCursor(in_table=layer, field_names=[oid_field], sql_clause=sql_clause) as cursor:
oids = [row[0] for row in cursor]
Код: Выделить всё
layer = r'' # layer path
n = 5
oid_field = arcpy.Describe(layer).OIDFieldName
prefix = None
postfix = 'ORDER BY {oid} DESC'.format(oid=oid_field)
sql_clause = (prefix, postfix)
oids = []
with arcpy.da.SearchCursor(in_table=layer, field_names=[oid_field], sql_clause=sql_clause) as cursor:
for i in xrange(n):
oid = cursor.next()[0]
oids.append(oid)
Код: Выделить всё
layer = r'' # layer path
n = 5
oid_field = arcpy.Describe(layer).OIDFieldName
with arcpy.da.SearchCursor(in_table=layer, field_names=[oid_field]) as cursor:
oids = sorted((row[0] for row in cursor), reverse=True)[:n]
-
- Участник
- Сообщения: 85
- Зарегистрирован: 21 ноя 2010, 17:36
- Репутация: 32
Re: Выборка добавленных в слой объектов
Оказалось, что если просто взять последний OBJECTID и после удаления и append'а выбрать всё, что больше - это займёт не слишком много времени)
Единственное, придётся прописать правила изменения ID в зависимости от источника
Единственное, придётся прописать правила изменения ID в зависимости от источника
-
- Активный участник
- Сообщения: 163
- Зарегистрирован: 28 июн 2012, 01:02
- Репутация: 84
- Откуда: Vladivostok
Re: Выборка добавленных в слой объектов
А можете немного подробнее пояснить, что вы имеете в виду? ID же генерируется автоматически...5Nap писал(а):Единственное, придётся прописать правила изменения ID в зависимости от источника
-
- Участник
- Сообщения: 85
- Зарегистрирован: 21 ноя 2010, 17:36
- Репутация: 32
Re: Выборка добавленных в слой объектов
После удаления объектов из слоя в некоторых случаях OID обновляются, в некоторых - нет. Для SHP и MDB айдишники всегда идут по порядку от 0, в GDB - начинаются от 1 и не обновляются.doujin писал(а):А можете немного подробнее пояснить, что вы имеете в виду? ID же генерируется автоматически...5Nap писал(а):Единственное, придётся прописать правила изменения ID в зависимости от источника
Т.е. если мне нужно удалить 100 записей, дописать в слой X записей и выбрать их, то в GDB мне достаточно просто до удаления записать последний ID и выбирать всё, что больше него. В SHP и MDB нужно вычесть эти 100 из последнего ID, т.е. выбирать всё, что больше (LASTID-100).
Но вообще ваш вариант мне симпатичнее, выглядит более надёжным)
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя