ST_ClosestPoint (ligne, point) ne coupe pas la ligne

11

Dans ma base de données PostGIS (PostGIS 1.5 sur Postgres 8.4.1), j'ai deux tableaux: les routes (composées de chaînes de lignes) et les accidents (composés de points). J'ai essayé de corréler chaque accident à une route, mais j'ai du mal à faire fonctionner les éléments suivants:

SELECT ST_ClosestPoint(road.the_geom, crash.the_geom),
    ST_Intersects(ST_ClosestPoint(road.the_geom, crash.the_geom), road.the_geom)
    ST_Distance(ST_ClosestPoint(road.the_geom, crash.the_geom), crash.the_geom) AS distance
    FROM
        --Table crashes is already in SRID 4326
        (SELECT the_geom FROM crashes WHERE gid = 360) as crash,
        (SELECT ST_SetSrid(the_geom, 4326) as the_geom from roads) as road
    ORDER BY distance;

Cette requête doit renvoyer le point le plus proche de l'accident avec gid 360 sur chaque route, mais la fonction ST_Intersects renvoie false pour le premier résultat (le vrai point le plus proche sur toutes les routes). Est-ce que je fais quelque chose de mal? Existe-t-il un autre moyen de relier l'accident à la route la plus proche?

Joshua Galecki
la source

Réponses:

9

Il s'agit d'un problème provenant du fait que ST_Intersects n'a aucune tolérance. Même si les coordonnées en double précision contiennent beaucoup de décimales, elles forment une grille où les seuls endroits pour les points sont dans les croisements. Souvent, la ligne ne coupe aucun de ces croisements et il n'y a aucun moyen que n'importe quel point coupe la ligne exactement. La solution consiste à utiliser à la place st_dwithin avec une petite tolérance.

/ Nicklas

Nicklas Avén
la source