Open Street Map et autres goodies

Ressources et services géo- et cartographiques

L'usage des dispositfs de géolocalisation, visualisation (en particulier en 3D), la cartografie, etc., tout ceci a besoin d'une très importante quantité de données. On ne peut mettre tout dans un téléphone ou même un desktop. Dans ces circonstances, l'usage du Cloud, des applications Web, et de toute sorte de services en ligne s'impose.

Nous n'allons pas discuter les grands logiciels SIG, même si certains parmi vous peuvent en avoir besoin, mais ce domaine est simplement énorme. Ceci implique la standardisation de données, car actuellement on exploite au moins 800 différents formats de données géodésiques / topographiques, relief, cartographiques (physiques, politiques, historiques, botaniques), etc.

Même si on insiste souvent à utiliser le format textuel, lisible, on a vu déjà que les traces des parcours utilisent GPX, KML (et sa version compressée kmz), mais aussi TRL (Google Navigator Tracklines), les formats des GPS commerciaux comme Garmin Forerunner (tcx et autres) ou Tom Tom (pgl), etc.

Pour la plupart de formats, le programme GPSBabel peut être utilisé comme le convertisseur. Ce programme fonctionne en ligne de commande, avec quelques interfaces visuelles, mais aussi comme un service Web, faisant partie du projet GPS Visualizer.

Paquetages Python utiles dans le domaine Geo

Les applications "natives" pour Android sont actuellement écrites surtout en Java / Dalvik superposé sur le noyau Linux. Cela fait que le SDK Android est bien maîtrisé, et Java règne. Cependant Dalvik a commencé à être remplacé par ART (Android Runtime), moins dépendant de Java, et ceci offre de nouvelles opportunités aux développeurs dans d'autres langages, comme Python, Ruby, etc.
(Python est déjà très présent dans le support logiciel de Raspberry Pi...).

Les exemples de programmation montrés ici sont en Python car le développement en Python est plus rapide qu'en Java, et le langage est plus convivial et extensible, et la vitesse d'exécution n'est pas critique pour nous. Faire des applications exécutables en Python n'est pas facile, et Android toujours manque d'outils, mais l'évolution est rapide.
On a au moins

Mentionnons quelques paquetages utilisables sur les ordinateurs de bureau. Nous avons fait le survol des techniques graphiques, et l'usage des librairies numériques, comme numpy, car une école d'ingénierie informatique doit former les concepteurs de logiciels, et les experts, non pas seulement les "consommateurs" de paquetages existants.

Matplotlib / Basemap

Basemap est bien adapté aux structures du Matplotlib, même s'il est distribué séparément. Il dispose de plusieurs projections cartographiques (librairie PROJ.4), peut lire shapefiles, et contient la librairie GEOS. Afin de tracer une carte minimale, par ex.

il suffit de coder

from mpl_toolkits.basemap import Basemap
import numpy as np
import matplotlib.pyplot as plt
m = Basemap(projection='moll',lon_0=0,resolution='l')
# (Mérid. centr. 0, résolution "low")
m.drawcoastlines()
m.fillcontinents(color='coral',lake_color='aqua')
# Graticule.
m.drawparallels(np.arange(-90.,120.,15.))
m.drawmeridians(np.arange(0.,420.,30.))
m.drawmapboundary(fill_color='aqua')
plt.title("Projection de Mollweide"); plt.show()
L'objet Basemap contient toute information concernant la géométrie et le style, et est facilement configurable. On peut y ajouter d'autres éléments, comme les lignes-parcours, contours, etc. Le paquetage ne lit pas les GPX, mais on peut les convertir en shapefiles.

(La plupart de logiciels adéquats est payante, comme ExpertGPS... On les ignorera ici. Babel pour l'instant ne le fait pas).

Mais puisque les données GPX, KML, etc sont textuelles, ceci est objectivement facile. Si vous faites la conversion d'une trace en deux listes, disons horiz et verti, il suffit d'ajouter au traçage de la carte, disons :

m.plot(horiz,verti,'r',lw="2",latlon=True)
L'objet Basemap hérite du Matplotlib les propriétés de surface graphique (axes), sur laquelle vous pourrez déposer des calques, lignes, images, etc.

Et si on cherche des solutions déjà codées, le Web est infini, voir par ex. Zonum Solutions, qui offre des convertisseurs, comme KML → shp, etc. Pour le parsing des fichiers XML vous avez des centaines d'outils, par ex. Lxml, téléchargé plus de 2 millions de fois, et qui permet aussi la création du XML depuis des données Python. Ce paquetage est universel, son adaptation n'est pas triviale.

Mais un Croate, Tomo Krajina l'a fait, et vous pouvez télécharger GPXpy pour la conversion des traces en données Python.

En quelques mots : Basemap n'est pas une "géo-application", mais une extension du paquetage de visualisation Matplotlib, destinée aux affranchis en Python, et coopérant avec plusieurs autres librairies opérant sur des données géographiques. C'est un module composite, grand, et difficile à embarquer sur des plates-formes comme Android.

Cartopy

Ce paquetage, utilisant également Matplotlib et numpy, est plus orienté vers les procédures cartographiques, et de données avec des attributions spécifiques géo, par ex. on peut chercher les lacs, etc.

Voici la démonstration de la déformation provoquée par une projection carto simpliste (plate, mais avec la rotation des pôles).


Observez la présence d'une image (satellite) de fond.
Le système a des ressemblances avec Basemap, mais opère avec plus de données mondiales, par ex. Natural Earth. Voici le code de la déformation.

import matplotlib.pyplot as plt
import cartopy.crs as ccrs
rot_pole = 
  ccrs.RotatedPole(pole_latitude=45, pole_longitude=180)
box_top = 45;  x, y = [-44, -44, 45, 45, -44], 
                      [-45, box_top, box_top, -45, -45]
ax = plt.subplot(211, projection=rot_pole)
ax.stock_img();  ax.coastlines()
ax.plot(x, y, marker='o', transform=rot_pole)
ax.fill(x, y, color='coral', transform=rot_pole, alpha=0.4)
ax.gridlines()

ax = plt.subplot(212, projection=ccrs.PlateCarree())
ax.stock_img();  ax.coastlines()
ax.plot(x, y, marker='o', transform=rot_pole)
ax.fill(x, y, transform=rot_pole, color='coral', alpha=0.4)
ax.gridlines()
plt.show()

Les deux paquetages sont conceptuellement similaires. Basemap est plus stable, cartopy évolue en fonction de données plus récentes.

GeoPy

Ceci, pour varier, n'est pas un paquetage de visualisation, mais une "passerelle" un client pour les services de géocodage. Par exemple, l'exécution du programme :

from geopy.geocoders import Nominatim
geolocator = Nominatim()
location = geolocator.geocode("6 Maréchal Juin, Caen, France")
print(location.address)

print((location.latitude, location.longitude))
affiche :
Boulevard Maréchal Juin, Folie-Couvrechef, Caen, Calvados, 
Basse-Normandie, France métropolitaine, 14000, France

(49.2103062, -0.3674849)
et une seconde tentative produit une erreur timeout, car le service Nominatim a une politique très restrictive concernant les requêtes... Tout ceci appartient à la "nébuleuse" OpenStreetMap, et sera discuté prochainement.

Le paquetage peut calculer les distances, y compris par la formule de Vincenty.

from geopy.distance import *
home = (49.189337, -0.267594); sci3 = (49.212157, -0.368739)
divi = vincenty(home, sci3); grci = great_circle(home, sci3)
print(divi.m, grci.m)

# Res. 7795.83675   7776.72598
Ceci fait presque 20 m de différence. Cependant, ici il faut également rester cool, car nous ne connaissons pas le vrai rayon terrestre.

Ce service permet d'accéder (en principe) aux ressources IGN (Institut National de l'Information Geographique), mais il faut s'enregistrer, obtenir une clé, etc. [Et ceci parfois se bloque, refuse l'authentification, etc.]. On peut accéder à une dizaine d'autres services, en dehors de la France.


Pour des travaux plus compliqués, on peut chercher GDAL (Geospatial Data Abstraction Library), ou GeoDjango, etc.
On voit la domination des solutions basées sur le Cloud, les services Web, etc. Tout ceci est alors accessible depuis vos plates-formes mobiles.

Cartes pour tous. Mais pas de "hamburgers gratuits".

Enfin, OpenStreetMap...

Le projet OpenStreetMap ne se réduit pas aux "cartes gratuites", mais c'est une action coopérative de constituer une base de données géographiques, la plus complète possible, et mise à jour en permanence. Le système n'utilise aucun SIG propriétaire, et même si quelques formats de données internes (par ex. PBF) sont binaires et illisibles, la raison est que l'on a voulu opérer avec des données compactes, plus efficaces pour le stockage, la transmission et le décodage.

Les mises à jour sont fréquentes, plusieurs fois par semaine, et dans ces conditions, la structure ressemble à des bases de données transactionnelles, avec les "diffs" en grand nombre, et une période où les corrections sont incorporées dans la base.

Il est peu utile de stocker les cartes en forme visuelle, il est préférable de les générer dynamiquement.

Le software qui accompagne le projet est volumineux, il existe de centaines de paquetages, librairies qui facilitent le décodage et l'assemblage des données (tracking), et de conversion entre les formats. Mais presque rien pur les "nuls"!

Certes, on dispose de site carto, qui se veut comparable à Google Maps... Cependant, la forme graphique et les APIs de contrôle restent toujours derrière Google.

(Intégrer OSMap directement dans un Iframe est difficile... Un service fait par Rodolphe Quiédeville, Cartosm, aide un peu. C'est justement la source de la présentation sur la page précédente. On peut utiliser le lien direct.)

Le projet a commencé en 2004, son auteur, le britannique Steve Coast a fait les premières collections et quelques programmes en Java. Actuellement la plate-forme serveur officielle, centrale, est basée sur Ruby-on-Rails (voir leur site). En 2006 la Fondation OpenStreetMap a été constituée, et on a pu commencer l'évolution du projet avec un financement structuré.

L'idée de constituer la base, d'abord contenant des routes localisées des zones faciles d'accès, ne pouvait pas marcher sans un squelette global, des cartes/images (multispectrales) couvrant la totalité. Coast et ses collaborateurs ont exploité le programme Landsat américain, qui offre une imposante quantité d'informations au quotidien. Depuis 2009 la plupart de ces images est libre. Cependant, pour l'usage "typique" des données OSMap, elles ne sont plus utiles, sauf dans des zones vierges.

Plusieurs pays construisent leurs propres ressources OSMap, et offrent des cartes (et autres données) spécialisées. Ainsi, nous avons le site OpenStreetMap France, avec les régions, départements, lignes de bus, etc. L'organisme (l'association) produit des cartes en format vectoriel (SVG) ou raster. La compagnie néerlandaise Automotive Navigation Data a offert la base contenant la totalité du réseau routier du Pays Bas à OSM.