Выборка добавленных в слой объектов

ArcGIS 8.x,9.x,10.x (Arcview, ArcEditor, Arcinfo).
Ответить
5Nap
Участник
Сообщения: 85
Зарегистрирован: 21 ноя 2010, 17:36
Репутация: 32

Выборка добавленных в слой объектов

Сообщение 5Nap » 24 ноя 2016, 12:07

Привет!
Есть ли какой-то быстрый способ добавить в выборку объекты, записанные в слой через Append?
Т.е. желаемый результат - выполнение Append'a слоя А в слой Б и FeatureLayer со всеми этими объектами из Б. Или набор ObjectID дописанных объектов. Всё осложняется тем, что эта операция должна быть быстрой (поэтому, например, Select by Location не годится).
Не обязательно дописывать объекты именно Append'ом (можно через курсоры, ...).
В доступе есть arcpy. ArcObjects нет(

amnesiac
Активный участник
Сообщения: 244
Зарегистрирован: 03 мар 2015, 10:01
Репутация: 24
Откуда: Санкт-Петербург

Re: Выборка добавленных в слой объектов

Сообщение amnesiac » 24 ноя 2016, 19:08

В Model builder есть инструмент "Выбрать", так что можно загнать в модель Append, а затем Select Data. Правда не уверена, можно ли им воспользоваться именно применительно к объектам изначального слоя. надо пробовать)

doujin
Активный участник
Сообщения: 163
Зарегистрирован: 28 июн 2012, 01:02
Репутация: 84
Откуда: Vladivostok

Re: Выборка добавленных в слой объектов

Сообщение doujin » 25 ноя 2016, 10:03

Не претендую на оптимальное решение, но как вариант...
Если можно курсоры, то 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]
Но "TOP is only supported by SQL Server and MS Access databases", поэтому файловые базы и шейпы в пролете. Для файловых баз можно так:

Код: Выделить всё

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)
Но и тут есть проблема с шейпами: "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)". Поэтому для шейп-файлов:

Код: Выделить всё

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]
По производительности, на мой взгляд, будет сильно зависеть от количества объектов в данных.

5Nap
Участник
Сообщения: 85
Зарегистрирован: 21 ноя 2010, 17:36
Репутация: 32

Re: Выборка добавленных в слой объектов

Сообщение 5Nap » 25 ноя 2016, 12:16

Оказалось, что если просто взять последний OBJECTID и после удаления и append'а выбрать всё, что больше - это займёт не слишком много времени)
Единственное, придётся прописать правила изменения ID в зависимости от источника

doujin
Активный участник
Сообщения: 163
Зарегистрирован: 28 июн 2012, 01:02
Репутация: 84
Откуда: Vladivostok

Re: Выборка добавленных в слой объектов

Сообщение doujin » 25 ноя 2016, 13:47

5Nap писал(а):Единственное, придётся прописать правила изменения ID в зависимости от источника
А можете немного подробнее пояснить, что вы имеете в виду? ID же генерируется автоматически...

5Nap
Участник
Сообщения: 85
Зарегистрирован: 21 ноя 2010, 17:36
Репутация: 32

Re: Выборка добавленных в слой объектов

Сообщение 5Nap » 25 ноя 2016, 13:55

doujin писал(а):
5Nap писал(а):Единственное, придётся прописать правила изменения ID в зависимости от источника
А можете немного подробнее пояснить, что вы имеете в виду? ID же генерируется автоматически...
После удаления объектов из слоя в некоторых случаях OID обновляются, в некоторых - нет. Для SHP и MDB айдишники всегда идут по порядку от 0, в GDB - начинаются от 1 и не обновляются.
Т.е. если мне нужно удалить 100 записей, дописать в слой X записей и выбрать их, то в GDB мне достаточно просто до удаления записать последний ID и выбирать всё, что больше него. В SHP и MDB нужно вычесть эти 100 из последнего ID, т.е. выбирать всё, что больше (LASTID-100).

Но вообще ваш вариант мне симпатичнее, выглядит более надёжным)

Ответить

Вернуться в «ArcGIS»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя