TL;DR

Kako sam došao do stambenih zajednica

Jedan od lokal-patriotskih projekata kome se iznova i iznova vraćam je OpenStreetMap (OSM) projekat. Besplatna i slobodna mapa sveta koju svako može da uređuje (obično počnem da objašnjavam OSM projekat ovako, kao “Vikipedija, ali za mape”). Od kada sam batalio Google, OSM (i okolni ekosistem zasnovan na OSM-u) mi je glavna i jedina zamena za Google mape. I tek kada vidiš projekte i aplikacije koje koriste OSM shvatiš šta sve propuštaš kad koristiš Google. Jasno je da imam lični interes da OSM bude sve bolji i bolji, i to naravno tamo gde ga najviše koristim – u Srbiji. Sada je možda jasnije da se moj gorepomenuti lokal-patriotizam zapravo svodi na najsebičniji lični interes😀.

Već dugo razmišljam koji su to projekti i napori koji mogu da doprinesu OSM-u u Srbiji, ali nelinearno, pa bilo to finansiranje OSM editora, lokalni skupovi, mapathoni, ili importovanje podataka odnekuda. E, sad, da bi se podaci importovali, potrebno je da budu slobodni (free, libre), a takvi su retki. Republički geodetski zavod (RGZ) ima sjajan portal ovde: https://a3.geosrbija.rs, ali sa njega ne mogu da se importuju podaci u OSM. Onda sam pogledao šta ima na portalu otvorenih podataka republike Srbije i našao sam samo jedan dataset koji je ponudio RGZ tamo, a to je registar stambenih zajednica!

Zašto ih analizirati

Posle konsultacija na forumu (a ako čitate ovo i želite da se uključite nekako, javite se na forumu), shvatili smo da je registar stambenih zajednica zapravo… spisak zgrada u Srbiji😀. Možda ne deluje kao mnogo, ali to je nažalost sve što imamo od RGZ-a. I dalje mislim da treba da analiziramo shit-out-of-it, a evo i zašto:

  • Analiziranjem ovog registra pokazujemo da možemo da iskoristimo otvorene podatke u praksi
  • Registar sadrži 43.000 zgrada. Neka u svakoj zgradi u proseku živi 20 ljudi (verovatno i više). To je preko 800.000 duša u Srbiji koji će dobiti svoju zgradu u OSM-u. To je preko 10% stanovnika do kojih će navigacija bazirana na OSM-u raditi!
  • Ovom analizom možemo objektivno da vidimo kakvo je kvalitativno i kvantitativno stanje OSM-a u Srbiji i možemo da pratimo stanje kroz vreme (kada su zgrade dodavane)
  • Ovom analizom dobijamo i indirektne podatke (tačna imena ulica, okruga, opština…)
  • I poslednje, ali ne i najmanje bitno – ovom analizom “pokazujemo” državi da otvoreni podaci koji se daju zajednici imaju nekog smisla, da ih država ne baca preko zida bespotrebno, da su nam korisni i upotrebljivi. To onda može da napravi pozitivnu povratnu spregu i da pokaže da te otvorene podatke, kao u razvijenim državama, treba sve više i više otvarati.

Stvari koje mi padaju na pamet da možemo izvući odavde (a na forumu možemo da nastavimo diskusiju i da raspravljamo predloge), a pošto spojimo podatke iz registra i iz OSM-a:

  • Tu možemo da vidimo kako “stojimo”
  • Da analiziramo stanje po okruzima i opštinama
  • Da vidimo kako je vremenski OSM dobijao podatke (nije još urađeno ovde)
  • Da vidimo kvalitet tagova. Npr. zgrade treba tagovati kao “building=apartments” i treba da budu way-ovi (ne node-ovi). To je nešto što može lako da se pri(o)meni
  • Obrnuta logika isto važi – ako je nešto tagovano kao building=apartments, a nije u registru, to verovatno znači da je u pitanju greška u OSM-u.
  • Čak i nedostatak zgrade u OSM-u nam govori dosta:
    • Ime ulice ili kućnog broja je pogrešno (greška u kucanju, pravopisu ili latinični naziv)
    • Pogrešan je okrug ili opština (boundaries ucrtani u OSM-u nisu dobri)
    • Zgrada prosto nije ucrtana u OSM

Analiziranje

Izvorni kod cele analize je urađen u Python-u i možete ga naći ovde:
https://gitlab.com/stalker314314/stambene-zajednice-analysis
Ne bih trošio ovaj blog na detalje koda, sve možete naći tamo.

Ovde bih pomenuo samo neke poteškoće na koje sam naišao prilikom pravljenja.

Geocoding

OK, imaš ulicu i broj, a kako da našeš gde je to na mapi? Geocoding koji bi koristio Mapbox, Google i sl. nisu dolazili u obzir jer ne mogu da vrate OSM entitet (node ili way). Postojala su tri moguća izbora koja su mi pala na pamet, a na probanje i odabir sam izgubio više vremena nego što bih voleo da priznam😀. Overpass turbo je sjajan alat, koji je mogao da nađe ulicu i broj, ali je bio užasno spor, oko 20-40 sekundi po upitu. Razlog što je toliko spor je što ne možete da query-uje tagove case insensitive, već za to mora da se koriste regularni izrazi, pa krajnji upit izgleda nekako ovako (primetite ono “,i” za case sensitivity):

(
     node["addr:street"~"^КОСМАЈСКА$", i]["addr:housenumber"~"^1$",i](42.2, 19.0, 46.2, 23.0);
     way["addr:street"~"^КОСМАЈСКА$", i] ["addr:housenumber"~"^1$",i] (42.2, 19.0, 46.2, 23.0);
 );
 out;

Bounding box je pravougaonik oko Srbije, a to je zato što, ako bih stavio:

area[boundary=administrative][admin_level=2][name="Србија"]
(
    node(area)...
    way(area)...  

to bi tek bilo sporo.

Onda sam probao sa Nominatimom. On je dosta brži, ali (za razliku od Overpass-a) postoji samo jedna javna instanca Nominatima i nisam hteo da me banuju, pa sam stavio čekanje od 5 sekundi između upita. Takođe, Nominatim se ponaša jako čudno, da ne kažem nekonzistentno, a ta konzistencija je generalno bitna za ovakve data pre/post-processing poslove, čisto da imaš nešto konstantno za šta možeš da se uhvatiš. Dešava se da Nominatim ne nađe entitet koji postoji i zove se apsolutno isto kao u upitu (evo primer Nominatim upita i evo OSM entiteta)🤪. Takođe sam viđao i obrnuto – Nominatim nađe entitet koji uopšte nema “addr:street“, ali je pored date ulice (evo primer Nominatim upita i evo OSM entiteta). Nije ovo netačno, ali sâm entitet treba da ima “addr:street“, majku mu. Ovakav pristup mi se uopšte nije svideo i odlučio da sam da zaobiđem Nominatim za geocoding. I Overpass i Nominatim geokodiranje su trenutno u izvornom kodu, eto se ne koriste, stoje tu, eto čisto da se ne baci.

Treći pristup, gde sam lepo skinuo .PBF mapu Srbije je onaj koji mi je dao najbolje rezultate. Učitavanje svih entiteta koji imaju “addr:street” i “addr:housenumber” traje 1-2 minuta, a kopanje po tome je posle trenutačno. Nisam ubacio neke “napredne” dodatke, kao što je mogućnost traženja transliterizovanih stvari (latinične kućne brojeve koji su česti, npr. “43v” i sl.), ali to sam namerno izostavio, da vidimo koliko zgrada imamo ovako klot, čisto (bez “budženja”). Čak i bez budženja, ovaj pristup daje 44.5% nađenih entiteta, dok Nominatim nalazi 41.5%.

Spajanje okruga i opština

Kad god podaci treba da se spoje iz više nezavisnih izvora, mora da se uradi neka “normalizacija” po ključevima od svih strana. U ovom slučaju, okruzi i opštine su problematični. U Srbiji je malčice komplikovanija situacija nego u nekim drugim državama, pošto imamo koncept okruga (“raški”, “kolubarski”, “severnobački”…) u koji upada i “Grad Beograd” (admin_level=6), kao i koncept opština (admin_level=8) koje mogu biti ili stvarno opštine ili gradske opštine (“Bor”, “Novi Sad”, ali i “Voždovac”, “Rakovica”…). Više o ovome možete videti na OSM Wiki-ju.

Uopšte nisam znao odakle da napadnem problem, pošto mi se nije baš parsirao .PBF da dobijem poligone ovih oblasti, ali na moju sreću, Overpass je uspeo da vrati okruge i opštine vrlo prosto i brzo, a takođe se imena okruga i opština iz RGZ registra i OSM-a slažu SAVRŠENO. Naravno, nije ovo sreća, nego je gomila ljudi provela gomilu vremena da ovo u OSM-u bude savršeno. Tako da mi je mapiranje ispalo mnogo prosto na kraju. Jedine razlike su što u OSM-u imamo “управни” u imenima okruga (“Браничевски управни округ”…) i imamo “општина” ili “град” u imenima opština.

Prezentacija finalnih podataka

Hteo sam da svako može da vidi dobijene rezultate što prostije. Pored .CSV-a koji može da se skine i pored neke osnovne Jupyter vizualizacije, hteo sam da ovi podaci mogu da se koriste “interaktivno”, za analizu, gledanje i razumevanje šta fali i gde. Izbor “data table” Javacript komponente je težak jer ima mnogo izbora, a svi su sranje (kao valjda sve u JS svetu🤫). Na kraju sam se odlučio za js-grid kao najmanje zlo. Deluje OK za sad. Na kraju je dakle izgenerisan i HTML, sa svim podacima, ali je veliki 20MB, pazite se ako klikćete! Može se naći ovde, a zgodan je što može da se preuzme i gleda offline.

Rezultati

Rezultati mogu da budu pozitivni ili negativni, zavisi kako se gleda na njih😀. Od 43.000 zgrada u Srbiji, u OSM-u ih je nađeno 45.3%. To znači da skoro pola zgrada u Srbiji ima ispravan “addr:street” i “addr:housenumber” tag. Ovo je po meni jako dobar rezultat. Od tih nađenih zgrada, samo 48.6% su way tipa, dok su 51.4% node-ovi. Generalno, zgrade bi trebalo da su poligoni, a ne tačke. Od tih zgrada koje su ways, skoro sve su tagovane kao zgrade (čak 99.88%). Ovo je još jedna dobra vest, a biće lako i proći ove koje nisu i dodati im tag😉. Sa druge strane, od zgrada koje su tagovane kao building, samo 11.5% je tagovano kao building=apartments. Sve u svemu, nije loše, ali krajnji cilj (da sve zgrade budu u OSM-u, kao way tip entiteta i da imaju building=apartments) za sada ispunjava samo 45.3%*48.6%*99.88%*11.5%=2.4% zgrada, ili oko njih 1000.

Ako se analizira apsolutna i relativna količina zgrada po okruzima, što iz registra, što iz OSM-a, pada mi samo jedna reč na pamet – “DOMINACIJA BEOGRADA”. Primera radi, evo broj zgrada po okruzima, izvađen samo iz registra:

Ako se pogleda koliko je zgrada pronađeno u OSM-u, što apsolutno, što procentualno, po okruzima:

Sve u svemu, Beograd dominira (ne ulazeći u to koja vam sve ovo osećanja izaziva😀). Takođe se vidi i da se neko u Novom Sadu i Zrenjaninu baš pomučio da zgrade budu cakum-pakum.

Više rezultata i ostatak vizualizacije možete videti ovde.

Beogradski rezultati

Beograd nema dominantne opštine, ali definitivno se mogu razaznati prigradske opštine. Evo koliko registar kaže da ima zgrada po opštinama:

A evo koliko od tih zgrada je nađeno u OSM-u, opet što apsolutno, što procentualno:

Više rezultata i ostatak vizualizacije možete videti ovde.

Šta dalje?

Ne znam, videćemo. Objaviću ovaj rezultat na forumu, pa ću videti šta drugi kažu. Meni je plan da popravim ove procente – verovatno ću ići od lakših ka težim stvarima:

  • Srediti puteve koji nisu tagovani kao “building
  • Promeniti postojeće “building=yes” puteve sa “building=apartments
  • Proći one delove Beograda koje znam, naći nedostajuće zgrade, dodati njih
  • Proći kroz zgrade tagovane kao node-ovi tamo gde znam (po Beogradu) i probati da ih prebacim u ways (ako je to moguće)

Ako vidite da se generisani rezultati ne slažu sa podacima iz OSM-a, možda sam i ja tu malo čačkao😉.

Videćemo kada RGZ planira da objavi novu verziju dataset-a, ali treba ponoviti ovu analizu sledeće godine, da vidimo da li smo i koliko napredovali!😀