FR:Project of the month/highway non connectés (OSM Inspector Routing)

From OpenStreetMap Wiki
Jump to: navigation, search


A VALIDER

Objectif:

Lors de la création de highway (voie de circulation routière), il arrive que les contributeurs ne relient pas les extrémités à un autre highway.

La raison peut être multiple :

- La voie ne doit pas être connectée (voie sans issue). Attention sans issue au sens strict du mot et pas que automobile, n'est relié à aucune autre voie de circulation (ni chemin, ni pédestre,...) mais s’arrête très proche d'une autre voie d'où le signalement.

- La voie est connectés sur le terrain mais une erreur de contribution à laissé cette erreur. Le problème de contribution est souvent une du à une mauvaise utilisation de l'outil d'édition.

Ces erreurs, ont une importance sur les système de routage qui ne peuvent effectuer le passage d'une voie à l'autre que si il existe un noeud commun entre les deux voies. Attention un noeud commun n'est pas deux deux superposé mais bien un seul noeud partagé par deux éléments.

Ces erreurs sont souvent non détectées par les contributeurs car la faible distance (5m maxi) ne se voie pas sur les cartes

L'objectif étant de corriger ces erreurs afin que les non connections soient éliminées et ainsi améliorer les données et leur utilisation par les systèmes de routage.


Comment identifier le problème

L'outil qualité OSM Inspector option Routing détecte et signal ces cas en séparant le type de voie et la distance de non connexion. OSM_Inspector/Views/Routing , http://tools.geofabrik.de/osmi/?view=routing&lon=2.24805&lat=46.74367&zoom=6&opacity=0.54&overlays=unconnected_major1,unconnected_major2,unconnected_major5,unconnected_minor1,unconnected_minor2,unconnected_minor5

Il serait souhaitable de récupérer ces signalements pour les intégrer dans une instance de l'outil MapRoulette http://maproulette.org/ et ainsi rendre le défi un peu plus fun et éviter les conflits d'édition. http://oegeo.wordpress.com/2012/10/29/new-maproulette-challenge-connectivity-bugs/

ou faire une analyse Osmose pour ces problèmes

Il est possible depuis peu d'utiliser un script complémentaire à JOSM pour afficher les différentes erreurs des outils qualités dont celle d'OSM Inspector : Quality_Assurance_Tools_script

Merci Martijn pour le code ci-dessous à utiliser avec MapRoulette http://github.com/osmlab/maproulette Je laisse aux personnes compétentes le soin de mettre en place l'outil dans la zone géographique.


Code à utiliser

connectivity_function.sql

CREATE OR REPLACE FUNCTION public.detect_connectivity_errors()
RETURNS void
LANGUAGE plpgsql
AS $function$
DECLARE
 deadend RECORD;
 closeway RECORD;
 closestway RECORD;
 d float;
 dthreshold smallint := 5;
 dmin float;
 is_connectivity_error_candidate BOOLEAN;
 deadendcursor CURSOR FOR
   WITH endnodes AS (
     SELECT
       unnest(ARRAY[nodes[1], nodes[array_length(nodes, 1)]]) AS node_id,
       id AS way_id,
       linestring,
       tags->'highway' AS hwytype
     FROM ways
     WHERE tags?'highway'
   )
   SELECT node_id, way_id, linestring, hwytype, geom
   FROM endnodes, nodes
   WHERE (
     SELECT count(1)
     FROM way_nodes
     WHERE node_id = endnodes.node_id)
   = 1
   AND endnodes.node_id = nodes.id;
BEGIN
 OPEN deadendcursor;
 LOOP
   FETCH deadendcursor INTO deadend;
   EXIT WHEN NOT FOUND;
   -- set minimum distance to infinity initially
   dmin = 'Infinity'::float;
   -- initiate a loop over all ways that are close to the dead end point using a bbox query that utilizes the spatial indexes.
   FOR closeway IN
     SELECT * from ways
     -- to avoid a double reprojection, approximate the distance roughly in degrees.
     WHERE CAST(ST_Expand(deadend.geom, 0.0001) AS BOX2D) && ways.linestring
     -- include only 'highways'
     AND ways.tags?'highway'
     -- and exclude the deadend way itself.
     AND NOT deadend.way_id = ways.id
   LOOP
     -- calculate the distance between the dead end and the close way in meters, store in d
     SELECT distance_point_line(deadend.geom, closeway.linestring) INTO d;
     -- update minimum distance if d is smaller
     dmin = (SELECT LEAST(d, dmin));
     -- store closest way record
     IF d = dmin THEN
       closestway = closeway;
     END IF;
   END LOOP;
   -- insert into results table if minimum distance is smaller than the threshold value (set in DECLARE block)
   IF dmin <= dthreshold THEN
     INSERT INTO connectivity_errors_new VALUES (deadend.node_id, (SELECT geom FROM nodes WHERE id = deadend.node_id), deadend.way_id, deadend.linestring, dmin, closestway.id, closestway.linestring);
   END IF;
 END LOOP;
END;
$function$


Une première vague pourra traiter des routes majeurs (points rouge de OSMI) et une deuxième les routes mineurs (points jaune)

Comment participer:

Seul la connaissance du terrain ou une bonne imagerie permet de corriger

- Si c'est un faux positif, alors, l'ajout du tag noexit=yes sur le dernier noeud enlèvera le signalement de l'outil et le doute possible pour l'avenir. - Relier l’extrémité du way à l'autre way :

- JOSM : Soit en mode création de way cliquer le noeud incriminé puis cliquer sur le way à relier (mode accrochage, le way est en surbrillance rouge). Soit sélectionner le noeud et utiliser "Joindre le noeud au chemin raccourci J.

- Potlatch : Soit en mode création de way cliquer le noeud incriminé puis cliquer sur le way à relier (mode accrochage, les noeuds sonr en surbrillance bleu).


Statistique

Évolution

Ce projet pourra être relancé périodiquement dès que le nombre de signalements sera important

L'utilisation de MapRoulette peut-être sans fin ...: MapRoulette/Challenges