用PostGIS创建围绕linestring的多边形

4

我是PostGIS的新手,在这里需要寻求一些帮助。

我有一个来自谷歌地图的折线(代表行程),需要在其周围建立一个特定距离的多边形(缓冲区),单位为米或千米。

作为输入,我有纬度/经度点的列表和所需的缓冲距离。

有人能帮忙构建查询,使返回结果为纬度/经度坐标的多边形,可以直接绘制在地图上吗?

4个回答

6
  1. 将您的线串的第一个顶点再次添加到末尾以创建多边形。
  2. 将线串转换为多边形
  3. 在多边形周围创建缓冲区
SELECT
    ST_Buffer(ST_Polygon(ST_AddPoint(the_geom, ST_StartPoint(the_geom))),100)
FROM
    mytable
  1. 如果您的缓冲区以米/千米表示,而数据以纬度/经度表示,则可能需要先将多边形转换为适当的投影坐标系(我不知道您在哪里),然后再转换回纬度/经度。
SELECT
    ST_Transform(ST_Buffer(ST_Transform(ST_Polygon(ST_AddPoint(the_geom,ST_StartPoint(the_geom)),4326),XXXX),100),4326)
FROM
    mytable

我还没有尝试过这段代码,但它应该可以正常工作。


2

对于经纬度几何图形的米级缓冲区,您可以使用geography数据类型上的ST_Buffer。这种方法允许避免查找合适的投影。PostGIS实际上使用UTM区域。

例如,geometry(ST_Buffer(georgaphy(geom), 100))返回几何图形geom的100米缓冲区多边形。

因此,对于具有seq、lon和lat列的表,它看起来像:

SELECT geometry(ST_Buffer(georgaphy(ST_MakeLine(ST_MakePoint(lon, lat))), dist))
FROM sometable
ORDER BY seq

关于这个评论:http://postgis.org/docs/ST_Buffer.html 对于地理数据,如果对象足够大以至于跨越两个UTM区域或者穿过日期变更线,它可能不会按预期行事。 - Jonathas Pacífico

2
这里并没有使用PostGIS,但是在Google Maps API v3中有一个叫做RouteBoxer utility的工具可以做到类似你所要求的功能。
另外一个选择是JSTS库示例

你说得很对,这不是我要找的。我之前研究过使用RouteBoxer,但它根本不适合我的需求。 - Simon

-2
经过测试,我发现PostGIS生成的多边形缓冲区不可靠。也就是说,如果我想在一条折线周围创建一个5公里的缓冲区,PostGIS会返回一个最大为5公里的多边形,但在某些点上则可能小于这个值。
放弃PostGIS。

这是不正确的。这里有一个示例,PostGIS正在围绕路线创建25英里的缓冲区:http://gis5.com/pois_along_route/gm_pois_along_route.php - Marcelo
@Marcelo - 你能提供一下你是如何实现这个的代码吗?我在测试供应商上做的时候,缓冲区出现了问题。 - Simon
3
如果你已经说过你要放弃PostGIS,为什么还需要代码呢?:p ... (而且你已经接受了自己的答案,但它并不能解决问题)。这不是StackOverflow的工作方式!请注意。 - Marcelo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接