Сравненеие 2-х слоев
-
- Активный участник
- Сообщения: 216
- Зарегистрирован: 21 окт 2009, 13:29
- Репутация: 28
- Откуда: Новосибирск
Сравненеие 2-х слоев
Такой вопрос: есть два слоя полигонов, которые по идее сдолжны быть одинаковые. Есть поле одинаковое в обоих этих таблицах(кадастровый номер, например) . Как мжно по этому полю попарно сравнить объекты? Желательно, как в проверке топологии, получить геометрическую разность объектов.
-
- Гуру
- Сообщения: 5292
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1015
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: Сравненеие 2-х слоев
Код: Выделить всё
Select *
from
tbl1 left join tbl2 on tbl1.cadnum = tbl2.cadnum
where not tbl1.geom.STSymDifference(tbl2.geom).STIsEmpty();
-
- Активный участник
- Сообщения: 216
- Зарегистрирован: 21 окт 2009, 13:29
- Репутация: 28
- Откуда: Новосибирск
Re: Сравненеие 2-х слоев
И что это даст? Как получить слой с геометрической разностью? И что делать если нет SQL сервера?
-
- Участник
- Сообщения: 85
- Зарегистрирован: 21 ноя 2010, 17:36
- Репутация: 31
Re: Сравненеие 2-х слоев
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])
-
- Гуру
- Сообщения: 5292
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1015
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: Сравненеие 2-х слоев
слой с геометрической разностьюИ что это даст?
-
- Завсегдатай
- Сообщения: 406
- Зарегистрирован: 14 авг 2006, 16:21
- Репутация: 25
Re: Сравненеие 2-х слоев
1. Можно рассчитать площадь и периметр для каждого объекта. Затем сравнить полученные результаты.
2. Можно определить центроиды для каждого полигона. Далее сравнить координаты центроидов.
В любом случае получите перечень объектов у которых отличаются геометрические характеристики.
2. Можно определить центроиды для каждого полигона. Далее сравнить координаты центроидов.
В любом случае получите перечень объектов у которых отличаются геометрические характеристики.
-
- Активный участник
- Сообщения: 216
- Зарегистрирован: 21 окт 2009, 13:29
- Репутация: 28
- Откуда: Новосибирск
Re: Сравненеие 2-х слоев
Спасибо, работает.
А как это сделать? Нужно определить запрос для слоя? А если классы хранятся в разных таблицах?
-
- Участник
- Сообщения: 85
- Зарегистрирован: 21 ноя 2010, 17:36
- Репутация: 31
Re: Сравненеие 2-х слоев
trir написал запрос выше. Если нет SQL-сервера - выгрузить в SpatiaLite/PG и прогнать там.
Если у вас очень большие слои, можно сильно убыстрить скрипт (а заодно избежать MemoryError), если написать последовательный проход двумя курсорами по сортированным слоям. С точки зрения скорости и смысла будет очень близко к варианту через SQL. Память не понадобится вообще:)
-
- Активный участник
- Сообщения: 216
- Зарегистрирован: 21 окт 2009, 13:29
- Репутация: 28
- Откуда: Новосибирск
-
- Гуру
- Сообщения: 5292
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1015
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: Сравненеие 2-х слоев
низя, слишком много там
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 29 гостей