PostGIS中的ST_Buffer为同一组行生成不同的结果

问题描述 投票:0回答:1

我们有一个由多个点(蓝线)组成的LineString(地图上的路线),然后我们将其缓冲以产生它周围的区域。我们发现除非路线与自身相交,否则一切看起来都符合预期,此时缓冲区域会获得相当大的纵向曲率。

一个例子显示了不同的结果:http://geojson.io/#id=gist:jgwconsulting/1e2a6e8bad9f018f2c6321016a527bef&map=6/55.621/-3.618

  • 灰色:整个路径作为单个LineString缓冲,导致缓冲区域的曲率。 SELECT ST_AsGeoJSON( ST_Buffer(ST_GeomFromGeoJSON('{"type":"LineString","coordinates":[[-14.466666666666667,55.25],[7.233333333333333,54],[0,58.86666666666667],[-11.7,52.06666666666667],[-12.6,56.55]]}')::geography, 9260, 'quad_segs=30 endcap=round join=round') );
  • 红色/橙色:LineString被分成由两个点组成的单独直线,然后缓冲每个直线,并使用ST_Union合并生成的多边形。 SELECT ST_AsGeoJSON( ST_Union( ARRAY[ ST_Buffer(ST_GeomFromGeoJSON('{"type":"LineString","coordinates":[[-14.466666666666667,55.25],[7.233333333333333,54]]}')::geography, 9260, 'quad_segs=30 endcap=round join=round')::geometry, ST_Buffer(ST_GeomFromGeoJSON('{"type":"LineString","coordinates":[[7.233333333333333,54],[0,58.86666666666667]]}')::geography, 9260, 'quad_segs=30 endcap=round join=round')::geometry, ST_Buffer(ST_GeomFromGeoJSON('{"type":"LineString","coordinates":[[0,58.86666666666667],[-11.7,52.06666666666667]]}')::geography, 9260, 'quad_segs=30 endcap=round join=round')::geometry, ST_Buffer(ST_GeomFromGeoJSON('{"type":"LineString","coordinates":[[-11.7,52.06666666666667],[-12.6,56.55]]}')::geography, 9260, 'quad_segs=30 endcap=round join=round')::geometry ] ));
  • 黄色:LineString被分成由两个点组成的单独直线,然后使用ST_Collect将每个点包装到MultiPolygon中。 SELECT ST_AsGeoJSON( ST_Collect( ARRAY[ ST_Buffer(ST_GeomFromGeoJSON('{"type":"LineString","coordinates":[[-14.466666666666667,55.25],[7.233333333333333,54]]}')::geography, 9260, 'quad_segs=30 endcap=round join=round')::geometry, ST_Buffer(ST_GeomFromGeoJSON('{"type":"LineString","coordinates":[[7.233333333333333,54],[0,58.86666666666667]]}')::geography, 9260, 'quad_segs=30 endcap=round join=round')::geometry, ST_Buffer(ST_GeomFromGeoJSON('{"type":"LineString","coordinates":[[0,58.86666666666667],[-11.7,52.06666666666667]]}')::geography, 9260, 'quad_segs=30 endcap=round join=round')::geometry, ST_Buffer(ST_GeomFromGeoJSON('{"type":"LineString","coordinates":[[-11.7,52.06666666666667],[-12.6,56.55]]}')::geography, 9260, 'quad_segs=30 endcap=round join=round')::geometry ] ));

是否有人能够解释我们所看到的不同结果,表面上是使用相同的坐标集,特别是为什么交叉线会如此显着地改变缓冲区?

这是创建(不同)路线的示例,显示一旦添加了与路线的另一部分相交的线,缓冲区几何体如何发生显着变化。

点击此链接:https://vimeo.com/320203046

google-maps geometry geospatial postgis geo
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.