PostGIS ST_Buffer Radius Bantuan

9

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?

Nik
sumber
4326 adalah dd (derajat desimal). 12070 adalah area yang cukup besar (radius) ketika diproyeksikan sebagai latlon.
Brad Nesom
1
salah - 12 070 meter = 7,49995029 mil jadi 5 mil adalah 8046,72 meter begitu (? = 8046,72) - apakah data geografi atau geometri Anda?
Mapperz

Jawaban:

14

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:

SELECT * FROM table WHERE ST_DWithin(ST_GeogFromText('SRID=4326;POINT(0,0)'), geography(latlon), 12070);

Ini memiliki geographytipe 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.

MerseyViking
sumber
Saya menghargai bantuannya. Saya masih cukup baru di PostGIS.
Nik
4

mungkin Anda ingin fungsi ST_DWithin sebagai gantinya. lihat catatan di st_buffer doc.
ST_Buffer

Orang sering membuat kesalahan dengan menggunakan fungsi ini untuk mencoba melakukan pencarian radius. Membuat buffer untuk pencarian radius lambat dan tidak berguna. Gunakan ST_DWithin sebagai gantinya.

Brad Nesom
sumber