ST_ClosestPoint (linea, punto) non interseca la linea


11

Nel mio database PostGIS (PostGIS 1.5 su Postgres 8.4.1), ho due tabelle: strade (composte da linee) e incidenti (composte da punti). Ho cercato di correlare ogni incidente a una strada, ma ho problemi a far funzionare quanto segue:

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;

Questo caso dovrebbe restituire il punto più vicino allo schianto con gid 360 su ogni strada, ma la funzione ST_Intersects restituisce false per il primo risultato (il vero punto più vicino su tutte le strade). Sto facendo qualcosa di sbagliato? C'è un altro modo per collegare l'incidente alla strada più vicina?

Risposte:


9

Questo è un problema derivante dal fatto che ST_Intersects non ha tolleranza. Anche se le coordinate a doppia precisione contengono molti decimali, formano una griglia in cui gli unici punti per i punti sono negli incroci. Spesso la linea non si interseca con nessuna di quelle croci e non c'è modo che nessun punto intersechi esattamente la linea. La soluzione alternativa è utilizzare st_dwithin invece con una piccola tolleranza.

/ Nicklas

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.