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

Материал из GIS-Lab
Перейти к навигации Перейти к поиску
Эта страница является черновиком статьи.


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

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

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

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

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

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

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

Границы административно-территориального деления г. Москва (источник - 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 делаем Вектор/Управление данными/Объединение атрибутов по районам. После этой операции, каждая точка получит все атрибуты того полигона района, который ей нужен. Визульно точки не изменятся, просто добавятся новое поле с кодом ОКАТО из слоёв АТД.

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

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

Скачать очищенный набор точек

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

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

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

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

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

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

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

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

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

Понятно, что вручную нам это повторять для всех районов не хочется, поэтому будем автоматизировать процесс выше с помощью Sextante.

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

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

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

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

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

Результат

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

Результат

Скачать границы рассчитанных участков

Почему плохо

Результат ужасен и на то есть несколько причин.

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