Първо, ако използвате географска ширина, дължина, трябва да използвате 4326.
UPDATE season SET geom = ST_PointFromText ('POINT(' || longitude || ' ' || latitude || ')' , 4326 ) ;
След това създавате индекс в полето geom
CREATE INDEX [indexname] ON [tablename] USING GIST ( [geometryfield] );
След това получавате kNN neightbors:
SELECT *,ST_Distance(geom,'SRID=4326;POINT(newLon newLat)'::geometry)
FROM yourDbTable
ORDER BY
yourDbTable.geom <->'SRID=4326;POINT(newLon newLat)'::geometry
LIMIT 10;
Тази заявка ще се възползва от функционалността на kNN на основния индекс (http://workshops. boundlessgeo.com/postgis-intro/knn.html ).
Въпреки това върнатото разстояние ще бъде в градуси, а не в метри (проекция 4326 използва градуси).
За да коригирате това:
SELECT *,ST_Distance(geography(geom),ST_GeographyFromText('POINT(newLon newLat)')
FROM yourDbTable
ORDER BY
yourDbTable.geom <->'SRID=4326;POINT(newLon newLat)'::geometry
LIMIT 10;
Когато изчислявате ST_distance, използвайте географския тип. Там разстоянието винаги е в метри:
http://workshops.boundlessgeo.com/postgis-intro/geography.html
Цялата тази функционалност вероятно ще се нуждае от скорошна версия на Postgis (2.0+). Не съм сигурен обаче.
Проверете това за справка https:// gis.stackexchange.com/questions/91765/improve-speed-of-postgis-nearest-neighbor-query/