【问题标题】:Find the nearest points along the linestring in specified distance limit and order以指定的距离限制和顺序沿线串查找最近的点
【发布时间】:2012-05-04 10:33:13
【问题描述】:

我有这样的问题,如果有人可以帮助我,我会很好。 我有带有 GIST 索引的积分表。这些点不会随时间改变。

我想获取某个给定线串附近的点。 示例:假设线串是道路,点是道路沿线的 poi。 我想获取距离给定道路 5 公里的 poi。我想以正确的顺序(沿路的驾驶顺序)获取这些 pois。看图:

对于从点 1 到 5 的给定道路,我想获取距离道路最大 5 公里的 POI,并按顺序从道路上的点 1 到 5。所以结果应该是:

POI_ID
1
5
6
8
9
10
12
13

这应该告诉我在沿路旅行时可以以最低成本访问哪些 POI。

有人对如何使用 postgres 和 postgis 有一些想法吗?

【问题讨论】:

    标签: postgresql postgis


    【解决方案1】:

    假设您有几何列 geom 在表 road (LINESTRING) 和 poi (POINT) 中使用米的投影 SRID,您的查询将查找道路 5 公里范围内的所有 POI(其中 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);
    

    带有ST_LineLocatePoint 的第一个ORDER 部分使用0.0 到1.0 之间的小数,具体取决于该点沿LINESTRING 的位置。如果道路的方向是“错误的方向”,则附加DESC 以颠倒顺序。第二个 ORDER 部分基于距离,如果该点稍微超过 LINESTRING 的开始/结束(其中ST_LineLocatePoint 将分别返回 0.0 或 1.0),则可以使用该距离。

    如果您使用带有 Long/Latitude 值的 geography 类型,此查询也可能有效,因为它会自动计算米,而不是度数。查看文档了解更多信息:

    【讨论】:

    • 感谢您的回答。我认为这行不通,因为顺序是错误的。如果 id=123 的道路(线串)有点 1、2、3、4,我想获取点(pois),以便您沿着道路经过,所以首先是点 1 附近最近的 poi,然后是 2、3并以线串 4 的最后一点结束。
    • 我会试试我的朋友 :) 我还更新了问题以便更容易理解。
    • 非常好的答案。非常感谢。有什么想法可以将所选 POI 与 lineString 上的点进行匹配?
    • @cecemel 将 LineString 转换为 MultiPoint 以找到最近的顶点,like here
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-18
      • 1970-01-01
      • 2022-08-15
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多