在指定的距离限制和顺序中找到沿线串的最近点

时间:2012-04-23 19:24:51

标签: postgresql postgis

我有这样的问题,我会很高兴如果有人可以帮助我。 我有GIST索引的积分表。这些要点不会及时改变。

我想获取某些给定线串附近的点。 示例:想象一下,线串是道路,道路上的点是poi。 我想去距离特定道路5公里的poi。我想以正确的顺序取得那些poi(沿路的驾驶秩序)。看图像:

image

对于从1点到5点的特定道路,我想从道路上获取距离最远5公里的POI,并沿着道路从1点到5点获取。所以结果应该是:

POI_ID
1
5
6
8
9
10
12
13

这应该告诉我在沿着这条路旅行时我能以最低成本访问的POI。

有没有人对postgres和postgis有什么想法?

2 个答案:

答案 0 :(得分:12)

假设您的几何列geom使用表road(LINESTRING)和poi(POINT)中的投影SRID米,您的查询将查找5 km范围内的所有POI road(id = 123)应该是这样的:

SELECT poi.*, ST_Distance(road.geom, poi.geom)/1000.0 AS distance_km
FROM road, poi
WHERE road.id = 123 AND ST_DWithin(road.geom, poi.geom, 5000.0)
ORDER BY ST_LineLocatePoint(road.geom, poi.geom),
         ST_Distance(road.geom, poi.geom);

ORDER的第一个ST_LineLocatePoint部分使用介于0.0和1.0之间的分数,具体取决于LINESTRING中的点。如果道路方向“走错路”,则追加DESC以反转订单。第二个ORDER部分基于距离,如果该点稍微超过LINESTRING的开始/结束(其中ST_LineLocatePoint将分别返回0.0或1.0),则可以使用该距离。

如果您使用具有长/纬度值的geography类型,则此查询也可能有效,因为它会自动计算米 - 而非度数。查看文档了解更多信息:

答案 1 :(得分:0)

听起来你可以从去年夏天的PostgreSQL 9.1版本中受益于KNN-GIST功能,并得到PostGIS 2.0版的支持。

http://blog.opengeo.org/2011/09/28/indexed-nearest-neighbour-search-in-postgis/