google-maps - PostGIS 中的 ST_Buffer 对同一组行产生不同的结果
问题描述
我们有一个由多个点(蓝线)组成的 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 ] ));
有没有人能够解释我们所看到的不同结果,表面上使用相同的坐标集,特别是为什么相交线会如此显着地改变缓冲区?
这是创建(不同)路线的示例,显示了一旦添加了与路线的另一部分相交的线,缓冲区几何形状如何发生显着变化。
解决方案
GIS StackExchange 上一个非常好的人在这里给出了一个很好的答案:
推荐阅读
- jquery - 如何切换使用滚动(功能)的元素?
- python - Openpyxl 无法读取引用它之前写入的单元格的函数值
- javascript - 需要重新指定实现接口方法的类方法的参数类型?
- vb.net - 运行应用程序时字体只会更改一次
- python - 如何为 Python 中的线程设置异步事件循环?
- python - 如何同步执行操作以进行内存管理?
- sql-server - 没有重复项的 SQL Server 数据
- jquery - 单个视图中的 Django 多个表单集仅保存最后输入的值
- marklogic - 将控制台上的 uris 输出保存到文件系统
- android - 蓝牙 CSR8510 未连接到多个 BLE 设备