OpenStreetMap
OpenStreetMap (OSM) est un projet qui a pour but de constituer une base de données géographiques libre du monde.
Site principal :
Autre :
- https://www.geoportail.gouv.fr/
- https://www.visugpx.com/
- permet d'imprimer des cartes avec des parcours
Utilisation
Lien et marquage
Il est possible d'intégrer l'affichage d'un marquage dans le lien :
?mlat=48.56122&mlon=-3.14810
: permet d'afficher l'indicateur à la position indiquée.
Exemple :
- Guingamp, mairie ; avec zoom et coordonnées : https://www.openstreetmap.org/#map=17/48.56123/-3.14809
- Guingamp, mairie ; avec indicateur, zoom et coordonnées : https://www.openstreetmap.org/?mlat=48.56123&mlon=-3.14809&zoom=17#map=17/48.56123/-3.14809
Caractéristiques pour la 3D
Le projet osmbuildings.org :
Avec les coordonnées pour Pommerit-le-Vicomte (au 09/06/2019, il n'y a aucunes données pour la représentation 3D) :
Plusieurs projets tentent d'utiliser les données libres d'Openstreetmap.org pour réaliser des scènes 3D. En conséquence, il est nécessaire de caractériser avec plus de détail les éléments d'Openstreetmap.org et en particulier les bâtiments.
Principes généraux sur le wiki d'openstreetmap.org :
Plusieurs clés sont utilisées :
- height pour la hauteur brute du bâtiment ;
height=7
pour une hauteur de 7 mètres ; - building:levels pour le nombre d'étages au-dessus du sol, sans compter le toit ;
building:levels=2
pour deux étages au-dessus du sol ; - building:material pour les matériaux des murs ;
- roof:shape pour caractériser le type de toiture :
- roof:material pour les matériaux utilisés pour la toiture :
L'article "Bâtiments 3D simples" sur le wiki d'Openstreetmap.org :
Initiative pour la découverte
Cartopen, association de promotion d'Openstreetmap :
Projet dérivé
Openrouteservice, permet de générer des isochrones (temps et distance) :
OpenHistoricalMap :
Wikipédia, l'article :
Un exemple en construction :
Outils dérivés
- http://map.meurisse.org : pour calculer des distances ;
- http://map.project-osrm.org : calcul d'itinéraire ;
- https://umap.openstreetmap.fr : créer ses propres cartes :
- cpt f22
- http://www.openrunner.com : créer ses propres circuits (randonnée, course à pied...).
overpass turbo
Outil permettant de réaliser des requêtes sur le base de données OpenStreetMap :
Mode d'emploi :
- https://wiki.openstreetmap.org/wiki/FR:Overpass_turbo
- https://wiki.openstreetmap.org/wiki/FR:Overpass_API/Overpass_QL
Document très utile :
Exemples de scripts
Bâtiment et nombre de niveaux
/* Mise en évidence des bâtiments ayant 1 ou 2 niveaux sur la zone de la carte visible */ // I - Format des données générées et durée maximum de la requête [out:json][timeout:25]; // II - La requête ( way["building:levels"="1"]({{bbox}}); way["building:levels"="2"]({{bbox}}); ); // III - La sortie des résultats // III.1 - avec représentation des éléments sur la carte out body; // Sortie de tous les résultats >; out skel qt;
Type "ferme"
Ci-dessous, un exemple de code permettant d'identifier les éléments ayant la caractéristique "amenity=farm" :
/* Mise en évidence des fermes (noeud, chemin et relation) sur la zone de la carte visible */ // I - Format des données générées et durée maximum de la requête [out:json][timeout:25]; // II - La requête ( nwr[landuse=farmyard]({{bbox}}); ); // III - La sortie des résultats // III.1 - avec représentation des éléments sur la carte out body; // III.2 - avec un style personnalisé des marques {{style: nwr[landuse=farmyard] { color: red; width: 4; opacity: .7; } }} // IV - Sortie de tous les résultats >; out skel qt;
Liste des routes limitées à 50
/* Liste des routes limitées à 50 km/h sur la zone de la carte visible */ // I - Format des données générées et durée maximum de la requête [out:json][timeout:25]; // II - La requête ( way["highway"]["maxspeed"="50"]({{bbox}}); ); // III - La sortie des résultats // III.1 - avec représentation des éléments sur la carte out body; // Sortie de tous les résultats >; out skel qt;
Autre exemple, uniquement un tableau de résultat : liste des pharmacies sur la commune de Rennes
[out:csv(::"type",::"id", name, admin_level,::"count")]; area[name="Rennes"][boundary]; rel(area)[boundary][admin_level=7]; map_to_area; foreach->.d( (.d;); out; ( node(area.d)[amenity=pharmacy]; way(area.d)[amenity=pharmacy]; relation(area.d)[amenity=pharmacy]; ); out; out count; );
Liste et carte des adresses n'ayant pas de code postal
[out:json][timeout:25]; ( node["addr:street"][!"addr:postcode"]({{bbox}}); way["addr:street"][!"addr:postcode"]({{bbox}}); ); out skel; out;
Mise en évidence des routes et des vitesses autorisées
[bbox:{{bbox}}]; ( way["highway"](if: (is_number(t["maxspeed"]) && t["maxspeed"] <= 90)); >; ); out; {{style: way[highway][maxspeed=30] { color: red; width: 4; opacity: .7; } way[highway][maxspeed=50] { color: green; width: 4; opacity: .7; } way[highway][maxspeed=70] { color: blue; width: 4; opacity: .7; } way[highway][maxspeed=80] { color: grey; width: 4; opacity: .9; } way[highway][maxspeed=90] { color: black; width: 3; opacity: .7; } }}
Les panneaux stop et cédez-le-passage
/* Liste des panneaux stop et des panneaux cédez-le-passage (give_way) sur la zone de la carte visible */ // I - Format des données générées et durée maximum de la requête [out:json][timeout:25]; // II - La requête ( node["highway"]["highway"="stop"]({{bbox}}); node["highway"]["highway"="give_way"]({{bbox}}); ); // III - La sortie des résultats // III.1 - avec représentation des éléments sur la carte out body; // III.2 - avec un style personnalisé des marques {{style: node[highway][highway=stop] { color: red; width: 4; opacity: .7; } node[highway][highway=give_way] { color: green; width: 4; opacity: .7; } }} // IV - Sortie de tous les résultats >; out skel qt;
Mise en évidence des quelques types de bâtiments
/* Mise en évidence des quelques types de bâtiments : * bâtiment général ; * maison d'habitation ; * commerce ; * médecin ; * bâtiment de ferme ; * ... */ // I - Format des données générées et durée maximum d'exécution de la requête [out:json][timeout:25]; // II - La requête ( way["building"]["building"="yes"]({{bbox}}) ; way["building"]["building"="house"]({{bbox}}) ; way["building"]["building"="commercial"]({{bbox}}) ; way["building"]["amenity"="doctors"]({{bbox}}) ; way["building"]["amenity"="dentist"]({{bbox}}) ; way["building"]["building"="farm_auxiliary"]({{bbox}}) ; ); // III - La sortie des résultats // III.1 - avec représentation des éléments sur la carte out body; >; out skel qt; // III.2 - avec un style personnalisé des marques {{style: way[building][building=yes] { color: black; width: 4; opacity: 1 ; } way[building][building=house] { color: orange; width: 4; opacity: .7; } way[building][building=commercial] { color: red; width: 4; opacity: .7; } way[building][amenity=doctors] { color: yellow; width: 4; opacity: 1 ; } way[building][amenity=dentist] { color: yellow; width: 4; opacity: 1 ; } way[building][building=farm_auxiliary] { color: green; width: 4; opacity: .7; } }}
Lignes électriques 20 000 V et 400 V, et transformateurs de distribution
/* Mise en évidence des quelques types de bâtiments : * lignes électriques 20 000 V ; * lignes électriques 400 V ; * transformateur électrique de distribution. */ // I - Format des données générées et durée maximum d'exécution de la requête [out:json][timeout:25]; // II - La requête ( way[voltage=20000]({{bbox}}); way[voltage=400]({{bbox}}); node[transformer=distribution]({{bbox}}); ); // III - La sortie des résultats // III.1 - avec représentation des éléments sur la carte out body; >; out skel qt; // III.2 - avec un style personnalisé des marques {{style: way[voltage=20000] { color: red; width: 5; opacity: .7; } way[voltage=400] { color: blue; width: 3; opacity: .7; } node[transformer=distribution] { color: green; width: 8; opacity: .7; } }}
Antennes de réseau de téléphonie mobile, couleur par opérateur
/* Liste des antennes de téléphonie mobile sur mat et par opérateur sur la zone de la carte visible */ // I - Format des données générées et durée maximum de la requête [out:json][timeout:25]; // II - La requête ( node["tower:type"="communication"]["operator"="TDF"]({{bbox}}); node["tower:type"="communication"]["operator"="SFR"]({{bbox}}); node["tower:type"="communication"]["operator"="Free Mobile"]({{bbox}}); ); // III - La sortie des résultats // III.1 - avec représentation des éléments sur la carte out body; // III.2 - avec un style personnalisé des marques {{style: node[tower:type=communication][operator=TDF] { color: blue; width: 4; opacity: .7; } node[tower:type=communication][operator=SFR] { color: green; width: 4; opacity: .7; } node[tower:type=communication][operator=Free Mobile] { color: red; width: 4; opacity: .7; } }} // print results out geom;
Bars et cafés d'une zone, avec icone et étiquette
/* Liste bars et cafés sur la zone de la carte visible, avec étiquette et icone */ // I - Format des données générées et durée maximum de la requête [out:json][timeout:25]; // II - La requête ( node[amenity=bar]({{bbox}}); node[amenity=cafe]({{bbox}}); ); // III - La sortie des résultats // III.1 - avec représentation des éléments sur la carte out body; // III.2 - avec un style personnalisé des marques {{style: node[amenity=bar] { icon-image: url('icons/maki/cafe-18.png'); icon-width: 18; text:name; } node[amenity=cafe] { icon-image: url('icons/maki/cafe-18.png'); icon-width: 18; text:name; } }} // print results out geom;
Parking avec étiquette
/* Nom : OSMOVT010 Description : OpenStreetMap, overpass turbo, script numéro 10 Résultat : liste des parkings avec l'étiquette contenant le type et la capacité Usage : exercice Référence 1 : https://www.openstreetmap.org Référence 2 : https://overpass-turbo.eu Auteur : fylip22 Version : 1.0 Révisions : - 1.0 (29/01/2025) : fylip22, création du script */ // I - Format des données générées et durée maximum de la requête [out:json][timeout:25]; // II - La requête nwr["amenity" = "parking"]({{bbox}}); // III - La sortie des résultats // III.1 - avec représentation des éléments sur la carte out geom; // III.2 - avec un style personnalisé des marques {{style: node[amenity=parking] { /* pour concaténer plusieurs valeurs dans l'étiquette, utilisation de la fonction "eval()" pour convertir le résultat, et avec le point comme élément de concaténation */ text: eval("tag('amenity').', '.tag('parking').' ('.tag('capacity').')'"); } way[amenity=parking] { /* way[amenity=parking][capacity>27] : cette syntaxe pour cibler les éléments dont la capacité est supérieur à 27 */ /* pour concaténer plusieurs valeurs dans l'étiquette, utilisation de la fonction "eval()" pour convertir le résultat, et avec la fonction "concat" comme fonction de concaténation */ text: eval("concat(tag('amenity'),', ',tag('parking'),' (cap. : ',tag('capacity'),')')"); } }}
Toutes les contributions d'un utilisateur
[out:json][timeout:25]; (node(user:fylip22)({{bbox}});); out body; >; out skel qt;