Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Mendapatkan Bangunan dengan Cekap dalam Jejari Tertentu Menggunakan PostGIS?

Bagaimana untuk Mendapatkan Bangunan dengan Cekap dalam Jejari Tertentu Menggunakan PostGIS?

DDD
DDDasal
2025-01-09 11:41:43857semak imbas

How to Efficiently Retrieve Buildings within a Specified Radius Using 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn