Développement

background

Bouclomisation sous Postgres

En quête de rapidité

vincjo · 2020 M08 28

A partir des données OpenStreetMap du territoire Rhônalpin importées sous PostgreSQL via osm2pgsql, on obtient 4 tables : points, lignes, polygones et nœuds. Chacune contient une soixantaine de colonnes et plusieurs centaines de milliers d'enregistrements.

La partie route du schéma source constitue le réseau sur lequel on va pouvoir effectuer des traitements destinés à optimiser la création d’itinéraires en forme de boucles.

Notamment :

  • 1- la création du graphe
  • 2- le calcul de dénivelé

Topologie du réseau avec pgRouting

Avec pgRouting il est possible de créer un graphe en seulement 3 étapes :
La fonction pgr_createTopology génère la table des sommets (ou vertex), c’est-à-dire les points de liaison, de terminaison et d'intersection du réseau.
Une fois les vertex obtenus on souhaite récupérer les arrêtes, soit les tronçons de routes reliant les sommets. On peut donc utiliser la fonction pgr_nodeNetwork qui redécoupe automatiquement le réseau à chaque intersection.
Pour finir, Boucle d'Air a besoin d'identifier les vertex au carrefour de plusieurs routes afin de choisir un point de mi-parcours pertinent. On va donc lancer la fonction pgr_analyzeGraph qui compte le nombre d'occurences d'un sommet parmi les arêtes. Lorsqu'un sommet est présent 3 fois et plus, c’est qu’il peut être considéré comme le point de retour potentiel d’une boucle.

Quelques statistiques :

Fonction Elément Nombre d'entités Temps de génération
pgr_nodeNetwork Arête 2 368 543 3 hr 17 min
pgr_createTopology Sommet 2 115 660 5 hr 32 min
pgr_analyzeGraph Sommet ~ 55 min

Calcul des dénivelés

Pour calculer le dénivelé sous Postgres, on importe un Modèle Numérique de Terrain (MNT), par exemple celui de l'IGN, et on utilise GDAL pour reprojeter et fusionner les dalles. Le MNT permet de draper une ligne afin d'en extraire l'altitude. Le drapage renvoie un tableau de type INTEGER[] contenant une suite ordonnée de hauteurs jalonnées à 50 mètres.
Exemple : [651, 667, 688, 695, 705] (pente ascendante)
Le sens de parcours n’étant connu qu’une fois la boucle générée, il est utile de draper la géométrie dans les deux directions du vecteur.