Extraire des données thématiques d'OpenStreetMap sans utiliser de base de données

L'approche sans base de données peut paraître compliqué, mais sera au final plus rapide sur un petit jeu de données. L'objectif de cet article va être de récupérer les données OpenStreetMap concernant les voies cyclables du département de la Gironde.

Pour obtenir le résultat attendu il faut répondre à trois questions :

  • récupérer des données d'OpenStreetMap,
  • filtrer les données sur la thématiques des voies cyclables,
  • filtrer sur les contours du département de la Gironde.

Obtenir des données

Il existe plusieurs solution possible pour télécharger des données sur une zone grande comme la Gironde. La première est de télécharger un export complet national ou régional. Il n'existe pas encore d'export au niveau des départements français :

  • export sur la région Aquitaine, contenant donc le département de la Gironde, depuis le site de Geofabrik,
  • export de la France depuis le site de l'association OpenStreetMap-France.

Filtre thématique

Les tags OpenStreetMap permettant de retrouver les données thématiques sont listés sur la page MapFeature du wiki et plus particulièrement dans la partie « Voies cyclables ».

Les objets qui nous intéressent sont donc les voies avec :

  • le tag « highway » et la valeur « cycleway »,
  • le tag « cycleway » avec n'importe qu'elle valeur.

Il faut faire attention aux variantes, on le voit sur le rapport du site taginfo. Pour être plus exact il nous faut donc les voies possédant les tags highway=cycleway, cycleway=*, cycleway:right ou cycleway:left. Il faut également ignorer les tags cycleway=no.

taginfo.png

Filtre spatial

Le but est de limiter les résultats uniquement au département de la Gironde. Les limites administratives dans OpenStreetMap sont représentées par des « relations » (groupes des lignes segmentées). Pour filtrer suivant le polygone définit par le département de la Gironde il nous faut identifier la relation utilisé. Plusieurs approches sont possibles pour le retrouver :

nominatim-gironde.png

  • L'opverpass, un moteur de requête de données OpenStreetMap. Recherche d'une relation ayant pour nom « Gironde », représentant une limites administrative de niveau 6 (départemental).
relation
  ["name"="Gironde"]
  ["boundary"="administrative"]
  ["admin_level"="6"];
>;
out;

overpass-gironde.png

Le résultat de la requête sous overpass-turbo.

Tout cela nous conduit au même résultat, l'identifiant de la relation que nous cherchons est le 7405. On peut la visualiser et la télécharger directement depuis le site d'OpenStreetMap ou depuis le résultat d'une recherche overpass.

Ces données sont au format OpenStreetMap. Pour des raisons d'efficacité les outils de filtrage n'utilisent pas directement ce format. Il faut donc les convertir. Différent utilitaires ou solutions existent. Parmi elles, l'éditeur offline JOSM est capable de le faire avec le plugin « poly ». Mais encore plus simple, un outil en ligne le fait automatique depuis un identifant de relation.

On télécharge tout et on filtre

On commence donc par télécharger un export de l'Aquitaine au format pbf depuis le site de Geofabrik, plus de 100 Mo. Le filtrage thématique et spatial va être fait en une seul fois avec Osmosis, un outil de manipulation d'export OpenStreetMap.

osmosis-0.39/bin/osmosis \
--read-pbf aquitaine.osm.pbf file=aquitaine.osm.pbf \
--tag-filter accept-ways "highway=cycleway" \
--read-pbf aquitaine.osm.pbf file=aquitaine.osm.pbf \
--tag-filter accept-ways "cycleway=*" \
--tag-filter reject-nodes "cycleway=no" \
--merge \
--read-pbf aquitaine.osm.pbf file=aquitaine.osm.pbf \
--tag-filter accept-ways "cycleway:left=*" \
--merge \
--read-pbf aquitaine.osm.pbf file=aquitaine.osm.pbf \
--tag-filter accept-ways "cycleway:right=*" \
--merge \
--tf reject-relations \
--used-node \
--bounding-polygon file=gironde.poly \
--write-xml file=cycleway-gironde.osm

Une autre approche : on filtre sur le thème, on télécharge puis on applique le filtre spatial

On a utilisé l'overpass pour extraire le polygone de la Gironde, on peut également l'utiliser pour extraire les éléments cyclables dans un rectangle englobant la Gironde.

way["highway"="cycleway"](44.13,-1.37,45.62,0.47);(._;node(w););out meta;
way["cycleway"]["cycleway"!="no"](44.13,-1.37,45.62,0.47);(._;node(w););out meta;
way["cycleway:right"](44.13,-1.37,45.62,0.47);(._;node(w););out meta;
way["cycleway:left"](44.13,-1.37,45.62,0.47);(._;node(w););out meta;

Il ne reste plus que à appliquer le filtre spatial, encore une fois avec osmosis.

osmosis --read-xml cycleway-gironde-bbox.osm \
--bounding-polygon file=gironde.poly \
--write-xml file=cycleway-gironde.osm

L'utilisation de l'overpass sera bientôt encore plus pratique, elle permettra d'appliquer le filtre spatial suivant un polygone depuis sont identifiant ou même des critères de recherche, tout pourra donc se faire en une seule étape.

Le résultat

Après ces manipulations l'on obtient des données au format OpenStreetMap (XML ou PBF). On peut les consulter dans JOSM ou Qgis avec le plugin OpenStreetMap. Si l'on souhaite les intégrer à un SIG classique il va encore falloir les convertir. La conversion depuis le modèle clé-valeur d'OpenStreetMap vers un modèle de tables à colonnes fixes ne se fera pas sans pertes. Il faut déterminer quels attributs sont à conserver. Il existe pour cela des utilitaires, osm2shp par exemple, ou encore avec le plugin Qgis.

josm-gironde-cycleway.png

Visualisation de la co-occurrence des tags dans OpenStreetMap

Cette visualisation représente les co-occurrences de tags dans OpenStreetMap en France. Plus un tag est écrit en gros, plus il est présent dans des associations avec d'autres tags. La proximité de deux tags marque la fréquence d'apparition de ceux-ci sur un même objet. On voit très clairement que maxspeed ou oneway sont liés à highway. On peut aussi voir un cluster thématique autour de railway à gauche, un cluster de tag obsolète left/right:region/departement en bas à gauche liés à boundary ou encore un cluster pour les monuments historiques en bas à droite ou les écoles à droite. Les couleurs sont arbitraires.

On voit également apparaitre des choses un peu curieuses comme des tags note:deplacer4mE, codecommune ou un cluster de tags non documentés tout à droite (seats, backrest, colour, meterial).

Cette visualisation a été réalisé avec les données de taginfo France et l'outil Gephi pour les co-occurrences de tag supérieures à 1000 et sans tenir compte des tags name, source et created_by.

Tags-cloud.png

  • http://taginfo.openstreetmap.fr/
  • http://gephi.org/

Serve all MBTtiles features with PHP script

TileMill is an application for design maps. With TileMill you can export your beautiful map as MBTtiles archive. It contains PNG tiles but also some metadata and UTFGrid tiles that empower map interactivity. With UTFGrid you can achieve hover popup without having vectorial data, unlike in KML file. UTFGrid are tiles like bitmaps, but contains index describing drew features on PNG tiles, so we can retrive descriptive content of map.

Mapbox, the TileMill supporting company, provide hosting for all this features. As TileMill is free software you can install our own instance, produce MBTiles files and aim server it.

TilleMill in action

First, design your map with TileMill using all features: write a keys legend and define a tooltip (display at right top and right bottom on map part). Then, they are all embedded in MBTtiles on export.

Now you have a large file with all your tiles and more. Use the new PHP script to serve this tiles, metainfo and UTFGrid to your webmap displayer (like OpenLayer, Leaflet or other). Mapbox provides the Javacript client library for using UTFGrid as Wax.

Simple usage with Leaflet: embed normal map definition within Wax connector.

wax.tilejson(
    'mbtiles-server.php?db=power.mbtiles', // MBTiles PHP script server
    function(tilejson) {
        var map = new L.Map('map', { … }); // Normal Leaflet usage
});

On server part, install the PHP script beside your MBTiles files. Obtain a PNG tile is relatively easy at this point:

mbtiles-server.php?db=power.mbtiles&z={z}&x={x}&y={y}

The full Javascript code is, note the last lines to add tooltip interaction and keys legend.

wax.tilejson(
    'mbtiles-server.php?db=power.mbtiles',
    function(tilejson) {

        var omq = new L.TileLayer(
            'http://otile2.mqcdn.com/tiles/1.0.0/osm/{z}/{x}/{y}.png', {
                maxZoom: 14,
                 attribution: 'OpenStreetMap - MapQuest',
                 opacity: 0.4,
        });

         var power = new L.TileLayer(
            "mbtiles-server.php?db=power.mbtiles&z={z}&x={x}&y={y}", {
                maxZoom: 14,
                attribution: 'OpenStreetMap - CL 2012-02-05',
        });

        var map = new L.Map('map', {
            center: new L.LatLng(46, 0),
            zoom: 6,
            layers: [omq, power]
        });

        map.addControl( new L.Control.Layers( { "OpenMapQuest": omq }, { "Power": power }));
        wax.leaf.interaction(map, tilejson); // Add display of tooltip
        document.getElementById("legend").innerHTML = tilejson.legend; // Append embedded MBTiles keys legend to page
});

Hover the keys tab or a circle to get information about electricity power source generator, data initialy come from OpenStreetMap. The full running demo

The PHP server script is available here.

Links