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

Как быть, если границы зон переписи населения изменились?

Добавлено: 11 фев 2019, 17:28
Albaricoque
Добрый день. Работаю с панельными данными, временной промежуток в 10 лет, и на самом "детализированном" уровне: полигоны в гис примерно соответствуют 1 зданию (census block). Данные переписи населения. Проблема в том, что за 10 лет границы многих полигонов изменились (например, если на месте поля построили здания, то поле, раньше бывшее одним полигоном, разбивается на несколько, которые примерно соответствуют зданиям). По сути, у меня сейчас два шеипфаила с полигонами, и мне бы хотелось, чтобы QGis их сравнил между собой, выделив полигоны, которые:
1. не изменились
2. были объединены в 1 большой полигон
3. были разделены на несколько полигонов
Есть идеи, как это можно сделать? Желательно в Qgis. Заранее спасибо!

Re: Как быть, если границы зон переписи населения изменились?

Добавлено: 11 фев 2019, 17:47
trir
если полигон не изменился, ST_Difference вернёт пустую геометрию

Re: Как быть, если границы зон переписи населения изменились?

Добавлено: 12 фев 2019, 07:41
gamm
снесите ID полигонов на достаточно детальный растр (GDAL rasterize), и постройте перекрестную таблицу двух растров (затащив растры в R, Python, или еще куда). С векторами намаетесь, если полигонов много - а выгода минимальная, при современных мощностях компьютеров.

Re: Как быть, если границы зон переписи населения изменились?

Добавлено: 12 фев 2019, 09:24
Dmitry Stasev
Если про Qgis и нужен анализ изменений то Вам может помочь виртуальный слой и составление в нем правильных
SQL запросов с использованием пространственных функций (что и советовал trir)
https://www.gaia-gis.it/spatialite-3.0. ... 0.html#p12
https://www.gaia-gis.it/spatialite-3.0. ... 0.html#p14
Но если нет понимания процессов выборки данных sql запросом, то это очень тернистый путь )
Плюс все операции с геометриями любят топологически-валидные геометрии.
И если наборы объемные то это может быть очень долго!

На днях делал скрипт, который должен был получить разницу между 2 наборами данных
Из рабочего набора 5тыс вычитал шаблон 30тыс геометрий.
Запрос "в лоб" не отработал и за 14 часов.
Пришлось бить набор в цикле пачками по 100 объектов, потом по габариту пачки вырезать пересекающиеся геометрии из шаблона, затем их вычитать, а потом результаты клеить )))
На отладку алгоритма ушло 1,5 дня. Хотя потом он отработал за 12 минут.
Так что смотрите сами, возможно лучше сразу смотреть на растры.

PS
--
Для этих танцев с бубном потребовался еще PyQGIS

Re: Как быть, если границы зон переписи населения изменились?

Добавлено: 12 фев 2019, 10:22
tsarev
а я бы сделал так:
берем два полигональных слоя и для каждого слоя определяем центр полигона и площадь полигона.
Затем берем центроиды первого слоя и долбим ими полигоны второго слоя.
Смотрим в какой полигон попал центроид (площадь полигона).
Потом делаем наоборот.

Re: Как быть, если границы зон переписи населения изменились?

Добавлено: 12 фев 2019, 10:42
trir
На днях делал скрипт, который должен был получить разницу между 2 наборами данных
Из рабочего набора 5тыс вычитал шаблон 30тыс геометрий.
Запрос "в лоб" не отработал и за 14 часов.
Пришлось бить набор в цикле пачками по 100 объектов, потом по габариту пачки вырезать пересекающиеся геометрии из шаблона, затем их вычитать, а потом результаты клеить )))
На отладку алгоритма ушло 1,5 дня. Хотя потом он отработал за 12 минут.
а сразу в БД загрузить, построить индекс?

Re: Как быть, если границы зон переписи населения изменились?

Добавлено: 12 фев 2019, 11:32
gamm
Dmitry Stasev писал(а):
12 фев 2019, 09:24
Запрос "в лоб" не отработал и за 14 часов.
в растр его, работает на порядок быстрее, чем вектор в MSSQL со всеми индексами и пр. За секунды ...

Re: Как быть, если границы зон переписи населения изменились?

Добавлено: 12 фев 2019, 12:03
Dmitry Stasev
trir писал(а):
12 фев 2019, 10:42
БД загрузить, построить индекс?
Тут БД нужна, я на удаленке на виртуалке. Там есть рабочий постгре, но он боевой и туда так просто не запустят. Да и опыт зато какой приобрел )))
gamm писал(а):
12 фев 2019, 11:32
в растр его, работает на порядок быстрее, чем вектор в MSSQL со всеми индексами и пр. За секунды ...
К сожалению с растрами плотно не работал.

Re: Как быть, если границы зон переписи населения изменились?

Добавлено: 12 фев 2019, 12:10
trir
Тут БД нужна, я на удаленке на виртуалке.
а даные себе скачать? или поднять ещё один постгре?
если там есть БД - почему данные не там?

Re: Как быть, если границы зон переписи населения изменились?

Добавлено: 13 фев 2019, 12:44
Albaricoque
Ох, спасибо всем за советы, попробую разобраться (ну да, я сходу не совсем поняла суть некоторых предложений, но всё ещё впереди). Также обнаружилось, что даже те полигоны, которые по сути одинаковые, формально разные, потому что были перерисованы даже те полигоны, которые не изменились. Чуть шире там, чуть длиннее здесь - и вот уже для программы они разные. На данный момент пытаюсь заиметь таблицу с кодами полигонов, в которой обозначено, какой полигон был разбит на несколько (и есть код старого полигона и новых). Идея попробовать с кодами сопоставить это всё с гисе, но, возможно, это тупиковый путь... Я за эти полигоны так держусь, потому что меня интересует информация, к нем прикрепленная, например, как изменилось количество машин в каждом полигоне за 10 лет

Re: Как быть, если границы зон переписи населения изменились?

Добавлено: 13 фев 2019, 13:59
gamm
Albaricoque писал(а):
13 фев 2019, 12:44
Я за эти полигоны так держусь, потому что меня интересует информация, к нем прикрепленная, например, как изменилось количество машин в каждом полигоне за 10 лет
тем более никакие полигоны вам не нужны. Сносите на растр свои машины (или что там еще есть), и вычитайте растры. Потом собирайте разницу в любые новые полигоны, и раскрашивайте, как новогоднюю елку..