Создаем карту границ участков избирательных комиссий Москвы из открытых данных
Шаги для создания карты границ участков]
В разных уголках нашей страны, а иногда и целиком по все стране иногда проводятся выборы разных уровней.
Эта статья иллюстрирует некоторые, достаточно простые подходы для создания такой карты в границах г. Москвы (исключаю присоединенные территории Новой Москвы). Статья может рассматриваться как иллюстрация применения географического анализа для новичков.
Забегая вперед хочется сказать, что существующие наборы данных неадекватны для решения этой задачи и результат неудовлетворителен. Но лучше хоть какая-то попытка, чем никакой.
Основная идея
Границы избирательных участков можно восстановить зная причисленные к ним адреса.
Исходные данные
Границы административно-территориального деления г. Москва (источник - GIS-Lab)
Адреса причисленные к избирательным участкам (источник - сервис "Поиск места голосования" Мосгоризбиркома).
Картографические данные - OpenStreetMap.
Используемое ПО
Будем использовать только открытое программное обеспечение.
Нам понадобится:
- Python - программирование скриптов для получения данных с МГИКа и пакетного геокодирования.
- QGIS/Sextante - геообработка, визуализация.
Получение и подготовка данных
=Границы АТД
Скачаем стабильную версию внутригородских муниципальных образований Москвы и Санкт-Петербурга. Удалим все что относится к Санкт-Петербургу, так как нас в данном случае он не интересует. Для этого откроем слой данных в QGIS, выделим и удалим объекты относящиеся к СПб.
Нам нужны эти границы, так как участки создаются в границах районов Москвы.
База адресов
Наша задача - получить все адреса домов и привязанный к ним номер УИКа.
Этап 1 - скачаем всю базу адресов МГИК.
Это можно сделать используя специальный скрипт на Python (исходник). Скрипт работает очень просто, обходит весь сервис МГИКа по поиску УИКов по адресу и складывает все найденные данные в CSV файл. Для запуска скрипта нужен чистый питон 2.7.x и пакет BeautifulSoup.
Пример фрагмента результата после скачивания:
В результате присутствуют важные для нас поля:
- UIK_ID - номер УИКа
- LVL1 - уровень 1 адреса: название нас.пункта или улицы
- LVL2 - уровень 2 адреса: название улицы если есть и нас.пункт
- LVL3 - уровень 3 адреса: номер дома
Этап 2 - подготовим адреса
Путем простых операций в табличном процессоре, превратим таблицу в подходящую для геокодирования, для этого нужно сделать чтобы адрес был в одной ячейке, это сделает простой CONCATENATE:
Кроме всяких служебных полей, нужных для правильной работы скриптов по геокодированию, добавились важные поля:
- ADDR - слитый адрес
- ADDR_V - результат очистки, поиском-заменой убраны лишние запятые и т.п.
Таблица готова к геокодированию.
Этап 3 - геокодируем
Скрипты для геокодирования можно скачать здесь. Это тоже питон использующий бэкэнд OpenStreetMap.ru для геокодирования.
Скачать результат геокодирования
На карте эти адреса будут выглядеть вот так:
Нам понадобится еще несколько шагов, чтобы подготовить только те данные, которые нам нужны:
Этап 4 - удалим всё, что не в старой Москве
Для этого в QGIS выполним Вектор/Выборка/Пространственная выборка и выделим все точки попадающие в границы нашей Москвы. После выборки - инвертируем ее и удалим все что выделилось (вне границ Москвы).
Этап 5 - удалим все районы Москвы без точек
С помощью того же инструмента проведем и обратную операцию, выбрав и удалив все районы в которые не попало ни одной точки.
Этап 6 - привяжем точки к районам
У нас каждой точке адреса соответствует УИК, а нам нужно, чтобы еще у них был и район (для чего - увидим позже). Поэтому в QGIS делаем Вектор/Управление данными/Объединение атрибутов по районам. После этой операции, каждая точка получит все атрибуты того полигона района, который ей нужен.