ST_ClosestPoint (garis, titik) tidak memotong garis

11

Dalam database PostGIS saya (PostGIS 1.5 pada Postgres 8.4.1), saya memiliki dua tabel: jalan (terdiri dari linestrings) dan tabrakan (terdiri dari titik). Saya telah mencoba menghubungkan setiap tabrakan dengan jalan, tetapi saya mengalami masalah dalam menjalankan hal berikut:

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;

Queury ini harus mengembalikan titik terdekat ke crash dengan gid 360 di setiap jalan, tetapi fungsi ST_Intersects mengembalikan false untuk hasil pertama (titik terdekat sebenarnya di semua jalan). Apakah saya melakukan sesuatu yang salah? Apakah ada cara lain untuk menghubungkan kecelakaan itu ke jalan terdekat?

Joshua Galecki
sumber

Jawaban:

9

Ini adalah masalah yang berasal dari ST_Intersects yang tidak memiliki toleransi. Sekalipun koordinat presisi ganda menyimpan banyak desimal, mereka membentuk kisi di mana satu-satunya tempat untuk titik-titik tersebut adalah di persimpangan. Seringkali garis tidak bersinggungan dengan salah satu dari persilangan itu dan tidak mungkin titik mana pun akan memotong garis itu dengan tepat. Solusinya adalah menggunakan st_dwithin sebagai gantinya dengan toleransi kecil.

/ Nicklas

Nicklas Avén
sumber