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

时间:2017-11-22 06:34:16

标签: gis postgis

我有一个包含LineString几何的表(SRID = 4326)。鉴于这条线,我也有一个"左边"和"对"每行的里程值。他们可能并不总是平等的。

我想从该LineString生成一个多边形,该多边形在英里的每一侧都正确展开,以形成一个结果矩形。

到目前为止,我试图在此处修改此解决方案但没有成功:https://gis.stackexchange.com/questions/60655/polygon-to-fill-gap

我可以使用ST_OffsetCurve()生成两条平行线,但到目前为止还没有能够创建多边形。非常感谢任何建议!

3 个答案:

答案 0 :(得分: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的情况,见图: Convex Hull

答案 1 :(得分:0)

计划如下:

  • 进入某个坐标空间,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)缩放offser米值以考虑地球曲率。

答案 2 :(得分:0)

如果我正确回答了您的问题,那么您可能需要从这里Creating a polygon around a linestring with PostGIS得到答案 。关键是ST_Buffer()函数,该函数用缓冲区半径包装内容。但是,它不是一个矩形-它使直线周围呈椭圆形。该函数接受点,线,多线,多边形和多多边形,并返回以该缓冲区半径包裹的任何点。