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?

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.