Outils pour utilisateurs

Outils du site


openstreetmap:geomatique:ogr2ogr_convertir_les_donnees_osm_au_format_shp

GDAL/ogr2ogr – Convertir les données OSM au format SHP

Les bâtiments de Vannes au format SHP

Partons d'un fichier au format .pbf de la ville de Vannes, que nous pouvons créer avec osmconvert :

osmconvert -B=vannes.poly --hash-memory=100 bretagne.pbf -o=vannes.pbf

La commande suivante permet d'en sélectionner les bâtiments et de créer un fichier SHP :

ogr2ogr -f "ESRI Shapefile" buildings.shp -sql "select osm_id,name,type from multipolygons where building is not null" -lco ENCODING=UTF-8 vannes.pbf

Quelques explications sur les paramètres :

  • -f définit le format du fichier buildings.shp à créer - ici un répertoire est créé avec l'ensemble des fichiers ESRI Shapefile associés
  • -sql définit une requête SQL qui permet de sélectionner les éléments à conserver - nous y reviendrons
  • -lco définit une variable pour la création du fichier de sortie : ENCODING=UTF-8 permet de gérer les caractères spéciaux

Selon la taille du fichier il peut être nécessaire – comme expliqué sur la doc du pilote OSM de GDAL – de modifier le fonctionnement par défaut du pilote OSM, en définissant les variables suivantes :

SET OGR_INTERLEAVED_READING=YES
SET OSM_USE_CUSTOM_INDEXING=NO

Créer un fichier GeoPackage

Il suffit de préciser l'extension du fichier en sortie, ogr2ogr se charge de reconnaître le format (qui peut aussi être explicité par -f GPKG) :

ogr2ogr buildings.gpkg -sql "select osm_id,name,type from multipolygons where building is not null" -lco ENCODING=UTF-8 vannes.pbf

Fusionner clefs et tables

Le pilote OSM pour OGR

La requête SQL d'une commande ogr2ogr est étroitement associée au pilote de lecture des données OSM. Celui-ci utilise en interne la base de données SQLite dans laquelle les données OpenStreetMap sont réparties en 5 tables :

  • points : les éléments de type nodes
  • lines : les éléments de type ways non identifiés comme des surfaces
  • multilinestrings : les relations de type linéaire (type=multilinestring ou type=route)
  • multipolygons : les relations définissant une surface (type=multipolygon ou type=boundary) et les ways identifiés comme des surfaces
  • other_relations : toutes les autres relations

Les colonnes de ces tables, et donc les attributs utilisables dans la requête SQL, sont définis dans le fichier de configuration du pilote. Par défaut ce fichier est osmconf.ini et se trouve dans le répertoire <gdal>/bin/gdal-data. Il s'agit du fichier que nous avons spécifié par la variable d'environnement OSM_CONFIG_FILE.

Ainsi la requête SQL utilisée pour obtenir les bâtiments consiste à sélectionner dans la table multipolygons les éléments portant la clef building, et conserver les colonnes osm_id, name et type :

select osm_id, name, type from multipolygons where building is not null

L'utilisation d'une requête SQL par ogr2ogr offre de larges possibilités.

Fusionner plusieurs clefs

Nous souhaitons recueillir dans une seule couche tous les plans d'eau de Bretagne. Pour l'occupation du sol OpenStreetMap distingue les éléments naturels (tag natural) et les éléments construits par l'homme (tag landuse). En étudiant le Wiki nous retenons les associations clefs/valeurs suivantes :

natural=water
natural=wetland
landuse=basin
landuse=reservoir

Nous écrivons donsc la requête SQL ainsi :

SELECT GEOMETRY,osm_id,name,COALESCE(NATURAL,landuse) AS "type" FROM multipolygons 
WHERE NATURAL='water' OR NATURAL='wetland' OR landuse='basin' OR landuse='reservoir'

Cette requête utilise la fonction coalesce() qui combine la valeur des champs natural et landuse, et les place dans la colonne type. Cette fonction est fournie par la base de données SQLite utilisée en interne, il nous faut pour cela spécifier l'option -dialect SQLITE. Enfin cette option exige de spécifier explicitement que l'on conserve la colonne GEOMETRY, qui est donc ajouté à la requête SQL.

Voici donc notre commande :

ogr2ogr -f "ESRI Shapefile" water.shp -dialect SQLITE -sql "select GEOMETRY,osm_id,name,coalesce(natural,landuse) AS "type" from multipolygons where natural='water' or natural='wetland' or landuse='basin' or landuse='reservoir'" -lco ENCODING=UTF-8 bretagne.pbf

Fusionner plusieurs tables

Une requête plus complexe consiste à extraire les bars et cafés. Ceux-ci sont identifiés dans OpenStreetMap par plusieurs valeurs de la clef amenity : bar, cafe et pub. Surtout, ces bars, pubs et cafés peuvent être modélisés comme points ou comme polygones. Ils peuvent donc être présents dans les tables points et multipolygons. Pour produire une seule table de points nous devons donc :

  • convertir les polygones en points : la fonction st_pointonsurface() fournie par SQLite permet cela
  • fusionner les points de la table points et ceux dérivés des polygones, en effectuant une UNION

La requête SQL est donc :

SELECT * FROM (
  SELECT st_pointonsurface(GEOMETRY) AS GEOMETRY, COALESCE(osm_way_id,osm_id) AS ID, name, amenity 
         FROM multipolygons 
  UNION 
  SELECT GEOMETRY, osm_id AS ID, name, amenity FROM points
) WHERE amenity='pub' OR amenity='cafe' OR amenity= 'bar'

La clause coalesce(osm_way_id,osm_id) AS ID permet de fusionner en un seul champ les identifiants de la table multipolygons. En effet ceux-ci se trouvent dans le champ osm_id s'ils proviennent de relations ou dans le champ osm_way_id s'ils proviennent de ways fermés.

Notre commande ogr2ogr est donc :

ogr2ogr -f "ESRI Shapefile" bars.shp -dialect SQLITE -sql "SELECT id,name,amenity AS "type",GEOMETRY FROM (SELECT st_pointonsurface(GEOMETRY) AS GEOMETRY, coalesce(osm_way_id,osm_id) AS ID, name, amenity FROM multipolygons UNION SELECT GEOMETRY, osm_id AS ID, name, amenity FROM points) WHERE amenity='pub' OR amenity='cafe' OR amenity= 'bar'" -lco ENCODING=UTF-8 bretagne.pbf
  • Printable version
  • Export to OpenOffice
  • Export to PDF
  • Add page to book
  • Tools:
openstreetmap/geomatique/ogr2ogr_convertir_les_donnees_osm_au_format_shp.txt · Dernière modification: 2020/01/10 10:14 par admin