2024年3月13日发(作者:)

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

基于QT的电子地图设计与实现

摘 要

人们生活质量不断提高,城际间的往来更加频繁,导航仪成为了生活中不可缺少的部

分。电子地图是导航仪最主要的部分,而电子地图的绘制工作颇为繁琐,价格也比较昂贵,

给导航仪的开发带来了很大的麻烦。如果掌握了电子地图的绘制方法,那么不仅带研发上

具有重要意义,而且将带来更大的经济效益。就此,本课题对电子地图的绘制和相关程序

的编写开展了研究。

课题对Trolltech公司的QT/Embedded的深入分析和研究的基础上,开发了基于Intel

Pxa270的电子地图。地图的数据来源于实际,利用Mapinfo9.5自主绘制电子地图。通过

QT的API与Mapinfo图表数据结合,把地图显示在QT的程序框架上。进而进行了相关的

功能的设计,主要包括地图引擎的设计、路径规划设计、实时定位设计等。

关键词:Mapinfo9.5 QT/Embedded 电子地图

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

QT-based Design and Implementation of Electronic Map

ABSTRACT

People constantly improve the quality of life, inter-city exchanges between the more

frequent, navigation has become an indispensable part of life. Navigation electronic map is the

most important part, the electronic map will work quite complicated, the price is also more

expensive, to navigation systems development is a big trouble. If the master electronic map

drawing method, then not only with research and development of great significance, and will

bring greater economic benefits. In this connection, the subject of the e-map rendering and

related research carried out the preparation procedures.

Subject to the Trolltech's QT / Embedded-depth analysis and research based on the

development of a digital map based on Intel Pxa270. Map data from the actual use of

Mapinfo9.5 own digital maps drawing. QT's API through the chart data combined with Mapinfo,

the map shows the procedure in the QT framework. Then carried out the functions related to the

design, including the design of the engine map, path planning, real-time location and design.

Key words:Mapinfo9.5 QT/Embedded Electronic map

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

目 录

摘 要 ............................................... I

ABSTRACT ............................................ II

1 前言 .............................................. 1

1.1概述 ................................................. 1

1.2研究背景 ............................................. 1

1.3研究目标 ............................................. 1

1.4需求分析 ............................................. 2

1.4.1用户需求分析 ....................................... 2

1.4.2功能需求分析 ....................................... 2

1.5 本章小结 ............................................. 3

2 QT简介 ........................................... 4

2.1 QT的背景介绍 ........................................ 4

2.2 QT实现的结构原理 .................................... 4

2.3 QT Graphics View Framework简介 ....................... 5

2.3.1 Graphics View层次结构 .............................. 5

2.3.2 QGraphicsItem ...................................... 8

2.4 QT应用程序的实现 ................................... 10

2.5 本章小结 ............................................ 11

3 mapinfo绘制电子地图 ............................. 12

3.1 MapInfo Professional简介 ............................ 12

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

3.2 MapInfo地图图表 .................................... 13

3.3 MapInfo地图图层与图元 ............................... 14

3.3.1地图图层 .......................................... 14

3.3.2地图图元 .......................................... 14

3.4 地图的来源 .......................................... 15

3.5 电子地图绘制 ........................................ 17

3.5.1 MapInfo Professional地图绘制工具 .................. 17

3.5.2 MapInfo Professional绘制地图 ...................... 17

3.6 *.MIF和*.MID文件 .................................. 18

3.7本章小结 ............................................ 20

4 系统框架描述 ..................................... 21

4.1系统模块 ............................................ 21

4.2主要功能 ............................................ 21

4.3平台简介 ............................................ 22

4.4 UP-TECHPXA270-S核心模块资源 ......................... 23

4.5 本章小结 ............................................ 24

5 详细设计 ......................................... 25

5.1程序流程图 .......................................... 25

5.2界面设计 ............................................ 27

5.2.1主窗体设计 ........................................ 27

5.2.2 子窗体设计 ........................................ 28

5.3 地图的显示 .......................................... 29

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

5.3.1地图坐标转换 ...................................... 29

5.3.2地图图元的显示 .................................... 30

5.3.3显示效果设计 ...................................... 33

5.4 单源最短路径算法 .................................... 36

5.4.1 Dijkstra(迪杰斯特拉)算法 .......................... 36

5.4.2 路径节点的存储 .................................... 37

5.5 本章小结 ............................................ 41

6 测试及运行结果 ................................... 42

6.1 测试目标 ............................................ 42

6.2 测试预期结果 ........................................ 42

6.3 运行结果 ............................................ 42

6.3.1 地图浏览功能 ...................................... 43

6.3.2 路径规划功能 ...................................... 44

6.4 本章小结 ............................................ 45

7 论文总结 ......................................... 46

参考文献 ............................................ 47

谢 辞 .............................................. 48

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

1 前言

1.1概述

随着新的ARM芯片不断问世以及这些芯片的价格下降,嵌入式产品开始潜移

默化的取代早期的一些单片机,并在社会各行各业中占有越来越重要的位置,嵌

入式产品也由此成为众多工程师选择开发高端产品的芯片首选。QT具备跨平台,

易扩展,界面华丽,性能稳定等优点。因此,以嵌入式处理器作为硬件平台,以

QT作为程序框架,两者的完美结合必将成为未来技术的发展方向。

1.2研究背景

现在,汽车正在普及,道路不断建设,城际间的经济往来更加频繁,活动的

区域也越来越大。为了提高生活质量,大量的休闲活动、探险活动的举行使我们

并不局限在自己认识的一小块区域中,不认识道路,找不到目的地的情况也屡有

发生。就此,各种各样的导航仪逐渐走进我们的生活。

无论什么导航仪最主要的部分都是电子地图。开发电子地图成为了导航仪的

关键。根据调查,电子地图制作困难而且价格相当昂贵,给导航仪的开发带来了

很多不便。自主绘制电子地图,编写电子地图应用程序,不管是从经济上还是研

究上都具有非常大的意义。

市面上的嵌入式产品各式各样,用到的嵌入式操作系统自然也是有所不同。

如果拥有一个跨平台的程序的话,那将会给我们的开发节省了大量的时间。QT

正是一个支持多平台的C++图形用户界面应用程序框架。它提供给应用程序开发

者建立艺术级的图形用户界面所需的所用功能。Qt是完全面向对象的很容易扩

展,并且允许真正地组件编程。所以使用QT作为应用程序框架是一个不错的选

择。

1.3研究目标

基于上述背景,开发一个电子地图项目,使用windows CE5.0搭配PXA270

开发板来构建这个项目。使用mapinfo电子地图绘制软件自主绘制电子地图。利

用QT4作为系统应用层的程序框架。根据系统的需求,裁减、移植windowsCE

内核。分析系统功能和接口,添加各种驱动程序,如:USB驱动,COM口驱动等。

根据应用程序中的每个功能模块,分析各个模块的用户界面接口和对人机交互图

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

形化用户界面的接口设计。

1.4需求分析

1.4.1用户需求分析

目前,我们可以通过各种途径接触电子地图,例如以网页形式的电子地图,

如Google地图、Google Earth、百度地图等,以车载GPS导航仪的电子地图,

如garmin任我游、纽曼、新科、城际通等,还有以手机导航功能出现的电子地

图,越来越多的手机将支持导航功能,诺基亚2010年在大规模普及手机导航。

对此,本项目采用免费版的QT4作为程序框架,并且可以跨平台使用,在开

发成本上有着很大的优势。

未来几年,配备电子地图的电子产品市场将逐渐走向成熟,市场需求和产品

销量会保持大幅增长,产品供应链中的各类企业将获得巨大商机。尤其是随着产

品价格的不断下降,这种快速发展的态势会愈加明显。电子地图在中国市场必然

会获得更大的发展空间。

由此,本项目也适应用户需求,开发电子地图的相关功能:地图显示功能、

卫星定位功能、路径导航功能、语音提示功能等。

1.4.2功能需求分析

根据用户需求,和对产品的定位,划分以下功能:

表1-1 用户需求功能

支持功能

1 地图显示

2 实时定位

3 路径导航

4 语音提示

所需硬件

UP-TECHPXA270-S为硬件开发平台

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

支持功能分析:

1. 地图显示:显示当前位置地理信息,包括道路、河流、建筑物,以及标志性

建筑的名称,可以通过地图了解的所在位置的周边情况。

2. 实时定位:通过不断对对COM口接收到的信息进行分析,获取当前所在位置,

并且显示在地图的相应位置上。

3. 路径导航:可以设置目的地点,系统将通过路径优先算法显示最优路径,完

成导航功能。

4. 语音提示:通过简单的语言提示来配合路径导航。

所需硬件分析:

需要的硬件模块在UP-TECHPXA270-S硬件实验平台上已一应俱全。在此平

台上还配制了8英寸的TFT真彩液晶屏,支持640*480的分辨率。UP-TECHPXA270

-S在存储系统方面也有着很高的配置,内置了高性能价格比的NAND FLASH 64M

内存,支持大容量的用户差异图形图片和媒体文件的存储。

CPU的能力当然是毋庸置疑的,Intel Xscale结构芯片的PXA270在各方面

都表现了很强悍的能力,在目前市场上来说也是一款很先进的处理器芯片。

PXA270处理器是Intel公司目前性能最为强劲的移动处理器,已经成为高端移

动设备中最受欢迎的处理器之一。PXA270最高主频可达624MHz,它引入了X86

架构奔腾4系列上的多媒体技术——MMX技术,能够大大提升多媒体处理能力,

用户通过该技术可以在VGA上面播放高质量的MPGE4视频;同时加入了Intel

SpeedStep动态电源管理技术,在保证CPU性能的情况下,最大限度地降低移动

设备功耗。

1.5 本章小结

本章主要介绍本项目的选题背景、意义,选题目标和项目需求分析,根据产

品市场和本人技术水平情况,按需求划分软件功能模块,还根据软件功能和现有

资源的性能对硬件需求做了详细分析。

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

2 QT简介

2.1 QT的背景介绍

Qt/Embedded 是著名的Qt库开发商Trolltech公司开发的面向嵌入式

系统的Qt版本,开发人员多为KDE项目的核心开发人员。许多基于Qt的X

Window程序可以非常方便地移植到Qt/Embedded上,与X11版本的Qt在最

大程度上接口兼容,延续了在X上的强大功能,在底层彻底摒弃了X lib,

仅采用framebuffer作为底层图形接口。Qt/Embedded类库完全采用C++封

装。丰富的控件资源和较好的可移植性是Qt/Embedded最为优秀的一方面,

使用X下的开发工具Qt Designer可以直接开发基于Qt/Embedded的UI(用

户操作接口)界面。越来越多的第三方软件公司也开始采用Qt/Embedded

开发嵌入式下的应用软件。

2.2 QT实现的结构原理

Qt/Embedded是Trolltech公司开发的面向嵌入式系统的Qt版本,与

X11版本的Qt在最大程度上接口兼容,采用帧缓存(framebuffer)作为底

层图形接口。Qt/Embedded类库完全采用C++封装,并且有着丰富的控件资

源以及较好的可移植性,大范围的Qt/Embedded API可用于多种开发项目。

Qt/Embedded的实现结构如下:

图2-1 QT的实现结构图

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

Qt/Embedded 的底层图形引擎基于framebuffer。Framebuffer 驱动程

序的实现分为两个方面:一方面是对LCD及其相关部分的初始化,包括画

在缓冲区的创建和对DMA通道的设置;另外一方面是对画面缓冲区的读写,

具体到代码为read、write、lseek等系统调用接口。至于将画面缓冲区的

内容输出到LCD显示屏上,则由硬件自动完成。对于软件来说是透明的。

当对于DMA通道和画面缓冲区设置完成后,DMA开始正常工作,并将缓冲区

中的内容不断发送到LCD上。这个过程是基于DMA对于LCD的不断刷新的。

基于该特性,framebuffer驱动程序必须将画面缓冲区的存储空间(物理空

间)重新映射到一个不加高缓存和写缓存的虚拟地址区间中,这样能才保

证应用程序通过mmap将该缓存映射到用户空间后,对于该画面缓存的写操

作能够实时的体现在LCD上。

QT程序是基于C++编写的,图形用户界面编程同时需要运行效率和高

水平的灵活性。Qt通过结合C++的速度为这一领域提供了Qt对象模型。

Qt把下面这些特性添加到了C++当中:

一种被称为信号和槽的非常强大的机制;可查询和可设计的属性项;

强大的事件和事件过滤器;根据上下文进行国际化的字符串翻译;完善的

时间间隔驱动的计时器等。

许多Qt的特性是基于QObject的继承,通过标准C++技术实现的。

QApplication是必须构造的Qt主对象,需要在一开始的时候就构造这

个对象,并把命令行参数传递给这个对象,每个Qt应用程序有且仅有一个

QApplication对象,该对象必须在做其他事之前创建,这个对象处理一些

底层操作,如事件处理、字符串本地化和控制界面外观等。

信号和信号处理函数是GUI应用程序用来响应用户输入的基本机制,

也是所有GUI库的核心特征,Qt的信号处理机制由信号(signal)和槽(slot)

构成,它们相当于GTK+中的信号和回调函数。在Qt中回调函数就叫做槽。

信号和槽用于对象间的通讯,它的基本语法为:

connect(object1,signal1,object2,slot1);

2.3 QT Graphics View Framework简介

2.3.1 Graphics View层次结构

Graphics View 提供一个强大的自定义2D平面图元并处理它们之间相

互作用的接口,以及将一个这些图元可视化的view控件,它支持旋转和缩

放。该框架还包含一个事件传递机制,允许画布和画布上的图元之间精确

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

地双向交互。图元处理鼠标键盘事件,如鼠标按下、移动、释放、点击和

双击事件,也跟踪鼠标移动。另外,Graphics View使用BSP树来提供快速

的图元搜索,从而能够支持大画布显示,甚至是包含数百万图元的画布。

Graphics View架构分作3层。最底层是一系列QGraphicsItem,也就

是最基本的图元。所有要显示的对象都必须包装成QGraphicsItem或其子

类的对象,然后调用QGraphicsScene::addItem方法把图元加入画布中。

中间层是QGraphicsScene对象都添加或删除图元。当显示QGraphicsScene

对象时,它包含的所有的QGraphicsItem对象都会显示。最上层是

QGraphicsView,这是个窗体控件,专门负责画布的显示。QGraphicsView

和QGraphicsScene类似于MVC架构中的Model和View的关系,或者

Observer设计模式的Data和View的关系。QGraphicsView控制图像显示,

并负责处理或向QGraphicsScene或QGraphicsItem转发键盘鼠标等用户交

互事件;QgraphicsScene包括要显示的QGraphicsItem列表数据信息。

QGraphicsView和QGraphicsScene是多对一的关系,即一个

QGraphicsScene可以放多个QGraphicsView中以不同方式显示。

图2-2 Graphics View三元素之间的关系

Graphics View基本类有各自不同的坐标系。QGraphicsScene 类的坐

标系是以中心为原点(0,0)。

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

图2-3 QGraphicsScene的坐标系

QGraphicsView 类继承自QWidget类,因此它和其他的QWidget类一样以

窗口的左上角作为自己坐标系的原点。

图2-4 QGraphicsView 的坐标系

QGraphicsItem则有自己的坐标系,在调用QGraphicsItem类的paint()

函数重画项目时是以此坐标系为基准。

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

图2-5 QGraphicsItem 的坐标系

3种坐标系统可以相互转换。QT提供了相应的接口。例如,通过调用

QGraphicsItem::mapToScene和QGraphicsItem::mapFormScene可以在Item坐

标系统和Scene坐标系统之间进行转换,QGraphicsItem::mapToParent和

QGraphicsItem::mapParent可以在Item坐标系统和它的父Item坐标系统之间

进行转换,QGraphicsView::mapFromScene和QGraphicsView::mapToScene可以

在View坐标系统和Scene坐标系统之间进行转换。

2.3.2 QGraphicsItem

QGraphicsItem提供了丰富的子类为程序的编写带来了很大的方便。有

QGraphicsEllipseItem,QGraphicsLineItem,QGraphicsPathItem,

QGraphicsPixmapItem,QGraphicsPolygonItem,QGraphicsRectItem,

QGraphicsSimpleTextItem,QGraphicsTextItem一共8种。

在地图的绘制中QGraphicsLineItem可绘制道路,河流。QGraphicsPathItem

可以绘制一些曲线。

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

图2-6 QGraphicsLineItem 图2-7 QGraphicsPathItem

QGraphicsPixmapItem可以把一些通用的小图标添加到地图中,例如酒店,

车站,书店,政府部门等。

图2-8 QGraphicsPixmapItem

QGraphicsPolygonItem可以灵活的绘制出一些多边形建筑物,或者行政区

域,湖泊等。

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

图2-9 QGraphicsPolygonItem

QGraphicsSimpleTextItem、QGraphicsTextItem则可以在地图上添加文字

说明或者地标。

图2-10 QGraphicsSimpleTextItem 图2-11 QGraphicsTextItem

2.4 QT应用程序的实现

由以上简介可知,Qt是一个创建GUI程序的C++类库,编写Qt应用程序的

主要工作是基于已有的Qt类编写用户类。

Qt提供了一组范围相当广泛的C++类库,并包含了几种命令行和图形界面的

工具,有效地使用这些工具可以加速开发过程。

Qt Designer:Qt设计器。用来可视化地设计应用程序界面。

Qt Linguist:Qt语言学家。用来翻译应用程序。以此提供对多种语言的支

持。

Qmake:使用此工具可以由简单的、与平台无关的工程文件来生成编译所需

的Makefile。

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

Qt Assistant:关于Qt的帮助文件。类似于MSDN。可以快速地发现你所需

要的帮助。

moc:元对象编译器。

uic:用户界面编译器。在程序编译时被自动调用,通过ui_*.h文件生成应

用程序界面。

Qt应用程序的设计使用基于工程的方法,并通过.pro文件进行工程管理。

实现应用程序的第一步是编写.pro文件,然后使用QT4自带的qmake工具生成

Makefile,最后进行源代码的编译。

Qmake的过程如下:

qmake –project //生成.pro的工程文件

qmake //生成Makefile

nmake //编译

2.5 本章小结

随着越来越多的第三方软件公司利用Qt/Embedded开发嵌入式Linux下的应

用软件,Qt的应用已经越来越广泛。本章主要介绍了QT的背景和描述了QT实

现的结构原理,还简述了QT的相关特性。此外,也介绍了QT应用程序开发时的

相关工具。

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

3 mapinfo绘制电子地图

3.1 MapInfo Professional简介

图3-1 mapinfo启动界面

MapInfo是美国MapInfo公司的桌面地理信息系统软件,是一种数据

可视化、信息地图化的桌面解决方案。它依据地图及其应用的概念、采用

办公自动化的操作、集成多种数据库数据、融合计算机地图方法、使用地

理数据库技术、加入了地理信息系统分析功能,形成了极具实用价值的、

可以为各行各业所用的大众化小型软件系统。MapInfo 含义是“Mapping

+ Information(地图+信息)”即:地图对象+属性数据。

1986年MapInfo公司成立并推出了第一个版本—MapInfo for DOS

V1.0及其开发工具MapBasic,此后又推出了DOS平台的2.0和3.0版。

1995年底MapInfo发布了MapInfo Professional,是一个以Windows 95

和Windows NT为平台的桌面地理信息系统。目前该软件的最新版本是

MapInfo Professional9.5及其系列软件。

MapInfo Professional是一套强大的基于Windows平台的地图化解决

方案,可以方便地将数据和地理信息的关系直观的展现,其复杂而详细的

数据分析能力可帮助用户从地理的角度更好地理解各种信息;可以增强报

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

表和数据表现能力,找出以前无法看到的模式和趋势,创建高质量的地图

以便做出高效的决策;凭借其新特性和增强功能,MapInfo Professional 使

得桌面地图化和分析功能更快和更容易-并可延伸至整个企业。

MapInfo Professional提供一整套功能强大的工具来进行复杂的商业

地图化、数据可视化和GIS功能。通过MapInfo Professional可连接本地

及服务器端的数据库,创建地图和图表以揭示数据行列背后的真正含义。

也可以定制MapInfo Professional以满足用户的特定需要。 支持Oracle8i

完全读/写,通过OCI对Oracle8i及通过ODBC对其它数据源的实时访问。

3.2 MapInfo地图图表

使用mapinfo软件可对地图进行处理、查询、编辑和分析等操作,前提条件

是:首先应该对地图信息化,而执行该操作的前提就是建立图表。

图表由行和列组成,行含了特定地理特性或事件的等信息,而列包含有关表

中数据项的特定类型信息。

图表的组成类型:

一个典型的mapinfo表将主要由*.TAB、*.MAP、*.ID和*.DAT文件格式组成。

*.TAB 属性数据的表结构文件

*.MAP 空间数据文件

*.DAT 属性数据文件

*.ID 交叉索引文件

图3-2 mapinfo图表之间联系

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

3.3 MapInfo地图图层与图元

3.3.1地图图层

每一个可用地图表示的mapinfo表都能在地图上作为图层显示。一个

mapinfo电子地图可能包含很多不同图层,而每一层都包含了地图的不同部分。

通过将这些图层一层层叠加,就可以看到整个地图信息。

【标注】

图层

北理工 宁堂

【点】

图层

【边界】

图层

图3-3 多个图层组成mapinfo地图

3.3.2地图图元

图元是图层中的一个元素。在mapinfo中共育4种基本图元样式。

1. 区域对象

区域对象特指覆盖给定区域的闭合对象。其中包括多边形、椭圆和矩形,例

如国家边界、邮政边界等。

2. 点对象

点对象表示数据的单一位置。其示例有饭店。

3. 线对象

线对象是指覆盖指定给定距离的开发对象,包括线、折线、弧线等,其示例

有街道、河流和电力线路等。

4. 文本对象

文本对象是特指用于说明地图或其他对象文本,其示例有标注或标题等。

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

3.4 地图的来源

西方绘画有一种写实手法,要有一个真实的物体,才可以进行创作。绘制地

图也是同样的道理,要有一个实物的照片或者是事先绘制的纸质地图,才可以进

行绘制。本项目绘制的是北京理工大学珠海学院电子地图,由于某些原因,使得

地理数据资源比较匮乏。在google地图上面找到比较合适的地图也是2004年学

校的卫星照片(图3-4)。

图3-4 Google地球上的卫星照片

这张图片上面虽然建筑物寥寥无几,但是已经可以作为参照物,为地图的绘

制提供了较高的准确性。为了获取更多的信息,还拍下了学校路边的地图(图

3-5)作为参考,并且做了实地考察,手工绘制了一幅学校的平面图地图(图3-6)。

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

图3-5 北京理工大学珠海学院学校路边平面图

图3-6 手工绘制北京理工大学珠海学院平面图

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

3.5 电子地图绘制

3.5.1 MapInfo Professional地图绘制工具

MapInfo Professional提供了一组专门的地图绘制工具,其中图形矢

量的工具集全集中在该工具栏中,利用这些工具基本上可灵活完成各种绘

图任务任务。这些绘图工具不仅能够在当前操作环境绘制图形对象,而且

可根据需要进行必要的编辑和调整,使其符合绘图的需要。

图3-7 mapinfo绘图工具条

工具条部分工具的含义

表3-1

符号

符号

符号样式

折线

线样式

多边形

多边形样式

含义

在地图中放置点符号

利用该工具指定符号属性

在地图中绘制折线

可设置线的类型、宽度和颜色

可一次绘制各种形状的多边形

可设置多边形的轮廓宽度和颜色,填充花纹和填充

的颜色

3.5.2 MapInfo Professional绘制地图

在一幅传统的地图中包含多种类型的图纸信息(如省市边界、城市、

山川、河流、道路和水库),而对于使用地图的个人或某行业来讲,往往仅

对注重对每个或部分类型进行显示和分析。所以根据不同需求设计地图的

层次机构,有意识的把同一类对象归类,并放置在同一个图层中。清楚了

mapinfo中图层和图元的概念以及了解绘图工具的使用后,就可以开始绘制

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

地图了。在本项目中设计了Key、Build、route1、route2、waterArea五

层。

Key:标注层。标注了地名称,道路名称,建筑名称等。

Build:建筑层。包括了该区域所有建筑物,例如教学楼,宿舍,饭堂

等。

route1:一级道路。适合驾车和步行。

route2:二级道路。适合步行。

waterArea:水域边界。包括了湖泊、河流等。

将道路层分为一级道路和二级道路主要是考虑到导航算法的设计,如果

选择驾车,则在导航算法中只考虑一级道路,而不用考虑二级道路。5个图

层绘制完毕后最终显示结果如图:

图3-8 各个图层综合显示

3.6 *.MIF和*.MID文件

绘制完成后mapinfo把每一个图层保存为相应的图表文件。而每一个

表又可以同时转出为*.MIF和*.MID两种格式文件。Mif文件包含了该图层

所有图元的类型、位置、颜色等相关信息,mid文件包含了mif每个图元对

应的标注。

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

例如:

保存了这个信息

对应的mid文件

对应的mif文件

Pline 4

113.529674 22.371699

113.531322 22.371673

113.532868 22.371649

113.534445 22.371624

Pen (7,2,16776960)

图3-9 TAB与mif和mid的联系

"金凤路"

文件描述了该对象是折线对象,该线有4个点,每一个点的具体坐标,画笔

是7号像素,2号样式,画笔颜色为16776960(黄色)。 同样的方法就可用理解

其他图元相关的信息。

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

3.7本章小结

mapinfo是地图绘制领域使用最为广泛的应用软件之一,本章介绍了

mapinfo的通用知识——地图图表和地图分层的基本概念,以及对如何绘制地图

进行了详细的介绍。最后还详细分析了*.MIF和*.MID文件格式,这两种格式

文件是整个项目的地理数据来源,对这两种文件结构的深入理解将是编程

的关键。

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

4 系统框架描述

4.1系统模块

系统OS层使用windows CE 5.0系统,底层调用多种驱动,其中包括:

USB键盘、鼠标驱动,触摸屏驱动等。软件层API使用QT4自由版提供的

API。应用层为电子地图应用程序。

电子地图

应用层

嵌入式GUI(QT4) 接口层

触摸

LCD

驱动

COM

驱动

USB

驱动

键鼠

驱动

系统层

windows CE 5.0 操作系统

PXA 270开发板

硬件层

图4-1 系统模块图

4.2主要功能

地图显示:显示所在位置周边地理信息,可对当前进行缩放,拖动,自动切

换地图。

路径导航: 自定义起点终点,利用最优路径算法计算出一条最优路径,并且在

地图上面显示。

历史记录:系统会自动保存用户最近使用的10条路径导航记录,以方便用户在

再次需要时浏览。

卫星定位:在地图对应位置显示当前所在位置。

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

4.3平台简介

本系统设计使用的硬件平台是由北京博创兴业科技有限公司开发的

UP-TECHPXA270-S 实验平台。该平台是基于Intel XSCALE 架构最新的

PXA270 嵌入式微处理器最高主频可达624MHz,加入了Wireless MMX 技术,

大大提升了多媒体处理能力;同时PXA270 还加入了Intel SpeedStep动态

电源管理技术,在保证CPU 性能的情况下,最大限度地降低移动设备功耗。

PXA270可以广泛应用于PDA、智能手机、PMP 产品中。博创科技的

UP-TECHPXA270-S 教学科研平台主要是面向计算机、软件专业的高端平台,

微处理器主频稳定运行在520MHz,可运行WinCE5.0 和Linux 2.6.x 操作

系统,支持QT/E、miniGUI 等嵌入式图形界面,提供完整的驱动和应用程

序。

图4-2 UP-TECHPXA270-S 教学科研平台图

UP-TECHPXA270-S 教学科研平台由处理器核心板、主板及LCD 三部份

组成。核心板和主板的接口设计充分考虑了升级产品的兼容性,核心板可

以升级到PXA271、PXA272 微处理器,而主板资源不变。此外,除了具有丰

富的接口资源,良好的可扩展性也是UP-TECHPXA270-S 平台的一大特色。

UP-TECHPXA270-S 预留了32 位扩展总线接口,与博创UP-NetARM2410、

UP-NetARM2410-S 平台兼容,从而大大减轻了用户扩展新功能的负担。

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

MIC、LINE-IN/OUT

模拟功率放大器

AC97 CODEC

触摸屏接口

KEYPAD

RTC 实时钟

RS232 串口

VGA 输出

PXA270 核心板

CPU

SDRAM

Nand Flash

NorthFlash

总线隔离驱动电路

640*480 TFT 16bit

LCD 液晶屏

USB1.1 DEVICE

USB1.1 HOST

4 端口USB HUB

10/100M 网卡

RJ45 接口

图4-3 以PXA270为核心的硬件架构图

4.4 UP-TECHPXA270-S核心模块资源

基于Intel XScale 架构内核的嵌入式处理器PXA270,内部集成iwmmx

指令,加速处理器对多媒体数据的 处理速度。辅助CPULPC2119 ARM7TDMI-S。

系统稳定工作在520MHZ 主频,64MB SDRAM、16MB Nor Flash、64MB Nand

Flash 库。

1) UP-TECHPXA270-S 软件资源:

Bootloader:eboot;

操作系统:wince5.0;

驱动程序:提供所有板级设备的驱动程序;

2) UP-TECHPXA270-S 平台配套线缆:

RJ45 交叉网线;

DC12V 电源适配器;

用户自备CAN、RS485 等的连接导;

3) PXA270-S 开发平台硬件资源:

PXA270 Core 小板:PXA270 XScale CPU、64M SDRAM、64M NAND FLASH,

16M NorFLASH。通过256Pin 2mm 间距直插针与主板连接。

Double 100M EtherNet 网卡:由两片DM9000 构成的双网卡,

4 HOST / 1 DEVICE USB 接口:PXA270 的主USB 口扩展为4 个,由

AT43301 构成USB HUB,其中电源管理用MIC2505。

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

3 UART/IrDA/RS485: 2 个RS232 串口。1 个RS485 串口,1 个IrDA

收发器,均从处理器的ICP UART 引出,由FPGA 内部逻辑切换。

LCD 显示屏:采用8 寸18bit 真彩屏,同时预留一个24bit LCD 接口。

TouchScr: 通过UCB1400 芯片和AC97 总线实现。

AC97 AUDIO:采用UCB1400 CODEC 和LM4880 功放芯片,具有放音、录

音功能。

板载17 键小键盘:从处理器键盘接口扩充。

电源、RESET、RTC、JTAG 等必须资源。电源电路具有专门逻辑,可以

实现软件关机功能。PXA270-S 开发平台需要DC12V 供电。

ARM7 辅助处理器:平台上配置LPC2119 ARM7 芯片,配合扩展板可完

成市场上LPC2119 开发板的大部分功能。LPC2119 通过SPI 和IIC 总线与

PXA270 通信。

AD 电位器:由LPC2119 扩展出2 路AD 采集。

CAN BUS:设置2 个CAN 口,由LPC2119 扩展和TJA1050 芯片构成。

VGA 接口:可以接驳VGA 显示器。

USB2.0 接口:由ISP1760 扩展,提供2 个USB2.0 HOST 接口,1 个

USB2.0 OTG/Device接口。MIC2526 作为电源控制器件。

IEEE1394 总线接口:由TSB43AA82PGE 扩展出2 个1394 接口

(FireWire 火线接口)。

4.5 本章小结

本章介绍了本项目的系统模块,包括每个模块的功能描述。此外,还

介绍了系统的硬件架构以及开发平台的软件、硬件模块资源等。

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

5 详细设计

5.1程序流程图

开始

窗体初始化

地图初始化

显示地图

输入起点

输入终点

导航?

退出

确定?

退出

通过Dijkstra

计算得出最优

路径并且把路

径显示在地图

退出导航

图5-1 程序总体流程图

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

开始

获取当前所在位置的经纬度

根据经纬度读取对应

Mapinfo地图导出文件

文件结束?

多边形

添加到对应链表中

折线

添加到对应链表中

添加到对应链表中

文本

添加到画布中

结束

图5-2 地图显示部分流程图

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

5.2界面设计

5.2.1主窗体设计

主窗体class MapWidget继承QGraphicsView基类,使得地图可以充满整个

窗体显示,在主窗体中有滑块QSlider,标示Qlabel,按钮QPushButton 三种

控件。

滑块QSlider通过不同刻度的选择,发送信号给主窗体的槽函数

slotZoom(int)实现对当前显示地图进行放大缩小。实现语句如下:

connect (slider,SIGNAL(valueChanged(int)),this,SLOT(slotZoom(int)));

标示Qlabel有两个zoominLabel和zoomoutLabel,一个在滑块的正上方,

一个在滑块的正下方。通过setPixmap(QPixmap(":/images/*.png"));加载图

片,分别“+”和“-”,加号标示放大,减号标示缩小。

按钮QpushButton,提示用户选择功能。有“导航”和“退出”两个功能。

导航按钮点击后将显示导航子窗体。退出按钮直接发送调clicked()信号给主窗

体的close()信号 实现关闭主窗体,退出程序。实现语句如下:

connect(quitButton,SIGNAL(clicked()),this,SLOT(close()));

最后使用布局管理器对以上控件进行布局。利用addWidget()函数将控件添

加进布局管理器,实现布局。

QVBoxLayout *zoomLayout = new QVBoxLayout;//垂直布局

zoomLayout->addWidget(zoominLabel);

zoomLayout->addWidget(slider);

zoomLayout->addWidget(zoomoutLabel);

QSpacerItem *verticalSpacer1;//使用空白空间,目的是为了把滑块放置

在布局的上半部分,使得地图有更多的显示空间。

verticalSpacer1 = new QSpacerItem(20, 30, QSizePolicy::Minimum,

QSizePolicy::Expanding);

zoomLayout->addItem(verticalSpacer1);

QVBoxLayout *buttonLayout = new QVBoxLayout;//第二个垂直布局

buttonLayout->addItem(verticalSpacer2); //空白

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

buttonLayout->addWidget(okButton);//“导航”按钮

buttonLayout->addWidget(quitButton);//“退出”按钮

利用水平布局进行总体布局,通过setLayout()把布局完的结果显示出来。

QHBoxLayout *layout = new QHBoxLayout;

layout->addLayout(zoomLayout);

layout->addItem(horizontalSpacer);//空白

layout->addLayout(buttonLayout);

setLayout(layout);

图5-3 主窗体布局图

5.2.2 子窗体设计

子窗体class PathLayout 继承于Qwidget类。主要有下拉框QgroupBox、

标示Qlabel和按钮QpushButton这些控件。

下拉框有两个,用于路径规划功能,一个选择起点,另外一个选择终点。选

择完后,通过发送currentIndexChanged(QString)信号把当前下拉框显示的

QString发送到主窗体的槽函数setStartPoint(QString)和

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

setEndPoint(QString)中完成起点与终点的设置。通过addItem()实现对两个下

拉框内容的初始化。

按钮QpushButton有取消和确定三个,取消按钮发送clicked()信号到主窗

体的clearThePath()槽函数中,如果地图上有规划路径,则把路径清除。确定

按钮发送clicked()信号到主窗体的setThePath()槽函数中,实现规划路径。最

后一个是“退出”按钮,退出子窗体。

同样在最后通过布局管理器对所以控件进行布局,布局最终结果如下图:

图5-4 子窗体

5.3 地图的显示

5.3.1地图坐标转换

地图文件中的坐标系统采取的是经纬度坐标,显示时采取的是Sense坐标

(各个Item的坐标统一转换到Sense坐标),因此加载地图文件,从地图文件解

析出图元坐标系统时,需要将图元的经纬度坐标转化为Sense坐标后才能知道在

画布的什么位置显示图元。画布的大小是始终固定不变的,但是它表示的经纬范

围可变,而它表示的经纬度范围就是进行坐标转换,地图缩放,地图平移的基准。

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

地图表示的经纬度范围用下面定义的结构体表示:

typedef struct

{

double x1; //画布左上角代表的经度

double y1; //画布左上角代表的纬度

double x2; //画布右下角代表的经度

double y2; //画布右下角代表的纬度

}

确定好画布表示的经纬度范围后,就可用很方便的将地图数据中的经纬度坐

标转换成画布坐标了。具体实现的转换函数:

double x; //当前点的x

double y; //当前点的y

double wx ;//当前显示区域经度的范围

double w;//当前显示区域的宽度

double hy; //当前显示区域纬度范围

double h; //当前显示区域的高度

point=new QPointF(((x-x1)/wx)*w-w/2,((y1-y)/hy)*h-h/2);

利用这个函数,所有图元都可以在画布上找到准确的位置显示出来。最终形

成了整幅地图。

5.3.2地图图元的显示

地图显示功能,实现原理就是把数据绘制还原称地图。地理数据的来源就是

之前绘制好的mapinfo地图,把地图所有图表全部用mif和mid格式文件转出。

mif和mid格式文件就是mapinfo和QT的接口。利用QT的QGraphicsItem将

mapinfo地图中的图元在QGraphicsScene显示出来。

QPointF *point;//存放图元节点

QVector pointfRegion;//存放一个多边形所有节点容器

QPolygonF *pPolygonF;//多边形指针

QGraphicsPolygonItem *pPolygonItem;// QGraphicsView框架下的多边形图

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

元,要把图元封装成QGraphicsItem才能够在该框架里面显示。

QByteArray brushColor;//存放当前填充颜色

QByteArray penColor;//存放当前画笔颜色

QString sColor;//存放颜色

if(graphicsName=="Region")

{

latlon>> count>>count ;//在mif文件结构中该行第二个数字记录了

多边形的节点数。如下图,这个多边形记录了5个点(用红色圈的点)。

图5-5 mapinfo里面记录多边形用的节点

for(int i=0;i

{

latlon>> x >> y;//x存放经度,y存放纬度

point=new QPointF(((x-x1)/wx)*w-w/2,((y1-y)/hy)*h-h/2);

//把经纬度转为QGraphicsSense坐标然后存到point中

pointfRegion << *point;//把转换后的点存进pointfRegion

容器中

}

pPolygonF=new QPolygonF(pointfRegion);//创建多边形

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

pPolygonItem=new QGraphicsPolygonItem(*pPolygonF);

//创建多边形图元

if(graphicsAttribute=="Pen")//一个图元的点描述后就是该图元的

边界画笔,用Pen 表示

图5-6 Pen字段描述的边界

{ latlon>>penColor;

(penColor);

or(QColor(n(",",2,2).remove(QChar(')'),

Qt::CaseInsensitive).toDouble()));//获取画笔颜色

}

pPolygonItem->setPen(pen);//设置图元边界颜色

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

图5-7 Brush字段描述了填充的颜色

if(graphicsAttribute=="Brush")//该图元的边界画笔描述完,继续用

Brush 表示填充颜色

{

latlon>>brushColor;

(brushColor);

or(n(",",1, 1).toDouble());

}

}

这样就完成了一个图元的显示。只要将所有图元显示出来就形成了地图。

pPolygonItem->setBrush(brush); //对元进行颜色填充

scene->addItem(pPolygonItem);//最后把图元添加到画布上

5.3.3显示效果设计

某部分图元需要进行特殊处理的,就应该使用数据结构对这部份图元进行存

储,以便对这些图元进行控制。例如地图中显示的文字,在地图被放大时,文字

不放大。

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

图5-8 放大前

图5-9 放大后

图元属于同类数据类型,而且又有相当数量,很容易就想到数组。但是数组

存放在连续空间,需要占据一块连续的空间且不可动态添加,而每一幅地图的图

元数量是不确定数,所以排除了数组的选择。而选择了链表。

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺

序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素

称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是

存储数据元素的数据域,另一个是存储下一个结点地址的指针域。下面是地图文

本类。

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

图5-10 链表结构

class MapTextItem

{

public:

};

通过对数据的处理而获取所有地图中文本图元。当检测到一个图元是就添加

到链表的末端,直到没有为止。

if(graphicsName=="Text")

{

latlon>> graphicsName; //获取文本信息,如“北理工”

latlon>> x >> y; //获取文本在地图的相应位置

mapText=new MapTextItem(graphicsName);

mapText->mapTextItem->setPos

(((x-x1)/wx)*w-w/2,((y1-y)/hy)*h-h/2);

scene->addItem(mapText->mapTextItem); //在地图上面显示

mapText->nextTextItem=mapTextItem->nextTextItem ;

mapTextItem->nextTextItem=mapText; //连接到链表中

}

MapTextItem(QString str);

MapTextItem();

virtual ~MapTextItem(void);

QGraphicsTextItem *mapTextItem;//存放当前QGraphicsTextItem的

MapTextItem *nextTextItem;//存放下一个QgraphicsTextItem的地

指针

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

5.4 单源最短路径算法

5.4.1 Dijkstra(迪杰斯特拉)算法

Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一

个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层

扩展,直到扩展到终点为止。Dijkstra算法能保证找到从起点到终点的一

条最优路径,只要路径权值不会为负。

Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,

一种是用OPEN, CLOSE表的方式,这里均采用永久和临时标号的方式。注

意该算法要求图中不存在负权回路。

算法的具体步骤如下:

(1)初始化时,S只包含原点,即S={v},顶点v到自己的距离为0。U包含

除v外的其他顶点,v到U中顶点u的距离为边上的权或者INFINITE

(无通路)。

(2)从U中选一点K,顶点v到顶点k的距离最小,然后把顶点k加入S中

(该选定的距离就是v到k的最短路径长度)。

代码实现如下:

int min = INFINITE;

for(int i=0; i<节点数; i++)

{

}

(3)以顶点k为新考虑的中间点,修改v到U各顶点距离:若从源点v到顶

点u(u属于U)的距离(经过顶点k)比原来距离(不经过k)短,则

修改顶点u的距离值,修改后的距离值的顶点k的距离加上边

的权。

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

if(done[i] != -1)

continue;

else if(distance[i] < min)

{

}

min = distance[i];

no = i;

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

代码实现如下:

for(map::iterator it = m_edges2[no].begin();

it!=m_edges2[no].end(); it++)

{

if(done[(*it).first] != -1)

continue;

else if((distance[no] + (*it).second)

< distance[(*it).first])

{

from[(*it).first] = no;

}

distance[(*it).first] = distance[no] + (*it).second;

}

(4)重复(2)和(3)直到S包含所有的顶点。

5.4.2 路径节点的存储

在一个道路网络中存在着很多交叉节点,点与点之间信息存放在邻接矩阵

中,放在二维数组中。例如下图:

图5-11 带权图

该图对应的邻接矩阵是:

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

图5-12 图5-11邻接矩阵表示

这样如果用二维数组存储则要用5*5空间,如果地图上交点有100个,则要

用100*100的空间来存储。将上图用邻接矩阵用邻接表存储,如下图:

V1 2 3 3 5 4 8 NULL

V2 1 3 3 6 4 4 5 1

1

NULL

V3 1 5 2 6 4 2 NULL

V4 1 8 2 4 3 2 5 1

0

NULL

V3 2 1

1

4 1

0

NULL

NULL

图5-13 图5-10邻接表表示

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

这样或许看不出有什么优越性,但是如果出现这样的矩阵:

图5-14 矩阵

用二维数组存储,有些节点只和一个或者两个节点有联系,如果用数组存这

种节点将会浪费n-2(n为所有节点数)的空间。显然是不可行的。用邻接表存

储如下:

V1 2 3 NULL

V2 5 1

1

NULL

V3 4 2 NULL

V4 5 1

0

NULL

V3 4 1

0

NULL

NULL

图5-15 图5-14矩阵对应的邻接表

显而易见,利用邻接表来存储数据将节省了大量的空间。而且可以动态添加

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

节点,所以本项目使用了邻接表来存储路径节点数据。

1. 表头结构体:

typedef struct Head

{

int id; //节点ID

double lat; //纬度

double lon; //经度

struct Head *nextAbutHead; //下一个头结点

2. 表项结构体:

typedef struct Item{

int id;

double lat;

double lon;

double distance ; // 与该行头节点的距离(权值)

struct Item *nextAbutItem;// 下一表项指针

abutItem *abutItem; //该行节点点指针

}abutHead;

}abutItem;

有了以上两个结构体就可以把所有节点数据都存进邻接表中,再加上

Dijkstra算法,就可用自主选择起点和终点,把路径途径节点存到链表里

面,利用地图上显示路径是算法把最短路径显示出来,实现了路径规划功

能(图5-16)。

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

图5-16 “化工楼”到“二饭”的最优路径

5.5 本章小结

本章详述了整个软件各部分功能的详细设计,包括主界面的设计,子窗体设

计、地图显示、以及路径规划设计。同时还介绍了Dijkstra算法的实现和设计。

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

6 测试及运行结果

6.1 测试目标

基于不同的立场,存在着两种完全不同的测试目的。从用户的角度出发,普

遍希望通过软件测试暴露出软件中陷藏的错误和缺陷,以考虑是否可以接受该产

品。而从软件开发者的角度出发,则希望测试成为表明软件产品中不存在错误的

过程,验证该软件已正确地实现了用户的要求,确立用户对软件质量的信心。

下面这些规则也可以看作是测试的目的或定义:

1. 测试是为了发现程序中的错误而执行程序的过程;

2. 好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案;

3. 成功的测试是发现了至今为止尚未发现的错误的测试。

本次测试目标主要是验证系统的软件效果,测试中包括检测软件错误,软件

缺陷,软件故障,软件失效等。测试中分析以下内容:当在系统软件生存期内发

生不希望或不可接受的人为错误时,导致系统软件缺陷产生的结果,当输入不准

确的数据时,系统软件产生的结果,当软件运行过程中出现的一种不希望或不可

接受的内部状态,譬如软件处于执行一个多余循环过程时,所产生的结果等。

6.2 测试预期结果

根据系统的软硬件情况,可以预测到以下结果:

主界面:包括背景图片,菜单选择入口,菜单选择过程应带有动态效果,多

次选择同一菜单时可打开多个模块,整个过程中系统应保持流畅。

地图显示:显示的地图与使用mapinfo绘制的地图一致,可放大缩小,体现

分层。

路径导航:当选择使用该功能后,选择起点终点,点击确定按钮,可以在地

图对应位置显示出一条最短路径。当点击取消的时候,清除地图上的规划路径。

6.3 运行结果

系统运行后可以见到以下界面:

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

图6-1 系统主界面

6.3.1 地图浏览功能

当滑块向上滑动时可以对当前地图进行放大。

图6-2 地图的放大

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

当滑块向下滑动时可以对当前地图进行缩小。注意到地图在放大缩小时字体

一直保持原来的大小。

图6-3 地图的缩小

6.3.2 路径规划功能

当点击导航按钮时,会弹出一个路径规划对话框,提供路径规划。

图6-4 路径规划子窗体

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

在两个下拉框里面分别选择起点终点,点击确定,则在地图上显示出该起点

与终点之间的最优路径。

图6-5 路径规划功能

点击取消则可清除红色路径,点击退出导航则退出导航功能,关闭子窗体,

回到显示地图窗口。

6.4 本章小结

本章主要讲述了系统的测试目标、测试预期结果以及系统运行结果。还对系

统的主界面和各个模块的测试运行结果进行截图。

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

7 论文总结

本论文详述了在嵌入式开发平台Intel Xscale PXA270上实现了基于QT的

电子地图的过程,在设计过程中,学习mapinfo地图制作软件的使用。经过网络

网络资源,实地考察,搜集地理信息。成功的利用了mapinfo绘制北京理工大学

珠海学院电子地图。熟读QT的API函数,通过API函数把mapinfo地图显示在

QT程序框架上。学习研究最短路径算法,把算法与地图数据结合,实现了路径

规划。

在项目开发过程中,本人对硬、软件有了进一步的认识和理解。尤其是软件

实现,此次项目就是大学所学知识的灵活运用。

最终项目已经实现功能包括:地图浏览、地图缩放、路径规划等。

整个项目系统中仅实现了基本的功能,仍有许多不足之处:例如地图显示上,

还不能做到以当前位置为中心进行地图自动更新显示。在最优路径算法还有其他

更好的算法,例如A*、D*、蚁群等高级算法可以节省路径运算时间,由于本人

能力有限和时间关系没有进行学习研究。

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

参考文献

[1] 吴秀琳,刘永革,王利军等:《Mapinfo9.5中文版标准教程》[M],清华大

学出版社,2009年版。

[2] 戚正伟,付国庆,蔡松露,钱吟,黄铠,冯立男,张柏年:《嵌入式GIS开

发及应用》[M],清华大学出版社,2009年版。

[3] 李春葆等:《数据结构教程(第2版)》[M],清华大学出版社,2008年版。

[4] 成洁,卢紫毅:《Linux窗口程序设计—Qt4精彩实例分析》[M], 清华大学

出版社,2008年版。

[5] 丁林松,黄丽琴:《QT4图形设计与嵌入式开发》[M],人民邮政出版社,2009

年版。

[6] 蔡志明,卢传福,李立夏:《精通Qt4编程》[M],电子工业出版社,2008

年版。

[7] 何宗键:《Windows CE嵌入式系统》[M],北京航空航天出版社,2006年版。

[8] 《UP-TECHPXA270-S实验指导书》[M],北京博创公司,2006年版。

[9] qt中文网:/bbs [EB/OL]

[10] qt4.5 参考文档:/4.5/[EB/OL]

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL

FGSJJLKSJGKLJG JLS JGKJ KJ SKJ KJSKLGJKSJLKSJKL

谢 辞

本论文是在陈东伟老师悉心指导下完成的,在此本人谨向陈东伟老师表示最

衷心的感谢和崇高的敬意。陈东伟老师活跃创新的学术思想,渊博的专业知识,

严谨的治学态度,开阔的思维方式,忘我的工作精神使我终身受益。

感谢黄东锐和陈少文同学在技术上给予我的帮助和提出了很多宝贵的意见,

感谢胡斐同学在实验上给予我的支持和帮助。

最后,向关怀和帮助我的各位老师、同学和朋友表示衷心的感谢。

KSGK JKLGJSLSK JSGKL JLSGJSLJ GJGKL JLSJ KL JGKL JGKL JKL