ST_ClosestPoint (линия, точка) не пересекает линию

11

В моей базе данных PostGIS (PostGIS 1.5 на Postgres 8.4.1) у меня есть две таблицы: дороги (составленные из линейных линий) и аварии (составленные из точек). Я пытался соотнести каждую аварию с дорогой, но у меня проблемы с получением следующего:

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;

Эта очередь должна возвращать ближайшую точку аварии с gid 360 на каждой дороге, но функция ST_Intersects возвращает false для первого результата (истинная ближайшая точка для всех дорог). Я делаю что-то неправильно? Есть ли другой способ связать аварию с ближайшей дорогой?

Джошуа Галецки
источник

Ответы:

9

Это проблема из-за того, что ST_Intersects не имеет допусков. Даже если координаты двойной точности содержат много десятичных знаков, они образуют сетку, где единственные места для точек находятся на пересечениях. Часто линия не пересекается ни с одним из этих пересечений, и ни одна точка не может точно пересечь линию. Обходной путь должен использовать st_dwithin с небольшим допуском.

/ Никлас

Никлас Авен
источник