矢量图形开发中的动态注记实现

    技术2022-05-11  65

    在矢量图形程序开发过程中,需要显示每个矢量对象的注记,比如地图中各个城市的名称、道路的名称等;而通常图形数据都是按多层来进行组织的,也就是说,在屏幕上看到的电子地图,可能是分别由行政区多边形层、道路线层、城市点层等迭加而成。如果不加限制地显示注记(直接把每个地物的注记文本TextOut出来),有可能会造成文本相互间的重叠,影响显示效果,这与专业地图生产的整饰要求是相违背的。大家可以去翻看任何一本正规地图册,上面所有的注记都是不相互遮盖的,所以,电子地图的生成,也必须要满足这个要求。

        一般专业的GIS软件都提供了相应的接口,如MapInfo和ArcInfo都提供了类似“注记优化”等的选项,而在自主开发图形引擎的应用中,就必须自己来编写代码解决这个问题。

        我的实现思路是在画每一层图形地物时,图形先画在DC上,而注记不要先直接画出来(否则后画的图层会影响先画的注记;注记必须是在图形都画完后,才能在上面一起生成),而是经过空间计算,看看注记点附近的上下左右8个位置是否有其他注记的包络矩形占据,如果有,则按照1-8的顺序依次计算新位置,如果找到一个空位,就把这个包络矩形连同注记文本放在一个链表中保存,如果找不到空位,则放弃;下一个地物的注记,再同这个链表中的矩形进行计算...这样,当图形画完后,也就得到一个最优注记的链表,然后再将这个链表中的注记画在生成图形的DC上。如下就是优化注记的算法示意图。

    ------------------------|    1  |   2    |    3   |------------------------|   8  | 地物 |   4    |-----------------------|   7  |    6    |   5    |-----------------------

    我目前生成的最优注记算法有以下功能:

    1、支持点、折线和多边形注记2、注记位置可以在原注记点附近九个位置(左,左上,上,右上,右,右下,下,左下,居中)动态移动; 3、长于某个数字(如8个字)的注记自动折行; 4、线状地物可以沿线自动调整  

    图形如下所示:


    最新回复(0)