GIS-LAB

Географические информационные системы и дистанционное зондирование

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

Обсудить в форуме Комментариев — 8Редактировать в вики

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


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

В разных уголках нашей страны, а иногда и целиком по все стране иногда проводятся выборы разных уровней. По закону, количество избирателей на участок не должно быть больше 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-файлов, чтобы получить единый слой границ участков по г. Москва.

Скачать готовую модель (Sextante model)

[править] Результат

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

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

Можно видеть, что некоторые полигоны получили номер -1, это связано с тем, что ряд адресов (и соответственно точек на карте им соответствующим) на момент написания статьи не имел связанного с ним УИКа (например: "город Москва, Яузская аллея, дом 2"). Таким точкам присваивался номер УИКа -1 и соответственно образовывался полигон.

Границы участков нарисованные управой выглядят следующим образом:

Размещение участковых комиссий и мест голосования с сайта управы

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

[править] Почему получилось плохо

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

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

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

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

Обсудить в форуме Комментариев — 8Редактировать в вики

Последнее обновление: 2015-05-06 14:16

Дата создания: 04.09.2013
Автор(ы): Максим Дубинин


(Геокруг)

Если Вы обнаружили на сайте ошибку, выберите фрагмент текста и нажмите Ctrl+Enter