Le map-matching : Raccrocher des points à un axe avec Postgis/Qgis

Dans le cadre de mon boulot j’ai eu à accrocher des points  de relevés GPS sur une axe d’un référentiel routier,  composé de plusieurs polylignes . Il existe des méthodes avec la base de données Spatialite mais le plus simple reste l’utilisation de Potgis, la cartouche spatiale de Postgres.

Cette technique de raccrochage « intelligent » (au plus proche du moins) s’appelle le map-matching et est couramment utilisé par les grand acteurs de l’information géographique (IGN, Google, TéléAtlas, etc..).

Typiquement les erreurs de mesures des GPS font que parfois, au grès de la réception plus où moins bonne du signal, elles s’éloignent de la cible. Or, les erreurs de relevés n’étant jamais partout pareilles,  les points de sont pas à la même distance de l’endroit réel de la mesure.

Dans notre exemple les mesures du relevé doivent être accrochées à l’axe du référentiel routier pour un traitement linéaire ultérieur.   On utilise donc le map-matching pour projeter la mesure du point sur la ligne du référentiel le plus proche partant du postulat que ce doit être, à quelques grosses erreurs de réception près,  majoritairement le cas.

Principe du map-matching

1- Importation des données sous Postgis

Une fois la base de données installée (voir documentation) Qgis permet d’importer rapidement toute donnée dans Postgis grâce aux outils d’importation du gestionnaire de BD.

Import d’une couche Qgis dans Postgis

 

Attention veillez à bien créer un index spatial et une clef primaire lors de l’importation, surtout si le volume de donnée est important.

Importation dans Postgis avec création d’une clef primaire et d’un index spatial

2- Accrochage/projection des points à la ligne la plus proche avec les fonctions st_interpolate_point, st_line_locate_point et st_distance :

Pour effectuer notre map-matching, nous allons utiliser trois  fonctions Postgis :

  • la  première est st_line_locate_point ( géométrie du point, géométrie de la ligne) : elle permet de renvoyer la fraction de ligne la plus proche d’un point
  • la deuxième fonction est st_interpolate_point (geométrie de la ligne, fraction de ligne ou le point projeté est) : elle permet de renvoyer les coordonnées d’un point de la fraction de ligne projetée.

On cumule donc les deux fonction comme ceci :

st_interpolate(géométrie de la ligne, st_line_locate_point (géométrie de la ligne, géométrie du point))

Principe des fonctions d’interpolation d’un point sur une ligne sous Postgis

 

Problème :  si on l’utilise tel qu’elle elle, la fonction ne marche qu’avec une ligne donnée. Or nous volons accrocher les points à leurs routes les plus proches respectives.

Du coup la requête se complique car on va cumuler cette fonction de projection avec une fonction qui va réduire la projection aux arcs de routes les plus proches via une troisième fonction Postgis

  • la troisième fonction est st_distance(géométrie à, géométrie b) : elle permet de donner la distance entre deux géométries.

On  restreint ainsi  la recherche de la route à une distance à 15 m par exemple autour des points du relevés GPS.

Pour combiner les deux on va utiliser la commande JOIN ON  :

Voilà pour le principe, nous allons profiter aussi pour embarquer les données de nos points GPS mais aussi les croiser avec les nom des routes les plus proches.

Attention !! Qgis demande une clef primaire pour pouvoir afficher des couches spatiales que nous allons créer automatique avec la fonction  row_number() OVER ()::integer

Attention aussi !!  pour plus de clarté, mettre les noms de base  en entête de base et  les nom de tables en entête de champs

ex:  osm est ma base et arc_rd_only est ma table ça donne osm.arc_rd_only pour appeler cette table

la requête donne donc ceci :

 

3- Résultat dans une vue et export vers d’autres formats via Qgis

Nous allons construire une vue qui jointe les deux tables . Une vue permet de fixer notre requête comme une table et permet ensuite  la conversion vers d’autres formats mais aussi l’affichage sous Qgis.

Pourquoi une vue matérialisée ? parce que c’est plus rapide ! En effet Postgis peut stocker les vues comme une table afin d’accélérer le calcul de la requête.

Si on créer une vue classique, à chaque appel de la vue, le calcul de la requête se refait à chaque fois….

 

Voilà donc la création de la vue matérialisée :

Et voilà le résultat. En rouge les points GPS, en vert leur résultante sur l’axe.

Les quelques doublons présents sont le résultat de notre choix d’un tampon de 15m autour des points GPS. A affiner donc, sachant toutefois qu’un chiffre plus bas étant lui aussi source d’erreurs (on peut ne pas « trouver » la route la plus proche).

 

Résultat de l’accrochage (en vert)

 

 

Tagged

One thought on “Le map-matching : Raccrocher des points à un axe avec Postgis/Qgis

  1. Claire CALANDRE dit :

    Bonjour,
    Je cherche à projeter des points sur la polyligne la plus proche dans le cadre d’une étude.
    J’essaye de suivre votre tutoriel mais je n’y arrive pas.
    A quoi correspond dans votre couche de points RL_Axes et RL_Rives. Faut-il savoir sur quelle polyligne on veut projeter le point ?
    Merci de votre retour.
    Cordialement

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.