Croatia/Kratki vodici/GDAL OSM driver - kako do dnevno svjezih osm podataka

G
= GDAL OSM driver - kako do dnevno svježih OSM podataka =
Za GDAL bilioteku u verziji 1.10 je najavljen driver za OSM podatke (tj. podrška za .osm xml i .pbf datoteke) što će omogućiti brzu i jednostavnu konverziju OSM podataka u bilo koji drugi GIS format podržan od OGR-a (ogr2ogr). Za testiranje drivera napravljen je primjer preuzimanja dnevnog exporta OSM podataka i konverzija u prostornu SQLite bazu (spatialite) spremnu za korištenje s desktop GIS aplikacijama (npr. QGIS) ili eventualno za web aplikacije koje koriste ove podatke a važna im je ažurnost na dnevnoj bazi.
Lokalna OSM zajednica još od 2009 god. čuva arhivu dnevnih exporta OSM podataka za područje RH (hvala Hrvoju B.) te je i prije bilo moguće s drugim alatima u svojoj bazi imati dnevno ažurne OSM podatke(alati oko PostgreSQL-a: osm2pgsql, osmosis i imposm ili za Sqlite spatialite-tool). No nama koji GDAL/OGR često koristimo, zbog velike mogućnosti manipulacije podacima, skriptanja i python bindinga, zgodno je imati i ovu mogućnost unutar tog alata.
U sljedećem tekstu su upute kako pripremiti GDAL/OGR biblioteku za konverziju iz .osm ili .pbf formata u .sqlite, te na koji način dohvaćati dnevno svježe openstreetmap podatke koristeći filtere.
Koraci:
# Instalacija dependency-ja
# Preuzimanje GDAL izvornog koda
# Kompajliranje GDAL-a
# Čitanje pbf datoteke i konverzija u SQLite
# Druge opcije
== Instalacija dependency-ja (Ubuntu 12.04.2 LTS)==
U primjeru OSM export konvertiramo u SQLite (tj. Spatialite) pa je prvo potrebno instalirati sve što je potrebno za kompajliranje a onda i biblioteke koje su potrebne GDAL-u za konverziju: 
$sudo apt-get install build-essential
$sudo apt-get install spatialite-bin expat curl sqlite3 libgeos-3.3.3
# spatialite je prostorna extenzija za SQLite bazu
# curl nam omogućava čitanje podataka preko mreže kako ih nebi morali svaki put preuzimati na svoje računalo
# expat je c biblioteka za parsanje xml datoteka. Nije obvezno - potrebna je za parsanje .osm datoteke
# geos - Nije obvezan ali potreban je zbog prostornog upita
Kako bi se GDAL kompajlirao sa ovim bibliotekama potrebno je na Ubuntu instalirati i njihove -dev pakete 
$sudo apt-get install libcurl4-gnutls-dev libexpat1-dev libspatialite-dev libsqlite3-dev libgeos-dev
== Preuzimanje GDAL izvornog koda ==
Preuzimanje GDAL izvornog koda direktno iz svn trunk-a (driver za osm je trenutno u trunk-u)
$svn checkout https://svn.osgeo.org/gdal/trunk/gdal gdal_1.10
== Kompajliranje GDAL-a ==
Kod kompajliranja GDAL-a treba explicitno uključiti podršku za curl, spatialite i geos (--with), koji zbog dependency-ja nisu uključeni u defaultni build. Instalacija je napravljena lokalno u $HOME/bin/gdal_1.10 direktorij (--prefix).
$cd ~/bin/gdal_1.10
$./configure --prefix=$HOME/bin/gdal_1.10 --with-spatialite=yes --with-curl=yes --with-geos=yes
$make
$make install
== Čitanje pbf datoteke i konverzija u SQLite ==
Pomoću ogr2ogr alata dohvaćaju se podaci i loadaju u SQLite bazu. 
$cd ~/bin/gdal_1.10/bin
$./ogr2ogr -f SQLite -dsco spatialite=yes \
 /tmp/osm_daily_stream.sqlite \
 /vsicurl_streaming/http://data.osm-hr.org/croatia.osm.pbf \
 --config OSM_CONFIG_FILE $HOME/bin/gdal_1.10/share/gdal/osmconf.ini -progress 
gdje je:
# -f SQLite - output format će biti SQLite baza
# -dsco spatialite=yes - datoteka će imati podršku za prostorne podatke (bez ove opcije geometriju neće moći čitati GIS alati ali će se podaci loadati).
# /vsicurl_streaming/ - pbf datoteka se čita preko mreže pomoću curl-a
# OSM_CONFIG_FILE - GDAL nakon kompajliranja nije znao pronaći osmconf.ini datoteku te je na ovaj način direktno postavljen path do datoteke
Nakon toga ogr2ogr kreira osm_daily_stream.sqlite datoteku u kojem su podaci organizirani po tipu geometrije (slično kako to napravi osm2pgsql).
Provjerom ogrinfo ispravno očitava osm_daily_stream.sqlite datoteku:
/tmp/:$ogrinfo osm_stream.sqlite 
INFO: Open of `osm_stream.sqlite'
 using driver `SQLite' successful.
1: points (3D Point)
2: lines (3D Line String)
3: multilinestrings (3D Multi Line String)
4: multipolygons (3D Multi Polygon)
5: other_relations (3D Geometry Collection)
== Druge opcije ==
Ovaj driver nam omogućuje da npr. OSM podatke loadamo direktno u PostgreSQL, MySQL, MSSQL, Oracle Spatial, ArcSDE ili bilo koji od OGR-a podržan format, a također je jako korisna mogućnost (iz osm.hr arhive) preuzimanja samo dnevnih promijena, te koristeći --append --update opcije u bazu loadati samo preuzete promjene. Možete koristiti i ogr2ogr sql_statement (-sql) pa exportati samo dio podataka koji vam trebaju, ili exportati samo OSM POI-e ili samo POI-e unutar nekog BBOX-a i sl. drugim riječima sav svemir manipulacije prostornim podacima koji nam otvara GDAL/OGR.
Ukoliko želite eksperimentirati sa ogr2ogr, pbf datoteku preuzmite na svoje računalo jer ćete bitno ubrzati izvršavanje!
Još jedna napomena prije primjera: konfiguracijska datoteka (osmconf.ini)koju GDAL/OGR koristi za OSM podatke se nalazi u share/gdal/ i po defaultu nije baš korisno konfigurirana pa ju prvo pogledajte i definirajte atribute koje želite exportati iz OSM podatka.
=== Export jednog ili više layera ===
U gornjem primjeru kreirana SQLite baza je imala 5 tablica (layera) ovisno o tipu geometrije (points, multilinestrings, multiplygons). Ukoliko želite exportati samo neke layer-e (za ovaj primjer layer points) dovoljno je iza navoda ulazne datoteke dodati ime layera kojeg želite exportati.
$./ogr2ogr -overwrite -f SQLite -dsco spatialite=yes \
 /tmp/osm_daily_stream.sqlite \
 /vsicurl_streaming/http://data.osm-hr.org/croatia.osm.pbf points \
 --config OSM_CONFIG_FILE $HOME/bin/gdal_1.10/share/gdal/osmconf.ini -progress
Naredba će kao rezultat u SQLite bazu loadati samo OSM POI-e.
Sada ogrinfo pokazuje samo jedan layer u bazi (points)
$./ogrinfo /tmp/osm_daily_stream.sqlite
INFO: Open of `/tmp/osm_daily_stream.sqlite'
 using driver `SQLite' successful.
1: points (3D Point)
=== Export sa "where" uvjetom ===
Za filtriranje exporta po bilo kojoj vrijednosti atributa možete koristiti -where opciju:
$./ogr2ogr -overwrite -f SQLite -dsco spatialite=yes \
 /tmp/osm_daily_stream_P.sqlite 
 /vsicurl_streaming/http://data.osm-hr.org/croatia.osm.pbf points \
 -where "amenity='school'" \
 --config OSM_CONFIG_FILE $HOME/bin/gdal_1.10/share/gdal/osmconf.ini -progress
Naredba će iz sloja "points" loadati samo objekte za koje je vrijednost atributa "amenity=school" tj. dobit ćemo samo podatke o školama. 
=== Export sa ugrađenim SQL-om ===
Za malo kompleksnije SQL upite od gornjeg primjera koristite -sql opciju. Na primjer ukoliko želite exportati sva "naselja" koja su ovisno o broju stanovnika različito tagirana u OSM bazi kao town, hamlet, vilage.. i sl. takav kompleksniji filter možete postaviti ugrađivanjem sql statementa u ogr2ogr naredbu:
$./ogr2ogr -f SQLite -dsco spatialite=yes \
 -sql "SELECT * FROM points WHERE place IN ('state', 'city', 'town', 'village', 'hamlet', 'suburb', 'neighbourhood', 'locality')" \
	 /tmp/osm_daily_stream3.sqlite \
 /vsicurl_streaming/http://data.osm-hr.org/croatia.osm.pbf \
 --config OSM_CONFIG_FILE $HOME/bin/gdal_1.10/share/gdal/osmconf.ini -progress 
OGR u SQL izrazima podržava JOIN-e, UNION, ORDER, operatore, neke osnovne funkcije itd... u svakom slučaju pogledati OGR SQL dokumentaciju
=== Prostorni upit "-spat" ===
OGR ima više "clip" opcija, ali za jednostavni prostorni upit dovoljno je definirati BBOX tj. extent unutar kojeg želite dohvatiti podatke.
U primjeru je uzet BBOX za Zagreb (xmin ymin xmax ymax). 
$./ogr2ogr -overwrite -f SQLite -dsco spatialite=yes \
 -spat 15.926055908203125 45.78859428734741 16.035919189453125 45.82742366876799 \
 /tmp/osm_daily_stream_P.sqlite \
 /vsicurl_streaming/http://data.osm-hr.org/croatia.osm.pbf points \
 --config OSM_CONFIG_FILE $HOME/bin/gdal_1.10/share/gdal/osmconf.ini -progress
Naredba će iz layera "points" exportati samo objekte koji se nalaze unutar specificiranog područja (intersects).
Za one koje interesira više obavezno pogledati što sve nudi ogr2ogr alat.
Za automatizaciju ovog procesa dohvaćanja i loada podataka dovoljno je ogr2ogr naredbu staviti u crontab.