Accueil / Blog / Métier / 2018 / Ré-ordonner des lignes dans PostGIS avec une requête récursive

Ré-ordonner des lignes dans PostGIS avec une requête récursive

Par Frédéric Bonifas — publié 09/02/2018
Comment ordonner des lignes les unes à la suite des autres dans PostGIS

Dans un réseau routier existant, provenant d'OpenStreetMap par exemple, les différentes lignes représentant un itinéraire ne sont pas ordonnées les unes à la suite des autres. Voici par exemple les différentes lignes composant la RN 20, colorées par osm_id, l'identifiant unique OpenStreetMap.

/blog/metier/2018/lignes-postgis-non-triees/image

Pour obtenir une liste de ces différentes lignes classées les unes après les autres, on peut utiliser une requête récursive PostgreSQL :

WITH RECURSIVE t(id,g,explored_paths) AS (
    SELECT osm_id, way, ARRAY[osm_id]
    FROM planet_osm_line
    WHERE osm_id=93378070
  UNION ALL
    SELECT osm_id, way, explored_paths || osm_id
    FROM planet_osm_line, t
    WHERE ST_Intersects(way, t.g)
    AND NOT (osm_id = ANY(explored_paths))
    AND ref='N 20'
)
SELECT *, row_number() over () FROM t LIMIT 30;

La première partie de la requête récursive consiste à l'initialiser avec la première ligne, ici l'objet ayant osm_id=93378070. Une union de ces données initiales est réalisée récursivement avec la ligne qui touche les lignes précédemment sélectionnées, mais qui ne fait pas encore partie des lignes sélectionnées (explored_paths). Cette requête s'arrête lorsque plus aucune ligne touchant les lignes précédentes n'est trouvée.

Voici un extrait des résultats de cette requête :

id explored_paths row_number
93378070 "{93378070}" 1
93378068 "{93378070,93378068}" 2
93378071 "{93378070,93378068,93378071}" 3
93378069 "{93378070,93378068,93378071,93378069}" 4
127721449 "{93378070,93378068,93378071,93378069,127721449}" 5

Les lignes peuvent maintenant être affichées en les classant par row_number, c'est à dire par leur ordre de sortie de la requête récursive.

/blog/metier/2018/lignes-postgis-triees/image
ABONNEZ-VOUS À LA NEWSLETTER !
Voir aussi
Retour State of the Map France 2018 Retour State of the Map France 2018 23/07/2018

L'équipe de Makina attendait avec impatience l'événement de l'année, State Of The Map 2018 à ...

Drape lines on a DEM with PostGIS 30/04/2013

This article gives a few SQL commands to drape 2D geometries on a DEM (Digital Elevation Model), in ...

Calcul d'itinéraires piétons avec OSRM Calcul d'itinéraires piétons avec OSRM 02/02/2018

Cet article présente différentes techniques utilisées dans le cadre du projet MoodWalkR pour ...

MoodWalkR: behind the scenes MoodWalkR: behind the scenes 30/09/2013

Understanding how MoodWalkR computes pedestrian routes.

Formation PostgreSQL / PostGIS du 12 au 14 juin à Paris Formation PostgreSQL / PostGIS du 12 au 14 juin à Paris 07/05/2018

Découvrez les outils Libres pour gérer vos données spatiales.