ST_ClosestPoint (linia, punkt) nie przecina linii

11

W mojej bazie danych PostGIS (PostGIS 1.5 na Postgres 8.4.1) mam dwie tabele: drogi (składające się z linii) i awarie (składające się z punktów). Próbowałem skorelować każdą awarię z drogą, ale mam problemy z uruchomieniem następujących elementów:

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;

Ta kolejka powinna zwrócić najbliższy punkt awarii z gid 360 na każdej drodze, ale funkcja ST_Intersects zwraca false dla pierwszego wyniku (prawdziwy najbliższy punkt na wszystkich drogach). czy robię coś źle? Czy istnieje inny sposób na połączenie awarii z najbliższą drogą?

Joshua Galecki
źródło

Odpowiedzi:

9

Jest to problem wynikający z tego, że ST_Intersects nie ma tolerancji. Nawet jeśli współrzędne o podwójnej precyzji zawierają wiele miejsc po przecinku, tworzą siatkę, w której jedyne miejsca na punkty znajdują się na skrzyżowaniach. Często linia nie przecina się z żadnym z tych krzyży i nie ma możliwości, aby jakikolwiek punkt dokładnie przeciąłby linię. Obejściem tego problemu jest użycie st_dwithin zamiast małej tolerancji.

/ Nicklas

Nicklas Avén
źródło