345 lines
16 KiB
Markdown
345 lines
16 KiB
Markdown
!!! abstract "Ce que nous allons apprendre"
|
||
|
||
- Créer un calque utilisant des *données distantes* c’est-à-dire non
|
||
stockées par uMap
|
||
- Utiliser une **requête Overpass** comme source de données distantes
|
||
- Utiliser une *requête dynamique* prenant en compte l’étendue visible
|
||
de la carte
|
||
- Contrôler l’affichage des calques en fonction du niveau de zoom
|
||
|
||
## Procédons par étapes
|
||
|
||
L’objectif de ce tutoriel est d’explorer les différentes manières
|
||
d’afficher sur une carte uMap des données externes, ou distantes,
|
||
c’est-à-dire des données qui ne sont pas stockées sur le serveur uMap.
|
||
Nous allons pour cela utiliser des données **OpenStreetMap**, que nous
|
||
allons extraire avec l’[API
|
||
Overpass](https://wiki.openstreetmap.org/wiki/FR:Overpass_API/Overpass_QL).
|
||
|
||
Nous allons en quelques étapes créer une carte du vélo à Nantes,
|
||
montrant les stationnements ainsi que les locations en libre-service.
|
||
|
||
### 1. Je crée un calque affichant le résultat d’une requête Overpass
|
||
|
||
Commençons par afficher les stations *Bicloo*, les locations de vélos en
|
||
libre-service à Nantes. Allons-y étape par étape :
|
||
|
||
1. produire et tester la requête Overpass avec Overpass Turbo
|
||
2. adapter la requête pour produire des données acceptées par uMap
|
||
3. exporter la requête
|
||
4. créer un calque uMap utilisant cette requête
|
||
|
||
#### Créer la requête Overpass
|
||
|
||
Le site [Overpass Turbo](http://overpass-turbo.eu/) propose un assistant
|
||
qui facilite la rédaction d’une requête. Activez l’assistant et
|
||
saisissez le texte suivant, qui permet d’extraire les locations de vélo
|
||
situées sur la commune de Nantes :
|
||
|
||
amenity=bicycle_rental in Nantes
|
||
|
||
Cliquez sur **Construire et exécuter la requête** : la requête est créée
|
||
dans l’éditeur à gauche de la carte, puis le résultat est affiché sur la
|
||
carte.
|
||
|
||
![overpass_turbo_assistant.jpg](../../static/tutoriels/11-je-valorise-les-donnees-openstreetmap-avec-overpass-et-umap/overpass_turbo_assistant.jpg)
|
||
|
||
#### Adapter la requête pour uMap
|
||
|
||
Avant d’exporter la requête nous devons l’adapter. L’assistant Overpass
|
||
Turbo produit des requêtes dont le résultat est au format JSON. uMap
|
||
sait lire des données dans plusieurs formats, dont le format GeoJSON,
|
||
mais pas le format JSON produit par Overpass. Par contre uMap comprend
|
||
très bien le format XML selon la syntaxe OSM (OpenStreetMap).
|
||
|
||
Pour que la requête produise des données au format XML/OSM, il suffit de
|
||
modifier dans l’éditeur de requête la clause **`[out:json]`** par
|
||
**`[out:xml]`**. Vous pouvez à nouveau exécuter la requête et observer
|
||
la différence de format dans l’onglet **Données** qui montre le résultat
|
||
de la requête.
|
||
|
||
![overpass_turbo_format_xml.jpg](../../static/tutoriels/11-je-valorise-les-donnees-openstreetmap-avec-overpass-et-umap/overpass_turbo_format_xml.jpg)
|
||
|
||
#### Exporter la requête Overpass
|
||
|
||
Exportez la requête en cliquant sur **Exporter** : un panneau s’affiche.
|
||
Ouvrez l’onglet **Requête** et cliquez sur **compact** à droite de
|
||
**Overpass QL**. Un nouvel onglet intitulé **Overpass API Converted
|
||
Query** apparaît. Faites un **clic droit** sur la ligne soulignée en
|
||
bleu, et choisir **Copier l’adresse du lien** (avec Mozilla Firefox) :
|
||
l’URL de la requête est copié dans le presse-papier.
|
||
|
||
![overpass_turbo_exporter.jpg](../../static/tutoriels/11-je-valorise-les-donnees-openstreetmap-avec-overpass-et-umap/overpass_turbo_exporter.jpg)
|
||
|
||
#### Utiliser la requête dans uMap
|
||
|
||
![umap_requete_overpass_url.png](../../static/tutoriels/11-je-valorise-les-donnees-openstreetmap-avec-overpass-et-umap/umap_requete_overpass_url.png)
|
||
|
||
Dans un nouvelle carte uMap, créez un calque et ouvrez l’onglet
|
||
**Données distantes**. Collez dans la case URL le contenu du
|
||
presse-papier et sélectionez le format **osm**, qui correspond au format
|
||
XML dans Overpass.
|
||
|
||
Notez que l’URL est *encodée* pour pouvoir être utilisée comme requête
|
||
HTTP : les caractères spéciaux comme `"` sont convertis en `%22`. Ne les
|
||
modifiez pas !
|
||
|
||
Vous pouvez configurer le calque comme cela a été décrit dans les
|
||
tutoriels précédents.
|
||
|
||
![umap_overpass_infobulle.jpg](../../static/tutoriels/11-je-valorise-les-donnees-openstreetmap-avec-overpass-et-umap/umap_overpass_infobulle.jpg)
|
||
|
||
De la même façon que les valeurs d’un tableur peuvent être affichées dans les
|
||
infobulles (voir [cette section](9-map-from-spreadsheet.md)
|
||
du tutoriel précédent), vous pouvez afficher dans les infobulles les
|
||
*tags* OpenStreetMap. Les tags disponibles sont visibles dans l’onglet
|
||
Données sur Overpass Turbo.
|
||
|
||
Par exemple le gabarit suivant permet d’afficher des infobulles comme
|
||
celle de droite.
|
||
|
||
# {name}
|
||
{capacity} emplacements
|
||
Carte bancaire : {payment:credit_cards}
|
||
{note}
|
||
|
||
### 2. J’affiche les parkings à vélo efficacement
|
||
|
||
Ajoutons à notre carte les parkings à vélo. La requête Overpass pour
|
||
obtenir les parkings à vélos de Nantes est semblable à celle utilisée
|
||
pour les locations, et peut être créée avec l’assistant :
|
||
`amenity=bicycle_parking in Nantes`.
|
||
|
||
![overpass_turbo_export_geojson.png](../../static/tutoriels/11-je-valorise-les-donnees-openstreetmap-avec-overpass-et-umap/overpass_turbo_export_geojson.png)
|
||
|
||
L’exécution de cette requête prend près de 5 secondes. Ce délai est trop
|
||
long pour une carte *interactive*. Aussi plutôt que d’exécuter le
|
||
requête lors de l’affichage de la carte nous préférons extraire les
|
||
données et les importer dans uMap.
|
||
|
||
#### Importer des données statiques
|
||
|
||
Dans Overpass Turbo, cliquez sur **Exporter**, sélectionnez l’onglet
|
||
**Données** puis cliquez sur **Download/copy as GeoJSON**. Cette
|
||
opération convertit le résultat de la requête dans le format GeoJSON (un
|
||
format standard pour transférer des données géographiques sur internet)
|
||
et crée un fichier nommé `export.geojson` dans le dossier
|
||
`Téléchargements` de votre ordinateur.
|
||
|
||
Dans la carte uMap importez le fichier ainsi produit dans un nouveau
|
||
calque (voir [cette section](9-map-from-spreadsheet.md) du tutoriel précédent).
|
||
Les parkings à vélos sont affichés mais la carte
|
||
perd en fluidité et ne réagit pas immédiatement lorsqu’on zoome ou la
|
||
déplace. Cela est dû au nombre élevé de marqueurs affichés sur la carte
|
||
(plus de 1600).
|
||
|
||
#### Afficher une carte de densité
|
||
|
||
![umap_heatmap.png](../../static/tutoriels/11-je-valorise-les-donnees-openstreetmap-avec-overpass-et-umap/umap_heatmap.png)
|
||
|
||
Une possibilité pour
|
||
contourner ce problème est d’afficher les marqueurs sous forme de
|
||
clusters, ou de carte de chaleur (heatmap), aussi appelée carte de
|
||
densité. Nous choisissons la seconde option qui permet de prendre en
|
||
compte le nombre de places de chaque parking, stocké dans le tag
|
||
`capacity`.
|
||
|
||
Ainsi la carte montrera non pas le nombre de parkings à vélos mais le
|
||
nombre de places de stationnement (dans OpenStreetMap un seul parking à
|
||
vélo peut représenter un grand nombre d’*appuis-vélos*).
|
||
|
||
Dans les propriétés du calque, sélectionnez le Type de calque
|
||
**Heatmap**.
|
||
|
||
Ensuite, dans l’onglet **Propriétés avancées** saisissez `capacity` dans
|
||
le champ **Propriété optionnelle à utiliser pour calculter l’intensité
|
||
de la heatmap**. Enfin vous pouvez ajuster l’intensité de la couleur en
|
||
modifiant la **Valeur de rayon pour la heatmap**.
|
||
|
||
La carte gagne en fluidité, mais l’utilisation d’une *heatmap* ne permet
|
||
pas d’identifier l’emplacement précis des parkings à vélos. L’étape
|
||
suivante propose une solution pour résoudre cette inconvénient.
|
||
|
||
### 3. J’affiche un calque en fonction du niveau de zoom
|
||
|
||
Lorsque les données d’un calque sont ***distantes*** (c’est-à-dire
|
||
**non** stockées sur le serveur uMap), il est possible de contrôler
|
||
l’affichage de ces données en fonction du niveau de zoom. Il faut pour
|
||
cela déposer le fichier de données sur un serveur et déterminer l’URL de
|
||
ce fichier.
|
||
|
||
#### Utiliser un fichier stocké sur un serveur
|
||
|
||
![umap_donnees_distantes_wordpress.png](../../static/tutoriels/11-je-valorise-les-donnees-openstreetmap-avec-overpass-et-umap/umap_donnees_distantes_wordpress.png)
|
||
|
||
Si vous disposez d’un accès FTP à un serveur, cela ne pose pas de
|
||
difficulté. Si vous avez accès au *back office* d’un CMS comme
|
||
Wordpress, vous pouvez probablement y déposer un fichier. Prenons
|
||
l’exemple de Wordpress.
|
||
|
||
Par sécurité Wordpress ne permet pas de déposer un fichier au format
|
||
JSON. Il se fie pour cela à l’extension du nom de fichier, il est donc
|
||
possible de contourner cette contrainte en renommant le fichier.
|
||
Procédons par étapes.
|
||
|
||
1. renommez le fichier `export.geojson` produit plus haut en
|
||
`parkings-velos-nantes.txt`
|
||
2. dans le *back office* Wordpress, ajoutez un **Média** et
|
||
sélectionnez le fichier ainsi renommé
|
||
3. affichez les détails du fichier et copiez son **Adresse Web**, de la
|
||
forme
|
||
`http://monsite.fr/wp-content/uploads/2018/01/parkings-velos-nantes.txt`
|
||
4. créez un nouveau calque uMap et collez cette adresse Web dans le
|
||
champ **URL** de l’onglet **Données distantes**
|
||
5. sélectionnez le format **geojson**
|
||
6. précisez la licence qui s’applique aux données : **ODbL 1.0**
|
||
puisqu’il s’agit de données OpenStreetMap
|
||
7. activez l’option **Avec proxy** en bas de cet onglet : cela autorise
|
||
le navigateur Web à accéder à un fichier stocké sur un serveur autre
|
||
que le serveur uMap
|
||
8. enregistrez les modifications de la carte
|
||
|
||
#### Combiner deux calques utilisant le même fichier
|
||
|
||
Pour associer fluidité de la carte et affichage de chaque parking nous
|
||
allons associer deux calques utilisant les mêmes données :
|
||
|
||
- jusqu’au niveau de zoom 16, un calque montrant la capacité de
|
||
stationnement sous forme de *heatmap*
|
||
- à partir du niveau de zoom 16, un calque montrant les parkings à
|
||
vélo sous forme de marqueurs
|
||
|
||
À nouveau procédons par étapes.
|
||
|
||
1. éditez le calque créé précedemment et dans l’onglet **Données
|
||
distantes** saisissez la valeur **16** dans le champ **Jusqu’au
|
||
zoom**
|
||
2. dupliquez le calque avec l’action **Cloner** de l’onglet **Actions
|
||
avancées** : ainsi le nouveau calque est déjà configuré pour
|
||
utiliser le fichier placé sur le seveur
|
||
3. sélectionnez le **Type de calque** par défaut pour le nouveau calque
|
||
4. dans l’onglet **Données distantes** saisissez la valeur **16** dans
|
||
le champ **À partir du zoom**
|
||
|
||
![umap_heatmap_et_infobulle.jpg](../../static/tutoriels/11-je-valorise-les-donnees-openstreetmap-avec-overpass-et-umap/umap_heatmap_et_infobulle.jpg)
|
||
|
||
Enfin vous pouvez renommer le nouveau calque, configurer le type de
|
||
marqueur, et définir le gabarit de popup, par exemple :
|
||
|
||
# {capacity} emplacements
|
||
Type : {bicycle_parking}
|
||
Couvert : {covered}
|
||
|
||
L’image à droite montre un extrait de la carte au niveau de zoom 16,
|
||
auquel nous avons choisi d’afficher les deux calques.
|
||
|
||
### 4. J’utilise une requête dynamique
|
||
|
||
Utiliser des données extraites plutôt qu’une requête présente un
|
||
inconvénient : la mise à jour des données sur OpenStreetMap n’est pas
|
||
répercutée sur notre carte. Pour pallier à cela nous vous proposons de
|
||
modifier le calque montrant les parkings à vélos sous forme de
|
||
marqueurs, de sorte qu’il utilise une requête dynamique.
|
||
|
||
Une **requête dynamique** permet d’*injecter* dans la requête des
|
||
*variables* relatives à l’état actuel de la carte uMap. Nous allons
|
||
utiliser une requête qui s’applique sur la seule partie visible de la
|
||
carte, définie par un rectangle (ou *bounding box*). Cette requête
|
||
s’exécutera à chaque zoom ou déplacement de la carte (d’où le terme
|
||
*dynamique*) et récupérera les parkings à vélos à l’intérieur de ce
|
||
rectangle.
|
||
|
||
#### Simplifier la requête Overpass
|
||
|
||
!!! note
|
||
|
||
Pour faciliter l’opération nous commençons par
|
||
simplifier la requête Overpass. Les points importants sont :
|
||
|
||
1. placer la clause **`[bbox:{{bbox}}]`** en entête de requête pour que
|
||
ce paramètre ne soit présent qu’une seule fois
|
||
2. remplacer la production du résultat par la clause **`out center;`**
|
||
qui permet de convertir chaque *way* (fermé ou pas) en un point
|
||
|
||
[out:xml][bbox:{{bbox}}];
|
||
(
|
||
node["amenity"="bicycle_parking"];
|
||
way["amenity"="bicycle_parking"];
|
||
);
|
||
out center;
|
||
|
||
|
||
#### Adapter et exporter la requête
|
||
|
||
![requete_dynamique.png](../../static/tutoriels/11-je-valorise-les-donnees-openstreetmap-avec-overpass-et-umap/requete_dynamique.png)
|
||
|
||
L’opération est délicate, et exige sang froid et concentration :
|
||
|
||
1. remplacez `{{box}}` par `{south},{west},{north},{east}` : il s’agit
|
||
de 4 variables qu’uMap remplacera, lors de l’exécution de la
|
||
requête, par les valeurs définissant l’emprise de la carte.
|
||
2. exportez la requête en utilisant l’option **download/copy as
|
||
standalone query** : un fichier texte est produit et téléchargé.
|
||
3. ouvrez le fichier dans un éditeur de texte et ajoutez en début de
|
||
ligne la base de l’URL permettant d’exécuter une requête Overpass :
|
||
`http://overpass-api.de/api/interpreter?data=`
|
||
4. copiez la requête modifiée et collez le texte dans le champ URL de
|
||
l’onglet **Données distantes**
|
||
5. activez l’option **Dynamique** et définissez le zoom à partir duquel
|
||
le calque est affiché
|
||
6. selon le serveur Overpass utilisé, l’option **Avec
|
||
proxy** doit être activée ou désactivée (voir ci-dessous)
|
||
|
||
Par commodité la requête modifiée est reprise ci-dessous, où elle peut
|
||
être copiée par un triple-clic :
|
||
|
||
http://overpass-api.de/api/interpreter?data=[out:xml][bbox:{south},{west},{north},{east}];(node["amenity"="bicycle_parking"];way["amenity"="bicycle_parking"];);out center;
|
||
|
||
|
||
!!! note
|
||
N’hésitez pas à utiliser un autre serveur Overpass en
|
||
libre service, dont la liste est disponible dans les **Paramètres
|
||
généraux** de Overpass Turbo, par exemple
|
||
`https://overpass.kumi.systems/`. Attention ce dernier exige
|
||
d’**activer** l’option **Avec proxy**, alors que le serveur
|
||
`http://overpass-api.de/` nécessite que l’option soit **désactivée**.
|
||
|
||
!!! note
|
||
|
||
N’utilisez pas la variable {bbox} car elle sera
|
||
remplacée par des coordonnées dont l’ordre (W,S,N,E) n’est pas celui
|
||
attendu par Overpass (S,W,N,E) !
|
||
|
||
Vous pouvez manipuler ci-dessous la carte produite par l’ensemble de ce
|
||
tutoriel. Zoomez jusqu’à ce que les parkings à vélos apparaissent et
|
||
déplacez la carte pour constater l’aspect dynamique des requêtes.
|
||
|
||
<iframe width="100%" height="400px" frameBorder="0" src="https://umap.openstreetmap.fr/fr/map/le-velo-a-nantes_189194?scaleControl=false&miniMap=false&scrollWheelZoom=false&zoomControl=true&allowEdit=false&moreControl=false&searchControl=null&tilelayersControl=null&embedControl=null&datalayersControl=false&onLoadPanel=undefined&captionBar=false"></iframe><p><a href="http://umap.openstreetmap.fr/fr/map/le-velo-a-nantes_189194">Voir en plein écran</a></p>
|
||
|
||
|
||
## Faisons le point
|
||
|
||
Nous avons vu comment créer une carte montrant les données OpenStreetMap
|
||
à jour, à l’aide de requêtes Overpass. Seule la couche montrant la
|
||
densité des stationnements sous forme de *heatmap* nécessitera de
|
||
renouveler l’extraction des données de temps en temps.
|
||
|
||
!!! note
|
||
Les serveurs Overpass utilisés dans ce tutoriel sont
|
||
des serveurs en libre service mis à disposition gracieusement. Ces
|
||
serveurs sont très sollicités aussi il convient de les utiliser avec
|
||
modération.
|
||
|
||
Si vous produisez une carte destinée à un grand nombre de consultations,
|
||
préférez l’utilisation de données statiques, importées dans uMap ou
|
||
stockées sur un serveur. Merci !
|
||
|
||
Si vous utilisez Github, ce [court
|
||
tutoriel](https://hackmd.io/OkwpRqQ7QXC3p8C0jfTUGQ?view) en anglais
|
||
explique comment utiliser un *workflow* pour exécuter une requête
|
||
Overpass et placer le résultat en cache.
|
||
|
||
|
||
??? info "Licence"
|
||
|
||
Travail initié par Antoine Riche sur [Carto’Cité](https://wiki.cartocite.fr/doku.php?id=umap:11_-_je_valorise_les_donnees_openstreetmap_avec_umap) sous licence [CC-BY-SA 4](https://creativecommons.org/licenses/by-sa/4.0/deed.fr).
|