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 повертає помилковий перший результат (справжня найближча точка по всіх дорогах). Я щось роблю не так? Чи є інший спосіб пов’язати аварію з найближчою дорогою?

Відповіді:


9

Ця проблема пов'язана з тим, що ST_Intersects не має толерантності. Навіть якщо координати подвійної точності містять багато десятків, вони утворюють сітку, де єдине місце для точок знаходиться в переходах. Часто лінія не перетинається з жодним із цих хрестів, і немає жодної точки точно перетинати лінію. Вирішення проблеми полягає в тому, щоб використовувати st_dwithin замість невеликої допуску.

/ Ніклас

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.