代码之家  ›  专栏  ›  技术社区  ›  user3288756

如何在PostGIS中将线串中心线扩展为矩形多边形?

  •  1
  • user3288756  · 技术社区  · 7 年前

    我有一个包含线串几何图形的表(SRID=4326)。根据这条线,我还有一个“左”和“右”值,每行的英里数。他们可能并不总是平等的。

    我想从该线串生成一个多边形,该线串在每边以英里为单位适当展开,以形成一个结果矩形。

    到目前为止,我试图在这里采用这种解决方案,但没有成功: https://gis.stackexchange.com/questions/60655/polygon-to-fill-gap

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

    3 回复  |  直到 7 年前
        1
  •  1
  •   Ohlsen1980    7 年前

    可以为字符串几何图形创建最小边界矩形。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中的情况可视化,见图: Convex Hull

        2
  •  0
  •   Darafei Praliaskouski    7 年前

    计划如下:

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

    棘手的部分包括:

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

    如果我答对了你的问题,你可能需要从这里得到答案 Creating a polygon around a linestring with PostGIS . 关键是 ST_Buffer() 函数,该函数使用缓冲半径包装您的物品。虽然不是一个矩形,但它围绕一条直线形成一个椭圆形。该函数接受点、线、多线、多边形和多边形,并返回用该缓冲区半径包装的任意多边形。