Đầu tiên, nếu bạn đang sử dụng vĩ độ, kinh độ, bạn cần sử dụng 4326.
UPDATE season SET geom = ST_PointFromText ('POINT(' || longitude || ' ' || latitude || ')' , 4326 ) ;
Sau đó, bạn tạo một chỉ mục trên trường địa lý
CREATE INDEX [indexname] ON [tablename] USING GIST ( [geometryfield] );
Sau đó, bạn nhận được neightbors 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;
Truy vấn này sẽ tận dụng chức năng kNN của chỉ mục gist ( http:// workshop. bindlessgeo.com/postgis-intro/knn.html ).
Tuy nhiên, khoảng cách được trả về sẽ tính bằng độ, không phải mét (phép chiếu 4326 sử dụng độ).
Để khắc phục điều này:
SELECT *,ST_Distance(geography(geom),ST_GeographyFromText('POINT(newLon newLat)')
FROM yourDbTable
ORDER BY
yourDbTable.geom <->'SRID=4326;POINT(newLon newLat)'::geometry
LIMIT 10;
Khi bạn tính toán ST_distance, hãy sử dụng kiểu địa lý. Khoảng cách luôn tính bằng mét:
http://workshops.boundlessgeo.com/postgis-intro/geography.html
Tất cả chức năng này có thể sẽ cần một phiên bản Postgis gần đây (2.0+). Tôi không chắc lắm.
Kiểm tra thông tin này để tham khảo https:// gis.stackexchange.com/questions/91765/improve-speed-of-postgis-nethers-neighbor-query/