Ruby on rails PostGIS:如何找到与给定集合最近的N组点?

Ruby on rails PostGIS:如何找到与给定集合最近的N组点?,ruby-on-rails,postgresql,gis,geospatial,postgis,Ruby On Rails,Postgresql,Gis,Geospatial,Postgis,我正在使用PostGIS/Rails,并且有一组带有地理位置的点 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 :da

我正在使用PostGIS/Rails,并且有一组带有地理位置的点

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进行此操作的最佳方法是什么


我的版本是PostgreSQL 9.3.4和PostGIS 2.1.2

关于如何在PostGIS中查找N个最近邻居的答案如下:

总结一下答案:

需要为点创建几何体对象。如果使用纬度、经度,则需要使用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;
其中newLon newLat是查询点坐标

此查询将利用gist索引的kNN功能

不过,返回的距离将以度为单位,而不是米。投影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_距离时,请使用地理类型。在那里,距离始终以米为单位:

所有这些功能可能都需要最新的Postgis版本2.0+。不过我不确定

请检查此项以供参考

编辑。这涵盖了一点的必要步骤。对于点集:

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;

谢谢我的PostGIS数据库中已经有几何体对象。您列出的SQL查询是比较点,而不是点集-我想看看是否有一个查询基本上可以在两个集中找到最近的点我相信我可以回答这个问题,但您能否澄清点集的含义-这些点在问题的上下文中是如何定义的?请参阅代码OK中的注释,进一步澄清,在你对Alexandros的评论中,你说在两个集合中找到最近的点,而在原来的问题中,你说找到离一个点最近的N个集合。对于所有的问题,我很抱歉,但是在Postgis中有各种各样的方法来做这些事情,但是性能各不相同。PostgreSQL的哪个版本?PostgerSQL 9.3.4和Postgis 2.1.2