GDAL lukee nyt suoraan OSM-vektoreita

OSM-dataa voidaan nyt lopultakin lukea suoraan GDAL:in avulla upouuden OSM-ajurin ansiosta. Ajurin oma ohjesivu on täällä
http://gdal.org/ogr/drv_osm.html
Kirjoitin myös pienen ohjeen, jossa käytetään esimerkkiaineistona finland.osm.pbf -tiedostoa ja irrotetaan yhdellä komennolla tiet ja kirjoitetaan ne shapefileksi EPSG:3067-koordinaattijärjestelmään.
http://latuviitta.org/documents/OSM_aineistojen_haltuunotto_ja_GDAL.pdf

GDAL-ajurin käyttö voi olla erinomainen vaihtoehto, jos haluaa esimerkiksi höystää MML:n avoimia rasteri- ja vektoriaineistoja tietyn rajauksen mukaan valituilla OSM-kohteilla. Pistekohteiden noukkiminen on erityisen nopeaa, Suomen n. 300000 kiinnostavaa OSM-pistettä saa maatiedostosta irti noin minuutissa. Kaikkien tasojen (pisteet, viivat, yksinkertaiset polygonit ja relaatioista rakennetut polygonit) muuntaminen kestää hitaalla Windows-kannettavalla noin 40 minuuttia. PostgreSQL/PostGIS -asennusta ei tarvita, ja on todennäköistä, että jatkossakin kaikki päivitykset ajuriin ovat saatavilla samaan aikaan sekä Linux- että Windows-käyttäjille.

Huom!

Jos joku aikoo kokeilla ohjetta ja käyttää -where -suodatinta, niin ennen GDAL-versiota r24690 täytyy suodattimessa käytettävä ominaisuustieto lisätä jokaisen OSM-tason määrityksiin (points, lines, polygons, multipolygons), muuten ohjelma ilmoittaa, ettei attribuutti ole käytettävissä. Päivitän pdf-ohjeen tältä osalta joskus vähän myöhemmin.

Huom2!

GDAL-versiossa r24697 on mennyt jotain rikki -where -ehdon käytössä. Toistaiseksi on parasta muuntaa koko aineisto ja tehdä mahdolliset suodatukset jälkikäteen. Muunnos on nopea, se kestää esimerkiksi noin 6 minuuttia (Windows 7, 3 x 3 GHz AMD, SATA-levy, Spatialite-tietokanta kohteena). Vanhalla Windows Vista -kannettavalla taisi mennä puoli tuntia.

Huom3!

Ongelma korjattu GDAL-versiossa r24699 http://trac.osgeo.org/gdal/changeset/24699, joten where-ehtoa pitäisi nyt voida käyttää tehokkaasti.

Olen muutaman päivän pois linjoilta, mutta olisi kiva nähdä takaisin tultua mallisuoritus esimerkiksi siitä, kuinka Geofabrikin finland.osm.pbf -tiedostosta poimitaan ogr2ogr-ohjelmalla huoltoasemat ja muunnetaan ne GBSBabel-ajurin kautta johonkin sellaiseen muotoon, jonka voi suhteellisen suoraan asentaa navigaattoriin tai retki-GPS:ään. Ei pitäisi olla kovin vaikeaa; eniten miettimistä todennäköisesti tarvitaan siihen, mitkä OSM:in tagit kirjoitetaan mihinkin GPS-formaatissa tuettuna olevaan kenttään. Suositeltavaa lukemista on
http://gdal.org/ogr/drv_gpsbabel.html ja
http://www.gpsbabel.org/capabilities.html

POI-kohteiden valinta ja vienti Garmin etrex:iin onnistuu esimerkiksi näin:

ogr2ogr -f gpx osmtest.gpx finland.osm.pbf
-sql “select name,amenity as ‘desc’ from points where amenity=‘fuel’”

Kysely tuottaa GPX-tiedoston ja ilmeisesti harmittoman virheilmoituksen
ERROR 1: Too many features have accumulated in lines layer. Use OGR_INTERLEAVED_READING=YES mode

GPX-tiedoston voi viedä suoraan etrex:in Custom POI -valikkoon POI Loader -ohjelmalla. Jos avaa GPX-tiedoston ensin Map Source -ohjelmalla, niin sillä voi valita pisteisiin liitettävän symbolikuvan, tallentaa uudestaan GPX-muotoon ja käyttää sitten POI Loaderia. Toinen vaihtohto on liittää oma BMP-muotoinen symboli (24x24 pikseliä tai pienempi) samaan hakemistoon, jossa GPX-tiedosto on ja nimetä se käyttämään samaa nimen alkuosaa. Tässä tapauksessa siis osmtest.bmp. Näin kun tekee, niin POI loader -latauksen jälkeen OSM:sta poimitut kohteet näkyvät Custom POI -ryhmässä ja etrex näyttää niille tuom itse määritellyn symbolin.

Homma sujuu melko nopeasti, hitaalla Windows-kannettavalla ogr2ogr otti aikaa kolme ja puoli minuuttia.

Huom!

Sama menetelmä toimii kaikille muillekin GDAL:in tukemille vektoritietolähteille. Esimerkiksi Helsingin pysäköintilippuautomaatit voi hakea ogr2ogr-ohjelmalla latuviitan WFS-palvelusta, tallentaa ne GPX-muotoon ja viedä sitten samoin kuin edellä kerrottiin GPS-laitteeseen.

Tarvittava Ogr2ogr-komento on tällainen:

ogr2ogr -f GPX parkkiautomaatit.gpx -t_srs epsg:4326
WFS:http://hip.latuviitta.org/cgi-bin/tinyows
-sql “select tunniste as ‘name’,osoite as ‘desc’ from hki_parkkilippuautomaatit”

GDAL pystyy myös lukemaan OSM-tietoja suoraan rajapintapalvelusta API, XAPI ja Overpass API toimivat kaikki. Normaalisti kannattaa käyttää XAPI:a tai Overpass API:a, jottei turhaan kuormita muokkauksiin käytettävää varsinaista API:a.

Käytännössö lukeminen tapahtuu niin, että GDAL:in tietolähteeksi annetaan
/vsicurl_streaming/“[tähän väliin mikä tahansa URL, joka palauttaa OSM-dataa]”

Esimerkki XAPI:n käyttämisestä:

ogrinfo -ro -al
/vsicurl_streaming/"http://open.mapquestapi.com/xapi/api/0.6/node[amenity=pub][bbox=-77.041579,38.885851,-77.007247,38.900881]"

ja vastaavasti Overpass API:sta. Huomaa, että hakuehto, joka annetaan data-parametrin arvoksi, täytyy URL-koodata valmiiksi, koska GDAL ei siitä huolehdi.

ogrinfo -ro -al
/vsicurl_streaming/"http://overpass.osm.rambler.ru/cgi/interpreter?data=%28node%2850%2E746%2C7%2E154%2C50%2E748%2C7%2E157%29%3B%3C%3B%29%3Bout%20meta%3B%0A"

Käytännön hyötyä tästä ominaisuudesta voisi saada irti tekemällä esimerkiksi sovelluksen, joka käyttää pohjalla harvemmin päivittyvää taustakarttaa, jossa ei välttämättä esitetä kaikkia kohdetyyppejä ollenkaan. Sovellus voisi sitten hakea joko itsenäisesti tai käyttäjän tilauksen mukaan tuoreimmat päivitykset ja vakiokartasta puuttuvat kohteet suoraan API:sta “olisikohan tässä matkan varrella kukkakauppaa”.

GDAL:in kyky lukea tietoja verkon yli mahdollistaa monia muitakin hauskoja juttuja. Se voi esimerkiksi lukea karttoja suoraan MBTiles-laattavarastotiedostosta verkon yli
http://www.gdal.org/frmt_mbtiles.html
Tai sitten se voi lukea kuvan tai vektoritiedoston netistä ilman, että tiedosto olisi ensin ladattava paikalliseen tiedostoon.
http://trac.osgeo.org/gdal/wiki/UserDocs/ReadInZip

Esimerkkki zipatun shapefilen ominaisuuksien lukemisesta:

ogrinfo -ro -al -so /vsizip/vsicurl/http://latuviitta.org/documents/ETRS_lehtijako_100t.zip

Kartta.kapsi.fi on myös luettavissa ilman erillistä lataamista, mutta siihen kyllä tarvitaan pieni temppu. M4R.zip alla olevassa esimerkissä ei sisällä suoraan shapefilejä, joten GDAL ei löydä vektoreita zipin osoitteesta. Lisäksi täytyy antaa hakemistorakennetta zipin sisältä niin pitkälle, että zippejä alkaa löytyä, tässä tapauksessa siis “/M4R.zip/M4R/”. Hakemistorakenne löytyy kun hakee ensin ogrinfon pelkällä zipin osoitteella, mutta listaus on melkoisen sekava.

ogrinfo -ro -al -so /vsizip/vsicurl/http://kartat.kapsi.fi/files/maastokartta_250k/kaikki/etrs89/shp/M4/M4R.zip/M4R/