矢量PDF 地图中“圆”的处理方法研究

2022-12-04 02:31胡浩杰李中全张顺喜
中文信息 2022年9期
关键词:贝塞尔数据量页面

胡浩杰 李中全 张顺喜

(78125 部队,四川 成都 610066)

矢量PDF地图是用矢量元素描述的PDF格式的电子地图。和在网络数据交换领域广泛使用的栅格PDF地图相比,矢量PDF地图因其制图相对困难的原因而鲜有使用。但矢量PDF地图具有数据量较栅格PDF地图小很多(10倍以上)的原因,矢量PDF地图一直以来都有着较好的使用前景。

Adobe公司提供了转换软件(如Adobe Acrobat)可以将EPS地图数据转换成矢量PDF地图。这样生产的矢量PDF地图用于出版是完美的,但用作电子地图使用就存在地图数据量大(和栅格PDF地图差不多)和地图打开速度慢的问题(慢到用户无法忍受)。这也导致了目前矢量PDF地图一般仅用于地图出版,而在网络交换领域很少使用。

因此,有必要利用公开的PDF编码机制结合矢量地图的特点制作适合于电子地图使用的矢量PDF地图。因为数据量越小的电子地图越能实现快速共享,因此在保持丰富的地图符号的基础上,极限追求最小的数据量就是研究矢量PDF地图的目标。本文主要研究解决矢量PDF地图中描绘“圆”的问题。通过分析PDF编码机制中“圆”的编码方法,提出了一种在矢量PDF地图中描述“圆”的方案,减少了矢量PDF地图的数据量。

一、PDF编码规则中对圆的特殊规定

根据《PDF Reference》中关于形状路径的构建规定,构建矢量路径只有折线、三次贝塞尔曲线和矩形,并没有能够直接构建圆的路径构建操作符。因此,矢量PDF地图中的圆只有利用三次贝塞尔曲线来描绘,但三次贝塞尔曲线是无法精确描绘一个圆的,而且用一条三次贝塞尔曲线来拟合的圆会出现肉眼可见的误差。目前比较好的方法是采用四条三次贝塞尔曲线来拟合圆,虽然仍然无法描绘完美的圆,但是已经可达肉眼不可觉察的要求了[1]。

图1显示了用四条三次贝塞尔曲线拟合圆的示意图。将一个圆分为四段,每段都用下面的公式来确定P0、P1、P2、P3四个控制点。

根据Adobe公司公开的PDF编码规则文档《PDF Reference》,构建一条三次贝塞尔曲线有三步。

第一步:使用“m”操作符开始一条路径。操作数为路径第一个点的坐标,例如:0 0 m,表示在(0,0)点开始以一条路径。

第二步:使用“c”操作符构建一条三次贝塞尔曲线。它有三个操作数,按照顺序分别是两个控制点和一个路径的终点。在图1中构建了一个四分之一的圆,其三次贝塞尔曲线的操作数按照顺序就是P1,P2,P3。

因此,构建图1中的一条四分之一圆的格式就是:

x1y1m %开始一条路径

X y1x2Y x2y2c %构建三次贝塞尔曲线

而构建一个完整圆就是连续的四条三次贝塞尔曲线。例如构建一个中心点在100 100,半径为100的圆的PDF编码如下。

二、处理圆的目的

在一幅矢量地图中存在大量的“圆”,如图2所示的地图符号都包含圆,特别是一个小圆点也要用实心圆来表示。矢量PDF地图中的一个“圆”需要用四条三次贝塞尔曲线来描绘。以固定三位数定位点坐标做比较,描绘一个圆需要占用117个字节而描绘一段直线需要22字节,矩形需要20字节,可见描绘一个圆的数据量大大多于其他图元。因此为了减少数据量,需要专题研究矢量PDF地图中“圆”的描绘方法(如图2)。

三、利用X对象避免圆的多次描绘

在PDF编码规则中,X对象是一种可以在页面中多次重复使用的页面资源。因此可以做一个基准“圆”,在矢量PDF地图页面中,任何使用圆的地方都可以调用这个基准圆。X对象可以是一个矢量图形,也可以是一个栅格图像。不建议使用栅格图像。第一,栅格图像本身的数据量不小,根据清晰度的不同几KB至十几KB不等。但对于一幅本身1MB左右的矢量PDF地图来说,已经很大了。第二,栅格图像在放大率较大的时候会出现模糊甚至是马赛克现象。第三,栅格图像是不透明的,无法实现空心圆。因此本文只讨论使用矢量图形来构建基准圆的方法。

1.X对象的编码机制

下面简要讨论X对象的编码方法[2]。

X对象是资源对象序列中的一种对象,如图3所示。设置两个X对象(填充圆和描边圆)就可以表示矢量PDF地图中的所有的圆。在资源对象序列中设置X对象后,需要在页面对象的Resource属性中注册,然后就可以在页面对象中使用了,在页面对象中使用只需要使用操作符Do即可。

上面的编码示例是在页面对象中注册了一个名为X1201的X对象。

上面的编码示例是在矢量PDF地图页面上放置了一个X对象。通过设置变形矩阵可以设置圆的大小,也可以把圆放到正确的位置,下面分别描述两个X对象的设置。

2.填充圆的设置

填充圆是既设置描边又设置填充的圆。填充圆的另一个重要作用是表示“点”。

上面的编码设置了一个填充圆。在构建了圆的路径后,采用路径描绘操作符“B”(作用是填充及描绘路径),将路径描绘在PDF页面中。在这个X对象中,没有设置任何的图形状态,如颜色、线宽、虚线样式等,这些属性都可以在页面对象中去设置,一旦在X对象中设置,在页面对象中的图形状态设置就无效了。这样就保证了这个X对象可以表达矢量PDF地图中的所有填充圆。对于“点”来说,实际上就是半径很小的黑色填充圆。在页面对象中不需要设置任何的图形状态,只需要设置变形矩阵cm,将填充圆设置的足够的小并且放置到正确的位置就可以了。

3.描边圆的设置

描边圆是只描边的圆,是一个空心圆。其X对象的编码和填充圆的编码几乎完全一样,只是将填充圆编码中采用的路径描绘操作符“B”改为“S”(作用是仅描边)。

考虑到既然描边圆和填充圆的代码几乎完全相同,能不能够在X对象中只设定路径而不描绘,在页面中去描绘呢。在《PDF Reference》并没有明确的相关规定。为此,专门进行了实验,试图在X对象中只描述路径,而既不加入图形状态操作符代码,也不用路径描绘抄作符来描绘。而实验结果并不支持使用这种方法,在X对象中如果不进行描绘,在页面对象中,即使使用了X对象,也无法完成对X对象路径的描绘。因此得出了PDF的X对象的必须要使用路径描绘操作符完成对路径的描绘的结论。

4.圆的大小和位置的控制

圆的大小和位置依靠在执行操作符Do前设置变形矩阵cm来实现。cm操作符有6个操作数a b c d e f,设置cm可以使X对象产生各种位移和变形,其中最简单的是缩放和位移。设置操作数中的a和d实现圆的缩放,这里的数字就是纵向和横向的缩放倍数,设置为2就是放大两倍,设置为0.1就是缩小10倍。这两个数字应设置为相同的数字,如果不这样设置圆就会形变为椭圆。操作数e和f实现圆的定位。因为X对象中设置的圆的中心点是(0 0)点,这里设置的e、f就是矢量PDF地图中圆的中心点的位置。例如设置为0.1 0 0 0.1 100 100 cm,就是放置了一个中心点为(100 100)的,半径为10的圆。

5.图形状态设置的注意事项

因为圆的大小和虚线样式都是用变形矩阵来控制的,而变形矩阵的缩放是对整个圆进行了缩放,对线宽和虚线都有影响。实际上,变形矩阵的缩放倍数对线宽和虚线样式的设置具有同样的缩放效果,如下例所示。

在上面的编码中,在描绘X对象X0前设置了线宽、虚线样式和变形矩阵,这样画出来的圆事实上是线宽为1,虚线样式为[2 1] 0 d的圆。

注意:图形状态不是一步一步起作用的,而是在执行图形描绘操作的时候才起作用的。交换图形状态的设置顺序对图形没有影响。例如,上例中交换图形状态的设置顺序为:

描绘出来的圆和前例相比没有任何变化。

四、效果分析

设置一个X对象的标准圆需要258个字节,设置两个标准圆需要516个字节。在矢量PDF地图中执行操作符Do描绘一个圆需要30个字节(包含设置cm变形矩阵)。和利用三次贝塞尔曲线描绘圆(需要117个字节)相比,数据量减少了75%。而因为设置两个基准圆的X对象(描边圆和填充圆)而增加的数据量只有0.5KB左右。地图中的圆越多,对地图数据量的减少也明显,一幅有1000个圆的地图,地图数据量的减少能达到87KB,而对于一幅1MB左右的矢量PDF地图,这样的数据量的减少已经很可观了。

对于单幅矢量PDF地图来说,使用这种方法减少的数据量并不是很大,对于目前高速的网络带宽和存储空间来说,这几十KB的优化看起来很小。但这样做的有以下几点好处。一是数据量是矢量PDF地图在网络数据交换领域的生命线,任何能够减少数据量的方法都是一次性能的提升。二是地理信息数据从来都是海量的数据。不论是存储还是网络传输,一旦和庞大的数量相乘就会发生质变。

五、结论

本文设计了一种利用X对象设置基准圆,在矢量PDF地图页面中利用变形矩阵描绘需求圆的方法。此方法避免了在矢量PDF页面中多次描绘需要用四条三次贝塞尔曲线来描绘的圆。另一方面,由于使用了X对象避免了大量三次贝塞尔曲线的生成,制作矢量PDF地图系统也减少了很多的计算量,也加快了矢量PDF地图的制图速度。在保证矢量PDF地图质量的情况下,不断减少矢量PDF地图的数据量,必将使矢量PDF地图的应用更加广泛。

猜你喜欢
贝塞尔数据量页面
刷新生活的页面
基于大数据量的初至层析成像算法优化
计算Lyapunov指数的模糊C均值聚类小数据量法
看星星的人:贝塞尔
宽带信号采集与大数据量传输系统设计与研究
基于虚宗量贝塞尔函数的螺旋带色散模型
求解贝塞尔类方程的推广试探函数法
高阶贝塞尔光束的Z扫描理论
网站结构在SEO中的研究与应用
浅析ASP.NET页面导航技术