Як ми отримали координати усіх виборчих дільниць

Як нанести результати голосувань усіх виборчих дільницях на карту? Таке питання виникло в нас в процесі аналізу результатів голосування та підготовки до виборів у 2019 році.

З сайту ЦВК можна отримати лише дані про адреси виборчих дільниць на конкретних виборах, та при умові попередньої обробки адрес ДВК, за допомогою геокодування, отримати їх координати. Проте цей процес часомісткий, та й працювати з адресами понад 30 тис. дільниць не зручно. Тому ми пішли до сайту Державного реєстру виборців. На сторінках одномандатних виборчих округів окрім адреси та опису меж дільниці є також інформація про її розмір та посилання на сторінку з картою розташування та межами виборчої дільниці.

Ознайомившись з html-кодом сторінки, ми виявили скрипт, що відповідає за показ карти, а в ньому частину посилання: url: “gis$core.Gis_DistrPoly?p_f5241=1&ts=”+Math.random(). Поєднавши з url Державного реєстру виборців – “http://www.drv.gov.ua/portal/”, отримали лінк, який перенаправляє нас до сторінки з GeoJSON. Нижче наведений приклад GeoJSON дільниці номер 010001:

{“type”:”FeatureCollection”,”features”:[{“type”:”Feature”,”geometry”:{“type”:”Polygon”,”coordinates”:[[[33.8821120000,44.7331310000],[33.9231400000,44.7220930000],[33.9659190000,44.7261870000],[33.9683780000,44.7328090000],[33.9719170000,44.7423450000],[33.9080020000,44.7723310000],[33.9019200000,44.7627330000],[33.8964190000,44.7544450000],[33.8946430000,44.7517990000],[33.8864060000,44.7398060000],[33.8822260000,44.7333000000],[33.8821120000,44.7331310000]]]},”id”:”457308″},{“type”:”Feature”,”geometry”:{“type”:”Point”, “coordinates”:[33.9012336730,44.7479524102]},”id”:”83781″,”popupContent”:”010001″}]}

GeoJSON містить інформацію про координати виборчої дільниці (“type”:”Point”), координати меж дільниці (“type”:”Polygon”) та номер виборчої дільниці (“popupContent”:”010001″).

Далі методом проб та помилок вияснили, що значення “p_f5241” в посиланні відповідає за порядковий номер дільниці, а методом підбору, що крайня дільниця має 33863 порядковий номер.

Швидкоруч написаний парсер вже на 75 дільниці видає помилку:

Expecting value: line 1 column 41 (char 40)

Відкривши посилання ми помітили що в геоджейсоні відсутні дані про межі виборчої дільниці (“type”:”Polygon”), але кома, що розділює координати полігону від точки, залишилась. Через  зайву кому парсер не міг ідентифікувати геоджейсон. Як вияснилось, координати спецдільниць не мають меж, та відповідно полігонів, й таких дільниць (усі з помилкою) майже 1 тис.. Тому ми написали новий парсер, який у випадку даної помилки видаляв 40-ий символ (зайву кому), й за годину часу роботи парсера отримали координати усіх дільниць та меж (за наявності).

Далі, по номеру дільниці ми поєднали отриманий датасет з інформацією про область, округ, тип дільниці, адресу та межі виборчої дільниці. Доречі, останні дані можна легко завантажити у форматі xml або xlsx в особистому кабінеті виборця на сайті ДРВ.
В результаті ми отримали датасет з переліком усіх постійних виборчих дільниць, з інформацією про їхній тип, округ, координати розташування та меж.

Ознайомитись зі структурою та завантажити датасет можна за адресою:
https://github.com/OPORA/electiondata/tree/master/cordynaty_VD

УВАГА! Межі дільниць та інша інформація в наборі актуальна на конкретну дату. Адже Центральна виборча комісія своїми постановами час від часу змінює межі, що відносяться до тої чи іншої дільниці. Як правило такі зміни відбуваються напередодні якихось виборів. На жаль, відстежувати історію таких змін ми поки не навчилися.