【问题标题】:How to expand LineString centerline into a rectangular polygon in PostGIS?如何在 PostGIS 中将 LineString 中心线扩展为矩形多边形?
【发布时间】:2018-05-05 19:26:11
【问题描述】:

我有一个包含 LineString 几何图形的表 (SRID=4326)。鉴于那条线,我还有每行的“左”和“右”值,以英里为单位。它们可能并不总是相等的。

我想从该 LineString 生成一个多边形,该多边形在每边以英里为单位正确扩展,以形成一个生成的矩形。

到目前为止,我一直在尝试调整这个解决方案,但没有成功:https://gis.stackexchange.com/questions/60655/polygon-to-fill-gap

我可以使用 ST_OffsetCurve() 生成两条平行线,但目前还无法创建多边形。非常感谢您的任何建议!

【问题讨论】:

    标签: gis postgis


    【解决方案1】:

    您可以为线串几何体创建一个最小边界矩形。您可以使用的 postgis 中的函数是 ST_Envelope。有关一些示例,请参阅https://postgis.net/docs/ST_Envelope.html。如果你有这个矩形,你可以用你给定的左值和右值来扩展它。见函数 ST_Expand https://postgis.net/docs/ST_Expand.html

    更新了我的答案(根据截图): 您可以执行以下步骤在 postgis 中创建所需的几何图形。

    drop table linetest;
    --create table to test
    create table linetest (
        id serial not null,
        geom geometry,
        parallel_geom geometry,
        union_lines geometry,
        polygon_geom geometry   
    );
    --insert sample linestring
    insert into linetest (geom) values (
        ST_GeomfromEWKT('SRID=4326; LINESTRING(100 100, 200 200)')
    );
    --create parallel linestring (query your field dx or dy for the parallel value here)
    update linetest set parallel_geom = (
        select ST_OffsetCurve(geom,
        -15, -- here you can parametrize your offset
        'quad_segs=4 join=round')
    );
    --union the 2 lines to get one geometry as a multilinestring
    update linetest set union_lines = (
        select ST_Union(geom, parallel_geom)
    );
    --create polygon with function convex hull out of the multilinestring
    update linetest set polygon_geom = (
        select ST_ConvexHull(union_lines)
    );
    --check your result
    select ST_ASTEXT (polygon_geom) from linetest;
    

    我在 qgis 中可视化了情况,见图:

    【讨论】:

    • 感谢您的回复,但它没有产生我想要的东西。 ST_Envelope 给了我一个像这样的盒子:ibb.co/bT9y3R 我实际上想像这样ibb.co/hNKy3R 从中心线制作平行线,然后“关闭”盒子并得到生成的多边形,但它的角度与中心线。这有意义吗?
    • 啊,我现在明白你的问题了,谢谢你的截图。在我更新的答案中查看我的解决方案。
    • 完美,这正是我所需要的。非常感谢!
    【解决方案2】:

    计划如下:

    • 转到 X 和 Y 上的比例相似的某个坐标空间(它们不在 EPSG:4326 中);
    • 通过 ST_OffsetCurve 获得一个方向的偏移几何;
    • 通过将负偏移量传递给 ST_OffsetCurve 来获取另一个方向的偏移几何体;
    • 使用 ST_MakeLine(geom1, geom2) 连接两个线性几何;
    • 使用 ST_Polygonize 将生成的线性几何图形转换为多边形。

    棘手的部分是:

    • 锐角几何图形在向锐角方向偏移后会消失;
    • 如果您的偏移线具有复杂的自相交形状,ST_MakeLine 可能会失败;
    • 以度空间为单位偏移英里。我建议将您的几何图形 ST_Transform 转换为 EPSG:3857,将英里转换为米,并使用类似于来自 lostgis 扩展的 ST_RealOffsetCurve 的函数,通过 cos(lat) 缩放偏移米值以考虑地球曲率。

    【讨论】:

      【解决方案3】:

      如果我没有正确回答您的问题,您可能需要Creating a polygon around a linestring with PostGIS这里的答案 .关键是ST_Buffer() 函数,它用缓冲区半径包裹你的东西。虽然不是一个矩形 - 它围绕一条直线形成一个椭圆形。此函数接受点、线、多线、多边形和多多边形,并返回用该缓冲区半径包裹的任何一个。

      【讨论】:

      • 请不要发布只是指向另一个 Stack Overflow 帖子的链接的答案。相反,标记或投票以将问题作为重复问题结束。
      猜你喜欢
      • 2016-10-11
      • 2021-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-29
      • 2011-11-27
      • 2014-02-14
      相关资源
      最近更新 更多