在矢量图形程序开发过程中,需要显示每个矢量对象的注记,比如地图中各个城市的名称、道路的名称等;而通常图形数据都是按多层来进行组织的,也就是说,在屏幕上看到的电子地图,可能是分别由行政区多边形层、道路线层、城市点层等迭加而成。如果不加限制地显示注记(直接把每个地物的注记文本TextOut出来),有可能会造成文本相互间的重叠,影响显示效果,这与专业地图生产的整饰要求是相违背的。大家可以去翻看任何一本正规地图册,上面所有的注记都是不相互遮盖的,所以,电子地图的生成,也必须要满足这个要求。
一般专业的GIS软件都提供了相应的接口,如MapInfo和ArcInfo都提供了类似“注记优化”等的选项,而在自主开发图形引擎的应用中,就必须自己来编写代码解决这个问题。
我的实现思路是在画每一层图形地物时,图形先画在DC上,而注记不要先直接画出来(否则后画的图层会影响先画的注记;注记必须是在图形都画完后,才能在上面一起生成),而是经过空间计算,看看注记点附近的上下左右8个位置是否有其他注记的包络矩形占据,如果有,则按照1-8的顺序依次计算新位置,如果找到一个空位,就把这个包络矩形连同注记文本放在一个链表中保存,如果找不到空位,则放弃;下一个地物的注记,再同这个链表中的矩形进行计算...这样,当图形画完后,也就得到一个最优注记的链表,然后再将这个链表中的注记画在生成图形的DC上。如下就是优化注记的算法示意图。
------------------------| 1 | 2 | 3 |------------------------| 8 | 地物 | 4 |-----------------------| 7 | 6 | 5 |-----------------------
我目前生成的最优注记算法有以下功能:
1、支持点、折线和多边形注记2、注记位置可以在原注记点附近九个位置(左,左上,上,右上,右,右下,下,左下,居中)动态移动; 3、长于某个数字(如8个字)的注记自动折行; 4、线状地物可以沿线自动调整
图形如下所示: