Saya telah menggunakan PostGIS untuk waktu yang lama sekarang tetapi tidak pernah harus menggunakan LINESTRING
geometri ...! :)
Inilah yang ingin saya lakukan: Saya memiliki tabel linestrings (mewakili jalan-jalan kota tertentu, SRID 3395) dan saya ingin mencari linestrings terdekat ke titik tertentu (posisi GPS, SRID 4326).
Solusi yang saya temukan adalah memilih semua linestrings dalam poin saya menggunakan expand()
metode dan menentukan jarak antara setiap linestring dan poin saya menggunakan ST_Distance()
metode.
Inilah SQL:
SELECT myLineId, myLineName, ST_Distance(ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395),myLineGeom) AS myLineDistance
FROM myLines
WHERE myLineGeom && expand(ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395), 100)
ORDER BY myLineDistance;
Hasil yang saya dapatkan terlihat OK tetapi saya merasa ada sesuatu yang salah dalam implementasi saya.
1) Apakah kalian pikir expand()
bisa mendapatkan semua linestrings yang bersangkutan?
2) Apakah kalian pikir ST_Distance()
metode yang tepat untuk digunakan? Saya kira saya melakukan kesalahan karena jarak yang ingin saya dapatkan adalah jarak terkecil antara titik dan garis saya dan bukan jarak antara titik dan salah satu titik linestring.
Ilustrasi:
Halo
Pertama pertanyaan tentang apa yang mengembalikan ST_Distance. ST_Distance mengembalikan jarak terpendek antara garis dan titik (atau apa jenis geometri yang dimasukkan) Itu berarti bahwa ST_Distance antara titik (1 3) dan linestring (0 0,0 10) akan kembali 1. Jarak tidak akan diukur antara titik dan (0 0) atau titik dan (0 10) tetapi dari titik (1 3) hingga (0 3).
Jadi dari apa yang saya mengerti, ST_Distance memberi Anda jawaban yang Anda inginkan.
Jika Anda ingin menemukan titik (0 3) pada contoh di atas, Anda dapat menggunakan ST_Closestpoint jika Anda memiliki PostGIS 1.5. Sebagai contoh, Anda menggunakannya seperti ini: ST_Closestpoint ('LINESTRING (0 0,0 10)' :: geometry, ' POINT (1 3) ':: geometry) maka Anda harus mendapatkan poin (0 3) sebagai imbalannya, titik pada garis yang paling dekat dengan titik Anda.
HTH Nicklas
sumber
Saya menemukannya :) (Yah saya kira: P)
Menggunakan
ST_Line_Locate_Point()
danST_Line_Interpolate_point()
saya berhasil mendapatkan titik yang BUKAN bagian dari definisi LINESTRING tetapi IS pada baris tersebut :) Yang harus saya lakukan adalah mendapatkan jarak dari titik saya ke titik ini dan saya sudah selesai.The
ST_Line_Locate_Point()
Metode menemukan lokasi titik terdekat pada garis ke titik tertentu,ST_Line_Interpolate_Point
metode mengubah lokasi ini menjadi titik.sumber
ST_Distance(geometry g1, geometry g2)
Utas arsip Postgis ini dapat menjawab Anda http://postgis.refractions.net/pipermail/postgis-users/2007-June/016045.html
sumber