作者:胡浩杰,王天林,时间
来源:《科技传播》 2018年第10期
摘 要 文章主要讨论了以直接利用《PDF 规范》制作复杂PDF 地图符号过程中遇到的问题及解决方法。通过制作圆形符号将全图的圆形(包括点)全部通过圆形符号来调用,大大减少了PDF 地图的数据量。通过组合符号的实现,创造了一条在PDF 地图制图过程中,利用简单符号组合合成复杂符号的方法,简化了复杂符号的制作。通过研究PDF 地图符号的精确控制,解决了因PDF 图形边界显示原理而带来的描边符号变大的问题。
关键词 PDF 地图;地图符号;制作研究
中图分类号 TP3 文献标识码 A 文章编号 1674-6708(2018)211-0065-03
PDF 地图是一种符合PDF 规范的电子地图,它具有数据量小、使用方便等特点[1]。目前PDF 地图的制作主要依靠直接将栅格地图利用PDF 制作工具转为PDF 格式,或者是利用EPS 数据制作矢量PDF地图。2011 年研究生学术论文《地理PDF 地图制图关键技术研究》详述了以直接写入符合《PDF 规范》的编码的方法来制作矢量PDF 地图。2018 年2 月期刊《工程技术》论文《矢量PDF 地图符号制作研究》一文,讨论了矢量PDF 地图符号库的制作方法。本文主要讨论了在制作较为复杂的矢量PDF 地图符号过程中遇到的问题及解决方法。
1 圆的处理
1.1 拟合圆的数据量问题
因为PDF 中没有描绘圆形路径的路径构建操作符,因此在PDF 中描绘圆形需用贝塞尔曲线来描绘。在学术论文《地理PDF 地图制图关键技术研究》第2.3.3 节中详述了PDF 中矢量圆的构建方法。采用这种拟合方法构建的圆一共需要使用四段贝塞尔曲线。下面这段代码是在PDF 页面内容流中构建圆形和矩形的数据量比较示例:
1000m
155.23 0 200 44.77 200 100 c
200 155.23 155.23 200 100 200 c
44.77 200 0 155.23 0 100 c
0 44.77 44.77 0 100 0 c
上面这段PDF 代码构建了一个中心在(100,100)点,半径为100 的圆。这个圆占用了123 个字节。
0 0 200 200 re
上面这段PDF 代码构建了一个左下角在(0,0)点,边长为200 的正方形。这个正方形占用了14个字节。
由此可见圆的数据量大大超过了其他图元的数据量。而在PDF 地图制图过程中,圆的使用是大量的。如果可以制作一个基本图元符号,让整张PDF地图的所有圆形都调用这个符号,那将大大减少整幅PDF 地图的数据量。
1.2 圆形符号的构建
1.2.1 路径描绘操作符的选择
地图中一般有3 种圆形符号。一是只描边的圆形符号;二是只填充的圆形符号;三是既描边又填充的圆形符号。这三种圆形符号因为其使用的路径描绘操作符的不同必须做成三种不同的符号。只描边的圆形符号使用路径描绘操作符S ;只填充的圆形符号使用路径描绘操作符f ;既填充又描边的圆形符号使用路径描绘操作符B[2]。
1.2.2 有效数字的选择
建议构成圆形符号的贝塞尔曲线的参数的有效数字可以多一些,一般在4 ~ 5 位。原因有3 点:一是PDF 中的圆形是由四段贝塞尔曲线拟合而成的,存在一定的误差。如果地图中的圆形有测量意义,精度要求更高,其参数的有效数字还可以设置的更多以保证其精度。二是圆形符号在地图中会放大缩小,在放大的过程中其误差也会放大。三是作为一个符号其参数增加一两位的有效数字对地图的数据量影响很小。但是有效数字也不能太多,太多的有效数字会增加地图打开时CPU 的计算量,减慢地图打开速度,因此只要达到精确度要求即可。
1.2.3 符号的图形状态
尽管资源对象序列中的符号可以加入颜色、线宽等图形状态。但这里的圆形符号是全图调用的,原因是加入这些状态后,全图的圆形符号的颜色和线宽都不能变化或不能按照制图员的意志来变化。因此建议圆形符号的内容流里只写入路径和路径描绘操作符,所有图形状态包含颜色和线宽都在调用圆形符号的内容流中设置。另外如果整张PDF 地图的圆形符号的颜色都是一个颜色,可以在圆形符号中设置颜色,这样调用符号时就不用设置颜色了且所有对圆形符号的颜色设置都会失效。
2 组合符号的实现
前文所述的圆形符号已经可以在PDF 中调用,但很多符号中有一个或多个圆形。为进一步减少数据量,符号中的圆形也可以直接调用圆形符号来构建,即用组合符号的方法来实现。
组合符号利用现有的一种或多种PDF 资源对象,在组合符号的流数据中通过矩阵变换改变PDF资源对象的大小、位置等状态,组合成新的更复杂的PDF 地图符号。组成组合符号的PDF 资源可以是已有的PDF 地图符号、栅格图像、文字等PDF 资源对象。本文以利用PDF 地图符号构建组合符号为例,描述组合符号的构建方法。
PDF 地图符号的组成元素和页面对象的元素构成类似,都是利用数据流在相应的空间中描绘图形。经过实验发现在符号资源对象中可以通过和页面对象中相似的结构来利用现有的PDF 符号资源,也就是在组合符号对象的Resources 属性中添加要利用的PDF 符号资源的序号和别名,在组合符号的流数据中用Do 操作符调用这个符号资源对象并用cm 变形矩阵进行平移和变形[1]。
图1 是一个省级行政符号的PDF 代码示例。示例中利用了一个只描边的圆(对象序号7)和一个只填充的圆(对象序号8),组合而成了一个省级行政符号?。
3 PDF 地图符号的精确控制
3.1 PDF 图形边界显示原理
通过实验发现,PDF 中只描边的图形,当描边宽度大于1 时,是以边界向内外均匀扩展描绘而成;如果是填充图形,则是从边界向内填充。例如代码中描绘一个半径20,边宽为6 的只描边的圆,实际上显示了一个外径为23,内径为17 的圆;如果代码中描绘一个半径20 的只填充的圆,则显示一个半径为20 的填充圆;如果代码中描绘一个半径20,边宽为6 的既填充又描边的圆,则显示一个半径23,边宽为6 的既填充又描边的圆。
3.2 符号空间的精确控制
符号空间是描绘PDF 地图符号所在的空间,相当于描绘符号的一张“画布”。这个空间设置的太大会增加显示PDF 地图的内存占用量。空间太小则会使PDF 地图符号显示不完全。因此一般建议使用PDF 地图符号的外切矩形来设置符号空间。
确定外切矩形的算法已经很成熟,本文不再复述。下面主要讨论PDF 图形边界显示原理对确定符号空间的影响。下面有个例子,在线宽大于1 的情况下,如果按图形的外切矩形设置符号空间的大小就会出现图2 情况。
图2 中,按照圆的外切矩形设置了符号空间,其结果是图形被裁剪,符号显示不完整,其符号空间设置得不够。根据PDF 图形边界显示原理,描边图形的边界向外扩展了半个线宽,因此需要将符号空间向外扩展半个线宽的长度。例如一个半径为20,圆心在(0,0)点,描边宽度为6 的圆,其符号空间应设置为[-23 -23 46 46]。
3.3 符号大小的精确控制
PDF 图形边界的这种显示方式,会使符号变大。这种符号变大可能会带来以下几个方面的问题。一是导致符号之间的关系发生变化。例如设计的是一个符号和另一个符号相切,实际会出现因为符号变大而变成两个符号相交的现象。二是定位点的位置发生变化。例如,原本在符号边界上的定位点会向符号内移动半个线宽导致一定程度上的符号定位不准,影响定位精度。
因此,如果符号的线宽较大或精度要求高就必须要在制作符号时有意减小符号以达到精度要求。例如一个半径20,圆心在(0,0)点的圆,为使其符号达到精确大小,实际应在代码中描绘一个半径17,圆心在(0,0)点,描边宽度为6 的圆。
4 结论
本文主要讨论了复杂PDF 地图符号制作过程中遇到的问题及解决方法。通过制作圆形符号将全图的圆形(包括点)全部通过圆形符号来调用,简化了圆形符号的使用,减少了地图加载过程中的计算量,提升了地图加载速度,大大减少了PDF 地图的数据量。通过组合符号的实现,创造了一条在PDF地图制图过程中,利用简单符号组合合成复杂符号的方法,简化了复杂符号的制作。通过研究PDF 地图符号的精确控制,解决了因PDF 图形边界显示原理而带来的描边符号变大的问题,保证了地图显示的精确性。
因篇幅问题不能全部显示,请点此查看更多更全内容