一、介绍算法:

缓冲区分析是邻近度分析的一种,缓冲区是为了识别某一地理实体或空间物体对其周围地物的影响度而在其周围建立具有一定宽度的带状区域。缓冲区作为独立的数据层进行叠加分析,可应用到道路、河流、环境污染源、居民点、辐射源等的空间分析,为某种应用目的提供科学依据,另外,结合不同的专业模型,可以在生活、军事、城乡规划等领域发挥重要的作用。

针对点、线、面不同的几何类型,建立缓冲区的方式相互有所不同。建立点缓冲区比较简单,即以某点要素为圆心,以缓冲半径 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

GEOShttps://trac.osgeo.org/geoshttps://github.com/libgeos/geoshttps://github.com/libgeos/geosDownload Source | GEOSDownload Sourcehttps://libgeos.org/usage/download/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分开处理的)。

3、开源项目推荐:Shapely

Shapely是GEOS的python版本

Shapely · PyPIGeometric objects, predicates, and operationshttps://pypi.org/project/Shapely/

https://github.com/Toblerity/Shapelyhttps://github.com/Toblerity/Shapely

4、开源项目推荐:Clipper

Clipper - an open source freeware polygon clipping libraryhttp://www.angusj.com/delphi/clipper.phpClipper download | SourceForge.netDownload Clipper for free. Polygon and line clipping and offsetting library (C++, C#, Delphi) The Clipper library performs clipping and offsetting for both lines and polygons. All four boolean clipping operations are supported - intersection, union, difference and exclusive-or.https://sourceforge.net/projects/polyclipping/

四、参考文献

a) GRASS (Geographic Resources Analysis Support System)

GRASS GIS - Bringing advanced geospatial technologies to the world

https://staging.grass.osgeo.org/

https://github.com/OSGeo/grass

b) GEOS (Geometry Engine - Open Source) GEOS

c) JTS(JTS Topology Suite)JTS Topology Suite

d) GIS缓冲区应用及算法实现 GIS 缓冲区应用及算法实现 - Flyingis - BlogJava

e) Buffer介绍 http://www.volusia.org/gis/buffer.htm

f)  《地理信息系统算法基础》,作者:张宏 温永宁 刘爱利等 出版社:科学出版社

五、学术论文

1、GIS空间缓冲区生成算法的概述与比较

2、基于栅格游程与边界矢量的缓冲区算法研究与实现

中国科学院 方金云 织女星地理信息系统平台(VegaGIS)

六、参考博客

GIS缓冲区算法对比研究(Buffer Algorithm)_wsh6759的CGIS专栏-CSDN博客GIS缓冲区算法对比研究(Buffer Algorithm)                ----by wangsh 一.介绍算法:缓冲区分析是邻近度分析的一种,缓冲区是为了识别某一地理实体或空间物体对其周围地物的影响度而在其周围建立具有一定宽度的带状区域。缓冲区作为独立的数据层进行叠加分析,可应用到道路、河流、环境污染源、居民点、辐射源等的空间分析,为某种应用目的提供科学依据,https://blog.csdn.net/wsh6759/article/details/5739230 https://blog.csdn.net/wsh6759/category_583378.htmlhttps://blog.csdn.net/wsh6759/category_583378.html

GIS系列专题(3):缓冲区算法对比研究(Buffer Algorithm),类似刀具补偿相关推荐

  1. 线段求交算法对比研究

    线段求交算法对比研究 -----by wangsh 一.介绍 线段求交算法在计算几何,地理信息系统算法等相关应用中占有重要的位置,本文简单给出算法说明. Bentley & Ottmann于1 ...

  2. 基于深度学习的交通标识别算法对比研究-TensorFlow2实现

  3. 基于深度学习的天气识别算法对比研究-TensorFlow实现-卷积神经网络(CNN) | 第1例(内附源码+数据)

  4. 毕业设计-基于 MATLAB的红外图像预处理算法对比研究

    目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言

  5. 基于matlab的数字图像边缘检测算法研究,基于MATLAB数字图像边缘检测算法的研究与对比分析...

    ·161· 居 舍 研究探讨 2017年10月(中) 1 绪论 图像边缘中通常包含着重要的边界信息,这些边界信息便于分析和研究图像.另外,边缘检测可以大大降低图像处 理的工作量,将提高图像分析的效率. ...

  6. 深度信念网络_【文章推荐】应用于油中溶解气体分析的深度信念网络与典型神经网络对比研究...

    文章推荐 应用于油中溶解气体分析的深度信念网络与典型神经网络对比研究 原文发表在<高压电器>2020年第9期. 请进<高压电器>网站(www.zgydq.com)下载全文. D ...

  7. 开源GIS平台空间数据管理与发布技术研究

    毕业论文(设计) 题目: 开源GIS平台空间数据管理与发布技术研究 2014 年 5 月 摘要 本文系统地分析了网络地理信息系统(Web GIS)工作原理,阐述了使用免费.开源的GIS平台的开发模式. ...

  8. 中科院张士峰:基于深度学习的通用物体检测算法对比探索

    https://www.toutiao.com/a6674792954369933838/ 人工智能论坛如今浩如烟海,有硬货.有干货的讲座却百里挑一.由中国科学院大学主办,中国科学院大学学生会承办,读 ...

  9. 基于NSGA-II算法的研究和改进

    基于NSGA-II算法的研究和改进 在大学的时候学习了有关NSGA2算法的相关知识,对这个颇有兴趣,想着把自己学习的内容都记录下来.同时也是自己第一次开始写博客,想开始自己以后的博客之路,为下班后的业 ...

  10. SHA3系列(KECCAK)哈希算法原理及实现(附源码)

    相关文章: (本文持续更新中) SHA3系列(KECCAK)哈希算法原理及实现(附源码) SHA512系列哈希算法原理及实现(附源码) SHA224和SHA256哈希算法原理及实现(附源码) 国密SM ...

最新文章

  1. 一文看懂神经网络初始化!
  2. 阿里云1C2G虚拟机【99/年】羊毛党集合啦!
  3. GreenPlum查看表和数据库大小
  4. 【Spring学习】spring动态配置多数据源
  5. Java快速排序的调试
  6. 自动匹配未认领订单编号_海量订单系统微服务开发:使用MongoDB支持海量数据...
  7. CSS之Box-sizing
  8. Spring4 MVC HelloWorld 注解和JavaConfig实例
  9. 在windows上搭建一个ftp服务器
  10. 单调有界定理适用于函数吗_第二百零二夜:导数与三角函数
  11. java怎样控制迭代周期_如何在Java中迭代日期范围?
  12. 书评 – 程序员经典读物(2)
  13. 聚合数据接口,提供开放API
  14. wxpython绘图保存_wxPython绘图模块wxPyPlot实现数据可视化
  15. C++对ascii文件按行和分隔符读取并显示
  16. TokenInsight对话首席——暗流涌动,钱包如何引领数字资产新生态
  17. 恶劣天气 3D 目标检测数据集收集
  18. npm安装同一个包的不同版本,以echarts为例
  19. CentOS 7 安装rar解压rar
  20. 图片太大怎么压缩变小,如何压缩图片?

热门文章

  1. 基于Xilinx的FPGA下载配置详解及几种电路参考设计
  2. 路由器、交换机、网关
  3. c语言正弦函数求导,正弦函数求导公式基本推导
  4. 什么是水仙花数python_什么是水仙花数python
  5. intent-filter属性介绍
  6. android倒计时器
  7. 怎么用计算机算lnx,lnx等于多少怎么算
  8. w ndows摄像头驱动怎么安,如何安装摄像头驱动?求安装步骤和方法!!!
  9. python爬虫qq音乐歌词_10、 在QQ音乐中爬取某首歌曲的歌词
  10. 2048游戏(C语言)