首先,如果您使用纬度、经度,则需要使用 4326。
UPDATE season SET geom = ST_PointFromText ('POINT(' || longitude || ' ' || latitude || ')' , 4326 ) ;
然后在 geom 字段上创建索引
CREATE INDEX [indexname] ON [tablename] USING GIST ( [geometryfield] );
然后你就得到了 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;
该查询将利用要点索引的 kNN 功能(http://workshops.boundlessgeo.com/postgis-intro/knn.html 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 http://workshops.boundlessgeo.com/postgis-intro/geography.html
所有这些功能可能需要最新的 Postgis 版本(2.0+)。但我不确定。
检查此以供参考https://gis.stackexchange.com/questions/91765/improve-speed-of-postgis-nearest-neighbor-query/ https://gis.stackexchange.com/questions/91765/improve-speed-of-postgis-nearest-neighbor-query/