ST_ClosestPoint (Linie, Punkt) schneidet keine Linie

11

In meiner PostGIS-Datenbank (PostGIS 1.5 auf Postgres 8.4.1) habe ich zwei Tabellen: Straßen (bestehend aus Linestrings) und Abstürze (zusammengesetzt aus Punkten). Ich habe versucht, jeden Unfall mit einer Straße in Beziehung zu setzen, aber ich habe Probleme, Folgendes zum Laufen zu bringen:

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;

Diese Warteschlange sollte den nächstgelegenen Punkt zum Absturz mit gid 360 auf jeder Straße zurückgeben, aber die ST_Intersects-Funktion gibt für das erste Ergebnis false zurück (der wahre nächstgelegene Punkt über alle Straßen). Mache ich etwas falsch? Gibt es eine andere Möglichkeit, den Absturz mit der nächsten Straße zu verbinden?

Joshua Galecki
quelle

Antworten:

9

Dies ist ein Problem, das dadurch entsteht, dass ST_Intersects keine Toleranz hat. Selbst wenn Koordinaten mit doppelter Genauigkeit viele Dezimalstellen enthalten, bilden sie ein Raster, in dem die einzigen Stellen für die Punkte in den Kreuzungen liegen. Oft schneidet sich die Linie mit keinem dieser Kreuze und es gibt keine Möglichkeit, dass ein Punkt die Linie genau schneidet. Die Problemumgehung besteht darin, stattdessen st_dwithin mit einer kleinen Toleranz zu verwenden.

/ Nicklas

Nicklas Avén
quelle