PostGIS
Jangan simpan lat dan long di atas meja seperti itu. Sebagai gantinya, gunakan geometri PostGIS atau jenis geografi .
CREATE EXTENSION postgis;
CREATE TABLE foo (
geog geography;
);
CREATE INDEX ON foo USING gist(geog);
INSERT INTO foo (geog)
VALUES (ST_MakePoint(x,y));
Sekarang ketika Anda perlu menanyakannya, Anda dapat menggunakan KNN (<->
)
yang sebenarnya akan melakukan ini pada indeks.
SELECT *
FROM foo
ORDER BY foo.geog <-> ST_MakePoint(x,y)::geography;
Dalam kueri Anda, Anda secara eksplisit memiliki HAVING distance < 5
. Anda juga dapat melakukannya di indeks.
SELECT *
FROM foo
WHERE ST_DWithin(foo.geog, ST_MakePoint(x,y)::geography, distance_in_meters)
ORDER BY foo.geog <-> ST_MakePoint(x,y)::geography;
Ini memastikan bahwa tidak ada yang dikembalikan jika semua titik berada di luar distance_in_meters
.
Selanjutnya x dan y adalah bilangan desimal ST_MakePoint(46.06, 14.505)