矢量数据压缩(二)

来源:互联网 发布:域名劫持简单原理 编辑:程序博客网 时间:2024/05/07 05:02

 

吴小芳 (华南农业大学) 陈玉进 李泉(南京跬步科技有限公司http://www.creable.cn )

其中,距离阈值的选取,通常根据人工对线要素复杂性的判断,凭经验来选取。因此,Douglas-Peucker 算法综合后保留点的多少,取决于人工判断的曲线的复杂性。即人工经验的距离阈值大小决定了线要素综合后所保留点的数目。

Douglas-Peucker 算法它从整体到局部即由粗到细来确定曲线压缩后需要保留点的过程, 具有平移旋转不变性同时具有给定曲线与限差后压缩结果一致的优点但该方法没有考虑矢量数据( 曲线) 之间的拓扑关系无法有效地控制偏差面积的大小曲线压缩后的保留点的压缩比不可能是在满足给定精度条件下的最大压缩比。

针对上述道格拉斯—普克法的缺点许多学者针对具体的运用需求对该方法进行不同程度的改进翟战强、管华等人提出用穷举搜索法寻找相邻多边形的公共边与非公共边再分别对其进行压缩杨得志王杰臣等人提出利用径向距离约束方法有效解决了无法有效控制偏差面积的大小的缺点黄培之提出的“具有预测功能的曲线矢量数据压缩方法” 在同一精度限差条件下能取得比Douglas-Peucker方法更高的压缩比,在相关文章资料中,均可以查阅具体的方法,本书中不作详细论述。

 

2 面要素化简

面状图形要素由一条或多条线状图形要素围成,其基础也是线状图形要素,因此面要素化简,可以看作一种特殊形式的线要素化简,可将面要素边界的最左边和最右边作为起始点,将面要素拆分为两条线要素,依据线要素化简算法,如Douglas-Peucker算法,对两条线要素进行化简,从而实现对面要素的坐标化简。

然而,在对面要素化简时,如果不考虑矢量数据( 曲线) 之间的拓扑关系,将会导致原有面要素拓扑关系被破坏,例如具有公共边的两个面要素,在化简时没有考虑要素之间的相互关系,压缩时只是按照要素自身的特点将公共边独立处理,因此会出现相邻两个面状目标的边界压缩后不一致的现象,公共边界处出现裂缝,其拓扑关系被破坏。

因此,在对面要素化简时,须对多边形的公共边和公共节点采用特殊的处理,以防止以上情况出现。面要素化简的基本思路是:(1)对面要素的预处理过程,提取相邻多边形的公共边,按照一定的逻辑结构生成等效的线数据;(2)利用Douglas-Peucker算法对等效线数据进行化简;(3)化简完毕,按照生成等效数据的索引顺序,重建面要素数据,并按照原始的数据格式进行存储。其中用Douglas-Peucker算法在线要素化简中已经详细说明,书中着重讲解第一步对面要素进行预处理,生成等效线数据的思路。

对面要素进行预处理,生成等效线数据,实际上是数据重组的过程。对于无拓扑数据,由于公共边没有任何特定标识,必须在整个矢量数据范围内查找公共边,将其从多边形数据中独立出来,建立元数据。为了准确描述原来的图形,必须建立这些元数据的索引。其基本步骤如下:

(1)       对于两多边形AB,首先判断其外接矩形是否相交,若不相交,则不进行以下公共边查找和数据预处理操作。反之,执行以下操作。

(2)       采用深度搜索匹配法,选取多边形A一个种子点,然后寻找多边形B上坐标相同的点,再按照一固定的方向搜索匹配其它的相同点。基本思路是:

a. 数据准备,读取多边形A坐标{P1 ,P2 , Pn},多边形B坐标{b1 ,b2 , ,bm}

b. A 的一个点Pi ,i[0,n1]

c. 判断Pi与多边形B的坐标{b1 ,b2 , ,bm}是否相等,若存在Pibj 则记录startNO1 =i ,startNO2 =j,否则转b,循环遍历A中的其他点。

d. 顺序比较Pi (i = i+1 ,i+2 , ,n) bj (j = j + 1 , j + 2 , ,m)Pibj是否相同。若相同,i ,j 分别依次增加,继续循环操作,直到找到最后一对相同的点,并记录它们的点号为endNO1 endNO2 ,转到g ;否则,e

e. 逆序比较Pi (i = i+1 ,i+2 , ,n) bj (j = j - 1 , j - 2 , ,0)是否相同,记录它们的点号为endNO1 endNO2 ,g ;否则,b, 循环遍历A中的其他点;

g. startNO1,endNO1 startNO2 ,endNO2 分别作为多边形A B 的检索表的一部分。

f. 按照多边形的索引表建立元数据。

其中在数据坐标匹配j中,需注意,若坐标为doublefloat类型,若仅通过大小值完全相等进行判断容易产生错误,如11.999999 12.00坐标值相差无几,而且人眼视觉上也认为其坐标是重合的,而计算机中通过大小相等判断,无法得到坐标匹配相等的结果,因此,需考虑设定一定值的容差,通过判断两坐标之差是否在容差范围内,若在范围内,则认定坐标值相等。反之,则不相等。

在对面要素进行预处理之后,对预处理的元数据采用的Douglas-Peucker算法进行压缩,然后,依据索引表,将每条记录对应的元数据进行首尾相连,组成一个完整的多边形。即实现对存在公共边的面要素化简。

矢量数据的无损压缩,是在不删除节点的情况下,对坐标进行变换来达到缩减坐标数据量的目的。比如,坐标是用double型存储的,将小数点后移几位,把double变成int,在必要的空间运算中,通过反变换再变换回来;再比如,通常,线的各节点坐标位移不大,保留首节点原始坐标,其他节点只保留与该节点的偏移量,并变换为int型。以上两种属于线性变换,有运算简单效果好的优点。

点群的压缩,是依据voronoi图来实现的;还有许多其他的方法,比如通过积分变换的方法等等,留给读者自己思考吧:-)

[1] 徐庆荣,杜道生,黄伟,费立凡,计算机地图制图原理,武汉测绘科技大学出版社,1993P61-62