在上一节中我们介绍了对于矢量地图点弧信息的校正算法。在本章中,我们将简单介绍这一 算法的程序实现;并对一些已有的城市道路矢量地图作处理,分析我们算法的效果;在此基 础上,我们将介绍校正后的矢量地图信息在城市道路路径寻优及车辆导航中的应用。
5.1 校正程序介绍
5.1.1 原始矢量地图的获取
如前所述,原始的矢量地图是通过对原地图的道路识别、细化、矢量化等操作后得到。在这里,我们采用了实验室的矢量化平台MapVector,对彩色地图进行分析,得到其对应的矢量地图。

由MapVector得到的矢量地图的基本点弧信息,可以以.clr文件的格式存储。而后续应用中所用到的矢量库文件由三个文件构成,分别为点、弧和路文件,这个在2.5.2节中已经有所介绍。我们可以通过程序Getbit将.clr文件转换成为这三个矢量库文件,并且应用于GIS应用系统中。
5.1.2 校正程序的模块组成
我们的校正算法是在VC++6.0 下编写实现的。采用的是基于单文档的程序外观,能够实现对图像和矢量地图的读入、修改、切换显示和存档。程序主要分为以下几个功能模块:
1) 数据读取模块。可以读取.bmp 或.jpg 格式的图像,并可以读取.clr 文件中的点弧信息到指定的数据格式中。
2) 信息校正模块。这是整个程序的核心部分,实现了第四章中的自动校正算法,并避免了不必要的用户交互。
3) 切换显示模块。实现了原始地图和矢量地图的切换显示以及叠加显示,便于用户实时观察校正效果。
4) 存储模块。可以把校正后的点弧信息以.clr 文件的格式输出。
程序的外观如下:

在校正程序中,点和弧都用特定的数据结构来表示:
struct point{ //点的数据结构
int x; //点的坐标
int y;
int orgx; //点的原始坐标
int orgy;
int status; //点的状态,是否是可疑点,是否是
int numofline; //连接弧的数目
int numofneighbor; //邻接点个数
int* connectedline; //记录连接弧标号的数组
int* neighboringpts; //记录邻接点标号的数组
struct line{int numofpts; //弧中节点的个数
int* pPtsinline; //弧中各节点的标号};
在程序中,所有的点和弧均存放在列表中,以便于搜索更新。
5.2 校正结果分析
我们利用我们的校正程序,对不同的城市矢量地图进行校正处理。在这里,首先以合肥市矢量地图的校正为例,详细介绍我们的校正效果;然后对于若干个不同城市的矢量地图,给出校正的统计结果。
5.2.1 结合合肥地图分析校正算法的效果
在这里,我们以合肥市旅游地图为例,分析和说明我们校正算法的效果。下面是原地图二值化后的黑白位图:

直接细化、矢量化得到的原始矢量地图显示为:

而根据我们校正算法校正后的矢量地图为:

首先,对于原矢量地图中的错误交叉点,通过校正,基本上可以恢复原有交叉的形态,消除多余的分路口和回路。

其次,对于原矢量地图中明显的断点,通过校正,实现了对断开处的连接

还有,对于有明显位置误差的丁字路口,也可以通过对路口点位置的调整,消除或降低其误差:

最后,通过对道路的整体调整,可以进一步校正一些点的位置,使之符合实际道路的情况:

另外,在校正过程中,没有引入新的拓扑错误点,也没有出现明显的位置误差,这说明我们的校正算法是可靠的。
5.2.2 对其他地图的校正结果分析
这里我们对39 个城市的原始矢量地图加以校正,以验证我们校正算法的可靠性和有效性。在下表中,列出了对其中的8 副地图的处理结果,其中为了增强可比性,所有的校正过程采用一次循环:

为了说明不同阈值对于校正结果的影响,这里我们把原有距离阈值均变为原来的0.67 倍,所得结果见下表:


可见,随着距离阈值的集体减小,我们算法虽然减少了误操作点的个数,但也使得算法的搜索检测能力也大大下降。
5.3 修正后的矢量库文件的运用
校正后的矢量地图可以用于多个应用领域。由于对原有的信息作了进一步的修正,因此,新的矢量信息更能够反映实际的道路信息,为实际应用提供了更为可靠的保证。下面是修正后的合肥市矢量地图在最短路径计算中的应用:



