Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Mendapatkan Bangunan dengan Cekap dalam Jejari Tertentu Menggunakan PostGIS?
Mencari Bangunan dengan Cekap dalam Radius Tertentu Menggunakan PostGIS
Panduan ini menunjukkan cara untuk mendapatkan semula semua bangunan dalam radius tertentu menggunakan PostGIS, dengan mengandaikan jadual pangkalan data "Bangunan" anda mengandungi lajur "nama," "lat" dan "lng". Katakan anda perlu mencari semua bangunan dalam jarak 5 batu dari koordinat (-84.38653999999998, 33.72024).
Mengoptimumkan Storan Data Spatial
Adalah penting untuk memahami bahawa menyimpan latitud dan longitud dalam lajur yang berasingan adalah tidak cekap. Untuk prestasi PostGIS yang optimum, simpan koordinat anda sebagai jenis data geometri atau geografi. Ini mengelakkan penukaran yang tidak perlu semasa pertanyaan.
Memanfaatkan ST_DWithin dan ST_Distance untuk Pengiraan Jarak
PostGIS menawarkan dua fungsi utama untuk pengiraan jarak: ST_DWithin
dan ST_Distance
.
1. Menggunakan ST_DWithin untuk Carian Jejari Cekap:
ST_DWithin
cekap memeriksa sama ada geometri berada dalam jarak yang ditentukan. Pertanyaan berikut menggunakan ST_DWithin
untuk mencari bangunan dalam radius 5 batu (kira-kira 8046.72 meter):
<code class="language-sql">SELECT name, long, lat FROM building WHERE ST_DWithin( ST_GeographyFromText('SRID=4326;POINT(-84.38653999999998 33.72024)'), ST_MakePoint(long, lat)::geography, 8046.72 -- Distance in meters );</code>
Perhatikan penggunaan ST_GeographyFromText
dan tuangan ST_MakePoint
kepada geografi untuk pengiraan jarak yang tepat pada permukaan sfera. Menggunakan geography
biasanya lebih disukai daripada geometry
untuk koordinat geografi.
2. Menggunakan ST_Distance untuk Maklumat Jarak Terperinci:
ST_Distance
mengira jarak antara dua geometri. Tidak seperti ST_DWithin
, ia tidak mendapat manfaat daripada indeks spatial dan harus digunakan dalam klausa SELECT dan bukannya klausa WHERE untuk prestasi yang lebih baik. Pendekatan ini berguna apabila anda memerlukan jarak yang tepat ke setiap bangunan:
<code class="language-sql">SELECT name, long, lat, ST_Distance( ST_GeographyFromText('SRID=4326;POINT(-84.38653999999998 33.72024)'), ST_MakePoint(long, lat)::geography ) AS distance_meters FROM building ORDER BY distance_meters;</code>
Pertanyaan ini mengembalikan jarak dalam meter. Anda boleh menukarnya kepada batu dengan mendarab dengan 0.000621371.
Nota Penting pada ST_MakePoint:
Ingat bahawa ST_MakePoint
mengambil longitud dahulu, kemudian latitud. Susunan yang salah akan membawa kepada keputusan yang tidak tepat. Sentiasa semak semula susunan koordinat anda. Penggunaan jenis data geografi adalah penting untuk pengiraan jarak yang tepat di permukaan bumi.
Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Bangunan dengan Cekap dalam Jejari Tertentu Menggunakan PostGIS?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!