




免费预览已结束,剩余40页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本科毕业设计(论文)题目: 基于arm处理器的gps导航软件 系统设计 学 院 电子与信息学院 专 业 电子科学与技术(微电子)学生姓名 翁伟鹏 学生学号 200730371487 指导教师 高学 提交日期 2011 年 6 月 8 日 摘 要“汉信码”是一项具有我国自主知识产权的国家标准,是中国物品编码中心取得的诸多科研成果一。是中国在二维码领域向世界发出的信息和声音,标志着中国开始走上国际条码技术的主要舞台,开始具有自己的技术话语权。作为一种矩阵式二维条码,它具有汉字编码能力强、抗污损、抗畸变、信息容量大等特点,是一种十分适合在我国广泛应用的二维条码,具有广阔的市场前景。本文着重介绍如何在visual c+平台设计与实现二维汉信码编码和解码的功能,详细介绍编码和解码的步骤与模式。本文先对所涉及到的概念进行介绍;然后对汉信码编码过程和解码过程进行分析,并简单介绍了纠错码的原理算法。本设计最终实现了二维汉信码各种模式下的编码、解码功能,虽然不够全面,但对于二维汉信码编解码的研究还是具有一定的参考价值。关键词:汉信码;编码; 解码;模式abstract keyword:目录第一章 绪论1.1 课题背景与意义1.2 国内外研究现状1.3 二维条码的应用前景1.4 论文的主要内容第二章 汉信码的编码实现研究2.1 主要特性2.2 符号结构2.3 汉信码的符号生成步骤2.3.1 数据分析2.3.2 数据编码2.3.3 纠错编码2.3.4 构造最终数据流位2.3.5 码图放置2.3.6 掩模2.3.7 构造功能信息流位2.4 编码模式第三章 汉信码的纠错译码算法3.1纠错码3.2纠错码的基本原理3.3 bch码3.4 本章小结第四章 汉信码的译码实现研究4.1汉信码译码过程分析4.2译码功能实现4.3识读系统接口说明第五章 总结与展望参考文献致谢第一章 绪 论1.1. 选题背景嵌入式系统方面:随着信息化、智能化、网络化的发展,嵌入式技术将全面展开,现在嵌入式已经成为通信和消费类产品的共同发展方向。嵌入式系统的应用正在从狭窄的应用范围、单一的应用对象以及简单的功能,向着未来社会需要的应用需求进行转变,在通讯、网络、工控、医疗、民用等领域发挥着越来越重要的作用。社会对嵌入式系统的需求正在慢慢扩大,特别是最近几年随着国际互联网发发展,从pc时代步入到后pc时代,对信息家电的需求起来越明显。嵌入式系统在信息家电的应用,就是对嵌入式系统概念和应用范围的一个变革,从而打破了过去pc时代被单一微处理器厂家和单一操作系统厂家垄断的旧局面,出现了一个由多芯片、多处理器占领市场的新局面。因此,对嵌入式技术的学习研究,也逐渐成为电子专业的主要研究方向。gps导航方面:随著科技化的角度持续加快,迫使有越来越多的人必须在紧凑的时间及地点进行工作,而当城市化的速度不断地膨胀后,不仅导致交通网络日益复杂,人们必要的移动性也有越来越频繁的趋势。这使得每个人对空间信息有了更多的依赖,使得人们对于我身处在何方?、前往的目的地?、如何前往?等问题,存在著前所未有的需求性。因此,以嵌入式系统为主要平台的数码地理整合性应用与其因应方案,也就是手持式、车载gps全球卫星导航系统等,便可解决对此人们急迫的需求性。另外,随着时代的发展,对于gps导航的技术要求也越来越高。不仅要实现导航的基本功能,还要实时显示具体所在位置,以及周围路线,为到达目的地最便捷的一种方案。另外,随着计算机技术的飞速发展,全球定位系统(gps)和地理信息系统(gis)在各行各业中得到广泛的重视和应用,两者的集成化程度也越来越高。复杂的交通网,越来越多的自驾出行,要求有能够实现gps导航信息在gis上的可视化、一体化和集成化,能够在地图上实时动态地跟踪目标和显示地理位置的小型导航系统。本文将在嵌入式平台上实现一个导航软件系统,实现定位、最短路径搜索、导航、地图浏览等功能。其中所经历的步骤有:电子地图获取和数据读入,地图数据的处理,gui界面的实现,地图的绘制,最短路径算法的代码实现,提取串口读取进来的gps数据,最后实现定位与导航功能。 1.2. 本文的主要工作及安排本文的主要工作是:详细介绍实现gps导航软件系统的功能的过程,并对相关的概念进行介绍。安排如下:本文先对所涉及到的概念进行介绍;并对本设计所用的电子地图格式进行分析,给出了制作地图的方法;然后对硬件平台以及软件环境作了简明扼要的介绍,包括操作系统和gui系统;接着给出整个导航软件系统的设计思路和架构;然后给出导航软件系统功能详细的实现步骤,最后进行调试运行并对运行效果进行了分析。第二章 相关知识的介绍1.12122.2.1. gps概述gps是global positioning system即“全球定位系统”的简称,是20世纪70年代由美国陆海空三军品联合研制的新一代空间卫星导航定位系统。其主要目的是为陆、海、空三大领域提供实时、全天候和全球性的导航服务,并用于情报收集、核爆监测和应急通讯等一些军事目的,是平车独霸全球战略的重要组成。经过20余年的研究实验,耗资300亿美元,到1994年3月,全球覆盖率高达98%的24颗gps卫星已布设完成。在军用领域取得成功之后,gps系统逐渐用于民用领域。为了国家安全, gps卫星发射两种信号,一种是民用信号;另一种只有军方才能解码。2000年以后,美国政府取消对gps卫星民用停产的sa干扰,发用gps定位精确度达到平均6.2米的实用化水平,从而掀起gps产业和应用热潮。gps系统由三大子系统构成:空间卫星系统、地面监控系统和用户接收系统。空间卫星系统是一个由覆盖全球的24颗卫星组成的系统。这个系统可以保证在任意时刻,地球上的任意一点都可以同时观测到4颗以上卫星,以保证卫星可以采集到该观测点的经纬度和高度,以便 实现导航、定位、授时等功能。用户接收系统主要由无线电传感和计算机技术支撑的gps卫星接收机和gps数据处理软件构成。接收机在捕获到跟踪的卫星信号后,就可测量出接收天线至卫星的伪距离和距离的变化率,解调出卫星轨道参数等数据。接收机中的微处理器就可根据获得的数据,计算出用户所在地理位置的经纬度、高度、速度、时间等信息1。2.2. gis概述gis即geographic information system,地理信息系统,是在计算机软硬件支持下,以空间数据库为基础,对空间数据进行采集、存储、管理、分析、显示与描述,为用户规划、决策、管理和研究提供信息支持的技术系统,是随着地理科学、计算机技术、遥感技术和信息科学的发展而发展起来的一个新兴边缘学科1。一般由计算机系统、地理数据库系统、应用人员与组织机构组成。嵌入式gis是新一代地理信息系统发展的代表方向之一,它是运行在嵌入式计算机系统上高度浓缩、高度精简的gis软件系统2,是导航、定位、地图查询和空间数据管理的一种理想解决方法,在军事、智能交通、旅游、自然资源调查、环境研究等领域被广泛使用。2.3. 电子地图..3.1. 电子地图的格式本文设计过程中主要涉及到栅格图和矢量图。栅格图最常见的有jpeg格式图,是以像素点来存放的。而矢量图矢量图也叫面向对象绘图,是用数学方式描述的曲线及曲线围成的色块制作的图形,它们在计算机内部中是表示成一系列的数值而不是像素点,这些值决定了图形如何在屏幕上显示。用户所作的每一个图形,打的每一个字母都是一个对象,每个对象都决定了其外形的路径。因此,可以自由地改变对象的位置、形状、大小和颜色。同时,由于这种保存图形信息的办法与分辨率无关,因此无论放大或缩小多少,都有一样平滑的边缘,一样的视觉细节和清晰度。2.3.2. mif与tab矢量图为了便于读取和显示,以及实现缩放浏览等功能,选择矢量图是不二的选择。而矢量图方面,有tab和mif两种格式文件可选。两种格式都可从mapinfo软件获得。mif文件是mapinfo用来向外交换数据的一种中间交换文件,内容存放格式简单明了,以asc码存放,易于读取操作,最重要的是存放体积小,非常符合嵌入式系统精简的特点。因此本文选择用mif地图文件作为系统地图的接口文件。2.3.3. mif与mid文件的格式当用户在mapinfo中将一张mapinfo地图表以mif格式转出来mif文件中后,mapinfo会同时在用户指定的保存目录下生成两个文件(*.mif,*.mid)。其中*.mif文件保存了该mapinfo表的表结构及表中所有空间对象的空间信息(如:每个点对象的符号样式、点位坐标;每个线对象的线样式、节点数据、节点坐标;区域对象的填充模式、每个区域包含的子区域个数及每个区域的节点数、节点数等)。而*.mid文件则按记录顺序保存了每个空间对象的所有属性信息。这两个文件都为文本性质的文件,用户可以通过相应的文件读写方法实现对文件内容的读写。 mapinfo数据在两个文件中图形保存在*.mif文件中,而文本数据包含在.mid文件中。文本数据是分界数据,每行一个记录以及行间的回车,或者回车加换行,或者换行。mif文件有两个区域文件头区域和数据节。2.4. 电子地图的制作本文电子地图的制作需要准备两个软件,goole earth和mapinfo,版本可选。本文用到mapinfo 9.5版3。这两个软件分别用于获取两种格式的地图,goole earth截取栅格图,mapinfo在栅格地图的基础上绘制地图,最终制成mif/mid格式的地图,作为qt接口地图数据文件。下面是具体步骤:图2- 1 地标标于明显位置(1) 在goole earth中找到华南理工大学北校区的范围,设置“显示经纬度”为小数格式,在校区内选取比较明显的位置添加地标,并记录下该位置相应的经纬度。地标是为了后面mapinfo可以配准这张地图,一般3个足够。地标越多,配准越精确,误差越小。笔者在此标了16个地标,如图2- 1比较有标志性的位置。(2) 地标标完后,调整缩放比例到整个校区都在视野内,调整右上角罗盘使视角达到近似90度的俯视角。然后保存此图像,默认是jpeg格式的,名为“华工”。这便是后面配准所需要的栅格图了。(3) 在mapinfo中打开“华工.jpeg”,选择配准(register)进入配准界面,投影方式选择longitude/latitude,在图像上标有地标的位置,仔细标上标号,并给标号输入之前记录下来的相应的经纬度,其中x为纬度,y为经度。所有地标标记完毕,确定即可得到一张有经纬度有地图,即“华工.tab”文件。(4) 在“华工.tab”的基础上建立四个图层,依次为block.tab, road.tab, nodes.tab, edge.tab。在block.tab中用多边形polygons工具按建筑投影形状画出各建筑和场地;在road.tab以粗细不同的折线画道路;在nodes.tab以点的形式标出道路各节点;edge.tab画出华工边界,并给整张地图标上四个顶点。如此完成保存后,菜单栏-表-转出各个表,保存为mif格式。第三章 系统结构. 硬件系统的介绍本文采用忆道公司的xsbase270开发平台,xsbase270开发平台基于 intel/marvell xscale 架构最新的 pxa270 嵌入式微处理器。最高主频可达 520mhz,可运行 linux 2.4.21和 linux 2.6.11的 linux的操作系统,支持 tiny-x、qt/e 等 gui 嵌入式图形用户界面,提供完整的驱动和应用程序。同时还可以支持最新的 windows ce 5.0.net操作系统。系统由模块板以及扩展板构成,扩展板接口资源丰富,可进行多功能项目开发。既适合作为计算机、电子、通信、软件等专业开设嵌入式软件课程的教学平台,又适合广大从事车载娱乐、工业控制、手持设备、医疗仪器的厂商和科研单位作为参考设计平台。如图3- 1,本设计主要用到该平台的外围设备tftlcd和gps模块。图3- 1 xsbase270开发平台3.2. 软件系统.3.2.1. 操作系统的选择鉴于该平台支持两种操作系统,本文在开发之初应先做好选择。两者相比之下,linux具有以下优点:(1)linux是开放源代码,遍布全球的众多linux爱好者都是linux开发者的强大技术支持者;windows ce目前6.0内核全部开放,gui不开放。(2)linux的内核小、效率高;windows ce相比,占用过多的ram。(3)linux是开放源代码的os,在价格上极具竞争力,适合中国国情。windows ce需要版权费用。(4)linux不仅支持x86芯片,还是一个跨平台的系统,支持多种平台。 综上所述,结合本设计实际地图数据占用内存可能较大,故选择内核可剪裁的linux系统。3.2.2. 导航软件系统的架构对于小型嵌入式导航系统,根据实际需要至少要能实现如下功能:(1) 定位: 结合gps数据,对地图上显示gps接收块所在的地点。(2) 最短路径搜索:根据用户输入的两个位置,在地图上显示最短的路线。(3) 地图漫游:可浏览整张地图,查看简单的位置事物信息。当前位置最短路径搜索放大正常大小地图导航退出地图显示窗口缩小退出导航工具栏图3- 2 gui界面的设计雏形(4) 地图缩放:漫游或导航时可改变地图大小。(5) 地图导航:结合最短路径搜索的实时定位。根据实际需要,人机交互界面可设计如图3- 2所示,右栏为工具栏。而设计导航软件系统的结构如图3- 3所示。该软件系统的工作流程如下:首先进行数据初使化,如程序运行过程中所要用到的标志数,构建新指针;接着构建gui界面,根据需图3- 3 导航软件系统结构图 数据,指针初使化 构建gui界面函数 地图层操作函数 重合节点清除函数 构建邻接矩阵和路径信息矩阵 启动qt定时器,定时1s工具栏各槽函数触发gps硬件串口驱动模块定时读取地图文件读取要只需要工具栏和一个canvasview窗口作为视图窗口即可;然后读取地图数据并按一定方式存储起来并在canvas中画出;紧接着把道路重合的结点清除,并初始化最短路径搜索所要用到的两个数字矩阵;这时才启动定时器,每隔1s读gps模块的串口一次,并从读到的数据中提取有用信息存储起来,以供定位和导航所用。最后处于待命状态,等待用户输入相应的命令,通过相应的槽函数随时响应。为了使读者对此系统的运行流程了解更加明了,特给出如图3- 4所示的系统工作流程图。图3- 4 导航软件系统程序流程图初始化构建界面读取地图数据并绘图清除道路重复节点开始初使化最短路径邻接矩阵和路径信息矩阵启动定时器aa是否有用户命令?否最短路径搜索放大缩小正常大小导航退出导航退出定位是响应相应的槽函数1s定时溢出?读取gps数据验证并提取有用信息是否导航?定位否是是否第四章 用户图形界面的设计与实现123. gui的选择目前在常用的嵌入式gui领域,广泛使用系统由嵌入式qt、microwindows和minigui三种,适于在嵌入式linux上运行的,主要是奇趣公司(现为诺基亚公司)的qt/embedded和北京飞漫公司的minigui。qt是奇趣公司开发的一个跨平台的c+图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。qt是完全面向对象的,很容易扩展,并且允许真正地组件编程。自从1996年早些时候,qt进入商业领域,它已经成为全世界范围内数千种成功的应用程序的基础。qt也是流行的linux桌面环境kde 的基础。 基本上,qt 同 x window 上的 motif,openwin,gtk 等图形界 面库和 windows 平台上的 mfc,owl,vcl,atl 是同类型的东西,但qt具有优良的跨平台特性、面向对象 、丰富的api、大量的开发文档等优点4。qt/embedded则是trolltech公司发布的面向嵌入式系统的qt版本。该公司2008年3月收归诺基亚旗下。minigui是由北京飞漫软件技术有限公司开发的面向嵌入式系统的轻量级图形用户界面支持系统。自1999年发布第一个版本以来,minigui已广泛应用于手持信息终端、机顶盒、工业控制系统及工业仪表等产品和领域5。笔者收集资料对比两者各自的特点如下:(1) qt/e编程使用c+面向对象的所有机制。minigui使用c语言,采用结构化编程。(2) minigui对中文支持较好,qt/e也可支持中文,但不像前者方便。(3) qt/e使用qt自身一些基于c+附加的功能、信号和槽以及相应的宏编译(moc)机制。基于此强大开发功能,为快速建立嵌入式gui程序提供了很大的方便。而minigui提供的功能模块较少,对于中高端手持设备的界面开发,minigui使用较复杂。综上,权衡之下,入门较快,功能更加强大的qt/e,作为本gps导航软件系统的gui是更好的选择。4.2. qt介绍qt泛指qt的所有桌面版本,比如qt/x11,qt windows,qt mac等。由于qt最早是在linux中随着kde流行开来的,因此通常很多人说的qt都指用于linux/unix的qt/x11。qt/e(qt/embedded)是用于嵌入式linux系统的qt版本。qt/e去掉了x lib的依赖而直接工作于frame buffer上,因而效率更高,但它并不是qt的子集,而应该是超集,部分机制(如qcop等)不能用于qt/x11中。一般只要取对应的版本就能使在qt/x11上能用的类在qt/e中也能使用。这也正是qt的方便之处,在宿主上编写完代码后,只需要根据不同平台的目标机用不同的工编译工具编译,就可在目标机运行,而不用修改代码。4.3. 开发环境的介绍...1. 操作系统宿主机上要求安装有linux操作系统,然后在该linux系统下安装交叉编译工具链。在开发板建立elinux操作系统(主机是windows或linux均可)。基本上可以有两种方法来建立宿主机上的linux系统:(1) 建立独立的主机redhat linux操作系统;(2) 在window下,利用虚拟机管理软件,建立一个可以在windows启用和管理的虚拟redhat linux操作系统。鉴于在虚拟机有如下优势:虚拟机也能够控制系统硬件;完全能够满足交叉编译环境需要,而且方便与windows系统进行切换;虚拟机使用windows下文件来作为硬盘空间,相对于双系统,不需复杂的硬盘分区;虚拟机在windows下,只是几个文件而已,方便备份和恢复。而且在本实验系统中,windows系统和linux 系统都必不可少,故选择虚拟机方式来建立宿主机的系统。4.3.2. 交叉编译环境嵌入式系统的开发需要宿主机(host pc),因为嵌入式系统一般没有大容量的存储设备6。而由于host pc的处理器与嵌入式微处理器通常不同,为了生成能够在嵌入式系统中运行的代码,需要进行交叉编译。交叉编译,即在宿主机(x86)上编译可以在目标系统(arm)上运行的二进制文件。开发板是嵌入式linux操作系统,故交叉编译环境要求在主机的linux操作系统下建立本系统交叉编译环境,即在主机的redhat 9.0 linux操作系统下建立。4.3.3. gui开发环境本导航系统设计过程中需要用到三个版本的qt库,版本如表4- 1所示工具软件描述变量声明tmake1.11生成makefile文件tmakedir/tmakepath/pathqt-embedded-2.3.7qt库支持 libqte.soqtedir/ld_library_path/path工具软件描述变量声明qtopia-free-1.7.0应用程序开发包 桌面环境qpedir/ld_library_path/pathqt-x11-3.1.1qvfb虚拟帧缓存工具uic用户界面编辑器qt designer 图形设计器ld_library_path_/path表4- 1 gui编译工具表其中qt-x11-3.1.1是现在redhat9 linux自带的qt编程工具,包括qvfb工具和qt desinger,可为我们设计图形用户界面节省不少时间,提高设计效率。当程序在宿主机上运行正常后,在下载到目标机调试之前,要用tmake1.11工具生成用于编译应用程序的makefile文件,然后利用qt-embedded-2.3.7的库和qtopia-free-1.7.0重新编译代码,以便生成可在开发板上运行的版本。4.4. gui设计.4.1. qt窗口类介绍如图3- 2所示的界面思想,本导航系统需要构建一个带有工具栏的窗口,地图显示窗口放在主窗口位置上。qt为我们提供了多种窗口类,如qwidget,qmainwindow,qdialog等。他们的关系如图4- 1所示:低层类从高层类继承。图4- 1 qt类继承关系图在qt中,qmainwindow和不同的qdialog的子类是最普通的顶级窗口,即不被嵌入到一个父窗口部件的窗口部件。通常情况下,顶级窗口部件是有框架和标题栏的窗口。qmainwindow提供一个有菜单条、锚接窗口(例如工具条)和一个状态条的主应用程序窗口。主窗口通常用在提供一个大的中央窗口部件(例如文本编辑或者绘制画布)以及周围菜单、工具条和一个状态条。而qdialog类是对话框窗口的基类。对话框窗口主要用于短期任务以及和用户进行简要通讯的顶级窗口。如常见的“打开文件”对话框和“保存文件”对话框。一般情况下,如果是顶级对话框,那就基于qdialog创建,如果是主窗体,那就基于qmainwindow,如果不确定,或者有可能作为顶级窗体,或有可能嵌入到其他窗体中,则基于qwidget创建。综上分析,结合本设计的需要,选择qmainwindow类创建本gui界面的主窗口,而用qdialog类创建最短路径搜索对话框。4.4.2. 信号与槽机制图4- 2 信号与槽的连接原理为了响应用户在界面上的操作,qt提供了信号(signal)和槽(slot)机制,这也是qt程序相对于c+比较特殊也有非常方便的机制。当一个对象的状态发生改变时,它就会发出signal通知所有的slot接收signal,尽管它并不知道哪些函数定义了slot,而slot也同样不知道要接收怎样的signal,但他们可以通过connect关联起来,如图4- 2所示。signal和slot机制真正实现了封装的概念,slot除了接收signal之外和其它的成员函数没有什么不同。这样在工具栏里就可能通过添加qaction类来表示不同的动作或工具,以供用户选择性操作。这些qaction作为信号发射端,qmainwindow作为信号接收端,即connect(qaction,signal(activated(),qmainwindow,slot(slot_n());在这里的qaction表示qaction声明的类,qmainwindow也表示其相应的类。activated()是该动作的触发信号,当用户点击该工具动作时就会触发该信号发射,而slot_n()作为该动作的响应函数就会被调用执行。详细的创建步骤和关键代码请看下文。4.4.3. 主窗口的创建首先构建一个继承自qmainwindow的类作为顶级窗口部件,为了方便程序接口,将在此中声明整个系统用到的必要的指针和成员函数。包括工具条qtoolbar,动作qaction和槽函数等。对于没必要的菜单栏,选择省略。对应本设计的功能,共声明了8个动作指针以及与之对应7个槽函数。在成员函数creatactions()中定义这些动作指针,并把通过connect()函数将它们一一关联起来。代码如下:connect(curpositionaction, signal(activated(),this, slot(curpositionrespond();connect(pathsearchingaction, signal(activated(),this, slot(pathsearchingrespond();connect(zoominaction, signal(activated(),this, slot(zoominrespond();connect(zoomoutaction, signal(activated(),this, slot(zoomoutrespond();connect(normalsizeaction, signal(activated(),this, slot(normalsizerespond();connect(navigationaction, signal(activated(),this, slot(navigationrespond();connect(exitnaviaction, signal(activated(),this, slot(exitnavirespond();connect(exitaction, signal(activated(),this, slot(close();最后一个槽函数close()是qmainwindow类自带的关闭窗口槽函数,用于关闭本gui界面。这样,只要在各个槽函数中写好事件处理代码,就可以响应用户的各个工具选择了。接着用qaction:addto()添加到工具栏中。接下来创建一个qcanvas画布作为地图绘图平台,再用qcanvasview窗口关联此容器,这样画布中的项目才能显示出来,即qcanvasview类为该画布提供了一个视窗,外界才能通过此视窗看到画布中的东西。然后通过qmainwindow:setcentralwidget()把qcanvasview类窗口设置为主窗口的中心部件。这样主界面创建完毕。4.4.4. 最短路径搜索对话框图4- 3 最短路径搜索对话框声明一个qdialog类对话框,标题为“pathsearching”,以此为父组件,添加三个qlabel标签,两个qlistbox列表框和两个qpushbutton按钮。三个标签的内容,分别为“please choose the beginning and terminal”、“beginning”和“terminal”,是该对话框的提示内容。两个列表框分别显示着学校各个地点,用户可从两表中分别选择起点和终点。两个按钮内容分别为“ok”和“exit”,选择好起点与终点后按ok即可得到最短路径,按exit即退出并取消此次操作。如图4- 3所示。为了知道用户选择的是哪一个地点,需要在记录下起点与终点。可通过槽函数修改(记录)全局变量beginning和terminal来完成。代码如下:connect(beginlist, signal(highlighted(int), this, slot(returnbeginning(int);connect(terminallist, signal(highlighted(int), this, slot(returnterminal(int);当用户选择列表中的某一项时,列表的highlighted(int)信号被触发,发射该项的序号,以上的两个槽函数即修改全局变量以记录下起点与终点的序号,便于后面查找处理。当用户按下ok按键时,触发槽函数findshortestpath(),在这里面分两种情况进行处理,一种是用户已经选好了起点和终点,那么就可直接进入最短路的搜索和绘制;另一种是用户没选择起点或终点,或全都没选,这时将出现提示,让用户返回重新选择,或直接放弃最短路径搜索。而按下exit则直接退出此次路径搜索。如图4- 4所示,只要漏选了起点或终点都会出再提示,返回再选或取消操作。图4- 4漏选起点或终点提示第五章 嵌入式gis功能的实现设计好gui界面后,在实现本导航系统的功能之前还需要两方面的数据,即地图数据和gps数据。下面将介绍这两种数据的获取关键代码和地图绘制方法。.. 地图读取5.1.1. 地图图元数据格式地图文件是第二章所作的block.mif/mid,road.mif/mid,nodes.mif/mid和edge.mif/mid等文件。在读取之前,要先清楚这些文件的数据存放格式,才能有的放矢地进行读取操作。如前文对于*.mif/mid文件的格式所述,mif文件存放的是矢量图形数据,具体举例如下,例如本文的block.mif文件中的多边形图元,一个多边形图元的数据格式如下:region numpolygons numpts1 x1 y1 x2 y2 : numpts2 x1 y1 x2 y2 : pen (width, pattern, color) brush (pattern, forecolor, backcolor) center x y 其中numpolygons表示组成该多边形的多边形的个数,因为它有可能是若干个子多边形合并起来的,在数据方面仍然以多个多边形的格式表示。numpts表示子多边形的顶点个数。xn,yn表示每一个顶点的经纬度。pen是画笔,用于画多边形的边缘,其属性包括线宽,风格(实线或是虚线等格式),颜色。brush属性包括图形的填充风格和颜色。为了方便,在画图的时候,笔者将前景色和背景色设置相同。center是该图形的中心点。其他图元数据的格式在这里就只介绍涉及到的折线图元和点图元,如下所示:折线图元,其中的smooth表示该线经过平滑处理:pline numpts1x1 y1 x2 y2 : pen (width, pattern, color) smooth 点图元,symbol表示该点的属性,包括形状、颜色和大小。point x y symbol (shape, color, size)而在各个mid文件中则存放着与其对应的mif文件中的各个图元的信息,如block.mid保存了各个多边形所代表的地名或建筑物的名字。5.1.2. 地图数据读取准备在读取之前还需要根据不同的地图数据建立不同的结构体或类来存放。鉴于地图数据只有多边形,折线和点以及文本三种数据,对应着建立以下数据结构体和类。typedef struct double longitude; double latitude;stlatlon;此结构体用于存放一个点的经纬度。typedef struct int x; int y;strecplane;此结构体用于存放一个点通过投影转换后的平面坐标。在这里用整形是因为qt3的qcanvas容器暂时只是支持整形坐标点。所以在做投影转换后,直接保存为整形,避免后面再转换。如果在qt4上,图形容器可支持double型坐标数据,那么,这里可改为double型的,在投影转换函数修改相应的数据类型即可。对于图元,本文建立了三个类,用于存放多边形区域、折线和点三种图元。具体如下:class map_regionpublic: map_region(qcanvas *canvas); map_region();public: qcanvastext *regionname; qcanvaspolygon *mappolygon; /;在该类中直接使用qt自带的qcanvastext类和qcanvaspolygon类分别声明了指向该多边形名字的指针和该多边形的指针。qcanvastext类带有可以设置位置的成员函数,即可以设置其中qcanvas类容器中的坐标。这样,就可以把多边形数据中的center作为文字的位置坐标,当然,要先经过投影转换才能在添加到容器中的正确位置上。class map_polylinepublic: map_polyline();public: / qcanvastext name; qvaluelist mappolyline;折线图元类,主要用于存放代表道路的折线图元,而折线又可看成是多段线段构成,那么在读取的时候就可以把每条折线分成若干条直线来保存,只需要把每两个连续的点记录为一条线段即可。故在此链表的方式存放一个折线图元的所有直线。class map_pointpublic:map_point();public:stlatlon latlon; qpoint coordinate;/这里也可以用前面的strecplane声明,两者都是整形的。 qstring name;/如果要在地图上显示节点名,可以用qcanvastext类。;点图元类,用于存放点数据,包括其经纬度、平面坐标和文字描述。建立好单个图元存放类后,为了方便管理,可以用通过链表的方式来管理这些图元,这样不但可以使用物理存储区的不连续块,还可以有不同的模板类来管理不同类型的数据,大大优于数组。本文选择用qt3自带的数据容器qvaluelist类,是一个提供基础值列表模板的类,可以管理不同类型的数据,而且该类有多个方便的成员函数,如append(),重载运算符等等,都可以使代码大大简化,而且可读性更强。代码如下:qvaluelist mapregions;qvaluelist mappolylines;qvaluelist mappoints;他们的寻址取值方式,结合重载运算符基本上与c+代码无异。5.1.3. 读取地图数据清楚了地图文件的格式,确定好存放数据的方式后,接下来就要写代码实现对这些文件的数据读取。在读取文件方面,qt为开发者提供了非常方便的类qfile和qtextstream。qfile类是一个用来读写二进制文件与文本文件的输入输出设备。qfile可以被自己或更方便的类 datastream或qtextstream使用。在这里只用qfile来打开地图文件,而读取数据则用qdatastream或qtextstream。由于qtextstream可以满足我们读取不同类型的数据,包括int,qstring,char,double等等,所以选择qtextstream来读取即可。图5- 1 读取block.mif/mid文件程序流程图创建两个qfile对象指向block.mif/mid文件路径是否都打开成功?是否到达.mif文件最后?用qtextstream从 .mif读入字符串是否为region?读入region数,顶点数,经纬度(放于链表longs中)新建map_region图元指针,读入mid文本信息,经纬度作投影转换,存储坐标是否关闭文件结束是否aa是否异常返回创建两个qtextstream对象读以上两个qfile对象在这里只举例说明block.mif/mid的读取流程,结合图5- 1的程序流程图,如前文所说,以qfile类打开指定路径的格式的文件,然后用qtextstream类读取数据。qtextstream可以根据接收数据的变量的类型读取相应类型的数据。例如,int x;double y;qtextstream out(file);outxy;此段代码out从file中读取一个整形数据写入变量x,然后读取一个双精度类型的数据写入y。由此可见,只要知道文件中数据的排列方式,配合必要的数据筛选,就可以准确无误读取其中的信息。为了避免重复寻址,在这里,同时打开这两个文件,每读取一个图元就读取一次mid文件获得其对应的文本描述信息。对于qcanvaspolygon类,要求该多边形区域的全部顶点坐标,代码里可以利用qt的qpointarray类创建一个数组,用于存放该多边形区域的全部顶点坐标,再传递给该图元指针。关键代码如下:qpointarray *polygonpoint =new qpointarray(longs.count();for(uint i=0;isetpoint(i,convertcoord(longsi,latsi);其中链表longs中以结构体stlatlon为单位存放着一个多边形区域的全部顶点的经纬度,convertcoord()函数是投影转换函数(后面详细介绍)。接着,文本信息的读取直接用qtextstream:readline()读取整行文字。再给文本设置坐标即完成了一个多边形区域图元的所有信息的读取,只要设置好其属性值,就可以将其像压入堆栈般放入链表mapregions。代码如下:region-mappolygon-setpen(pen); /设置画笔region-mappolygon-setbrush(brush); /设置填充刷region-mappolygon-setpoints(*polygonpoint); /设置该多边形的顶点坐标最后放入链表mapregions.append(region);这就完成了一个图元数据的读取和存放。如此循环反复,直到文件的最末处,就跳出循环,关闭文件。其他文件的读取方式与此基本相同,就不再一一解说。5.2. 电子地图的绘制5.2.1. qt画布类在介绍地图绘制步骤之前,有必要先介绍一下之前一直提到的qcanvas类以及以此为前缀的其他qt类。qcanvas,即画布,该类提供了一个高级的平面图形编程接口,是一个高度优化的2d绘图区,可以处理大量的诸如线条、多边形、矩形、文本、位图、椭圆、动画等画布项。画布项是qcanvasitem子类的实例,允许被快速的移动,隐藏和显示。例如本文电子地图存储类所用到的qcanvasploygon,qcanvastext,qcanvasline 等类对象都属于画布项,是qt预定义的画布项子类。对于qcanvas对象的显示,qt提供了特定的视图类qcanvasview来进行显示的,qcanvasview派生于视窗类qscrollview,拥有qscrollview的所有性质,而且qcanvasview对象可以通过不同的比例、译文、剪切方式、旋转角度来显示同一个画布。另外,视图在画布中可以使用一个任意的变换矩阵qwmatrix对象,通过使用其成员函数qwmatrix:scale()就可以容易地实现缩放的特性。这对于本导航软件系统实现地图缩放功能无疑是莫大的帮助。5.2.2. 创建画布对象和画布视窗用qcanvas创建一个画布类对象,这跟前面创建主窗口对象时所建的画布是同一个画布,这里再作详细说明。因为还要设置该画布的大小,即高h和宽w,这里可以自定义,但为了跟地图大小成比例,设置高宽比例为h/w = latitude/longitude。这样,画布的各顶点相当于地图各顶点,不会有多余的区域。以下为创建qcanvas对象和qcanvasview对象的代码:qcanvas *canvas = new qcanvas(w,h);/预设置画布大小,根据地图顶点经纬度来定canvasview = new qcanvasview(canvas,this);/this为其父组件mainwindow类指针canvasview-setworldmatrix(wm);/设置变换矩阵用于缩放setcentralwidget(canvasview);/设该视窗为mainwindow的中心部件。canvasview-sethscrollbarmode(qscrollview:auto);canvasview-setvscrollbarmode(qscrollview:auto);/设置自动化滚动条canvasview-setupdatesenabled(true);/设置视窗为可更新模式canvasview-show(); /显示该视窗内容。该段
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 大众机油知识培训
- 人教版九年级化学 2.2氧气的教学设计
- 六年级数学上册 六 百分数第1课时 百分数的意义和读写教学设计 苏教版
- 九年级物理下册 第十八章 能源与可持续发展 三 太阳能教学设计 (新版)苏科版
- 彩钢板设计培训
- 出国参展展前培训
- 餐饮成本管理培训课件
- 一年级下册10 端午粽教案
- 二年级数学下册 6 有余数的除法第4课时 有余数除法的竖式计算(2)教学设计 新人教版
- 主题三:红色之美 第16课《乡村振兴-战旗村的崛起》(教学设计)川教版四年级上册综合实践活动
- 期中模拟测试卷(试卷)-2023-2024学年一年级下册数学人教版
- 2024年青海省电力交易员竞赛选拔考试题库(含答案)
- (高清版)TDT 1067-2021 不动产登记数据整合建库技术规范
- 民宿服务培训课件
- 公路养护安全意识培训
- 2025年4月自考00808商法押题及答案
- 铁路专用线设计规范(试行)(TB 10638-2019)
- ISO 45003-2021职业健康安全管理-工作中的心理健康安全-社会心理风险管理指南(中文版)
- 三年级语文 写通知(全国一等奖)
- 2024年河南艺术职业学院高职单招(英语/数学/语文)笔试历年参考题库含答案解析
- 边坡岩石锚喷支护设计方案
评论
0/150
提交评论