Mengapa Anda menyimpan x,y dalam kolom terpisah? Saya sangat menyarankan Anda untuk menyimpannya sebagai geometry
atau geography
untuk menghindari overhead casting yang tidak perlu dalam waktu kueri.
Karena itu, Anda dapat menghitung dan memeriksa jarak dalam mil menggunakan ST_DWithin
atau ST_Distance
:
(Data uji)
CREATE TABLE building (name text, long numeric, lat numeric);
INSERT INTO building VALUES ('Kirk Michael',-4.5896,54.2835);
INSERT INTO building VALUES ('Baldrine',-4.4077,54.2011);
INSERT INTO building VALUES ('Isle of Man Airport',-4.6283,54.0804);
ST_DDalam
ST_DWithin
mengembalikan true jika geometri yang diberikan berada dalam jarak yang ditentukan dari yang lain. Kueri berikut menelusuri geometri yang berada dalam radius 5 mil dari POINT(-4.6314 54.0887)
:
SELECT name,long,lat,
ST_Distance('POINT(-4.6314 54.0887)'::geography,
ST_MakePoint(long,lat)) * 0.000621371 AS distance
FROM building
WHERE
ST_DWithin('POINT(-4.6314 54.0887)'::geography,
ST_MakePoint(long,lat),8046.72); -- 8046.72 metres = 5 miles;
name | long | lat | distance
---------------------+---------+---------+-------------------
Isle of Man Airport | -4.6283 | 54.0804 | 0.587728347062174
(1 row)
ST_Distance
Fungsi ST_Distance
(dengan geography
type parameter) akan mengembalikan jarak dalam meter . Dengan menggunakan fungsi ini, yang harus Anda lakukan adalah mengubah meter menjadi mil pada akhirnya.
Perhatian :Jarak dalam kueri menggunakan ST_Distance
dihitung secara waktu nyata dan oleh karena itu jangan gunakan indeks spasial . Jadi, tidak disarankan untuk menggunakan fungsi ini di WHERE
ayat! Gunakan lebih baik di SELECT
ayat. Namun demikian, contoh di bawah ini menunjukkan bagaimana hal itu dapat dilakukan:
SELECT name,long,lat,
ST_Distance('POINT(-4.6314 54.0887)'::geography,
ST_MakePoint(long,lat)) * 0.000621371 AS distance
FROM building
WHERE
ST_Distance('POINT(-4.6314 54.0887)'::geography,
ST_MakePoint(long,lat)) * 0.000621371 <= 5;
name | long | lat | distance
---------------------+---------+---------+-------------------
Isle of Man Airport | -4.6283 | 54.0804 | 0.587728347062174
(1 row)
- Perhatikan urutan parameter dengan
ST_MakePoint
:Ini bujur, lintang.. bukan sebaliknya.
Demo:db<>fiddle
Setara dengan Amazon Athena (jarak dalam derajat):
SELECT *, ST_DISTANCE(ST_GEOMETRY_FROM_TEXT('POINT(-84.386330 33.753746)'),
ST_POINT(long,lat)) AS distance
FROM building
WHERE
ST_Distance(ST_GEOMETRY_FROM_TEXT('POINT(-84.386330 33.753746)'),
ST_POINT(long,lat)) <= 5;