OpenStreetMap / Import do PostGIS

Z FreeGIS portál
Přejít na: navigace, hledání

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