Сравненеие 2-х слоев

ArcGIS 8.x,9.x,10.x (Arcview, ArcEditor, Arcinfo).
Ответить
Sibit
Активный участник
Сообщения: 216
Зарегистрирован: 21 окт 2009, 13:29
Репутация: 28
Откуда: Новосибирск

Сравненеие 2-х слоев

Сообщение Sibit » 17 янв 2018, 08:26

Такой вопрос: есть два слоя полигонов, которые по идее сдолжны быть одинаковые. Есть поле одинаковое в обоих этих таблицах(кадастровый номер, например) . Как мжно по этому полю попарно сравнить объекты? Желательно, как в проверке топологии, получить геометрическую разность объектов.

trir
Гуру
Сообщения: 5278
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1014
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Сравненеие 2-х слоев

Сообщение trir » 17 янв 2018, 08:34

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

Select *
from
tbl1 left join tbl2 on tbl1.cadnum = tbl2.cadnum
where not tbl1.geom.STSymDifference(tbl2.geom).STIsEmpty();

Sibit
Активный участник
Сообщения: 216
Зарегистрирован: 21 окт 2009, 13:29
Репутация: 28
Откуда: Новосибирск

Re: Сравненеие 2-х слоев

Сообщение Sibit » 17 янв 2018, 08:58

И что это даст? Как получить слой с геометрической разностью? И что делать если нет SQL сервера?

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

Re: Сравненеие 2-х слоев

Сообщение 5Nap » 17 янв 2018, 09:29

Sibit писал(а):
17 янв 2018, 08:26
Как мжно по этому полю попарно сравнить объекты?
Data Management -> Data Comparson -> Detect Feature Changes. Выбрать кадастровый номер как базовое поле, Shape - как поле, по которому сравнивать. Но в результате будет только указатель на то, изменилась геометрия или нет.

Если нужно именно пересечение, то SQL или Python.

Такая штука вернёт в diffs_fc симметричную разность для тех полигонов, где геометрия отличается.

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

shapes_base = {row[0]: row[1] for row in arcpy.da.SearchCursor(base_fc, [cad_field, 'SHAPE@'])}
shapes_target = {row[0]: row[1] for row in arcpy.da.SearchCursor(target_fc, [cad_field, 'SHAPE@'])}
diffs = {}
for key, base_geom in shapes_base.iteritems():
    target_geom = shapes_target.get(key, None)
    if target_geom is not None:
        if not base_geom.equals(target_geom):
            diffs[key] = base_geom.symmetricDifference(target_geom)
with arcpy.da.InsertCursor(diffs_fc, [cad_field, 'SHAPE@']) as ic:
    for key, geom in diffs.iteritems():
        ic.insertRow([key, geom])
SQL сделает то же самое эффективнее (как минимум, меньше чтения в память).

trir
Гуру
Сообщения: 5278
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1014
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Сравненеие 2-х слоев

Сообщение trir » 17 янв 2018, 09:37

И что это даст?
слой с геометрической разностью

tsarev
Завсегдатай
Сообщения: 406
Зарегистрирован: 14 авг 2006, 16:21
Репутация: 25

Re: Сравненеие 2-х слоев

Сообщение tsarev » 17 янв 2018, 10:33

1. Можно рассчитать площадь и периметр для каждого объекта. Затем сравнить полученные результаты.
2. Можно определить центроиды для каждого полигона. Далее сравнить координаты центроидов.
В любом случае получите перечень объектов у которых отличаются геометрические характеристики.

Sibit
Активный участник
Сообщения: 216
Зарегистрирован: 21 окт 2009, 13:29
Репутация: 28
Откуда: Новосибирск

Re: Сравненеие 2-х слоев

Сообщение Sibit » 17 янв 2018, 10:41

5Nap писал(а):
17 янв 2018, 09:29
Такая штука вернёт в diffs_fc симметричную разность для тех полигонов, где геометрия отличается.
Спасибо, работает.
5Nap писал(а):
17 янв 2018, 09:29
SQL сделает то же самое эффективнее (как минимум, меньше чтения в память).
А как это сделать? Нужно определить запрос для слоя? А если классы хранятся в разных таблицах?

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

Re: Сравненеие 2-х слоев

Сообщение 5Nap » 17 янв 2018, 12:31

Sibit писал(а):
17 янв 2018, 10:41
А как это сделать?
trir написал запрос выше. Если нет SQL-сервера - выгрузить в SpatiaLite/PG и прогнать там.

Если у вас очень большие слои, можно сильно убыстрить скрипт (а заодно избежать MemoryError), если написать последовательный проход двумя курсорами по сортированным слоям. С точки зрения скорости и смысла будет очень близко к варианту через SQL. Память не понадобится вообще:)

Sibit
Активный участник
Сообщения: 216
Зарегистрирован: 21 окт 2009, 13:29
Репутация: 28
Откуда: Новосибирск

Re: Сравненеие 2-х слоев

Сообщение Sibit » 17 янв 2018, 13:10

5Nap писал(а):
17 янв 2018, 12:31
trir написал запрос выше. Если нет SQL-сервера - выгрузить в SpatiaLite/PG и прогнать там.
Вопрос не в запросе, а в том как его использовать. И можно ли вообще без выгрузки куда-либо.

trir
Гуру
Сообщения: 5278
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1014
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Сравненеие 2-х слоев

Сообщение trir » 17 янв 2018, 13:17

низя, слишком много там Изображение

Ответить

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

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

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