3.4 Extract OSM data - orbisgis/h2gis GitHub Wiki
Introduction
This tutorial describes how extract and transform OSM data using H2GIS functions. The method is divided in three steps. Firstly a OSM file is extracted using a bounding box. Secondly the osm file is parsed and loaded in a H2GIS database. Then the OSM data is processed in SQL to build two GIS tables : buildings and roads.
Extract OSM file
To extract an OSM file using a bounding box runs the following command.
call ST_OSMDOWNLOADER('POLYGON ((-2.77 47.64, -2.77 47.65, -2.76 47.65, -2.76 47.64, -2.77 47.64)) '::geometry,'/tmp/vannes.osm')
where the input geometry represents the bounding box in lat/lon and /tmp/vannes.osm the output file.
Load OSM file
Thanks to the OSMRead function that offers the mechanism to parse the OSM file. The OMS file is stored in 11 tables. More details are available on h2gis.org website : OSMRead function
Execute the command :
call OSMRead('/tmp/vannes.osm', 'vannes');
Where /tmp/vannes.osm is the extracted file and vannes a prefix for 11 tables created.
Build GIS tables
In order to be "GIS readable" the OSM tables must be transformed.Indeed, in OSM there are no layers in the traditional GIS sense. All features are in one big database organized in a pseudo graph model. The database contains tables for each Element type (nodes, ways, relations). Please consult OMS database for more information.
We propose two scripts. The first one to create a table that contains buildings as polygons and the second one to extract a table of roads represented with lines. Note thats these scripts are for demonstration purpose. Feel free to adapt them to extract more details.
Buildings table
DROP TABLE IF EXISTS VANNES_BUILDINGS;
CREATE TABLE VANNES_BUILDINGS(ID_WAY BIGINT PRIMARY KEY) AS SELECT DISTINCT ID_WAY
FROM VANNES_WAY_TAG WT, VANNES_TAG T
WHERE WT.ID_TAG = T.ID_TAG AND T.TAG_KEY IN ('building');
DROP TABLE IF EXISTS VANNES_BUILDINGS_GEOM;
CREATE TABLE VANNES_BUILDINGS_GEOM AS SELECT ID_WAY,
ST_MAKEPOLYGON(ST_MAKELINE(THE_GEOM)) THE_GEOM FROM (SELECT (SELECT
ST_ACCUM(THE_GEOM) THE_GEOM FROM (SELECT N.ID_NODE, N.THE_GEOM,WN.ID_WAY IDWAY FROM
VANNES_NODE N,VANNES_WAY_NODE WN WHERE N.ID_NODE = WN.ID_NODE ORDER BY
WN.NODE_ORDER) WHERE IDWAY = W.ID_WAY) THE_GEOM ,W.ID_WAY
FROM VANNES_WAY W,VANNES_BUILDINGS B
WHERE W.ID_WAY = B.ID_WAY) GEOM_TABLE WHERE ST_GEOMETRYN(THE_GEOM,1) =
ST_GEOMETRYN(THE_GEOM, ST_NUMGEOMETRIES(THE_GEOM)) AND ST_NUMGEOMETRIES(THE_GEOM) >
2;
DROP TABLE VANNES_BUILDINGS;
Roads table
DROP TABLE IF EXISTS VANNES_ROADS;
CREATE TABLE VANNES_ROADS(ID_WAY BIGINT PRIMARY KEY) AS SELECT DISTINCT ID_WAY FROM VANNES_WAY_TAG WT,
VANNES_TAG T WHERE WT.ID_TAG = T.ID_TAG AND T.ID_TAG =13;
DROP TABLE IF EXISTS VANNES_ROADS_GEOM;
CREATE TABLE VANNES_ROADS_GEOM AS SELECT ID_WAY, ST_MAKELINE(THE_GEOM) THE_GEOM FROM (SELECT (SELECT
ST_ACCUM(THE_GEOM) THE_GEOM FROM (SELECT N.ID_NODE, N.THE_GEOM,WN.ID_WAY IDWAY FROM VANNES_NODE
N,VANNES_WAY_NODE WN WHERE N.ID_NODE = WN.ID_NODE ORDER BY WN.NODE_ORDER) WHERE IDWAY = W.ID_WAY)
THE_GEOM ,W.ID_WAY FROM VANNES_WAY W,VANNES_ROADS B WHERE W.ID_WAY = B.ID_WAY) GEOM_TABLE;
DROP TABLE VANNES_ROADS;