Pertama, Jika Anda menggunakan lintang, bujur, Anda perlu menggunakan 4326.
UPDATE season SET geom = ST_PointFromText ('POINT(' || longitude || ' ' || latitude || ')' , 4326 ) ;
Kemudian Anda membuat indeks pada bidang geom
CREATE INDEX [indexname] ON [tablename] USING GIST ( [geometryfield] );
Kemudian Anda mendapatkan tetangga kNN:
SELECT *,ST_Distance(geom,'SRID=4326;POINT(newLon newLat)'::geometry)
FROM yourDbTable
ORDER BY
yourDbTable.geom <->'SRID=4326;POINT(newLon newLat)'::geometry
LIMIT 10;
Kueri ini akan memanfaatkan fungsionalitas kNN dari indeks inti (http://workshops. boundlessgeo.com/postgis-intro/knn.html ).
Tetap saja jarak yang dikembalikan akan dalam derajat, bukan meter (proyeksi 4326 menggunakan derajat).
Untuk memperbaikinya:
SELECT *,ST_Distance(geography(geom),ST_GeographyFromText('POINT(newLon newLat)')
FROM yourDbTable
ORDER BY
yourDbTable.geom <->'SRID=4326;POINT(newLon newLat)'::geometry
LIMIT 10;
Saat Anda menghitung ST_distance, gunakan tipe geografi. Jarak selalu ada dalam meter:
http://workshops.boundlessgeo.com/postgis-intro/geography.html
Semua fungsi ini mungkin memerlukan versi Postgis terbaru (2.0+). Saya tidak yakin.
Periksa ini untuk referensi https:// gis.stackexchange.com/questions/91765/improve-speed-of-postgis-nearest-neighbor-query/