OpenStreetMap / Import do PostGIS
Pro import dat OpenStreetMap do geodatabáze PostGIS existuje několik nástrojů:
osm2pgsql
Nejprve stáhneme zkomprimovaná data ve formátu OSM, viz [1]. Např.
wget http://download.geofabrik.de/openstreetmap/europe/czech-republic-latest.osm.bz2
Pomocí konzolové aplikace osm2pgsql data naimportujeme do existující databáze PostGIS (EPSG 3857).
osm2pgsql -d pgis_osm -p czech -E 3857 -s czech-republic-latest.osm.bz2
Příklad pro transformaci dat do WGS-84 (EPSG 4326):
osm2pgsql -d pgis_osm -p czech -E 4326 -s czech-republic-latest.osm.bz2
Příklad pro cvičnou databázi PostGIS:
#!/bin/sh
export DB=pgis_student
export FILE=czech-republic-latest.osm.bz2
wget http://download.geofabrik.de/openstreetmap/europe/$FILE
psql $DB -c "DROP SCHEMA IF EXISTS osm CASCADE"
psql $DB -c "CREATE SCHEMA osm"
psql $DB -c "GRANT USAGE ON SCHEMA osm TO public"
bunzip2 -c $FILE | osm2pgsql -d $DB -E 3857 -p czech -s /dev/stdin
tables=`psql $DB -t -c "SELECT tablename FROM pg_tables WHERE schemaname = 'public' AND tablename LIKE 'czech%'"`
for table in $tables; do
psql $DB -c "ALTER TABLE $table RENAME COLUMN way to geom"
psql $DB -c "ALTER TABLE $table ADD COLUMN gid serial"
psql $DB -c "ALTER TABLE $table ADD primary key (gid)"
psql $DB -c "ALTER TABLE $table SET SCHEMA osm"
psql $DB -c "GRANT SELECT ON osm.$table TO public"
done
rm -rf $FILE
Doporučená úprava:
Tabulka osm.czech_polygon obsahuje mix geometrií, které je vhodné sjednotit:
SELECT distinct st_geometrytype(geom) from osm.czech_polygon;
ST_MultiPolygon ST_Polygon
ALTER TABLE osm.czech_polygon add geom1 geometry(multipolygon, 3857);
A to buď na multiprvky:
UPDATE osm.czech_polygon SET geom1 = st_multi(geom);
Anebo singleprvky:
TODO
ALTER TABLE osm.czech_polygon DROP COLUMN geom;
ALTER TABLE osm.czech_polygon rename COLUMN geom1 to geom;
osm2pgrouting
Nástroj osm2pgrouting importuje data do databáze PostGIS pro nadstavbu PgRouting, která je určena pro síťové analýzy.
Data stáhneme ve formátu OSM:
wget http://download.geofabrik.de/openstreetmap/europe/czech_republic.osm.bz2
Data dekomprimujeme a naimportuje do databáze 'pgis_osm_routing':
bzip2 -d czech_republic.osm.bz2 ./osm2pgrouting -file czech_republic.osm -conf mapconfig.xml -dbname <databaze> -user <uzivatel> -clean -passwd <heslo>
Poznámky
Na serveru geo102 je umístěna databáze pgis_student s importovanými OSM daty ČR. Databáze slouží pro výuku je určena pro experimentování.
Schema | Name | Type | Owner --------+---------------+-------+------- osm | czech_line | table | landa osm | czech_nodes | table | landa osm | czech_point | table | landa osm | czech_polygon | table | landa osm | czech_rels | table | landa osm | czech_roads | table | landa osm | czech_ways | table | landa
Příklad vytvoření tématické vrstvy 'lesni_porosty' (další příklady).
CREATE TABLE lesni_porosty AS
SELECT osm_id,name,geom FROM czech_polygon WHERE landuse = 'forest';
ALTER TABLE lesni_porosty ADD COLUMN gid serial;
ALTER TABLE lesni_porosty ADD PRIMARY KEY (gid);
CREATE INDEX ON lesni_porosty USING GIST (geom);
-- přidělení práv pro QGIS
GRANT SELECT ON lesni_porosty TO public;
Příklad přidání sloupce do tabulky.
ALTER TABLE lesni_porosty ADD COLUMN wood text;
UPDATE lesni_porosty SET wood = czech_polygon.wood FROM czech_polygon
WHERE lesni_porosty.osm_id = czech_polygon.osm_id;
Cyklostezky (ukázka práce s relacemi}:
create table cyklo as
select line.* from osm.czech_line as line join
(select distinct unnest(parts) as osm_id from osm.czech_rels where 'bicycle' = ANY(tags)) as foo
on line.osm_id = foo.osm_id;
Příklad vizualizace dat pomocí MapServer.
MAP NAME "Cvicna databaze OSM" STATUS ON IMAGETYPE PNG EXTENT 1347456.13 6198566.23 2099386.47 6630407.12 SIZE 800 600 IMAGECOLOR 255 255 255 UNITS meters WEB IMAGEPATH "/var/tmp/ms_tmp/" IMAGEURL "/tmp/" END LAYER NAME lesy CONNECTIONTYPE postgis CONNECTION "user=postgis password=XXXXXXXX dbname=pgis_osm host=localhost port=5432" DATA "way FROM czech_polygon" FILTER "landuse = 'forest'" STATUS DEFAULT TYPE POLYGON CLASS NAME "Lesy" STYLE COLOR 89 167 89 OUTLINECOLOR 32 32 32 END END END END