图廓的构成其实相当复杂,不同比例尺下,图廓规定是不一样的。但是他们有一个共同点,即如果图号确定,那么所有布局的位置信息在ArcMap都会被确定。图廓组件的设计,应当尽量和数据分离,这样在不同数据情况下,都能使用,而无须改动。
以百万分幅为例,其他比例尺类似。百万比例尺下,图廓的五个主要部分是,主图区,接图表,比例尺,(高度表在大部分专题图中不予考虑),图例。其他还有一些是文本描述都可以归为一类,统称为文本信息。现在来看制图中变化和不变的地方,五大部分是相对于主图区定位,主图区确定,其他部分都可以确定,而主图区部分,只有一个变量参数,那就是图号。
考虑到图号决定图廓的绘制,那组件的设计就从主图区开始(敏捷开发的重点就是关注主要问题)。
事实上主图区的设置有很多地方需要考虑。
问题一,在pageLayout下如何固定MapFrame中地图显示的比例尺,这里以1:100万兰伯特投影为例
问题二,如何只显示图号计算出的制图区域范围
问题三,经纬网如何绘制(需要依据国标),经纬网部分包括了,经纬线,十字丝,短线,经纬标注,1:100万比例尺下不需要考虑方里格网
问题四,字体问题,事实上这是个大问题,国标里的字体规定和字体库德实际大小是有出路的,如果要严格符合国标,需要实际测量比较
问题五,主图区移动如何确保其他依赖主图区的部分也能相对移动,这对地图布局是一个非常大的好处
第一个问题,AO下找到接口可以设置。图廓的范围是依据图号计算的,但是图号计算的是地理坐标系,投完影后投影坐标范围是多少呢?这需要计算出来,投完影后的实际范围如何显示到纸面上?这就涉及到投影坐标系到纸面坐标系的转换(纸面坐标系,可以称为世界坐标系)。事实上,纸面坐标系到屏幕坐标系仍然存在转换(只有屏幕坐标系下的绘制才是最后可操作和绘制的)。依据仿射原理,我们直接求出地理坐标系和屏幕坐标系的关系,这是算法的本质,等这部分关系解决了,制图所需的图廓绘制过程就可以顺利开展了。
第二个问题,同上,实际上ArcGIS是不能设置类似曲边梯形图廓的(这是国内和国外图式的差异)。需要通过程序计算出投影后的图号对应的范围,然后设置显示区域,问题来了,MapFrame是矩形,我需要计算出外接显示区域的矩形大小,然后设计MapFrame。事实上当前1:100万的投影是左右对称的,不需要旋转显示区域而使得外接矩形的底部保持水平,但是根据经验,其他比例尺下,显示区域是需要旋转的(高斯克里格投影下这个问题很明显)。
第三个问题,参考国标。实际上有一个隐藏的问题,这从侧面反映了ArcGIS最强大的优势,投影中基本不存在误差或者误差非常微小,我的经纬标注实际是完全按国标布局的,经纬标注的内容由图廓确定的点位反算地理坐标得到的,而我惊奇的发现坐标转换居然不存在任何误差(我估计ArcGIS的投影组件精度如此之高,底层可能是Fortran实现的)。
第四个问题,同上,工作量其实会很大,因为标准汉字的大小在制作上的差异,使得这个问题尤为明显,有过地图排版出版经验的人对这个问题很了解。
第五个问题,需要采用设计模式中的观察者模式来解决这个问题,这是一个组件设计和开发上的问题。实际上开发出的组件好不好用,架构和设计很重要。在这里我只需要使用组件的用户做两件事,第一,指定一个MapFrame为主图区。那么当前图廓的内容立刻根据给出的范围绘制出来,在观察者模式中即为注册目标。第二,指定接图表。组件立刻按照主图区的范围,设置接图表信息,对应了观察者模式中的注册观察者。观察者模式会解耦对象间的依赖,事实上观察者模式解决的关键是,只要我改变主图区,接图表就会自动更新。
以上的五个问题是最基本的,也是最重要的问题。事实上,还有一些问题需要考虑,如序列化的问题,ArcGIS Engine,ArcGIS Server也能使用的问题,而这些问题在架构之初也考虑了。
克服上述五个问题后,符合国标且不依赖数据的图廓排版组件就完成了。以1:100万的组件为例,加入测试数据后,实际输出pdf的效果非常好,不需要完成任何图廓整饰和接图表工作,地图就按国标规定输出了。但是ArcMap也是有缺陷的,我用的是ArcMap默认的CartographicLineSymbol绘制线型,屏幕上直接显示出来的效果,是锯齿比较明显的(幸好我以前写了一款弥补这个问题的平滑线型软件(ESRIChinaCartoGraphicLineSymbol,http://blog.csdn.net/jx1228/archive/2010/04/15/5488755.aspx),正版软件用户可以到ESRIChina免费索取)。事实上按1:1输出或者直接打印,锯齿问题就不存在了(分辨率在300dpi以上就很难看出锯齿了)。可以参考输出的PDF(1:1输出) 100%下的显示效果图
图名所在位置
以下是接图表效果图,事实上根据国标,接图表是需要旋转角度,和主图最右边的经线平行的;如果有用户觉得接图表没按四色处理,他只需要去调整DataFrame内的省界数据渲染就可以,其他的信息,如邻接图幅的图号,组件自动就完成了,这是架构带来的好处。其实接图表自动化绘制也有一个根本上的问题需要去解决,即分幅数据的区域实际投影后的外接矩形肯定不是4:3,如何解决呢?如果这个问题不解决,就不符合国标了。不要想能找到符合4:3的投影,根据我的经验那是不存在的,而且如果自定义这种投影,显示效率低下的问题会明显(我试过了)。花了一些时间研究最终还是能够完美解决的。
转载请注明出处:http://blog.csdn.net/jx1228/archive/2011/05/09/6407066.aspx