如何找到在PostGIS中的N最近的邻居答案在这里给出:
Postgis SQL for nearest neighbors
总结答案有:
你需要为你的点创建一个几何对象。如果您使用的纬度,经度,则需要使用4326
UPDATE season SET geom = ST_PointFromText ('POINT(' || longitude || ' ' || latitude || ')' , 4326) ;
然后你在GEOM场
CREATE INDEX [indexname] ON [tablename] USING GIST ([geometryfield]);
然后你得到的k近邻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;
其中newLon newLat是查询点坐标。
该查询将利用主要索引的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/
编辑。这涵盖了一点的必要步骤。对于一组积分:
SELECT n1.*,n2.*, ST_Distance(n1.geom,n2.geom)
FROM yourDbTable n1, yourDbTable n2
WHERE n1.setId=1 AND n1.setId=2 //your condition here for the separate sets
AND n1.id<>n2.id // in case the same object belong to 2 sets
ORDER BY n1.geom <->n2.geom
LIMIT 20;
我相信我可以回答这个问题,但是你能澄清一下你的意思吗?这些问题是如何在问题的背景下定义的? –
查看代码中的注释 – Tilo
好的,进一步的澄清,在你对亚历山德罗斯的评论中你说找到两组中最近的点,而在原始问题中你说找到N个最接近的点。对于所有的问题抱歉,但在Postgis中做这些事情的方式有很多种,但性能各不相同。 –