首页 > 代码库 > Windows Phone 8.1地图应用开发

Windows Phone 8.1地图应用开发

上班都是坐班车,很多TX肯定对租房子和买房子离班车站点近不近很上心。谁不想找个便宜的还能有班车的小区住啊(不差钱的可以直接无视我这屌丝行为了),于是我就想做一个应用,可以在用户搜索某个地点(比如心仪小区)时能显示出搜索地点附近的班车地点,另外计算下距这些班车站点都多远。

好了,题外话说完了,下面说说开发过程吧。

自从出了universal app(通用应用程序),我就知道大事要发生了。微软野心不小啊,采用universal APP 模式开发应用,使得统一应用在windows phone和windows store之间共享70%(微软给的数据,哈哈,我可没验证)代码,极大提速自己应用在平台的普及率。所以不用想了,现在搞必须直接从universal app搞起。对了,微软还有个文档,对universal app有这么个说法,文章标题叫做《构建面向 Windows 和 Windows Phone 的通用 Windows 应用》,就是说 叫做通用windows应用(Universal Windows app)。这种开发方式总会成为技术主导,大家拭目以待。

又啰嗦了一堆,就在我按照Universal Windows app都建好工程,准备大干一场时,出现第一个意外。

1第一个意外:windows phone 8.1地图和windows 8.1地图现在不是一回事啊

具体怎么搜索知道的都记不住了,就只记住结果了。随便找一点分析下吧,windows phone 8.1开发地图应用我们肯定会优先想到MapControl,这个类目前根据微软文档得到的信息就是目前只支持Windows Phone 8.1。尝试在windows 8.1项目中去引入MapControl和相关功能类都不行。

好吧,从知道这件事开始,我就知道我的universal windows app最核心的部分(地图数据处理)肯定得是两部分了。那肯定是从windows phone 8.1搞起啊。于是就有了下面文章的部分了。

2.从universal windows APP变成了windows phone 8.1 APP

请不要问我为什么不是windows phone Silverlight 8.1 APP。我们要跟对方向Ok?以后的趋势是基于完全的windows Runtime 架构的应用程序好么。既然刚开始做,那么肯定用以后会成为主流方向的那个模式啊。

好吧,到了这里,最终决定开发的是windows phone 8.1应用程序。

3.开始建立界面吧,包括地图区域,搜索框,功能按钮,大致就是这三块吧。界面大致如图1所示:

技术分享

图1

好吧,你说看不到搜索框,那是因为隐藏了啊,点击功能按钮区域的搜索按钮,就能打开搜索框了。如图2所示。

技术分享

图2

?

看一下UI架构,树形结构,树形结构是有

<Page>

????<Grid>

????????<TextBox/>

????????<StackPanel>

????????????<TextBlock/>

????????????<MapControl/>

????????</StackPanel>

????</Grid>

????<Page.BottomAppBar>

</Page.BottomAppBar>

</Page>

4.功能实现

4.1 初始化所有班车站点

这个主要是获取各个班车站点的经纬度信息。先是建立一个BusStation类,这个类主要是描述站点的一些信息,包括经纬度和站名。这只是我想到的。算是举例子吧。对于一个产品来说,班车站点作为一个对象,其实还可以有别的属性,比如所处街道,附近有什么重要标志或场所,被班车经过的时间等等,这些都可以归属到此班车站点上去。在项目之前,首先建立对象模型是非常重要的。只是这一点上我也还在学习,有兴趣的可以看看《大象:Thinking in UML》。里面讲述了面对一个项目时如何用面向对象的观点去分析,去建立模型对象。

有了BusStation,我们就可以将其转化为UI相对应的对象MapIcon,给其赋予相应的属性,然后将他们加入MapControl里的MapElements,就可以显示在地图上了。

注意,MapElements可以添加的元素除了MapIcon,还包括images,和多边形围栏等等。

4.2 将当前地图以老厂区为中心显示

这个功能在开始的时候想的是以当前所在位置为中心显示。但是这样想过不太好。我觉得按照本来的需求没有这个功能的需求。做了一下,觉得还是不好,现在就准备显示是老厂区。这个功能实现最主要的就是TrySetViewAsync。她的作用就是将我们的视中心转移到当前图标地点上来。

这是一个异步函数。充分利用了.net framework 4.5 和 Windows Runtime中对异步的支持。这项复杂的工作将会交由编译器来搞定,我们就像是在使用同步代码来编写应用程序的逻辑结构,但其结果是,得到了所有异步编程的优点,但只要付出一点点工作。

Await和async的例子可以参考http://cc.bingj.com/cache.aspx?q=.net+4.5+await+%e8%af%a6%e8%a7%a3&d=4729151226052614&mkt=zh-CN&setlang=zh-CN&w=8irFZ6SJ5uxmkYAa1kEEIGCSzmeXXwho

这里就不多讲了。

4.3 搜索功能的实现

点击搜索按钮,出现搜索框,输入搜索文字,点击回车键,触发搜索操作。SearchTextBox_KeyUp,这个事件就是搜索操作。利用MapLocationFinder.FindLocationsAsync我们可以获取所有地点,然后再将其显示在地图上。

4.4 线路计算的实现

MapRouteFinder.GetDrivingRouteAsync利用获取单条线路。再从中选择我们需要的线路,并标注出来就可以了。

4.5 辅助功能的实现

如何获取下一个地点,放大或者缩小地图的实现。

5.现阶段的一些问题

我不知道是不是微软API的问题,还是我没有申请MAP key的缘故,总之,我使用MapLocationFinder搜索时感觉不好用,搜索出来的有时候不是想要的地点,或者干脆搜索不到。在MSDN里也提问了,有人说是api还未完善所致,有的说使用bing的REST服务,容我有时间再研究了。

Windows Phone 8.1地图应用开发