我在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