地图标注(一)

介绍一种基于栅格的地图标注算法,用于解决电子地图中的注记自动配置问题。该算法能有效检测注记间的冲突和压盖,提高配置速度和效果。

地图标注

陈玉进 李泉 南京跬步科技有限公司 http://www.creable.cn

地图标注,亦称 地图注记,是电子地图显示的主要内容之一,注记位置的选择是否恰当,排列是否美观,将直接影响到电子地图的清晰易读性和使用价值。所以,在移动注记中,如何控制注记的位置和布局,以及解决注记之间的冲突和压盖问题,是解决注记自动配置问题的重点和关键。在传统地图创建中,制图人员配置注记需要顾及到地图的整体效果,某种要素注记位置的选择要顾及周围其它要素的图形及注记位置的选择,这一过程是人脑高度智能性的活动,因此要用计算机完成电子地图注记自动配置软件必须采用一定机制,才能取得满意的效果。目前,电子地图注记自动配置多数采用局部搜索法,该算法需采用较多的交互方式来弥补其不足之处,从而降低了配置的效率。为了克服局部搜索法的缺点近年来,不少学者在将组合优化理论应用于地图注记自动配置方面作了许多尝试。比较著名的算法有物理松弛法、整型规划及连续梯度下降法等。本文介绍了一种基于栅格的自动标注算法来检测冲突和压盖,以改善电子地图中移动注记配置的速度和效果。该算法计算量小,并且能够将电子地图中各种要素统一进行注记自动配置。

自动标注需要注意的地方,首先要求不能有叠加的情况(其中标注不能压盖标注,标注不能压盖点状要素),再次要求充分利用屏幕空间来标注,最后是符合读者阅读习惯,即从上到下,从左到右顺序标注。

地图要素可以分为三类:点、线、面。根据地图需要展现的主要要素的不同,标注策略有些不一样,例如导航为主的地图,则线标注是首先要进行的,点、面其次。读者可以自行设计标注策略。下面以先标注线为例说明地图标注的步骤。

地图标注步骤:

              我们采用网格索引类似的方式,根据文字大小计算出一个网格尺寸(保证一个文字占用的网格数目是定值),建立一个屏幕网格索引(采用的是屏幕坐标)。

              将所有的地图要素的坐标转换从实际坐标转换为屏幕坐标。

              因为标注不能压盖点状要素,所以计算出所有点状要素所占据的网格,并将这些网格标记为不可标注。

              标注所有点图层上的所有要素,标注的位置可以在点的右边、左边或者上面。标注之后,需将标注所占用网格设置为不可标注。

              标注所有线图层上的所有要素,标注按照线所占网格平均标注,采用等距离标注的策略。标注之后,需将标注所占用网格设置为不可标注。

              标注所有面图层上的所有要素,标注在面所占据网格的中心。标注之后,需将标注所占用网格设置为不可标注。

栅格标注算法数据结构:使用与屏幕网格一致的二维数组来标记其对应的网格是否可标注。设该二维数据为flag,若flag[2][3]=false,则说明第二行第三列网格可以进行标注。

下面将用三个小节来详细说明点、线、面标注各自不同之处。

5.1 点标注

       点标注的位置可以在点的右边、左边或者上面,首先判断右边的位置是否可以标注(标注需要占用网格是否可用),如不可标注则判断左边的网格,同理判断上面的网格。

算法:设计ptIndex函数能够计算点占用的网格,网格行号=(int)(点的y坐标÷网格高度),网格列号=(int)(点的x坐标÷网格宽度)

       举例说明如下,如图1所示,将屏幕切分为若干个网格,每个网格可以容纳下一个汉字,标注每个点状要素是,计算需要占用哪些网格。假设1号点的name为“南京大学”,标注时需要四个网格,判断需要第五行六列到九列网格用来标注。而这四个网格均可标注,所以将“南京大学”这四个字绘制在网格中,并将这四个网格相应的flag设置为true2号点的右边有一个网格被点占用,所以标注到左则,并将这四个网格相应的flag设置为true

 

 

5.2     线标注

线标注首先要计算出这条线所占用的网格,然后按照从左到右,从上到下的顺序等分进行线标注。

算法:

     判断线的走向。根据线的最小外包矩形(MBR)可以判断出线的大致走向。设线的MBR的横坐标分别为xminxmax,纵坐标分别为yminymax。如图2,左图中的线的MBR符合条件(ymax-ymin)>(xmax-xmin)则说明此线是南北走向(标注时从上到下),反之则是东西走向(标注时从左到右)。

 d7

 

     设计plIndex函数能够计算线所占网格,这里可以采用第二章介绍的Bresenham整数栅格化算法。

     设计标注策略,本文采用等分标注策略,即每个文字之间的空相等的网格数目。如果发现某个网格不可标注,则向前或者向后移动一个网格再试,还是不能标注就整条线不标注。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值