抽稀(概化)
2023年12月27日大约 4 分钟
抽稀(概化)
背景/应用场景
随着对海量地理空间数据加载、渲染的需求日益增加。在地理信息系统中,对一些细节程度高的数据在地图上的展示往往需要绘制大量的坐标点,当地图缩放层级较小时,并不需要将所有的点都绘制出来,因为全部绘制出来往往会存在性能问题,因此,可通过抽稀算法,将不重要的点舍弃掉,那么系统对矢量数据加载的处理性能将得以提高,同时不影响视觉效果。
抽稀算法类型
抽稀,也称作概化。抽稀算法的关键是定义抽稀因子,抽稀因子的不同决定了抽稀算法的多样性。在现有抽稀理论中,有按步长,线段长度,垂距等来定义抽稀因子。1在GIS领域,比较常用的抽稀算法是Ramer-Douglas-Peucker算法(基于距离)和Visvalingam-Whyatt算法(基于面积)。
Ramer-Douglas-Peucker(道格拉斯-普克)
从整体角度来考虑一条完整曲线或一段具体线段,思路为:
- 确定距离阈值
D
,即抽稀因子,作为判断是否抽稀的指标 - 对曲线的首末两点虚连一条直线,计算曲线每个点到虚直线的距离,找到最大距离
Dmax
,判断其距离与距离阈值D
的关系 - 如果
Dmax < D
,则舍弃该曲线的所有中间点,将虚直线作为抽稀后的线段 - 如果
Dmax >= D
,则找到Dmax
在曲线上的对应的点作为分割点将当前曲线分割为两段,继续对这两条线段进行第2步
操作(即递归处理,直至所有Dmax < D
,则处理完毕)

上图说明(可对应思路说明进行理解):
- 黑色曲线:表示抽稀前的曲线
- 浅蓝色直线:表示虚直线
- 深蓝色直线:表示抽稀后的曲线
- 最大值对应点(红色):表示
Dmax < D
,可以舍弃该曲线的所有中间点 - 最大值对应点(绿色):表示
Dmax >= D
,需要进行曲线分割并重新处理
Visvalingam-Whyatt
是一种渐进式的抽稀方式,思路为:
- 确定距离阈值
A
,即抽稀因子,作为判断是否抽稀的指标 - 在一条曲线中,计算由三个连续的点所形成三角形面积,找到这些三角中的最小面积
Amin
,判断其面积与面积阈值A
的关系 - 如果
Amin < A
,则删除该面积对应三角形中的中间顶点,继续对剩下的顶点所形成的曲线进行第2步
操作(即递归处理,直至所有Amin > A
,则处理完毕)

Ramer-Douglas-Peucker和Visvalingam-Whyatt的算法区别
Ramer-Douglas-Peucker
算法的优点是计算简单,但它的结果可能会出现自相交Ramer-Douglas-Peucker
计算效率更高,它的时间复杂度是O(n^2)
,Visvalingam-Whyatt
的时间复杂度是O(n·log(n))
。Ramer-Douglas-Peucker
算法的阈值是距离,Visvalingam-Whyatt
算法的阈值是面积- 相比起
Ramer-Douglas-Peucker
算法的选取保留点,Visvalingam-Whyatt
算法是选取删除点 - 相比起
Ramer-Douglas-Peucker
算法,Visvalingam-Whyatt
算法产生的角度变化更小,更能保留几何面的特征,更加适用于河流、森林或海岸线等自然线条或多边形特征的抽稀
拓扑问题
概化数据可能会破坏数据的拓扑关系,因此,可以先将数据转化为拓扑结构,再对拓扑数据进行数据概化(抽稀)
实现
已有实现
- mapshaper -simlpify
- Simply.js
- OpenpLayers —— ol/geom/Geometry -> simplify(tolerance)
- QGIS —— MenuBar -> Vector -> Geometry Tools -> Simplify
- QGIS —— ToolBox-> GRass -> Vector -> v.generalize