ST_ClosestPoint (línea, punto) no se cruza con la línea

11

En mi base de datos PostGIS (PostGIS 1.5 en Postgres 8.4.1), tengo dos tablas: carreteras (compuestas de cadenas de líneas) y bloqueos (compuestos de puntos). He estado tratando de correlacionar cada choque con una carretera, pero tengo problemas para que funcione lo siguiente:

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;

Esta consulta debería devolver el punto más cercano al accidente con gid 360 en cada camino, pero la función ST_Intersects devuelve falso para el primer resultado (el verdadero punto más cercano en todos los caminos). ¿Estoy haciendo algo mal? ¿Hay alguna otra manera de vincular el accidente a la carretera más cercana?

Joshua Galecki
fuente

Respuestas:

9

Este es un problema que proviene de que ST_Intersects no tiene tolerancia. Incluso si las coordenadas de doble precisión contienen muchos decimales, forman una cuadrícula donde los únicos lugares para los puntos están en los cruces. A menudo, la línea no se cruza con ninguna de esas cruces y no hay forma de que ningún punto se cruce exactamente con la línea. La solución es usar st_dwithin en su lugar con una pequeña tolerancia.

/ Nicklas

Nicklas Avén
fuente