1、ANDROID平台公交查询工具的设计与实现摘要出行一直是人们日常生活中不可或缺的一部分。就目前情况而言,公交车仍是大多数人出行的首选的交通工具。人们的出行是无时无刻不在的,web查询服务无法满足人们突发、即时的查询。但随着手机的普及,功能的强大,使用的方便,它已成为人们生活工作中获取各种信息的主要途径之一,借助于无线互联网,人们可以直接通过手机随时随地地查找公交线路的信息,进一步提高公交的服务水平。本毕业设计主要是以福州公交线路为主进行设计的系统,它基于android平台开发的,利用Eclipse开发工具,主要以JAVA语言编写,以及Android的一些控件,选择SQLite作为目标数据库,应
2、用SQL语言实现对数据库的操作,地图部分使用谷歌地图。它主要实现的功能有换乘查询,将乘车的次数默认设置为三,将乘车次数最少的方案显示在最前面,还有线路查询和站点查询功能,不仅能显出查询的结果,而且还能够根据用户选择的线路实现电子地图的显示,使系统更加直观。本文详细地介绍了开发该系统所要用到的技术,接着介绍各个功能的概述和数据库的设计,然后是讲解系统各个功能实现的详细过程,尤其是详细地介绍了在Google map地图基础上的各个图层的开发,最后展示成品的最终结果,指出自己系统存在的不足之处。关键字:Android,SQLite,Google mapDesign and Implementatio
3、n of a Bus Routes Search Tool for Android PlatformAbstractIt is indispensable to going out in our daily life. In the light of present situation, bus is still the first choice for most people. People may go out all the time, hence, web search service can not satisfy the sudden and immediate demands.
4、As mobile phones become widespread, multifunctional and convenient, it has been an important way to get information through the wireless Internet in our life. We can directly get information about bus routes through the mobile phones at all times and all places. The bus service quality will further
5、improved.This graduation project is a system designed for Fuzhous bus routes. It is developed based on Android platform and written in JAVA language. It utilizes Eclipse development tool, some basic combination controls of Android system and Google map. It takes SQLite as target database and is oper
6、ated by SQL language. One of its major functions is to search the changes of rides. It takes 3 as the default value of ride times. The program with the least times will be shown at the first. It can also search the routes and bus stations. It not only gives the results, but also shows them on the el
7、ectronic map according to the users choices, which makes the system more visual.This thesis elaborates the technologies used in the system, their functions and the design of database. Then, it explains the implementation process of every function, especially the development of each picture layer bas
8、ed on Google map. Lastly, it shows the final result of the project and point out its shortages.Key words: Android, SQLite, Google map27目 录第1章 绪论11.1 研究背景11.2 研究现状11.3 研究目的及意义21.4 本次课题研究内容21.5 本文组织结构2第2章 Android相关技术背景介绍32.1 Android操作系统简介32.1.1 Android简介32.1.2 Android的特点32.1.3 Android架构32.2 SQLite简介42
9、.3 Android布局管理器52.4 Android基本组件介绍52.4.1 Activity简介52.4.2 Intent简介62.5 Toast的使用72.6 Google Map介绍7第3章 系统总体结构设计83.1 系统主要功能模块83.2 数据库设计83.2.1 数据库概念模型设计83.2.2 数据库表设计93.2.3 数据库的相关操作10第4章 公交系统的实现114.1 欢迎界面的实现114.2 主要功能的实现114.3 Google Map的使用154.3.1 地图开发的前期准备154.3.2 地图的初始化164.3.3 地图图层的开发16第5章 整体测试与分析改进185.1
10、截图及运行说明185.2 软件可以改进之处23结论24参考文献25谢辞26附录1 部分关键源码及解释27ANDROID平台公交查询工具的设计与实现第1章 绪论1.1 研究背景随着城市规模的逐步扩大,使整个城市的交通干道越来越复杂。在这种情况下,城市公共交通运输以其覆盖面广、经济、快捷的特点,成为绝大多数出行者的首选方式,也是各地城市政府大力推荐的一种出行方式。因为它从很大程度上缓解了交通压力,改善了交通状况。要想提高公交服务的水平的途径很多,其中很重要的一条途径就是提高智能公交系统的建设。但是我国城市公交车查询系统的发展还处于一个相对落后的水平,广大乘客可以获取公车线路的方式很少,而且线路的完
11、整性、准确性及实时性无法得到保证。1.2 研究现状国外许多国家都十分重视公交查询的研究和应用。其目的在于通过提供及时准确的信息和服务,吸引更多的出行者使用公共交通,促进公交的大力发展,减缓城市的交通压力。尤其是美国,他们的研究取得了较好的效果。他们发展公交查询系统的特点是能够提供快捷、方便的电话咨询服务;与定位技术相结合,提供实时信息服务;触摸屏在公共场所的广泛使用以及查询与网络的结合。欧洲一些国家,如芬兰、意大利等,他们在研究公交查询方面也取得了不小的成果。近年来,我国的公交查询系统也在迅速地发展,不少城市也都有拥有公交线路查询系统,网络上也可以下载到许多不同的版本。不过公交查询系统在发展的
12、同时也存在一些问题,需要不断地改进和完善。比如早期的公交查询系统脱离了网络,只是一种供人下载后方可查询的程序,是一种单机程序。这样的信息不够准确,也不够及时。有一部分公交查询系统,它们只是简单地将各个线路和站点的信息一一罗列出来,让用户自己去一条条查找。而真正意义上的公交查询系统应该是用户输入想要查询的内容,系统能够自动查询出结果,而不是靠用户人工进行查询。还有一部分网上的公交查询系统,它们的系统功能比较完善,实现站点、线路查询以及换乘查询,更加完善一点的系统还有电子地图查询等功能,但是对城市有代表性的地点介绍和查询的功能,做得好的比较少。还有就是手机上的公交查询系统,可以采用短消息的形式进行
13、查询,但也有一定的局限性。硬件方面,比如遇到服务器、网络繁忙时或者信号盲区,导致用户请求长时间得不到回应。软件方面,运营商不一定提供此类的查询服务。现行的公交车系统或多或少都还是存在一些缺陷的。但是随着技术的更新以及不断的改进,相信可以做出更人性化、更完善的公交查询工具。1.3 研究目的及意义出行是人们日常生活中不可或缺的一部分,而公交车是大多数人出行首选的交通工具,如何才能随时随地、方便快捷的获取公交线路的信息,合理安排自己的出行线路,是很多人非常关心的问题。建设智能公交系统,利用当代高新技术:电子、信息、通信、计算机、GPS、GIS等,将交通系统中的人、交通设施和交通工具有机的联系起来,建
14、立智能公交系统,如公交优先系统、公交查询系统、智能化行车系统等,为乘客提供实时的更多更全面的出行信息,更好的为乘客服务1。在智能公交系统中,公交查询系统的服务是目前最贴近乘客日常生活的,也是最能让乘客亲身体会公交服务水平高低的方面。因此,如何给乘客提供一个良好的平台,让乘客选择或是推荐合适的乘车方案出行,以节约乘车时间,缩短到达目的的乘坐距离,减少乘坐的票款成本,才是提高公交服务水平最值得关注的问题之一2。越来越多的人倾向通过上网获得和共享信息,随着网络应用的普及而不断的发展,Internet的应用成了世人关注的焦点3。智能公交查询系统既提供全面的公交信息,更具有实用性、便利性、多样性。因此我
15、们提出开发并设计了一个基于Android平台的公交查询系统。用户可以在任意一款Android手机中安装此工具。通过此查询工具可以查看线路,查找任意两地的乘车方案等,更方便用户出行,节约时间,减缓交通压力。1.4 本次课题研究内容本次毕业设计要研究的内容是学会界面的设计,进行数据库的设计并学会使用SQLite数据库,学会在Google Map的基础上进行地图开发。1.5 本文组织结构第二部分为关键技术介绍,主要介绍本系统中所涉及到的主要关键技术,第三部分是关于系统总体结构设计,主要介绍系统的功能模块和数据库的设计与实现。第四和第五部分就是系统详细的设计与实现及测试结果等,然后对整个毕业设计进行了
16、总结,最后部分为致谢。第2章 Android相关技术背景介绍2.1 Android操作系统简介2.1.1 Android简介Android是Google在2007年11月宣布的基于Linux平台的开源手机操作系统的名称,而在Android系统底层方面,Android使用C/C+作为开发语言4。该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的解决方案。2.1.2 Android的特点Android系统就是一个开发式的手机和平台电脑操作系统5,早期由Google开发,后由开放手机联盟开发6。它提供了从底层操作系统到上层的程序界面的所有软件,使用这个平台无
17、需缴纳任何的授权许可费用,同时不同的厂商还可以根据自身的需求修改和扩展Android平台。在Android平台下,除了应用程序运行的载体虚拟机之外,所有的Android应用程序之间是完全平等的。所有的应用程序都运行在虚拟机上面,虚拟机提供了一系列用于应用程序和硬件资源间通信的API。Android打破了应用程序之间的界限,在Android平台下开发应用程序,可以很方便的实现应用程序之间的数据共享。一个应用程序不但可以通过API访问系统提供的功能,还可以通过申明自身的功能供其他应用程序调用7。Android为开发人员提供了大量的使用库和工具,使得开发人员可以快速地创建自己的应用程序。例如Andr
18、oid将著名的Google Map集成进来,开发人员通过简单的几行代码就可以快速的开发出基于地图的应用。2.1.3 Android架构图2-1显示的是Android操作系统的主要组件。Android同一个核心应用程序包一起发布,该应用程序包括email客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是用Java编写的。Android应用程序框架即开发者也完全可以访问核心应用程序使用的API框架。该应用程序架构用来简化组件软件的重用:任何一个应用程序都可以发布它的功能模块并且任何其他的应用程序都可以使用其所发布的功能模块(不过得遵循框架的安全性限制)。该应用程序重
19、用机制使得组件可以被用户替换8。图2-1 Android系统架构图2.2 SQLite简介SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。Android 在运行时(run-time)集成了 SQLite,所以每个 Android 应用程序都可以使用 SQLite 数据库。SQLite 支持多数 SQL92 标准,很多常用的SQL命令都能在SQLite上面使用,除此之外Android还提供了一系列自定义的方法去简化对SQLite数据库的操作9。S
20、QLite 由以下几个组件组成:SQL 编译器、内核、后端以及附件。SQLite 通过利用虚拟机和虚拟数据库引擎(VDBE),使调试、修改和扩展 SQLite 的内核变得更加方便。SQLite 和其他数据库最大的不同就是对数据类型的支持,创建一个表时,可以在CREATE TABLE 语句中指定某列的数据类型,但是你可以把任何数据类型放入任何列中。当某个值插入数据库时,SQLite 将检查它的类型。如果该类型与关联的列不匹配,则 SQLite 会尝试将该值转换成该列的类型。如果不能转换,则该值将作为其本身具有的类型存储10。2.3 Android布局管理器Android本身是一个权限分立的操作系
21、统。在这类操作系统中,每个应用都以唯一的该系统主要用到的布局有线性布局和帧布局。(1) LinearLayout类线性布局是最简单的布局之一。android:orientation可以设置线性布局的朝向,可以是水平(horizontal)或者垂直(vertical)两种排列方式。同时使用android:gravity设置控件的对齐方式,还可以通过设置控件的weight参数控制各个控件在容器中的相对大小。(2) FrameLayout类FrameLayout帧布局在屏幕上开辟出了一块区域,在这块区域上可以添加多个子控件,但是所有的子控件都被对齐到屏幕的左上角。帧布局的大小由子控件尺寸最大的那个子
22、控件来决定。如果子控件一样大,同一时刻只能看到最上面的子控件,因为在FrameLayout中,子控件是通过栈来绘制的 11。2.4 Android基本组件介绍2.4.1 Activity简介Activity是android最常用的组件,是应用程序的表示层,Activity一般通过View来实现应用程序的用户界面,相当于一个屏幕,用户与程序的交互是通过该类实现的。 Activity类创建了一个窗口,开发人员可以通过 setContentView(View)接口把UI放到activity创建的窗口上,当activity指向全屏窗口时,也可以用其他方式实现:作为漂浮窗口(通过windowIsFloa
23、ting的主题集合),或者嵌入到其他的activity(使用ActivityGroup)12。如图2-2所示,Activity的生命周期主要包含三个状态,各种状态之间的切换是通过各种回调方法实现。处于运行态的Activity拥有焦点,正在与用户进行交互,该状态的Activity可以为用户提供信息并接收用户的事件响应。而处于暂停态的Activity失去了焦点,一般被运行态的Activity替代,当前台显示的Activity不是全屏时,可以见到暂停态的Activity。而处于停止态的Activity没有焦点,并且是不可见的,系统可以随时将其释放。图2-2 Activity生命周期2.4.2 Int
24、ent简介所谓Intent,就是一种运行时的绑定机制,在应用程序运行时连接两个不同的组件。一般的应用是通过Intent向android系统发出某种情求或者意愿,然后android系统会到根据请求查询各个组件声明的IntentFilter,找到需要的组件并运行它。Activity、Service和BroadcastReceiver,他们都是通过Intent机制激活的,不同类型的组件有传递Intent的不同方式13。而本系统中就是要激活一个新的Activity,可以通过调用Context.startActivity()方法。这个方法需要传入的Intent参数也称为Activity Action I
25、ntent(活动行为意图),为了能够使用该方法,所有的activity类都必须在AndroidManifest.xml文件中定义有相关的“activity”项。然后根据Intent对象对目标Activity描述的不同,来启动与之相匹配的Activity或者传递信息。2.5 Toast的使用Toast向用户提供比较快速的即时消息,当Toast被显示时,虽然其悬浮于应用程序的最上方,但是Toast从不获得焦点。因为设计Toast时就是为了让其在提示有用信息时尽量不显眼。比如:提示用户某些输入为不合法输入等。Toast对象的创建是通过Toast类的静态方法makeText来实现的,该方法有两个重载实
26、现,主要的不同是一个接受字符串,而另外一个接受字符串的资源标实符作为参数。Toast对象创建好之后,调用其show方法即可将消息提示显示到屏幕上。Toast一般只显示比较简短的文本消息,当然也可以显示图片。2.6 Google Map介绍Google Map是谷歌最为成功的一款网络服务之一,广泛应用在旅游景点的查询以线路导航等场合14。Google提供了一组API,可以方便的在应用程序当中添加基于地图的功能,详细介绍Google Map API的使用。Android中定义了一个名为com.google.android.map的包,其中包含了一系列用于在google map上显示、控制和叠层信息
27、的功能类,以下是对该包中重要的几个类的介绍:(1) MapActivity:这个类是用于显示Google Map的Activity类,它需要连接底层网络。MapActivity是一个抽象类,任何想要显示MapView的Activity都需要派生自继承MapActivity,并且子其派生类的onCreate()中,都要创建一个MapView实例。(2)MapView:MapView是用于显示地图的View组件。它派生自android.view.ViewGroup.它必须和MapActivity配合使用,而且只能被MapActivity创建,这是因为MapView需要通过后台的线程来连接网络或者文
28、件系统,而这些线程需要MapActivity 来管理。(3) OverLay:这是一个可显示于地图之上的可绘制的对象。(4) GeoPoint:这是一个包含经纬度位置的对象15。第3章 系统总体结构设计3.1 系统主要功能模块公交换乘查询模块:主要实现的是输入出发站和目的站,查询出乘车的方案,至多乘车3次到达目的地。公交线路查询模块:输入想要查询的线路,按顺序显示相应的站名,还可以进行线路的地图查询,在地图上显示线路。公交站名查询模块:输入想要查询的站名,显示经过该站的相关线路,点击线路,又可显示有哪些站经过该线路,还可以显示以该站为中心的相应线路。3.2 数据库设计3.2.1 数据库概念模型
29、设计根据系统的功能设计分析,本系统的实体主要有两个:站点和线路。下图列出了各个实体及其属性,如图3-1和3-2所示。站点站编号站名称站经度站纬度 图3-1 站点实体及属性线路编号线路名称线路 图3-2 线路实体及属性一条线路有多个的站点,一个站点可以被多条线路经过,所以线路和站点的关系是一对多。由此可以得到公交系统的E-R图,如图3-3所示。线路 站点 关联站编号站名称站经度站纬度线路编号线路名称n 1 图3-3 公交查询系统的E-R图3.2.2 数据库表设计将概念模型里的实体及属性转换成关系模型,于是知道了本系统需要三张表,分别是线路表lines,站名表station,线路关系表ls,以下将
30、详细介绍每张表的结构。(1) 线路表lines: 用于记录线路的基本信息。表3-1 lines表字段名数据类型是否主键是否为空字段含义L_ numberint是否线路编号L_nameVarchar2(20)否是线路名称(2) 公交车站信息表station:用于记录公交车站的基本信息。表3-2 station表字段名数据类型是否主键是否为空字段含义S_ numberint是否站编号S_ namevarchar(50)否是站名称S_jdvarchar2(20)否是站经度S_wdvarchar2(20)否是站纬度(3) 线站关系表ls:用于记录公交线路与站之间的关系。表3-3 ls表字段名数据类型是
31、否主键是否为空字段含义LS_ idint是否编号L_ numberint否是线路编号S_ numberint否是站编号3.2.3 数据库的相关操作(1) 数据库表的创建CreatTable类主要通过SQL语句建立表和插入部分数据,将所有SQL语句放入一个数组中,在通过循环调用的方法执行SQL语句即可实现建表和初始化数据功能。(2) 数据库的相关操作LoadUtil类是一个只提供功能的类,主要对数据库进行操作。其中连接数据库的方法是createOrOpenDatabase(),而查询数据库的方法是query()方法,先连接数据库,然后将查询结果以Cursor对象返回,再调用其moveToNext
32、方法进行遍历,最后返回查询结果向量。该类还提供了许多静态方法供其他对象调用。第4章 公交系统的实现4.1 欢迎界面的实现(1) 欢迎界面的设计WelcomeView类是本系统的欢迎界面。WelcomeView继承自SurfaceView,其绘画机制与普通的View并不相同。本系统的欢迎界面由两张图片组成。该类新起一个单独的线程重新绘制画面。首先绘制以白色填充的矩形画布,再依次绘制两张图片,该线程通过for循环,对欢迎界面图片1的透明度进行变化,每变化一次就画一次,这样就达到了渐变的效果。当第一张图片完全消失后,线程等待一小段时间,切换到第二张图片进行相同的处理,这样就达到了动态的效果。(2)
33、自定义GGView类使用Android,我们可以在屏幕上绘制各种诸如PNG和JPG的图像,以及文本和基本图形。要在屏幕上绘制,需要一个可用的Canvas(画布)对象。所以,该类就是通过继承View类,实现onDraw()方法,来获得一个Canvas。该类最终实现的功能是循环播放图片,提升界面的美观度。要想在相应的界面实现该功能,只需将在使用的地方添加如下代码即可。4.2 主要功能的实现(1) 换乘查询的实现换乘查询主要实现的是提供从出发站到目的站的乘车方案,最多实现二次换乘(即乘车次数为三次)。实现该模块功能有关的类:QueryUtil类、LineNode类LineNode类的主要变量和函数的
34、介绍:lineName:线路名称startStation:边的起点站endStation:边的到达站方法:LineNode(String lineName, String startStation, String endStation)是描述搜索过程中的边,比如说从车站A通过线路L可以到达车站B,如图4-1所示。 startStationLineendStation图4-1 LineNode结点QueryUtil类的主要变量和函数的介绍:主要变量:Set stationsSearched:用于保存已搜索过的车站。Set lineSearched: 用于保存已搜索过的线路,相同的线路不给出多次方
35、案。Set oldStations:当前搜索中旧的站点集。Set newStations:当前搜索中新的站点集。MapString, Set:这个结构很重要,Map中的String表示某个车站名,后面Set表示可以搜索到这个车站的LineNode结点。方法:getLinesByStation(String station):获取经过某个车站有哪些线路。getStationsByLine(String line):获取某条线路经过那些车站。查找出所有经过出发站和目的站的换乘方案,默认的换乘次数为二,即乘三次车。系统会先通过isLegal()方法对输入的出发站和目的站进行判断,当出发站或者目的站为
36、空,或者出发站和目的站相同时,就会弹出相应的错误提示,如果输入合法,就进入数据库查询,是否存在经过用户输入出发站和目的站的线路,如果没有,也弹出错误的提示。若有直达的线路,则排除对该线路继续换乘的方案。比如如果乘111路可以到达目的站,则不再考虑111路转乘到站点再转其他线路到达目的站。通过while循环,主要是为了找出站点到线路LineNode结点的映射,表示某个站点经过某条线路可到达该站点。直到搜索不到新的站点或者是换乘的次数大于二,就结束循环。再通过递归调用extractResult()方法提取所有的换乘方案,然后将方案进行排序,实现乘车次数最少的显示在界面的最前面。(2) 线路查询的实
37、现线路查询主要实现的是查询该线路经过的所有站点,下图4-2是线路查询的流程图。输入线路 线路是否为空在数据库中进行查询,返回结果结果是否为空 提示线路不能为空提示没有相关线路显示查询结果查询结束是 否否是 图4-2 线路查询流程当进入线路查询界面时,标识界面值curr=WhichView.XLCX_VIEW;当按下查询按钮后,通过FZGJActivity类中的isLegal()方法用于判断当前输入的文本是否为空,如果为空,使用Toast弹出提示框否则就执行 LoadUtil类中的LineSearch()方法,即到数据库中查找该线路经过的站点,然后再判断返回的结果是否为空,为空则弹出提示框。否则
38、将返回的结果通过goToPassStationView()方法显示的界面上,该方法主要实现的是先为ListView创建适配器,然后每一行使用一个LinearLayout,再将需要显示的文本放入TextView中,再将TextView放到LinearLayout中,得到每一行列表要显示的内容 。(3) 站点查询的实现站点查询主要实现的是查找与该站点相关的线路信息,下图4-3是站点查询的流程图。输入站点 站点是否为空在数据库中进行查询,返回结果结果是否为空 提示线路不能为空显示经过站点的所有线路结果显示线路的信息是 否否是 提示没有相关信息查询结束图4-3 站点查询流程当进入站点查询界面时,标识界
39、面值curr=WhichView.ZMCX_VIEW;同线路查询一样,当按下查询按钮后,先通过FZGJActivity类中的isLegal()方法判断当前输入的文本是否为空,如果为空,就弹出提示框。然后再判断是否有该站点的相关信息,如果没有,就弹出提示没有相关的车站信息。若不为空,LoadUtil类中的stationSearch()方法是查找出经过该站点的所有线路,然后通过goToListView()方法将结果显示在界面上。goToListView()方法和goToPassStationView()其实差不多,goToListView()方法就是多了为每行LinearLayout添加监听器,当
40、用户单击列表的某一项时,从数据库中取出对应的数据,即调用LineSearch()方法查找出该线路的详细信息,再将结果显示到passstation界面上。4.3 Google Map的使用4.3.1 地图开发的前期准备(1) 申请Map API Key使用JDK自带的keytool生成MD5指纹,当进入.android目录下,在命令行输入如下代码:keytool list alias androiddebugkey keystore debug.keystore。输人keystore密码:输入android回车即可。结果如图4-4所示。图4-4 命令行中的MD5值计算获取了MD5指纹认证后,打开
41、浏览器,在地址栏输入地址 ,填入刚申请到的认证指纹(MD5)就可以获得API Key,但必须要注册一个Google账号,如图4-5所示。图4-5 网页申请Android Map Key的值(2) 地图界面的开发,地图界面主要包含一个导航条和一个实现地图的加载MapView,用于显示地图的信息,只须在需要加载地图的XML文件中添加如下代码。4.3.2 地图的初始化当单击地图显示的图片按钮时,跳转到Map界面,通过Intent进行传递和处理接收消息。当界面标记flag=1时,即进行查询线路的地图显示,这时传递的消息为该线路的首站站点的经纬度以及站点的名称,若flag=2,即进行查询站点的相关线路显
42、示,这时传递的消息为输入的查询站点的经纬度和站点名称。创建bundle对象获取Intent的消息。接下来介绍MapNavigateActivity类,值得注意的是该类继承的不再是Activity类而是继承MapActivity,MapActivity用于显示Google Map的Activity类,它需要连接底层网络,MapNavigateActivity类主要的任务是完成地图的初始化,对地图进行简单的设置及图层的添加。setBuiltInZoomControls(Boolean bool)将其参数设置为true,可实现了地图缩放功能,此外还设置了地图的缩放比例的大小和地图显示的中心位置以及拖
43、拽功能。当进入线路地图查询界面(flag=1),显示用户选择的线路地图,并将该线路的首站站点显示在地图的中心位置。当进入站点地图查询界面(flag=2),显示它的地图信息,就将用户要查找的站点显示在地图的中心,并显示用户所选择的线路,而这时线路地图的图层就变成了NothingOverlay图层,即为一个透明图层。4.3.3 地图图层的开发在Map地图上主要开发了四个图层:线路图层、站点图层、信息图层和捕捉触控事件图层。(1) 线路图层开发根据用户的选择,绘制不同的公交车线路。实现该功能的主要是LineOverlay类。其中的valueofline()方法是用笛卡尔公式求得两个站点之间的直线距离
44、。calDirection1方法()根据两点的X、Y坐标差构成的atan值来求得两个站点间的方向问题,求得了距离和方向角就可以进行线路的绘制了。(2) 站点图层开发站点图层StationPicture类主要是在用户选择显示的线路上,将本线路上的站点图标随线路的显示而显示,这时就需要用到LoadUtil类中的searchSinglejw()方法,该方法为了获取指定线路上所有站点的经纬度,还需要用到MiddleLineOverl类中的getPoint1()方法,通过该方法将数据库中查询得到的站点经纬度转换成标准经纬度形式,再将标准经纬度转成成屏幕上得XY坐标,最后就是绘制站点图标将其显示在线路图层上。(3) 信息图层开发当用户可以查询相关线路上的站点了,但用户还是无法知道自己选择的站点是哪个站点,所以就需要开发一个信息图层MyBallonOverlay。该信息图层主要显示一个用于定位当前站点的图标和一个显示当前站点信息的文本提示框,图标开发是在当前位置实施贴图操作,即将图标和信息提示窗口显示于站点之上。其drawWindow()方法是用于绘制信息提示的矩形圆角边框及文本内容,并通过重写onTouchEvent()方法,通过对动作和触控范围的判断实现信息文本提示框的屏蔽或者显示。就是当用户不需要提示框显示时,单击相应的站