Відкриті дані Державного реєстру виборців: гайд по використанню

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

  • Інформація про виборчі дільниці утворені на постійній основі (включно з координатами місцезнаходження та полігонами) ;
  • Інформація про органи ДРВ;
  • Відомості про виборчі округи;
  • Довідник адміністративно-територіальні одиниці України;
  • Довідник регіони України;
  • Кількість виборців в межах районів, міст, областях;
  • Довідник “Адресний реєстр”.

Опис наборів даних

Починаючи з Президентських виборів 2019 року, ДРВ надає дані лише через протокол SOAP. І якщо ви не програміст, або ж крутий аналітик даних то отримати дані у вас не вийде, або ж займе надто багато часу. SOAP – це протокол для обміну повідомленнями в форматі XML. Цей ж протокол використовується у Системі електронної взаємодії державних електронних інформаційних ресурсів ТРЕМБІТА, що, ймовірно, зумовило ДРВ також перейти до протоколу SOAP.

Та попри те, що пройшов майже рік із моменту початку та вже минули дві виборчі кампанії інструкцій користування на сайті так і не з’явилось. Тому ми підготували для вас короткий гайд як отримати дані з сайту ДРВ. Для отримання даних ми використовуємо мову програмування Python 3, стандартну бібліотеку requests та бібліотеку xml.etree.ElementTree – для роботи з XML повідомленнями.

1. Довідник регіони Україн

Набір даних містить інформацію про регіони України включаючи системний код регіону, який необхідний для отримання даних з адресного реєстру.
Приклад запиту для отримання даних:

Import requests
import xml.etree.ElementTree as ET
url="https://www.drv.gov.ua/ords/svc/personal/API/Opendata"
headers = {'content-type': 'text/xml'}
body = """<?xml version="1.0" encoding="UTF-8"?>
      <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:drv="http://www.drv.gov.ua/">
            <soap:Header/>
            <soap:Body>
                <drv:GetRegions>
                </drv:GetRegions>
            </soap:Body>
        </soap:Envelope>"""
timeout=20
r = requests.post(url,data=body,headers=headers,timeout=timeout)
#Отриманий xml файл можна зберегти на ПК:
root = ET.fromstring(r.text)
tree = ET.ElementTree(root)
tree.write("file.xml")

У відповідь на запит ми отримаємо xml файл, у якому Region_Id – це системний код регіону.

<?xml version="1.0"?>
-<ns0:Envelope xmlns:ns1="http://www.drv.gov.ua/" xmlns:ns0="http://www.w3.org/2003/05/soap-envelope">
<ns0:Header/>
    -<ns0:Body>
        -<ns1:RegionsList>
         <ns1:QUERRY_RESULT>27</ns1:QUERRY_RESULT>
              -<ns1:Region>
                  <ns1:Region_Id>1</ns1:Region_Id>
                  <ns1:Region_Num>1</ns1:Region_Num>
                  <ns1:Region_Name>Автономна Республіка Крим</ns1:Region_Name>
                  <ns1:Region_Short>АРК</ns1:Region_Short>
                  <ns1:Region_Center>м. Сімферополь</ns1:Region_Center>
               </ns1:Region>
....

2. Інформація про виборчі округи

Набір даних містить інформацію про виборчі округи, утворені ЦВК на постійній основі, включно з адресами місцезнаходження окружних виборчих комісій та описом меж виборчих округів. (Проте у ньому відсутня інформації про кількість виборчих дільниць, що вимагає постанова КМУ №835).

Приклад запиту для отримання даних:

Import requests
import xml.etree.ElementTree as ET
url="https://www.drv.gov.ua/ords/svc/personal/API/Opendata"
headers = {'content-type': 'text/xml'}
body = """<?xml version="1.0" encoding="UTF-8"?>
      <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:drv="http://www.drv.gov.ua/">
            <soap:Header/>
            <soap:Body>
                <drv:GetAreas>
                </drv:GetAreas>
            </soap:Body>
        </soap:Envelope>"""
timeout=20
r = requests.post(url,data=body,headers=headers,timeout=timeout)
#Отриманий xml файл можна зберегти на ПК:
root = ET.fromstring(r.text)
tree = ET.ElementTree(root)
tree.write("file.xml")

Зразок відповіді на запит:

<?xml version="1.0"?>
-<ns0:Envelope xmlns:ns1="http://www.drv.gov.ua/" xmlns:ns0="http://www.w3.org/2003/05/soap-envelope">
<ns0:Header/>
   -<ns0:Body>
      -<ns1:AreasList>
       <ns1:QUERRY_RESULT>225</ns1:QUERRY_RESULT>
         -<ns1:Area>
             <ns1:Region_Id>1</ns1:Region_Id>
             <ns1:Area_Num>1</ns1:Area_Num>
             <ns1:Area_Name>Одномандатний виборчий округ №1</ns1:Area_Name>
             <ns1:Area_Center>місто Сімферополь, Центральний район</ns1:Area_Center>
             <ns1:Area_Desc>Залізничний район міста Сімферополя з населеними пунктами Залізничної районної в місті Сімферополі ради, Центральний район міста Сімферополя</ns1:Area_Desc>
             <ns1:Area_OvkAdr>вул.Горького, 15, м.Сімферополь, Автономна Республіка Крим, 95011</ns1:Area_OvkAdr>
             <ns1:Area_OvkLocation>приміщення Центральної районної ради м.Сімферополя</ns1:Area_OvkLocation>
         </ns1:Area>
...

3. Інформація про виборчі дільниці

Набір даних містить відомості про виборчі дільниці утворені на постійній основі. Зокрема інформація про місцезнаходження виборчої дільниці (адреса та координати), її межі (опис меж та орієнтовні координати), вид та тип дільниці. тощо.
Для отримання набору даних потрібно змінювати номер виборчого округу (Area) – для отримання всіх виборчих дільниць в окрузі, або ж системний код регіону ( Reg_ID) – для отримання всіх виборчих дільниць в регіоні.

Приклад запиту для отримання інформації про виборчі дільниці у 222 виборчому окрузі:

Import requests
import xml.etree.ElementTree as ET
url="https://www.drv.gov.ua/ords/svc/personal/API/Opendata"
headers = {'content-type': 'text/xml'}
body = """<?xml version="1.0" encoding="UTF-8"?>
      <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:drv="http://www.drv.gov.ua/">
            <soap:Header/>
            <soap:Body>
                    <drv:GetPollingStations>
                        <drv:PSParams>
                            <drv:Area>222</drv:Area>>
                        </drv:PSParams>
                    </drv:GetPollingStations>
            </soap:Body>
        </soap:Envelope>"""
r= requests.post(url,data=body,headers=headers,timeout=timeout)
#Отриманий xml файл можна зберегти на ПК:
root = ET.fromstring(r.text)
tree = ET.ElementTree(root)
tree.write("file.xml")

Зразок відповіді на запит:

<?xml version="1.0"?>
-<ns0:Envelope xmlns:ns1="http://www.drv.gov.ua/" xmlns:ns0="http://www.w3.org/2003/05/soap-envelope">
<ns0:Header/>
-<ns0:Body>
   -<ns1:PSList>
    <ns1:QUERRY_RESULT>87</ns1:QUERRY_RESULT>
      -<ns1:PollingStation>
          <ns1:Region_Id>80</ns1:Region_Id>
          <ns1:PS_Area>222</ns1:PS_Area>
          <ns1:PS_Num>800844</ns1:PS_Num>
          <ns1:PS_Type>Звичайна</ns1:PS_Type>
          <ns1:PS_Desc>м.Київ – бульв.Чоколівський: 1–3, 9/13, 14; вул.Донецька: 3; вул.Смілянська: 1–3, 8; просп.Повітрофлотський: 50/2, 52, 58–62;</ns1:PS_Desc>
          <ns1:PS_CommissionAdr>вул.Донецька, 25, м.Київ, 03151</ns1:PS_CommissionAdr>
          <ns1:PS_CommissionLocation>школа №69, каб.213, 217</ns1:PS_CommissionLocation>
          <ns1:PS_PlaceVotingAdr>вул.Донецька, 25, м.Київ, 03151</ns1:PS_PlaceVotingAdr>
          <ns1:PS_PlaceVotingLocation>школа №69, коридор 2-й поверх</ns1:PS_PlaceVotingLocation>
          <ns1:PS_GeoData>{"type":"Polygon","coordinates":[[[30.4527220000,50.4244110000],[30.4525460000,50.4241540000],[30.4529370000,50.4240400000],[30.4527390000,50.4237770000],[30.4523530000,50.4239000000],[30.4515640000,50.4227030000],[30.4520380000,50.4225620000],[30.4517810000,50.4222150000],[30.4548096656,50.4209842329],[30.4554373025,50.4215686893],[30.4573820000,50.4210240000],[30.4600560000,50.4254990000],[30.4592840000,50.4261760000],[30.4582670000,50.4274110000],[30.4585220000,50.4274790000],[30.4583340000,50.4277460000],[30.4587610000,50.4278640000],[30.4586290000,50.4283860000],[30.4583960000,50.4283830000],[30.4564570000,50.4281200000],[30.4577550000,50.4264250000],[30.4558100000,50.4257060000],[30.4568810000,50.4253980000],[30.4563300000,50.4245840000],[30.4567860000,50.4244090000],[30.4563000000,50.4235230000],[30.4552390000,50.4238140000],[30.4551640000,50.4236980000],[30.4527220000,50.4244110000]]]}</ns1:PS_GeoData>
          <ns1:PS_GeoDVK>{"type":"Point","coordinates":[30.4534777679,50.4259611250]}</ns1:PS_GeoDVK>
          <ns1:PS_GeoPG>{"type":"Point","coordinates":[30.4534577679,50.4259811250]}</ns1:PS_GeoPG>
          <ns1:PS_Size>Велика</ns1:PS_Size>
      </ns1:PollingStation>
...

4. Інформація про органи ведення ДРВ

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

Приклад запиту для отримання інформації:

Import requests
import xml.etree.ElementTree as ET
url="https://www.drv.gov.ua/ords/svc/personal/API/Opendata"
headers = {'content-type': 'text/xml'}
body = """<?xml version="1.0" encoding="UTF-8"?>
      <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:drv="http://www.drv.gov.ua/">
            <soap:Header/>
            <soap:Body>
                <drv:GetOrgans>
                </drv:GetOrgans>
            </soap:Body>
        </soap:Envelope>"""
r= requests.post(url,data=body,headers=headers,timeout=timeout)
#Отриманий xml файл можна зберегти на ПК:
root = ET.fromstring(r.text)
tree = ET.ElementTree(root)
tree.write("file.xml")

Зразок відповіді на запит:

<?xml version="1.0"?>
-<ns0:Envelope xmlns:ns1="http://www.drv.gov.ua/" xmlns:ns0="http://www.w3.org/2003/05/soap-envelope">
   <ns0:Header/>
   -<ns0:Body>
      -<ns1:OrgansList>
       <ns1:QUERRY_RESULT>787</ns1:QUERRY_RESULT>
          -<ns1:Organ>
              <ns1:Region_Id>1</ns1:Region_Id>
              <ns1:Organ_Id>2</ns1:Organ_Id>
              <ns1:Organ_Num>1</ns1:Organ_Num>
              <ns1:Organ_Name>Відділ ведення ДРВ Бахчисарайської РДА</ns1:Organ_Name>
              <ns1:Organ_Adr>вул.Радянська, 5, м.Бахчисарай, Автономна Республіка Крим, 98400</ns1:Organ_Adr>
              <ns1:Organ_Tel>(06554) 4-07-77</ns1:Organ_Tel>
           </ns1:Organ>
...

5. Кількість виборців в межах районів, міст, областей

Набір даних містить інформацію про кількість виборців в межах районів, міст обласного значення, районів у містах, областях, тощо. Також містить інформацію про виборців з відміткою про вибуття (без зареєстрованого місця проживання).

Зразок запиту для отримання інформації:

Import requests
import xml.etree.ElementTree as ET
url="https://www.drv.gov.ua/ords/svc/personal/API/Opendata"
headers = {'content-type': 'text/xml'}
body = """<?xml version="1.0" encoding="UTF-8"?>
      <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:drv="http://www.drv.gov.ua/">
            <soap:Header/>
            <soap:Body>
                <drv:GetCntVot>
                </drv:GetCntVot>
            </soap:Body>
        </soap:Envelope>"""
r= requests.post(url,data=body,headers=headers,timeout=timeout)
#Отриманий xml файл можна зберегти на ПК:
root = ET.fromstring(r.text)
tree = ET.ElementTree(root)
tree.write("file.xml")

Відповідь на запит:

<?xml version="1.0"?>
-<ns0:Envelope xmlns:ns1="http://www.drv.gov.ua/" xmlns:ns0="http://www.w3.org/2003/05/soap-envelope">
  <ns0:Header/>
  -<ns0:Body>
    -<ns1:ATO_List date="30.11.2019">
       -<ns1:ATO>
          <ns1:REGION_ID>1</ns1:REGION_ID>
          <ns1:ATO_ID>7041</ns1:ATO_ID>
          <ns1:ATO_NAME>Автономна Республіка Крим</ns1:ATO_NAME>
          <ns1:VOT_D>1484703</ns1:VOT_D>
          <ns1:VOT_V>24119</ns1:VOT_V>
       -<ns1:ATO_List>
              -<ns1:ATO>
                   <ns1:REGION_ID>1</ns1:REGION_ID>
                   <ns1:ATO_ID>7145</ns1:ATO_ID>
                   <ns1:ATO_NAME>Білогірський р-н</ns1:ATO_NAME>
                   <ns1:VOT_D>47150</ns1:VOT_D>
                   <ns1:VOT_V>327</ns1:VOT_V>
               </ns1:ATO>
...

6. Довідник “Адміністративно-територіальні одиниці України”

Набір даних містить інформацію про адміністративно-територіальні одиниці України, включаючи системний код АТО, необхідний для отримання адресного реєстру.
Для отримання даних потрібно змінювати системний код регіону ( Reg_ID) – для отримання інформації про всі АТО в регіоні.

Зразок запиту для отримання інформації про АТО у Сумській області (Reg_ID=59).

Import requests
import xml.etree.ElementTree as ET
url="https://www.drv.gov.ua/ords/svc/personal/API/Opendata"
headers = {'content-type': 'text/xml'}
body = """<?xml version="1.0" encoding="UTF-8"?>
      <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:drv="http://www.drv.gov.ua/">
            <soap:Header/>
            <soap:Body>
               <drv:GetATO>
                 <drv:ATOParams>
                    <drv:Reg_ID>59</drv:Reg_ID>
                 </drv:ATOParams>
              </drv:GetATO>
            </soap:Body>
        </soap:Envelope>"""
r= requests.post(url,data=body,headers=headers,timeout=timeout)
#Отриманий xml файл можна зберегти на ПК:
root = ET.fromstring(r.text)
tree = ET.ElementTree(root)
tree.write("file.xml")

Відповідь на запит:

-<ns0:Envelope xmlns:ns1="http://www.drv.gov.ua/" xmlns:ns0="http://www.w3.org/2003/05/soap-envelope">
  <ns0:Header/>
  -<ns0:Body>
    -<ns1:ATOList>
     <ns1:QUERRY_RESULT>1492</ns1:QUERRY_RESULT>
       -<ns1:ATO>
          <ns1:Region_Id>59</ns1:Region_Id>
          <ns1:ATO_Raj>Білопільський р-н</ns1:ATO_Raj>
          <ns1:ATO_Rad>Білопільська міська рада ОТГ</ns1:ATO_Rad>
          <ns1:ATO_Name>м.Білопілля</ns1:ATO_Name>
          <ns1:ATO_Id>8367</ns1:ATO_Id>
       </ns1:ATO>
...

7. Довідник “Адресний реєстр”

Набір даних містить адресну інформацію, яка використовується під час ведення Державного реєстру виборців.
Для отримання даних потрібно змінювати системний код регіону ( Reg_ID).

Зразок запиту для отримання адресної інформації Білопільського району (ATO_ID=8367) Сумської області:

Import requests
import xml.etree.ElementTree as ET
url="https://www.drv.gov.ua/ords/svc/personal/API/Opendata"
headers = {'content-type': 'text/xml'}
body = """<?xml version="1.0" encoding="UTF-8"?>
      <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:drv="http://www.drv.gov.ua/">
            <soap:Header/>
            <soap:Body>
                   <drv:GetAdrReg>
                       <drv:AdrRegParams>
                           <drv:ATO_ID>8367</drv:ATO_ID>
                       </drv:AdrRegParams>
                   </drv:GetAdrReg>
            </soap:Body>
        </soap:Envelope>"""
r= requests.post(url,data=body,headers=headers,timeout=timeout)
#Отриманий xml файл можна зберегти на ПК:
root = ET.fromstring(r.text)
tree = ET.ElementTree(root)
tree.write("file.xml")

Відповідь на запит:

<?xml version="1.0"?>
-<ns0:Envelope xmlns:ns1="http://www.drv.gov.ua/" xmlns:ns0="http://www.w3.org/2003/05/soap-envelope">
  <ns0:Header/>
  -<ns0:Body>
    -<ns1:GEONIMS>
     <ns1:QUERRY_RESULT>145</ns1:QUERRY_RESULT>
       -<ns1:GEONIM>
          <ns1:Geon_Id>1171256</ns1:Geon_Id>
          <ns1:Geon_Name>вул.3 Вересня</ns1:Geon_Name>
          <ns1:Geon_OldNames/>
              -<ns1:BUILDS>
              <ns1:BUILDS_COUNT>31</ns1:BUILDS_COUNT>
                  -<ns1:BUILD>
                      <ns1:Bld_ID>9981268</ns1:Bld_ID>
                      <ns1:Bld_Num>1</ns1:Bld_Num>
                      <ns1:Bld_Korp/>
                      <ns1:Bld_Ind>41800</ns1:Bld_Ind>
                      <ns1:Bld_PS>590004</ns1:Bld_PS>
                      <ns1:Bld_Area>158</ns1:Bld_Area>
                  </ns1:BUILD>
...

Також на гітхабі Кирила Захарова опубліковані curl запити для ДРВ, за допомогою яких також можна отримати дані.