之所以会出现椭圆是因为,在geojson转几何图形时(看下图),St_geomfromgeojson 函数返回的是geometry类型,缓冲时ST_Buffer函数接收到geometry类型就会选择使用欧式方法进行缓冲,但geojson中的数据却是球面坐标的经纬度数据,缓冲的半径传入的也是弧度单位,用球面坐标和弧度距离单位,在欧式方法的平面地图算法中计算,最终结果是个椭圆也就不奇怪了。
嗯~ 有道理。
转一下坐标试试,下图红框中就是坐标转换的过程,同时,因为使用投影坐标计算,buffer的距离参数可以直接使用米,不需要再转成弧度了。
再试,大圆是测地线方法,小圆是欧式方法,哈哈,完美!
最后再验证一下准确性问题,测一下距离,看哪个准。
很明显,下图中,500米的距离和上图中大圆的边界是一致的,也就是测地线方法更准确。
小疑问:
为啥示例中测地线方法缓冲的圆还是个正圆,不是会变形吗?
答:主要原因是,示例中的缓冲距离只有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文章。
本文章采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名《GIS兵器库》(包含链接: ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。