在PostGIS中创建单面缓冲区或平行线?


19

我正在寻找一种在PostGIS中创建所谓的单面缓冲区或平行线的方法。示例:1.缓冲区,2.一侧,3.两侧

替代文字

我在2009年的邮件列表中发现了一些讨论,以及在GEOS中实现的信息,但与PostGIS的当前状态无关。

如果尚未实现该功能,您知道任何解决方法吗?是否可以切断普通缓冲器的一侧?


因此,您要在AutoCAD中寻找等同于“偏移”的东西吗?
dassouki 2010年

@dassouki:对不起,我不了解AutoCAD。但是我认为UMN Mapserver有一个“偏移”选项,可以满足我的需求。
昏暗

如何从具有600条线的表中创建单面缓冲区或平行线?

欢迎来到该网站。如果当前答案不能解决您的问题,则应将其作为新问题打开(并说明为什么该问题不能解决您的问题)。在网站格式内,这不是进行此声明的合适位置,因为它不能回答问题。
Andy W

如何在MULTILINESTRING表中创建平行线?
菲利佩·科斯塔

Answers:


13

正确的片面的缓冲液应该在1.5已经登陆,但在我看来,虽然风格做了土地,片面性并没有做到这一点。然而,有一个当前补丁集暴露GEOSSingleSidedBuffer,并进行片面的缓冲预期的名字ST_OffsetCurve; 请参阅故障单#413中的更多背景。正在使用:

select ST_AsText(ST_OffsetCurve(
ST_GeomFromText('LINESTRING(10 10,10 20, 20 20 )'),
1,'right', 'join=mitre mitre_limit=5.0'));
--------------
LINESTRING(20 19,11 19,11 10)

嗨,我正在尝试使用此解决方案,但不经常使用postgis-我已经测试了此查询并获得了一些输出值,但是如何将其转换为功能?我只希望最后一行是原始表的一部分还是新表的行。这是我的查询:选择ST_AsText(ST_OffsetCurve(test_data_.geom,test_data_.buffer_dis,'join = mitre mitre_limit = 5.0'))来自test_data_;
kflaw

@kflaw-您可能已经知道了这一点,但是您只需要在查询的开头添加:“将newtable创建为”,或者对于视图,“将视图newview创建或替换为”,然后是select语句。
jbalk

4

此示例在线串的两侧创建两个多边形。它要求PostGIS 1.5或更高版本。我不确定它将如何处理自己的交叉线。

SELECT ST_AsText(geom)

FROM ST_Dump ((

SELECT 
  ST_Polygonize(GEOMUNION(ST_Boundary(ST_Buffer(the_geom, 0.5, 'endcap=flat join=round')), the_geom)) AS buffer_sides 
FROM
  (SELECT ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)') AS the_geom) AS table1

));

它输出:

                        st_astext

------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------
 POLYGON((0.5 5,0.509607359798385 5.09754516100806,0.538060233744357 5.19134171618254,0.584265193848727 5.2777851165098,
0.646446609406726 5.35355339059327,0.722214883490199 5.41573480615127,0.808658283817455 5.46193976625564,0.9024548389919
36 5.49039264020162,1 5.5,5 5.5,5 5,1 5,1 1,0.5 1,0.5 5))
 POLYGON((5 5,5 4.5,1.5 4.5,1.5 1,1 1,1 5,5 5))
(2 rows)

该代码以下列方式工作:

  1. 使用ST_Buffer缓冲线串。我们利用支持自定义端盖的PostGIS 1.5功能来完全不指定端盖。请参见下面的示例。
  2. 使用Wiki中记录方法,使用原始行将缓冲的多边形一分为二。

可以对其进行改进以应对将来的自交叉线。

带有扁平端盖的缓冲线串


3

此修改将创建两个平行的线串。它要求PostGIS 1.5或更高版本。

所需的几何形状或wkt,以及缓冲区中的距离


SELECT astext(
     st_removepoint( 
     st_removepoint(        st_linemerge(ST_Difference(st_boundary(geom),ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)')))         ,0),
      st_npoints(st_linemerge(ST_Difference(st_boundary(geom),ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)'))))-2)

    ) as parallel
    FROM ST_Dump ((
    SELECT 
    ST_Polygonize(st_union(ST_Boundary(ST_Buffer(geometria, 0.5, 'endcap=flat join=mitre mitre_limit=5.0')), geometria)) AS buffer_sides 
    FROM
    (SELECT ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)') 
        AS geometria) AS tabla))

--------------结果

"LINESTRING(0.5 1,0.5 5.5,5 5.5)"
"LINESTRING(5 4.5,1.5 4.5,1.5 1)"


0

由于我仍然无法在此处发表评论,因此我添加了此答案

SCW给出了最佳答案,

select ST_AsText(ST_OffsetCurve(
ST_GeomFromText('LINESTRING(10 10,10 20, 20 20 )'),
1, 'right', 'join=mitre mitre_limit=5.0'));
--------------
LINESTRING(20 19,11 19,11 10)

但是功能看起来像
http://postgis.refractions.net/docs/ST_OffsetCurve.html

现在'right'不需要该参数。使用正距离将创建左侧,而负距离将创建右侧

我的postgis也不需要补丁

SELECT PostGIS_full_version();
"POSTGIS="2.0.3 r11132" GEOS="3.3.8-CAPI-1.7.8" 
PROJ="Rel. 4.8.0, 6 March 2012" GDAL="GDAL 1.9.2, 
released 2012/10/08" LIBXML="2.7.8" LIBJSON="UNKNOWN" RASTER"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.