在PostGIS中沿中心线计算平行线


10

我在PostgreSQL数据库中有街道(道路中心线)和建筑物多边形表。示例场景如下:

示例场景

问题:

我需要在街道和两侧最近的建筑物多边形周围50米缓冲区的交点处计算沿着街道的平行线。所需的输出方案是:

所需的输出方案

我尝试过的

我的方法是:

 1) Generate 50m buffer around street layer
 2) get the intersection of buffer and polygons
 3) Compute the distance
 4) Draw offset curves (parallel lines) at both sides of street layer
 5) Merge both curves to get parallel lines at the intersection

这是我的尝试:

    WITH street_buffer AS (
     SELECT
      street.gid street_id,
      street.geom street_geom,
      ST_Buffer(street.geom, 50, 'endcap=square join=round') geom1,
      building.geom  geom2  
     FROM street
     LEFT JOIN building on ST_DWithin(building.geom, street.geom, 50)
     ORDER BY street_id
    ),
    selected_buildings AS (
     SELECT
      street_id,
      street_geom,
      ST_Intersection(geom1, geom2) geom
     FROM street_buffer
    ),
    distance AS (
     SELECT 
      street_id,
      street_geom,
      ST_Distance(street_geom, geom) as dist
     FROM selected_buildings 
    ),
    curves AS (
     SELECT 
      street_id,
      ST_OffsetCurve(ST_LineMerge(street_geom), dist) as curve1,
      ST_OffsetCurve(ST_LineMerge(street_geom), -dist) as curve2
     FROM distance
     ORDER BY street_id
    )
    SELECT 
     street_id,
     ST_Union(curve1, curve2) geom 
    FROM curves
    ORDER BY street_id

上面的代码的问题在于,它不会根据所需的输出返回平行线,也就是说,将在所有多边形相交处生成平行线,而不是在最近的多边形相交处。

EDIT_1:

上面代码的实际输出为:

代码输出

而在上面的输出中,仅需要黄色平行线(到街道两边的偏移曲线到最近的多边形):

实际输出中需要的行

谁能建议我如何获得所需的输出?


您还可以添加实际输出的图像吗?它有助于理解问题。
倾斜

@tilt:我已经编辑了问题。只需在实际输出中添加实际输出和所需的平行线即可。
哈吉克(Kajlk)'17

这个问题比您想象的要复杂。渴了,您必须找出房屋在街的哪一边。只有这样,你可以找到最接近的两个侧面。这是一篇包含查找正确边的示例代码的帖子:gis.stackexchange.com/questions/156578/…–
倾斜

实际上,可能存在建筑物仅在一侧的情况(我称之为例外)。一旦能够达到所需的输出,就可以修改代码以处理异常。在上方,您仍然可以在两边看到建筑物多边形。此时,我的要求是在街道两边获得平行线(就像我在图中显示的那样)。关于您的链接,我可能会在稍后使用示例代码来改进我的上述代码。
哈吉克(Kajlk)'17

我看到的一件事是缓冲区是多余的。您可以只使用stdwithin并使用50作为距离。(选择st_dwithin(街道,建筑物50)的街道,建筑物)
jbalk

Answers:


1

如果将距离CTE修改如下:

distance AS (
 SELECT 
  street_id,
  street_geom,
  MIN(ST_Distance(street_geom, geom)) as dist
 FROM selected_buildings
 GROUP BY street_id, street_geom
)

那么每个街道只会返回最短的距离,并且在该距离处会生成一对偏移线。


感谢您的建议。我将对其进行测试,看看是否能达到预期的结果。我一直在努力解决这个问题。我发现了一个疯狂的主意:从街道周围的1 m缓冲区开始,以编程方式增加缓冲区并搜索两侧的建筑物,直到建筑物数为2,然后将此缓冲区距离作为街道宽度返回。以上所有练习的最终目的。
khajlk

的确,使用您的建议只能生成一对偏移量。但是,上面显示的黄色Paralle线仍不存在:(
khajlk
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.