Saya mencoba menemukan semua titik dalam radius lima mil dari titik tertentu. Saya punya pertanyaan seperti ini:
SELECT * FROM table WHERE ST_Contains(ST_Buffer(geomFromText('POINT(0 0)', 4326), ?), latlon)
Saya tidak tahu apa yang saya tempatkan ?
(radius) untuk mendapatkan lima mil. Semuanya ada di EPSG 4326, dan menurut dokumentasi PostGIS (sebaik yang saya tahu), jari-jari saya harus dalam meter. Jika saya memasukkan 12.070.0m (sekitar 5 mil), saya mendapatkan kecocokan setengah jalan di seluruh negeri. Adakah yang tahu apa yang saya lewatkan?
postgis
postgis-1.5
Nik
sumber
sumber
Jawaban:
Karena data Anda tidak diproyeksikan - ini menunjuk pada sebuah spheroid - jarak linear agak tidak masuk akal. Lima mil di khatulistiwa adalah sudut yang jauh lebih kecil dari 5 mil di lingkaran Arktik. Tapi untungnya PostGIS (> = 1.5) memiliki jawaban yang Anda cari:
Ini memiliki
geography
tipe yang dirancang untuk hal semacam ini. Ini mirip dengan geometri, tetapi hanya pernah menggunakan EPSG: 4326, dan ada jauh lebih sedikit fungsi yang bekerja dengannya.Dalam contoh di atas, saya telah memanggil ST_GeogFromText () (Ada juga ST_GeographyFromText () , dan saya tidak yakin apakah ada perbedaan) pada tempat tujuan (mungkin bekerja dengan WKT biasa, karena parameter SRID adalah redundan), dan cor kolom latlon ke tipe geografi. Jika Anda melakukan banyak hal ini, akan lebih efisien untuk membuat kolom geografi di tabel Anda dan melewati semua pemain. Akhirnya, ST_DWithin () dapat mengambil parameter geografi, dan melakukan hal yang benar dengan jarak linear.
sumber
mungkin Anda ingin fungsi ST_DWithin sebagai gantinya. lihat catatan di st_buffer doc.
ST_Buffer
sumber