PostGIS中的ST_Buffer对于同一组线会产生不同的结果

时间:2019-02-27 11:48:12

标签: google-maps geometry geospatial postgis geo

我们有一个由多个点(蓝线)组成的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合并生成的Polygon。
    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

1 个答案:

答案 0 :(得分:0)