Open Street Map (OSM) est une carte ouverte à couverture mondiale. Chacun peut
puiser dans ses rendus cartographiques, ses outils pour développeurs (API) et/ou
la base de données sous-jacente. C’est une source de données localisées de
mieux en mieux alimentée, précise et « gratuite ». En France en
particulier, soutenu par l’association OSM France et un secteur public très
actif sur le développement de cette carte, le contenu est très régulièrement
enrichi notamment par les données cadastrales de la DG FIP.
La structure de la base de données sous-jacente est
cependant un peu complexe et nécessite un investissement chronophage pour
réussir ses extractions. Il faut quelques connaissances en géomatique pour
plonger dans le bain de données OSM. Le format du fichier .osm, xml tout en un,
est déroutant pour les utilisateurs de SIG et les statisticiens. Le fichier
.osm est un format texte balisé (xml) facile à manipuler par les développeurs.
Mais il l’est beaucoup moins par les analystes. Les informations ne sont pas
tabulées en colonne et les objets géographiques sont, le plus souvent, mal lus
par les SIG classiques. QGIS réussit à lire nativement les fichers .osm. Mais il
est impossible d’espérer lire et requêter sur un fichier France.osm
directement : les structure et volumétrie de données (80 GO pour la France)
ne passent pas…
Ce post détaille une méthode d’extraction des données
vectorielles d’OSM et de conversion sous formes de tables couches vectorielles
« classiques » facilement interprétables avec un système
d’information géographique. On se concentre ici sur les extractions à forte
volumétrie.
Il existe de nombreux moyens d’accès aux informations
d’OSM. Les plus faciles et populaires
sont :
- L’API Overpass ; avec une interface web très facile d’emploi, elle permet de faire des extractions ciblées sans connaissance de la structure de la base de données OSM.
- Les shapes produits par Géofabrik sur tous les pays du monde et accessibles en suivant ce lien ou encore sur les grandes aires métropolitaines par Mapzen.
Les capacités de l’Api overpass sont vite dépassées lorsque
l’on souhaite extraire sur un large territoire. Les transactions qui passent par
le web limitent la volumétrie d’extraction. Il est par ailleurs très fastidieux
de monter des extractions multi-thématiques et/ou sur plusieurs tag osm avec
cette API.
Les shapes de Géofabrik ou Mapzen sont très utiles mais trop
généralistes, parfois incomplets (manque d’objets ou d’attributs) et on ne
contrôle pas leur contenu. Par ailleurs, les limites de volumétrie des shapes entraînent
un découpage régional pour la France et il faut construire des requêtes
complémentaires pour obtenir une couche propre pour tout le pays.
Bref, nous souhaitons passer au stade supérieur ; être
autonome dans l’accès à la source, pouvoir gérer de grosses volumétries et
mieux comprendre ce que l’on extrait.
1/ Pré-requis :
Je mentionnais plus haut que l’accès à OSM est entre
guillemet « gratuit ». La carte est libre mais l’accès à la base de
données n’est pas vraiment « grand public ». Il y a quelques
pré-requis techniques, le plus souvent documentés en anglais. Il est souhaitable
d’avoir une expérience de la géomatique et des SIG pour s’attaquer à ces
extractions. On travaille sous windows sans interface logiciel, le langage de
commandes MSDOS[1] ne doit
pas vous rebuter et la liste des pré-requis est donc un peu longue :
1.1 Il faut d’abord lire et comprendre l’organisation des
objets cartographiques de la base de données OSM : le wiki de référence en
anglais sur les OSM
Map features détaille la nomenclature par catégories (Amenity, Shop,
Building, Boundary…) et sous-catégories
des objets de la carte ainsi que les propriétés complémentaires qui peuvent
être associées à ces objets (Name, addresses, annotation…)
1.2 Installer le logiciel OSMosis en suivant la procédure décrite
dans ce wiki : http://wiki.openstreetmap.org/wiki/Osmosis/Quick_Install_(Windows).
Osmosis utilise java, il faut avoir installé ce logiciel et
vérifié que son chemin d’accès est bien reconnu par Osmosis.
Pour cela, avec votre explorateur Windows, chercher « java.exe »
et modifier le fichier de lancement
C:\Program Files (x86)\osmosis\bin\osmosis.bat en
conséquence
Sur mon PC, la définition de variable d’accès à java s’écrit :
set JAVACMD=C:\Program Files
(x86)\Java\jre1.8.0_111\bin\java
Attention il y a une petite erreur dans le wiki car il ne
faut pas de guillemets “ “ pour la
définition de la variable javacmd.
N’oubliez pas aussi d’ajouter dans votre variable
d’environnement[2] PATH, le
chemin d’accès à Osmosis, sur mon PC : "C:\Program Files
(x86)\osmosis\bin"
Pour vérifier le bon fonctionnement d’Osmosis , la commande :
"C:\Program Files (x86)\osmosis\bin\osmosis.bat" doit renvoyer :
1.3 Installer GDAL pour l’accès à ogr2ogr :
GDAL (Geospatial Data Abstraction Library) est le
"couteau Suisse" du géomaticien. Ce logiciel est open source et
se substitue très bien aux équivalents payants (FME, ArcGISS....) pour ceux qui
manipulent l’invite de commande DOS. L’installation est expliquée sur le
site OSGeo4W. On peut aussi
se référer à ce mode
d'emploi ; attention à bien installer des versions de GDAL et de
python cohérentes.
1.4 Télécharger les données brutes d’OSM en format hyper
compressé .pbf sur le site de téléchargement de géofabrik. Il faut une bonne
fibre Internet et un peu d’espace sur vos disques pour télécharger ces sources
(Europe =18.2GB, FR 3.3GB, Germany 2.9 GB, Italie 1.2GB, GB 0.9…). Ces fichiers
organisés par continent et pays comprennent l’exhaustivité de la base OSM.
Elles sont actualisées tous les jours par Géofabrik.
1.5 Lire aussi l’excellent
article en français sur l’extraction de données .osm à l’aide du seul
logiciel org2ogr : vraiment utile et très clair. Je suis parti de cette
méthode que j’ai adaptée pour l’extraction de gros volumes en ajoutant une
étape osmosis en amont de l’étape ogr2ogr.
1.6 Lors de la mise au point et de la validation de mes
extractions, je vais toujours sur la
carte en ligne OSM dans des zones que je connais bien. Avec l’outil ? j’interroge
la carte à un endroit donné et j’ai ainsi accès à tous les objets avoisinants et tous leurs
attributs. En cliquant sur un objet, on voit tous les tags associés. C’est un
très bon moyen pour comprendre la structure de cette base.
La description d'un objet polygone OSM
ZAC de Kerfontaine (Pluneret 56) : tags base OSM |
2/ Conversion des
données osm en couches vectorielles :
Le format texte en clair (xml) .osm est très consommateur
d’espace disque.
La méthode que je préconise part des fichiers ultra
compressés .pbf France.pbf =3.3 GB versus 80 GB pour la version
décompressée .osm). Osmosis lit directement le fichier compressé et permet de faire
des filtres pour sortir un fichier .osm manipulable qui pourra facilement être lu
par les SIG ou mieux converti en format géo-tabulaire pour SIG (Shp ou MapInfo
files par exemple).
Les objets géographiques OSM sont de types point, ligne
polygone ou relation. On oublie les relations, car nous n’en avons a priori pas
d’usage avec un SIG.
2.1/ Extraire des points : création d’un fichier France de
tous les points d’intérêt de catégorie Shops (magasins) et Amenities
(infrastructures)
Avec la commande CD, placez-vous d’abord dans le
répertoire de vos sources .pbf. L’extraction est réalisée en deux étapes.
2.1.1 Création d’un fichier .osm
osmosis --read-pbf France.pbf --tf accept-nodes
shop=*
amenity=* --tf reject-relations --used-way --write-xml FR-ShopsAmenities.osm
Temps de traitement sur mon PC portable 30 mn
Explication des options
--read-pbf option
osmosis de lecture d’un fichier osm en format hyper compressé pbf
--tf accept-nodes
shop=* amenity=* : tf est l’abréviation de tag Filter, filter
tous les nœuds (ie points) des catégorie shop et amenity. Le jocker * signifie
que l’on prend toutes les sous-catégories des deux catégories.
--tf
reject-relations: on exclut les relations, à préciser dans toutes nos
extractions osmosis sinon on se retrouve avec tous les objets spécifiés par
ces relations.
--used-way : Ne
sélectionner que les points de polygones identifiés idem à préciser dans toutes
les extractions points sinon on extrait des points en pagaille qui ne correspondent
pas à notre filtre.
--write-xml FR-ShopsAmenities.osm : on écrit la sortie dans le répertoire courant un fichier xml .osm
--write-xml FR-ShopsAmenities.osm : on écrit la sortie dans le répertoire courant un fichier xml .osm
La liste des données (variables tags) extraite par osmosis est
définie dans un fichier osmconf.ini. Faites une recherche de ce fichier sur
votre PC (chez moi sur C:\Program Files (x86)\GDAL\gdal-data) éditez-le par exemple avec Notepad+[3].
Pour chaque type d’objet, le fichier liste les attributs extraits par défaut par
osmosis. Ajoutez et supprimez des attributs à votre guise en fonction de vos
souhaits d’extractions.
Voici ma configuration d’extraction d’attributs
pour des objets du type point :
2.1.2 Transformation
en fichier SIG
ogr2ogr -f "ESRI Shapefile" FR_shopAmenities_Points.shp -skipfailures -overwrite -gt 65536 -dialect SQLITE -sql "SELECT GEOMETRY,osm_id,name, coalesce(shop, amenity)
as type, address,brand, operator,other_tags from points" FR-ShopsAmenities.osm
-lco ENCODING=UTF-8 FR-ShopsAmenities.osm
-f "ESRI
Shapefile" FR_shopAmenities_Points.shp : création d’un fichier
shape. Je privilégie le format Shp car ogr2ogr ne gère bien l’encodage des
caractères UTF8 via l’option -lco
ENCODING=UTF-8 FR-ShopsAmenities.osm
-overwrite :
écrasement du précédent fichier de même nom s’il existe
-gt 65536 :
option à utiliser pour meilleure gestion de la puissance machine, ne semble pas
indispensable cependant
-dialect SQLITE
: précise que l’on va utiliser du sql avancé dans la requête qui suit
-sql "SELECT GEOMETRY,osm_id,name, coalesce(shop, amenity)
as type, address,brand, operator,other_tags from points" FR-ShopsAmenities.osm : on passe une requête sql sur
la base .osm préalablement constituée via osmosis. La requête figure entre
guillemets et précise la liste des champs à extraire. Ces champs doivent avoir été préextraits en amont via osmosis
et doivent donc être listés dans le fichier de configuration osmconf.ini. Notez
que tous les tags non spécifiés dans le fichier de configuration sont
accessibles en désordre dans un champs other_tags. coalesce(shop, amenity) as
type utilise une fonction sql avancée coalesce et indique que l’on inscrit dans
le champ type la valeur de la sous-catégorie shop si celle-ci est renseignée et la valeur de la sous-catégorie amenity
sinon.
On peut alors charger et manipuler le résultat avec son SIG
préféré.
2.2 Extraction d’un fichier des contours des zones industrielles et commerciales :
La démarche est très similaire à celle des points sauf que l’on filtre ici des polygones
La démarche est très similaire à celle des points sauf que l’on filtre ici des polygones
2.2.1 Création des polygons .osm
osmosis --read-pbf france.pbf --tf accept-ways landuse=retail,commercial,industrial,port shop=department_store,mall,supermarket building=retail,industrial,commercial,warehouse --tf reject-relations --used-node --write-xml FR-LanduseWays3.osm
osmosis --read-pbf france.pbf --tf accept-ways landuse=retail,commercial,industrial,port shop=department_store,mall,supermarket building=retail,industrial,commercial,warehouse --tf reject-relations --used-node --write-xml FR-LanduseWays3.osm
On filtre
ici les polygones des sous-categories retail,commercial,industrial,port du tag
landuse + les trois sous-catégories department_store,mall,supermarket de la
categorie shop + quelques tags de la catégorie building
--used-node bizarrement il faut préciser que l’on ne sélectionne que les nœuds des polygones de la sélection.
2.2.2 Définition d’un shape des
polygons
ogr2ogr -skipfailures
-overwrite -gt 65536 FR_Retail_Poly.shp -sql "SELECT osm_way_id,
name, landuse,building,shop,brand,operator from multipolygons" FR-LanduseWays3.osm
-lco ENCODING=UTF-8 FR-LanduseWays3.osm
A titre indicatif, voici la trace
msdos de ce traitement avec le temps d’extraction :
Et les fichiers résultats :
2.3 Extraire tout le bâti français :
Attention c’est « du lourd », pour la France métropolitaine, le tag « building »
(bâti) couvre près des 2/3 de la base soit 55GO sur les 80GO du fichier .osm de
référence. Avec cette extraction je souhaite donc « stress tester »
la méthode.
osmosis --read-pbf France.pbf --tf accept-ways building=* --tf reject-relations --used-node --write-xml FR-building.osm
Log MSDOS (un peu plus de 3h de traitement)
Puis :
ogr2ogr -f
"SQlite" FR_Building_Poly.SQLite -skipfailures -overwrite -gt
65536 -dialect SQLITE -sql "SELECT GEOMETRY,osm_way_id,name,building
from multipolygons " FR-building.osm
Note : cette requête crée un shape énorme (8GO) difficilement exploitable. Il est préférable de se concentrer sur la création de couches de bâti thématiques, ici le bâti qualifié :
ogr2ogr -f "ESRI Shapefile"
FR_BuildingQualif_Poly.shp -skipfailures -overwrite -gt 65536 -dialect
SQLITE -sql "SELECT
GEOMETRY,osm_way_id,name,buiding,address from multipolygons where building is not null" FR-building.osm
-lco ENCODING=UTF-8 FR-building.osm
2.4 Tous
les Parkings (points et polygones)
On
extrait séparément la couche de points et la couche de polygones
osmosis --read-pbf France.pbf --tf accept-nodes amenity=parking,motorcycle_parking,parking_entrance,bicycle_parking,bicycle_rental,car_sharing,garages,parking_space tourism=caravan_site site=parking building=garages,garages landuse=garages
--tf reject-relations --used-way --write-xml FR_Parking_nodes.osm
osmosis --read-pbf France.pbf --tf accept-ways amenity=parking,motorcycle_parking,parking_entrance,bicycle_parking,bicycle_rental,car_sharing,garages,parking_space tourism=caravan_site site=parking building=garages,garages landuse=garages
--tf reject-relations --used-node --write-xml FR_Parking_ways.osm
ogr2ogr -f
"ESRI Shapefile" FR_Parking_nodes.shp -skipfailures -overwrite -gt
65536 -dialect SQLITE -sql "SELECT GEOMETRY,osm_id,name, coalesce(amenity,
tourism, site, building) as type, address,brand, operator,other_tags from points"
FR_Parking_nodes.osm -lco ENCODING=UTF-8 FR- FR_Parking_nodes.osm
ogr2ogr -f
"ESRI Shapefile" FR_Parking_ways.shp -skipfailures -overwrite -gt
65536 -dialect SQLITE -sql "SELECT GEOMETRY,osm_way_id,name, coalesce(amenity,
tourism, site, building) as type, address,brand, operator,other_tags from multipolygons" FR_Parking_ways.osm -lco ENCODING=UTF-8 FR- FR_Parking_ways.osm
2.5 Toutes
les piscines et terrains de sport :
Attention, les commandes OSMosis et Ogr2Ogr
sont parfois un peu capricieuses. Je note une bizarrerie sur certaines requêtes ogr2ogr
avec requête option -sql utilisant des fonctions avancées accessibles via
l’option -dialect SQLITE. Ceci ne
fonctionne pas pour toutes les extractions osmosis (l’ordre SQL ne reconnait plus la table multipolygons).
Dans ce cas il faut simplifier la requête sql en supprimant l’option -dialect
SQLIT. Supprimez aussi la mention de l’extraction de l’objet qui est implicite
en dehors de SQLite et les appels de la fonction coalesce.
osmosis --read-pbf France.pbf --tf accept-nodes
leisure=swimming_area,swimming_pool,water_park,pitch,beach_resort natural=beach
sport=swimming,tennis --tf
reject-relations --used-way --write-xml FR_Leisure_nodes.osm
osmosis --read-pbf France.pbf --tf accept-ways
leisure=swimming_area,swimming_pool,water_park,pitch,beach_resort natural=beach
sport=swimming,tennis --tf
reject-relations --write-xml FR_Leisure_ways.osm
ogr2ogr -f "ESRI Shapefile" FR_leisure_nodes.shp
-skipfailures -overwrite -gt 65536 -dialect SQLITE -sql "SELECT GEOMETRY,osm_id,name,coalesce(leisure,natural,sport)
as type,address,access,brand,operator,other_tags from points"
FR_leisure_nodes.osm -lco ENCODING=UTF-8 FR_leisure_nodes.osm
ogr2ogr -f "ESRI Shapefile" FR_leisure_ways.shp
-overwrite -sql "SELECT osm_way_id,name,leisure,natural,sport,address,access,brand,operator,other_tags
FROM multipolygons" FR_Leisure_ways.osm -lco ENCODING=UTF-8 FR_Leisure_ways.osm
En filtrant les sorties sur access= « private »,
on obtient un fichier de localisation des piscines et cours de tennis privés.
La source de ce type de bâti est la DGI n’est cependant pas totalement
exhaustive sur ces signes extérieurs de richesse : cf le premier post
historique de ce blog piscines à la carte.
Les extractions sur le linéaire routier fonctionnent sur le
même principe. L’usage des linaires routiers dans les graphes de calculs de
distanciers/itinéraires méritent néanmoins un développement spécifique que j’espère
pouvoir poster dans un prochain épisode.
Si vous êtes arrivé jusqu’ici, je vous tire mon chapeau en guise de
conclusion. Vous êtes désormais mûrs pour puiser ce que vous cherchez dans OSM
et nous faire vos retours de trucs et astuces d’usage.
[1]
Accessible par l’invite de commande de windows
[2]
Accessible sur Panneau de configuration\Tous les Panneaux de
configuration\Système puis propriétés système+variables d’environnement +
variable système + modifier la variable PATH et y ajouter le chemin d’accès à
votre Osmosis.bat
[3] Si vous avez plusieurs installations Gdal (intégrées avec Qgis par exemple), il y a plusieurs fichiers osmconf.ini il n’est pas évident de savoir quelle version vous utilisez (voir votre variable d’environnement PATH). Dans ce cas, vous pouvez modifier l’un de vos fichiers osmconf.ini et recopier le en annule et remplace de tous les autres.
[3] Si vous avez plusieurs installations Gdal (intégrées avec Qgis par exemple), il y a plusieurs fichiers osmconf.ini il n’est pas évident de savoir quelle version vous utilisez (voir votre variable d’environnement PATH). Dans ce cas, vous pouvez modifier l’un de vos fichiers osmconf.ini et recopier le en annule et remplace de tous les autres.