Aina kun olen tarvinnut osoitetta, yrityksen tietoja tai lähintä bussipysäkkiä Helsingin seudulla, olen joutunut hyppimään kolmen eri palvelun välillä: Google Maps osoitteelle, Fonecta tai Kauppalehti yritykselle ja HSL:n sovellus lähdöille. Lisäksi esimerkiksi luontopolut tai -kohteet on pitänyt hakea OrganicMaps -sovelluksen kautta. Yhtä hakua, joka yhdistäisi nämä, ei ollut olemassa — saati sellaista, joka toimisi ilman käyttäjätiliä ja ilman että hakusi päätyvät jonnekin myytäväksi.
Piilevä tarve tällaiselle palvelulle oli mielestäni ilmeinen. Joten rakensin sen.
Palvelu on nimeltään Jihuu (jihuu.fi) ja se kattaa toistaiseksi pääkaupunkiseudun: Helsingin, Espoon, Vantaan ja Kauniaisten alueet, suomeksi ja englanniksi. Osoitteet toimivat myös ruotsiksi.
Yksi haku, seitsemän eri viranomaisen datalähdettä
Jihuu yhdistää yhdeksi hauksi dataa, joka on oikeasti seitsemästä eri lähteestä, useimmiten eri virastosta:
- Osoitteet: Suomen ympäristökeskuksen (SYKE) rakennetun ympäristön tietojärjestelmän rakennusten osoitetiedot.
- Nimetyt paikat: Maanmittauslaitoksen nimistöaineisto — puistot, maamerkit, luontokohteet ja muut nimetyt kohteet.
- Yritykset: PRH:n/YTJ:n avoin data.
- Julkinen liikenne: HSL:n data Digitransit-rajapintojen kautta — sekä aikataulupohja (pysäkit, linjat) että reaaliaikaiset lähimmät lähdöt.
- Kunta-koodit: Wikipedian listasta Suomen kuntanumeroista.
- Postinumeroalueiden nimet: Tilastokeskuksen Paavo-palvelusta.
- OpenStreetMap: osa nimetyistä paikoista, ulkoilukohteista ja nimetyistä rakennuksista, koordinaattien kautta yhdistettynä muuhun dataan.
Maanmittauslaitoksen geokoodauspalvelua kokeillaan lisäksi laskennallisten tieosoitteiden interpolointiin lähimmän osoitteen arvioimiseksi harvaan asutuille paikoille — tämä on toistaiseksi kokeilu, ei vielä tuotannossa. Tuotannossa lähimmän osoitteen haku paikalle käyttää suoraan SYKE:n rakennusosoitekantaa.
Miksi tällaista palvelua ei todennäköisesti ole vielä olemassa
Tässä on se osa, joka ehkä voi yllättää jonkun: näiden rekistereiden data ei oikeasti sovi yhteen — eikä syy ole vahinko, vaan rakenteellinen.
Osoitteet (SYKE) ja nimetyt paikat (Maanmittauslaitos) ovat kaksi tämän palvelun ydinaineistoa, ja ne tulevat kahdesta täysin eri virastosta eri ministeriöiden alta: SYKE toimii ympäristöministeriön alla, Maanmittauslaitos maa- ja metsätalousministeriön alla. HSL taas ei ole valtion virasto lainkaan, vaan kuntayhtymä — vielä eri hallinnon taso. Kun osoitteet ja paikannimet — juuri se pari, jota tällainen haku eniten tarvitsee toisiinsa sopivaksi — kuuluvat kahdelle eri ministeriölle, ei ole yllätys ettei kukaan ole omistanut vastuuta niiden yhdistämisestä. Jokainen virasto on julkaissut oman datansa omilla ehdoillaan, eikä mikään niistä ole suunniteltu yhdistettäväksi toisen viraston dataan.
Konkreettisia esimerkkejä siitä, mitä tämä käytännössä tarkoittaa:
- Ainoa yhteinen avain osoitteiden ja nimettyjen paikkojen välillä on
kuntakoodi — ja sekin on vuotava: osoitedatassa esiintyy 320
kuntanumeroa, joista 12 on lakkautettuja koodeja jotka vaativat oman
siltataulukkonsa nykyisiin 308 aktiiviseen koodiin. Yrityksissä taas
esiintyy koodi
2004 626 kertaa, joka ei tarkoita kuntaa lainkaan vaan "osoite tuntematon". - Koordinaattijärjestelmät ovat eri: osoitteet ovat EPSG:3067:ssä, Maanmittauslaitoksen paikannimet WGS84:ssä, Paavon aineisto omassa ETRS89-TM35FIN-projektiossaan. Mikään näistä ei puhu suoraan toisilleen.
- Jopa käsite "postinumero" tarkoittaa kahta eri asiaa kahdessa eri
lähteessä: SYKE:n osoitedatan postitoimipaikka (esim. "ESPOO") on
postin jakelualue, kun taas Tilastokeskuksen Paavo nimeää saman
postinumeroalueen tilastollisesti eri nimellä (esim.
02250= "Henttaa" Paavossa). Nämä eivät ole sama asia, vaikka numero näyttää samalta.
Lopulta se, mikä oikeasti yhdistää nämä rekisterit toisiinsa, on koordinaatit ja "lähimmän naapurin" haku — ei mikään yhteinen tunniste.
Kun testasin osoitepisteiden ja nimettyjen paikkojen yhdistämistä koordinaattien kautta, lähin osoite löytyi esimerkiksi Ison Omenan kohdalla 41 metrin päästä, Espoon keskukselle 40 metrin päästä ja Nuuksiolle 38 metrin päästä — toimii hyvin, mutta on silti vain arvio, ei koskaan varmistettu sisäänkäynti.
Sama pätee yrityksiin: vaikka osoite täsmäytetään tarkalla katu+numero-vertailulla, vain 82,6 % yrityksistä (381 428 kappaletta 461 649:stä) saa täsmällisen linkin kansalliseen osoitekantaan — loput kaatuvat kirjoitusasueroihin, vanhentuneisiin osoitteisiin tai osoitteisiin jotka eivät ole osoitekannassa lainkaan.
Tämä on luultavasti suurin syy, miksi tällaista palvelua ei ole vielä olemassa: palaset ovat hajallaan eri virastoissa ja jopa eri ministeriöiden alla, eikä mikään niistä ole suunniteltu sopimaan yhteen. Se yhdistämistyö on se, minkä tein.
Muista palvelun ominaisuuksista voi mainita mikrofonilla toimivan haun esimerkiksi ajaessa, sekä reaaliaikaisen paikan näyttämisen ja streamaamisenn (aukeaa hakupainikkeen vierestä). Näitä ei ole kaikkien helppo kehittää välttämättä - ja ensimmäistä ei ole esimerkiksi Google Mapsissakaan.
Palvelu pyrkii myös poimimaan Wikipediasta hyödylliset artikkelit sekä oleellisimmat web-hakutulokset tukemaan paikkatietohakua - vuotamatta käyttäjän tunnisteita lainkaan hakukoneelle.
Numeroina
Taustalla oleva data on paljon isompi kuin mitä pääkaupunkiseudulla näkyy juuri nyt — koko Suomen aineistoja on ajettu putken läpi testinä, vaikka tuotannossa on toistaiseksi vain neljä kuntaa:
Koko Suomen taustadata (putken kapasiteetti, ei tuotannossa):
| Lähde | Luku |
|---|---|
| Osoitteita (SYKE, ainutkertaisia) | 1 932 001 |
| Yrityksiä (PRH) | 461 649 |
| Nimettyjä paikkoja (Maanmittauslaitos) | 804 908 |
Tuotannossa nyt (pääkaupunkiseutu: Helsinki, Espoo, Vantaa, Kauniainen):
| Lähde | Luku |
|---|---|
| Osoitteita | 97 170 |
| Yrityksiä | 138 534 |
| Nimettyjä paikkoja | 2 882 |
| OpenStreetMap-kohteita | 11 834 |
| HSL-pysäkkejä/asemia | 8 420 |
Yksityisyys ei ole lisäominaisuus vaan koko lähtökohta
Olen aiemmin kirjoittanut siitä, miksi puhelinvalmistajan lupaus yksityisyydestä ei riitä, jos koko ekosysteemi ympärillä on rakennettu seurantaa varten. Sama ajatus ohjasi Jihuuta alusta asti: yksityisyyden pitää olla arkkitehtuurissa, ei lisätty jälkikäteen asetuksena, jonka voi ottaa pois päältä.
Käytännössä tämä tarkoittaa:
- Ei käyttäjätiliä, ei kirjautumista, ei evästeitä seurantaan.
- Ei kolmannen osapuolen analytiikkaa tai mainosverkkoja — ei ainuttakaan.
- Palvelulla on oma, ensimmäisen osapuolen telemetria, mutta se on tarkoituksella suppea: raakadata (yksittäiset haut) säilyy oletuksena 30 päivää, ja senkin jälkeen jäljelle jää vain nimetön päivätason yhteenveto (hakumäärät, onnistumisprosentti) — ei koskaan hakutekstiä tai mitään yksilöivää. Tarkoitus on nähdä, toimivatko haut oikeasti hyvin, ei profiloida ketään.
Jos palvelu ei tarvitse käyttäjädataa toimiakseen, sitä ei pidä kerätä "varmuuden vuoksi" tai myöhempää käyttöä varten. Se on koko pointti.
Mitä puuttuu — ja miksi tarkoituksella
Jihuu kattaa toistaiseksi vain pääkaupunkiseudun. Tämä ei ole väliaikaisratkaisu unohduksen takia, vaan tietoinen päätös: koko Suomen kattava haku vaatii ratkaisun siihen, miten näytetään järkevästi esimerkiksi kymmenet samannimiset kadut tai paikat eri kunnissa — ongelma jota neljän kunnan alueella ei vielä käytännössä ole, mutta joka pitää ratkaista kunnolla ennen laajentamista, ei laastaroida jälkikäteen. Sama periaate kuin edellä kuvatussa rekisterien yhdistämisessä: kunnolla ensin, nopeasti myöhemmin.
Mieluummin olen tehnyt pääkaupunkiseudun kunnolla ensin, kuin koko Suomen huonosti heti.
Loppuun muutama tekninen valinta, joka voi kiinnostaa osaa
Taustalla pyörii Python, Starlette (ei FastAPI) ja PostgreSQL/PostGIS. Frontend on käsin kirjoitettua HTML/CSS/JS:ää ilman frameworkia tai build-vaihetta — ei bundleria, ei npm-riippuvuuspuuta selainpuolella. Sama filosofia kuin tässä blogissakin: useimmat sivustot voi hyvin rakentaa ilman erillistä fronttikirjastoa.
Pari yksityiskohtaa, jotka ovat suoraan seurausta yksityisyystavoitteesta:
- Sisällön turvakäytäntö (CSP) on tiukka:
script-src 'self', eiunsafe-inline-poikkeuksia. Jokainen klikkaus menee oikean event listenerin kautta, ei inline-koodina. - Kartat renderöidään Canvasilla, ei WebGL:llä — nimenomaan siksi, että palvelu toimii myös yksityisyyttä korostavissa selaimissa, jotka estävät tai vääristävät WebGL:ää tunnistuksen vaikeuttamiseksi.
- OpenLayers-kirjasto (n. 290 kt) ei lataudu joka sivulatauksella, vaan vasta silloin kun kartta oikeasti näytetään.
- Äänihaku kulkee palvelimen kautta puheentunnistus-API:lle, jolloin ääniraita ei koskaan mene suoraan selaimesta kolmannelle osapuolelle.
Kokeile
Palvelu on ilmainen eikä sillä ole kaupallista mallia — tein sen koska se oli hyödyllinen itselleni, ja arvelen sen olevan hyödyllinen myös muille.
Kokeile osoitteessa jihuu.fi, ja kerrothan mielelläsi palautetta, jos löydät jotain rikki menevää tai parannettavaa.