2014-05-15 62 views
2

我使用的是PostGIS/Rails,并有地理定位点集。PostGIS:如何找到给定集的N个最接近点集?

class DataSet < ActiveRecord::Base # these are the sets containing the points 
    has_many :raw_data 
    # attributes: id , name 
end 
class RawData < ActiveRecord::Base # these are the data points 
    belongs_to :data_set 
    # attributes: id, location which is "Point(lon,lat)" 
end 

对于给定的一组点,我需要找到N个最近的集合和他们的距离; 或备选: 给定最大距离和我需要找到N个最接近集合的点集。

用PostGIS做这件事的最好方法是什么?

我的版本是9.3.4 PostgerSQL在PostGIS 2.1.2

+0

我相信我可以回答这个问题,但是你能澄清一下你的意思吗?这些问题是如何在问题的背景下定义的? –

+0

查看代码中的注释 – Tilo

+0

好的,进一步的澄清,在你对亚历山德罗斯的评论中你说找到两组中最近的点,而在原始问题中你说找到N个最接近的点。对于所有的问题抱歉,但在Postgis中做这些事情的方式有很多种,但性能各不相同。 –

回答

4

如何找到在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; 
+0

谢谢!我的PostGIS数据库中已经有了几何对象。 你列出的SQL查询是比较点,而不是点集 - 我试图看看是否有一个查询,基本上可以找到两组中的最近点 – Tilo

相关问题