pondělí 5. února 2018

Mapujeme adresy do českých krajů

Občas potkáte jako vývojář zábavné a jednoduché zadání, jako třeba "Vím, že lidé platí v mých prodejnách po celé republice. Chtěl bych vědět, kolik se toho děje v každém kraji." Zkušený borec si řekne, že prostě vezme mapu krajů, na ně napáruje adresy prodejen a hotovo... V tu chvíli ale netuší, že před ním leží křivolaká cesta plná slepých uliček, nezrušených zákonů, neúplných datových zdrojů a zajímavých algoritmů.


Hledáme data


Na úvod se sluší říct, co všechno o prodejně víme:
  • Ulice, město, PSČ, stát - to se píše na obálky, to známe
  • GPS souřadnice - to se píše do mobilů, to známe
  • RUIAN ID - Cože?

RUIAN (Registr územní identifikace, adres a nemovitostí) je státní katalog, který se používá zejména pro katastrální účely a hodí se při práci s mapovými podklady, adresními místy a dalšími prvky, které se týkají fyzického umístění nějakého objektu v krajině. To zní skvěle, tam určitě budou kraje! No, nejsou.

Slepá ulička?


PSČ všichni běžně používáme pro adresování dopisů, a asi také každý víme, že specifické PSČ přísluší specifické poště, která obsluhuje nějaké území. To by mohlo pasovat s kraji! No, nepasuje.

Na webu České pošty se k seznamu všech PSČ samozřejmě dostanete (Seznam PSČ částí obcí a obcí bez částí), ale když se do něj podíváte, zjistíte, že nejvyšší celek, který se k PSČ dozvíte, je okres. Moment, my ještě máme okresy? Ano, máme. A stejně tak máme dvoje kraje. Cože? Skutečně, dle zákonných norem u nás stále rozlišujeme kraje územní a samosprávní.

Nicméně s tím už se dá pracovat, takže si vesele vyrobíte mapování PSČ -> okres -> kraj a myslíte si, že máte hotovo. Chyba lávky! Ukazuje se totiž (a vzhledem k často diskutovanému rušení a slučování vesnických pošt se to dalo čekat), že jedno PSČ může sahat klidně do třech okresů. Těch případů je zhruba 10 %, a to se bohužel zanedbat nedá, potřebujeme pro tyhle případy náhradní řešení.

Hledáme data podruhé


Takže přichází na řadu GPS souřadnice, s nimi to musí být brnkačka. Kraje nejsou nic jiného než polygony, a algoritmů na párování bodu do polygonu existuje celá řada. Ale kde vzít ty polygony? Katastrální úřad? Tam už jsme byli a našli RUIAN. Ministerstvo vnitra? Jestli taková data poskytují, tak je mají pečlivě schovaná. Jednotlivé kraje? Spíš ne. Český statistický úřad? Do nich jsem vkládal velkou naději, a taky nic. My si snad budeme muset obkreslit mapu!

Naštěstí po chvíli googlení najdete přesně to, co potřebujete. V 10 let starém článku. Tak si s tím chvíli hrajete, začnete psát testy, a najednou vám zcela náhodně vybraná souřadnice nefunguje. Co to? Hranice krajů se totiž můžou měnit! Třeba když se rozpustí nějaký ten vojenský újezd. Takže data jsou to sice pěkná, ale zastaralá. Co teď? Vážně jdeme obkreslovat mapu?

Open Street Map zachraňuje


Není třeba, na záchranu přispěchá Open Street Map a jejich Overpass. Se správně formulovaným dotazem je získání hranic krajů hračka. Mimochodem povšimněte si, že zdrojem dat je náš národní katastrální úřad a jeho dataset s povědomým jménem RUIAN. No prostě Koucourkov. Odtud už je jen krůček k automatizaci celého našeho datasetu.

A jeho hezké vizualizaci přímo na githubu (samozřejmě bez těch PSČ, ale zase si můžete všimnout hraničních kamenů):

V samotné aplikaci už je to pak jen otázka načtení dvou souborů a můžeme vesele párovat: Kvůli výkonu to zkusíme samozřejmě nejdřív podle PSČ a když se zrovna trefíme do nejednoznačně určitelného, tak použijeme jeden z algoritmů pro hledání bodu v polygonu.


A přitom taková blbost


Ano, snad jen slovy klasika lze uzavřít tuhle odyseu. Na druhou stranu možná jenom neumím hledat ve státních datech a některý z mnoha úřadů má krasný portál s open-geodaty týkajícími se nejen krajů, ale třeba i měst a dalších územních ploch. Jestli o něm víte, napište nám!

Věřím tomu, že se někomu tahle data mohou hodit, takže všechny zdrojáky a data najdete na GitHubu, nepravidelně je aktualizuju.

Žádné komentáře:

Okomentovat