Страница 1 из 1

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

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

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

Добавлено: 17 янв 2018, 08:34
trir

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

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

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

Добавлено: 17 янв 2018, 08:58
Sibit
И что это даст? Как получить слой с геометрической разностью? И что делать если нет SQL сервера?

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

Добавлено: 17 янв 2018, 09:29
5Nap
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 сделает то же самое эффективнее (как минимум, меньше чтения в память).

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

Добавлено: 17 янв 2018, 09:37
trir
И что это даст?
слой с геометрической разностью

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

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

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

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

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

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

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

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

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

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

Добавлено: 17 янв 2018, 13:17
trir
низя, слишком много там Изображение