你真的会用PostGIS中的buffer缓冲吗? (2)

之所以会出现椭圆是因为,在geojson转几何图形时(看下图),St_geomfromgeojson 函数返回的是geometry类型,缓冲时ST_Buffer函数接收到geometry类型就会选择使用欧式方法进行缓冲,但geojson中的数据却是球面坐标的经纬度数据,缓冲的半径传入的也是弧度单位,用球面坐标和弧度距离单位,在欧式方法的平面地图算法中计算,最终结果是个椭圆也就不奇怪了。

image-20201112141538745

嗯~ 有道理。

转一下坐标试试,下图红框中就是坐标转换的过程,同时,因为使用投影坐标计算,buffer的距离参数可以直接使用米,不需要再转成弧度了。

image-20201112150016107

再试,大圆是测地线方法,小圆是欧式方法,哈哈,完美!

image-20201110192011776

最后再验证一下准确性问题,测一下距离,看哪个准。

很明显,下图中,500米的距离和上图中大圆的边界是一致的,也就是测地线方法更准确。

image-20201112151837047

小疑问:

为啥示例中测地线方法缓冲的圆还是个正圆,不是会变形吗?

答:主要原因是,示例中的缓冲距离只有500米,范围太小。同样是北京,如果是缓冲1000公里以上,就能看出明显的变形。

总结:

buffer有两种构建方式,欧式方法和测地线方法

欧式方法是在投影变形后的平面地图上进行缓冲计算,优点是算法简单,效率高,缺点是结果有误差,误差大小取决于投影方式、缓冲位置和缓冲距离。

测地线方法是在三维椭球体上进行缓冲计算,优点是结果准确,不受投影变形的影响,缺点是算法复杂,大数据量时可能会影响效率。

truf.js 只支持欧式方法。

arcgis server 支持两种构建方式。

postGIS 支持两种构建方式,默认是欧式方法,欧式方法中,参数如果是经纬度坐标,需要先将经纬度坐标转换为投影坐标再进行计算,不然缓冲的结果会是个椭圆。将参数的类型从geometry强制转换为geography 后,postGIS会采用测地线方法进行缓冲计算。

示例、源码

这个示例是文中用到的示例,可以在线访问,使用浏览器开发者工具可以看到代码。

postGIS缓冲区示例

这个函数脚本,包含文中提到的欧式方法和测地线方法,传入和返回都是geojson格式,缓冲半径单位是米,通过类型控制缓冲方式。直接执行就会创建函数。

postGIS中buffer函数脚本

参考文档

https://desktop.arcgis.com/zh-cn/arcmap/10.3/tools/analysis-toolbox/how-buffer-analysis-works.htm

原文地址:?blog=postGISbuffer

关注《GIS兵器库》公众号, 第一时间获得更多高质量GIS文章。

你真的会用PostGIS中的buffer缓冲吗?

本文章采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名《GIS兵器库》(包含链接:  ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgfwxd.html