11

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

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

图片

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

POI_ID
1
5
6
8
9
10
12
13

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

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

4

2 回答 2

15

假设您的几何列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);

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

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

于 2012-04-24T00:31:10.797 回答
0

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

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

于 2012-04-23T20:56:11.797 回答