我有这样的问题,我会很高兴如果有人可以帮助我。 我有GIST索引的积分表。这些要点不会及时改变。
我想获取某些给定线串附近的点。 示例:想象一下,线串是道路,道路上的点是poi。 我想去距离特定道路5公里的poi。我想以正确的顺序取得那些poi(沿路的驾驶秩序)。看图像:
对于从1点到5点的特定道路,我想从道路上获取距离最远5公里的POI,并沿着道路从1点到5点获取。所以结果应该是:
POI_ID
1
5
6
8
9
10
12
13
这应该告诉我在沿着这条路旅行时我能以最低成本访问的POI。
有没有人对postgres和postgis有什么想法?
答案 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
类型,则此查询也可能有效,因为它会自动计算米 - 而非度数。查看文档了解更多信息:
ST_Distance
ST_DWithin
ST_LineLocatePoint
(或ST_Line_Locate_Point
旧版PostGIS)答案 1 :(得分:0)
听起来你可以从去年夏天的PostgreSQL 9.1版本中受益于KNN-GIST功能,并得到PostGIS 2.0版的支持。
http://blog.opengeo.org/2011/09/28/indexed-nearest-neighbour-search-in-postgis/