GIS缓冲区算法对比研究(Buffer Algorithm)
转载:https://blog.****.net/wsh6759/category_583378.html
一、介绍算法:
缓冲区分析是邻近度分析的一种,缓冲区是为了识别某一地理实体或空间物体对其周围地物的影响度而在其周围建立具有一定宽度的带状区域。缓冲区作为独立的数据层进行叠加分析,可应用到道路、河流、环境污染源、居民点、辐射源等的空间分析,为某种应用目的提供科学依据,另外,结合不同的专业模型,可以在生活、军事、城乡规划等领域发挥重要的作用。
针对点、线、面不同的几何类型,建立缓冲区的方式相互有所不同。建立点缓冲区比较简单,即以某点要素为圆心,以缓冲半径 R作圆,得到点要素的缓冲区;线要素的缓冲区是以线为轴,以 R为距离作两侧的平行线,在线的两端构建两个半圆弧段,和平行线一起组成缓冲区;面缓冲区的建立,是以面要素的边界为基线向内外侧作平行线,平行线和基线里的区域就是面缓冲区。除此之外,还可以对栅格数据建立缓冲区,根据不同的模型方程建立动态缓冲区,不论对什么样的数据建立缓冲区,其基本方法都是相似的。(见参考文献4)
开源版本的的GRASS,GEOS和JTS里面都有Buffer算法模块,其中GEOS是JTS的C++版本。
使用GEOS的应用有PostGIS (C API),MapServer (C API),Quantum GIS (C API),OGR (C API),GRASS (C API),Shapely (C API),INGRES (C API),SpatiaLite (C API),MapGuide Open Source GeoDjango (C API),MapWindow GIS (C API), osm2pgsql (C++ API),osgEarth (C++ API),MonetDB (C API),rgeos (C API),其中还有软件包的FME和Autodesk MapGuide Enterprise。
GRASS版本介绍(见http://grass.itc.it/gdp/html_grass63/v.buffer.html)(相关的工程介绍见http://download.osgeo.org/grass/grass6_progman/)
这里仅列出相关源码,待以后列出对比算法分析,算法性能等。
二.算法说明及伪代码演示
缓冲区实现算法有矢量方法和栅格方法两种。其中矢量方法数据量小,方法相对成熟,栅格图像需要进行栅格像元之间进行布尔运算,当缓冲区较大时会带来较重的运算负荷,实际运用中存在一定的局限性。矢量方法算法一般遵循以下步骤:
点:确定中心点——以中心点为圆心、 R为半径生成一个圆——得到缓冲区边界;
线、面:确定轴线——以距离 R生成中心轴线的平行曲线——处理转角弧段——对生成的弧段进行求交、合并运算——生成缓冲区边界;
常用的矢量数据中心线扩张算法:
角分线法
基本思想:即“简单平行线法”,在轴线的两边作出平行线,在转角处形成尖角,两端形成弧段,组成缓冲区。
缺陷:难以保证在尖角处缓冲区左右边线等宽;校正过程复杂,主要体现在轴线折角很大和很小时的情况;算法模型复杂,主要是因为几何生成过程中需要处理较多的异常。
凸角圆弧法
基本思想:顾名思义,即是在转角外侧用圆弧来代替尖角,内侧仍然使用尖角的方法,生成缓冲区。
实施步骤:
1. 直线性判断,判断相邻三点是否在同一直线上;
2. 折点凸凹性判断,确定转角的地方哪侧使用直线求交,哪侧使用圆弧连接;
3. 凸点圆弧的嵌入,即将转角外侧形成的圆弧和两边的线段相连;
4. 边线关系的判别与处理,岛屿多边形参与缓冲区边界的构成,重叠多边形不参与缓冲区边界的构成;
5. 缓冲区边界的形成,具体是将重叠区域进行合并,绘制外围的边线,包括岛屿多边形的轮廓,形成最终的缓冲区边界。
在缓冲区算法中,需要注意的一个问题是缓冲区多边形的重叠与合并,包括同一要素缓冲区的重叠和多个要素之间缓冲区的重叠。栅格数据缓冲区内的栅格具有一个与其影响度对应的一个值,如果重叠区域具有相同影响度则任取一值,如果不同则采取影响度大的代替影响度小的方法处理。对于矢量数据的处理算法有三种:数学运算法;矢量-栅格转换法;矢量-栅格混合法。(见参考文献4)
三、源码
1、GEOS的源码(源码位置在GEOS/source/operation/buffer/BufferOp.cpp):
2、GRASS两个版本(源码位置grass\vector\v.buffer和grass-. src\vector\v.buffer,具体算法在grass\lib\vector\Vlib\buffer.c和grass\lib\vector\Vlib\buffer2.c)
第一个版本就是buffer.c版本(根据点,线和面类型分开处理:点和线归为一类处理;面分解为线对象处理,最后合并为面对象)。
第二个版本就是buffer2.c版本(这个是Google Summer of Code 2008的源码,将点,线和面的buffer分开处理的)。
四、参考文献
a) GRASS (Geographic Resources Analysis Support System) http://grass.itc.it/
b) GEOS (Geometry Engine - Open Source) http://trac.osgeo.org/geos/
c) JTS(JTS Topology Suite)http://www.vividsolutions.com/jts/jtshome.htm
d) GIS缓冲区应用及算法实现 http://www.blogjava.net/flyingis/archive/2006/04/17/41459.html
e) Buffer介绍 http://www.volusia.org/gis/buffer.htm
f) 《地理信息系统算法基础》,科学出版社。
五、学术论文
1、GIS空间缓冲区生成算法的概述与比较
2、基于栅格游程与边界矢量的缓冲区算法研究与实现
中国科学院 方金云 织女星地理信息系统平台(VegaGIS)