En 2023, une étude approfondie a été menée pour moderniser et optimiser l’API Altimétrie de l’IGN. Ce projet s’inscrit dans le cadre de la refonte du Géoportail et de la mise en place de la Géoplateforme. Nous avons collaboré avec les partenaires suivants :

Un exemple concret d’utilisation concerne les objets connectés dans le domaine sportif, qui exploitent les données géographiques pour fournir des analyses d’altitude. Par exemple, une montre Garmin peut générer un graphique de suivi de l’altitude.

Grâce à ces relevés, les dénivelés positifs et négatifs peuvent être calculés avec précision.

Objectifs de la refonte

  • Moderniser un code devenu obsolète. L’ancienne version, écrite en Java, a été entièrement réécrite en Python.
  • Préserver le périmètre fonctionnel existant en maintenant les endpoints actuels.
  • Adopter la norme OGC API – Processes, en abandonnant la norme WPS.
  • Introduire des évolutions majeures, notamment le choix de la ressource utilisée, l’ajout de nouveaux paramètres, l’homogénéisation et la standardisation des messages d’erreur.
  • Concevoir une API répondant aux exigences de l’IGN en matière de performance (temps de réponse, consommation CPU).

Documentation

Par défaut, les résultats s’appuient sur la donnée RGE ALTI. Cependant, en fonction de la ressource choisie, les résultats peuvent varier en raison des différences de résolution et de précision des produits. La liste des ressources disponibles peut être consultée via https://data.geopf.fr/altimetrie/resources.

Pour plus de détails :

Technologies et solutions

  • Framework de développement : Python FastAPI
  • Gestion des ressources : RabbitMQ
  • Stockage des données : AWS S3 avec structuration Rok4
  • Librairie utilisée : Rok4 (maintenue par l’IGN avec contributions d’Oslandia). Cette librairie a été choisie après une phase de benchmark incluant des tests de performance approfondis.

Résultats

La refonte a permis d’atteindre des performances largement conformes aux attentes :

Type de calcul Exigence Résultat actuel
Calcul d’altitude pour un point 10 requêtes par seconde 40 requêtes par seconde, temps moyen : 120 ms
Calcul d’un profil d’élévation 10 requêtes par seconde 10 requêtes par seconde, temps moyen : 200 ms
Utilisation CPU Consommation < 0,1 CPU Consommation maximale observée : 0,05 CPU

Exemples de réponses JSON

Réponse pour une liste de 2 points avec le paramètre measures :

{
    "elevations": [
        {
            "lon": 1.48,
            "lat": 43.54,
            "z": 164.34,
            "acc": "Variable suivant la source de mesure",
            "measures": [
                {
                    "z": 164.34,
                    "source_name": "RGE Alti IGN",
                    "source_measure": "Fixed value",
                    "acc": "Variable suivant la source de mesure",
                    "title": "Pyramide RGE Alti France Enti\u00e8re (M\u00e9tropole, DOM et COM couvertes)"
                }
            ]
        },
        {
            "lon": 1.49,
            "lat": 43.55,
            "z": 141.33,
            "acc": "Variable suivant la source de mesure",
            "measures": [
                {
                    "z": 141.33,
                    "source_name": "RGE Alti IGN",
                    "source_measure": "Fixed value",
                    "acc": "Variable suivant la source de mesure",
                    "title": "Pyramide RGE Alti France Enti\u00e8re (M\u00e9tropole, DOM et COM couvertes)"
                }
            ]
        }
    ]
}

Réponse pour un profil altimétrique :

{
    "elevations": [
        {
            "lon": 1.48,
            "lat": 43.54,
            "z": 164.34,
            "acc": "Variable suivant la source de mesure"
        },
        {
            "lon": 1.4833333333333334,
            "lat": 43.54333333333333,
            "z": 152.62,
            "acc": "Variable suivant la source de mesure"
        },
        {
            "lon": 1.4866666666666666,
            "lat": 43.54666666666667,
            "z": 145.1,
            "acc": "Variable suivant la source de mesure"
        },
        {
            "lon": 1.49,
            "lat": 43.55,
            "z": 141.33,
            "acc": "Variable suivant la source de mesure"
        }
    ],
    "height_differences": {
        "positive": 0,
        "negative": 23.00999999999999
    }
}