Создаем карту границ участков избирательных комиссий Москвы из открытых данных: различия между версиями

Материал из GIS-Lab
Перейти к навигации Перейти к поиску
Строка 52: Строка 52:
*LVL3 - уровень 3 адреса: номер дома
*LVL3 - уровень 3 адреса: номер дома


[http://gis-lab.info/data/uik_geo/mgik_addr_all_20130828.zip Скачать исходную таблицу]
[http://gis-lab.info/data/uik_geo/mgik_addr_all_20130828.zip Скачать исходную таблицу] (CSV)


Этап 2 - подготовим адреса  
Этап 2 - подготовим адреса  
Строка 66: Строка 66:
Таблица готова к геокодированию.
Таблица готова к геокодированию.


[http://gis-lab.info/data/uik_geo/mgik_addr_all_20130828_geocode.zip Скачать обработанную таблицу]
[http://gis-lab.info/data/uik_geo/mgik_addr_all_20130828_geocode.zip Скачать обработанную таблицу] (CSV)


Этап 3 - геокодируем
Этап 3 - геокодируем
Строка 88: Строка 88:
С помощью того же инструмента проведем и обратную операцию, выбрав и удалив все районы в которые не попало ни одной точки.
С помощью того же инструмента проведем и обратную операцию, выбрав и удалив все районы в которые не попало ни одной точки.


[[Файл:Uik-area-map-05.png|550px|thumb|center|Оставшиеся точки и районы]]
[[Файл:Uik-area-map-05.png|550px|thumb|center|Оставшиеся точки и районы]]  


Этап 6 - привяжем точки к районам
Этап 6 - привяжем точки к районам
Строка 99: Строка 99:
Из 55 тыс адресов у нас останется около 21 тысячи.
Из 55 тыс адресов у нас останется около 21 тысячи.


[http://gis-lab.info/data/uik_geo/mgik_addr_all_20130828_geocode_clean.zip Скачать очищенный набор точек]
[http://gis-lab.info/data/uik_geo/mgik_addr_all_20130828_geocode_clean.zip Скачать очищенный набор геокодированных точек адресов] (ESRI Shape)


Этап 8 - разбивка по ОКАТО
Этап 8 - разбивка по ОКАТО
Это последний этап подготовки.
Это последний этап подготовки.
Теперь у нас есть точки и полигоны, у всех объектов, помимо прочих, есть код ОКАТО, который их объединяет. Разобьем эти два слоя на множество слоёв, каждый из которых будет представлять один код ОКАТО.
Теперь у нас есть точки и полигоны и у всех объектов, помимо прочих значений в таблице атрибутов, есть код ОКАТО, который их объединяет. Разобьем эти два слоя на множество производных слоёв. Каждый из производных будет представлять один код ОКАТО.


В QGIS: Вектор/Управление данными/Разбить векторный слой Разбиваем по полю OKATO_CODE. Рекомендую сложить результирующие точки и полигоны в отдельные папки, которые предварительно нужно создать. После окончания разбивки, нужно переименовать все файлы так, чтобы в названии остался только код ОКАТО. В результате количество файлов точек и полигонов должно точно совпадать.
В QGIS: Вектор/Управление данными/Разбить векторный слой Разбиваем по полю OKATO_CODE. Рекомендую сложить результирующие точки и полигоны в отдельные папки, которые предварительно нужно создать. После окончания разбивки, нужно переименовать все файлы так, чтобы в названии остался только код ОКАТО. В результате количество файлов точек и полигонов должно точно совпадать.

Версия от 19:52, 5 сентября 2013

Эта страница является черновиком статьи.


Шаги для создания карты границ участков

В разных уголках нашей страны, а иногда и целиком по все стране иногда проводятся выборы разных уровней. По закону, количество избирателей на участок не должно быть больше 3000, поэтому вся страна или область разбивается на участки. Люди проживающие на территории участка голосуют на избирательном участке - месте голосования. В виде открытых геоданных, за редким исключением некоторых регионов, государство данные об участках и их границах не распространяет, границы доступны только в виде описаний. Если местоположения мест голосований еще можно собрать, с участками количество работы по самостоятельной их отрисовке возрастает минимум на порядок. Поэтому имеет смысл попробовать применить автоматизацию.

Эта статья иллюстрирует некоторые, достаточно простые подходы для создания карты участков в границах г. Москвы (исключаю присоединенные территории Новой Москвы). Статья может рассматриваться как иллюстрация применения географического анализа для решения более-менее конкретной задачи. Используя данные, ссылки на которые приведены, можно всё воспроизвести самостоятельно.

Забегая вперед хочется сказать, что существующие наборы данных неадекватны для решения этой задачи и результат неудовлетворителен. Но лучше хоть какая-то попытка, чем никакой.

Спасибо Сергею Шпилькину, что еще раз напомнил о том, что это стоит попробовать сделать и Виктору Олайя за помощь с Sextante и быстрый багфикс в нем. Опенсорс FTW!

Основная идея

Границы избирательных участков можно восстановить зная причисленные к ним адреса.

Исходные данные

Границы административно-территориального деления г. Москва (источник - GIS-Lab)

Адреса причисленные к избирательным участкам (источник - сервис "Поиск места голосования" Мосгоризбиркома). Используется выгрузка из ресурса на 29 августа 2013 г.

Картографические данные - OpenStreetMap.

Используемое ПО

Будем использовать только открытое программное обеспечение.

Нам понадобится:

  • Python - программирование скриптов для получения данных с МГИКа и пакетного геокодирования.
  • QGIS/Sextante - геообработка, визуализация.

Получение и подготовка данных

Границы АТД

Скачаем стабильную версию внутригородских муниципальных образований Москвы и Санкт-Петербурга. Удалим все что относится к Санкт-Петербургу, так как нас в данном случае он не интересует. Для этого откроем слой данных в QGIS, выделим и удалим объекты относящиеся к СПб.

Нам нужны эти границы, так как участки создаются в границах районов Москвы.

Границы муниципальных образований Москвы (без Новой Москвы)

База адресов

Наша задача - получить все адреса домов и привязанный к ним номер УИКа.

Этап 1 - скачаем всю базу адресов МГИК.

Это можно сделать используя специальный скрипт на Python (исходник). Скрипт работает очень просто, обходит весь сервис МГИКа по поиску УИКов по адресу и складывает все найденные данные в CSV файл. Для запуска скрипта нужен чистый питон 2.7.x и пакет BeautifulSoup.

Пример фрагмента результата после скачивания:

Таблица адресов МГИК

В результате присутствуют важные для нас поля:

  • UIK_ID - номер УИКа
  • LVL1 - уровень 1 адреса: название нас.пункта или улицы
  • LVL2 - уровень 2 адреса: название улицы если есть и нас.пункт
  • LVL3 - уровень 3 адреса: номер дома

Скачать исходную таблицу (CSV)

Этап 2 - подготовим адреса

Путем простых операций в табличном процессоре, превратим таблицу в подходящую для геокодирования, для этого нужно сделать чтобы адрес был в одной ячейке, это сделает простой CONCATENATE:

Таблица адресов МГИК

Кроме всяких служебных полей, нужных для правильной работы скриптов по геокодированию, добавились важные поля:

  • ADDR - слитый адрес
  • ADDR_V - результат очистки, поиском-заменой убраны лишние запятые и т.п.

Таблица готова к геокодированию.

Скачать обработанную таблицу (CSV)

Этап 3 - геокодируем

Скрипты для геокодирования можно скачать здесь. Это тоже питон использующий бэкэнд OpenStreetMap.ru для геокодирования.

Скачать результат геокодирования

На карте эти адреса будут выглядеть вот так:

Геокодированные адреса на карте районов

Нам понадобится еще несколько шагов, чтобы подготовить только те данные, которые нам нужны:

Этап 4 - удалим всё, что не в старой Москве

Для этого в QGIS выполним Вектор/Выборка/Пространственная выборка и выделим все точки попадающие в границы нашей Москвы. После выборки - инвертируем ее и удалим все что выделилось (вне границ Москвы).

Этап 5 - удалим все районы Москвы без точек

С помощью того же инструмента проведем и обратную операцию, выбрав и удалив все районы в которые не попало ни одной точки.

Оставшиеся точки и районы

Этап 6 - привяжем точки к районам

У нас каждой точке адреса соответствует УИК, а нам нужно, чтобы еще у них был и район (для чего - увидим позже). Поэтому в QGIS делаем Вектор/Управление данными/Объединение атрибутов по районам. После этой операции, каждая точка получит все атрибуты того полигона района, который ей нужен. Визульно точки не изменятся, просто добавятся новое поле с кодом ОКАТО из слоёв АТД.

Этап 7 - удалим плохие точки Удалим все точки, уровень точки геокодирования которых ниже чем Дом, т.е. эти точки привязались к улице или населенному пункту. Для нашего метода это абсолютно неприемлемо, поэтому мы их лучше удалим. Проще всего это сделать через таблицу атрибутов, где сделать выборку g_status != "building" и удалить выделенное.

Из 55 тыс адресов у нас останется около 21 тысячи.

Скачать очищенный набор геокодированных точек адресов (ESRI Shape)

Этап 8 - разбивка по ОКАТО Это последний этап подготовки. Теперь у нас есть точки и полигоны и у всех объектов, помимо прочих значений в таблице атрибутов, есть код ОКАТО, который их объединяет. Разобьем эти два слоя на множество производных слоёв. Каждый из производных будет представлять один код ОКАТО.

В QGIS: Вектор/Управление данными/Разбить векторный слой Разбиваем по полю OKATO_CODE. Рекомендую сложить результирующие точки и полигоны в отдельные папки, которые предварительно нужно создать. После окончания разбивки, нужно переименовать все файлы так, чтобы в названии остался только код ОКАТО. В результате количество файлов точек и полигонов должно точно совпадать.

Наши базы адресов и АТД готовы, займемся геообработкой.

Геообработка

Теперь наша задача следующая, произвести с каждой парой точки (адреса) - полигон (граница района) следующие операции.

  1. Рассчитать географический охват полигона
  2. Построить полигоны Вороного по точкам в границах рассчитанного охвата
  3. Обрезать получившиеся полигоны Вороного по границе района
  4. Растворить границы между полигонами с одинаковым номером УИКа.

На примере Щукино в картинках:

Исходно: адреса и граница района
Полигоны Вороного по адресам в пределах охвата границы района
Обрезка полигонов по граница района
Слияние полигонов относящихся к одному УИКу

Автоматизация

Понятно, что вручную нам это повторять для всех районов не хочется, поэтому будем автоматизировать процесс выше с помощью Sextante. Sextante - это набор модулей для геообработки и среда для удобного объединения этих модулей в последовательности (модели). Он доступен из коробки если у вас одна из последних версий QGIS.

Модель будет выглядеть следующим образом:

Модель геообработки Sextante

Запускать модель будет в пакетном режиме и добавим ей в качестве аргументов все наши точки и полигоны.

Параметры модели

После выполнения, останется только сделать Вектор/Управление данными/Объединение shape-файлов, чтобы получить единый слой границ участков по г. Москва.

Результат

После некоторой раскраски выглядеть в районе Щукино это будет примерно вот так:

Результат. Фиолетовым - границы районов, точки - геокодированные адреса, черным - границы расчетных участков.

Скачать границы расчетных участков (ESRI Shape)

Почему получилось плохо

Результат довольно плохо соответствует подобным картам, которые рисуются вручную и на то есть несколько причин.

  1. Это практически полностью автоматический алгоритм не ведающий красивых границ, но зато он математически точен.
  2. Качество исходных данных - ниже среднего, потому что геокодирована примерно половина точек. 33% вины на OpenStreetMap - нет геоданных, 33% вины на геокодере - не нашел адреса, хотя они есть, 33% вины на МГИК - плохо структурированные и неправильные адреса, масса отсутствующих домов и адресов которые не приписаны к УИКу. Точные вклады каждого из компонентов в результат оценить сложно, это примерная оценка.
  3. Не учтены промзоны, леса, парки, вода.

Очевидно, что улучшить результат можно засчет:

  • улучшения карты - нужно продолжать вносить данные в ОСМ, а попросту - рисовать карту
  • улучшения геокодера, есть много ситуаций когда он мог бы сработать лучше
  • убеждения МГИК и улучшения охвата описаниями всех домов, которые в участки почему-то не попали.