Windows Phone笔记(6)使用地图服务

现在的智能手机中地图应用已经成为基础功能之外的最重要的功能之一了,在很多应用中经常会使用到地图。在我们前面的Windows Phone笔记中讲到了位置服务,可以通过GPS对手机当前所在位置进行定位,返回当前位置的经纬度,但是如果只是用文本表示出来的话,很不直观,也不容易理解;如果能够通过地图把自己的位置显示出来那就一目了然了,这在Windows Phone开发中这很容易做到。

 

1.注册Bing Maps API密匙

  在Windows Phone开发中,我们可以通过使用Windows Phone中的Map控件,使用微软提供的Bing Maps服务,在程序中使用Bing Maps服务需要获取一个地图应用API的Key,这要求你注册一个Windows Live的账号,这是免费的,而且步骤非常简单(这里是获取Key的地址),使用Windows Live账号登陆后:

点击“Create or View Keys":

填写好相应的表单后就会得到一个属于你自己的Key了。

在后面的程序中你将会使用到它。

 

2.Map的缩放和显示模式

  下面我们通过是一个简单的示例来了解Map控件是如何进行缩放以及设置它的显示模式:道路模式航测模式。这是前台页面MainPage.xaml的代码:

复制代码
 1       <!--ContentPanel - 在此处放置其他内容-->
2 <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
3 <StackPanel>
4 <my:Map Name="map1" Height="450" CredentialsProvider="你注册的Key值">
5 </my:Map>
6 <StackPanel>
7 <Grid>
8 <Button Content="航测模式" HorizontalAlignment="Left" Width="160" Name="btnAerial" Click="btnAerial_Click"></Button>
9 <Button Content="道路模式" HorizontalAlignment="Right" Width="160" Name="btnRoad" Click="btnRoad_Click"></Button>
10 </Grid>
11 </StackPanel>
12 <StackPanel>
13 <Grid>
14 <Button Content="放大" HorizontalAlignment="Left" Width="160" Name="btnZoomIn" Click="btnZoomIn_Click"></Button>
15 <Button Content="缩小" HorizontalAlignment="Right" Width="160" Name="btnZoomOut" Click="btnZoomOut_Click"></Button>
16 </Grid>
17 </StackPanel>
18 </StackPanel>
19 </Grid>
复制代码

这里给出后台程序MainPage.xaml.cs的处理代码:

复制代码
 1       /// <summary>
2      /// 放大
3      /// </summary>
4      /// <param name="sender"></param>
5      /// <param name="e"></param>
6 private void btnZoomIn_Click(object sender, RoutedEventArgs e)
7 {
8 double zoom;
9 zoom = map1.ZoomLevel;
10 map1.ZoomLevel = ++zoom;
11 }
12
13 /// <summary>
14      /// 缩小
15      /// </summary>
16      /// <param name="sender"></param>
17      /// <param name="e"></param>
18 private void btnZoomOut_Click(object sender, RoutedEventArgs e)
19 {
20 double zoom;
21 zoom = map1.ZoomLevel;
22 map1.ZoomLevel = --zoom;
23 }
24
25 /// <summary>
26     /// 道路模式
27     /// </summary>
28     /// <param name="sender"></param>
29     /// <param name="e"></param>
30 private void btnRoad_Click(object sender, RoutedEventArgs e)
31 {
32 map1.Mode = new RoadMode();
33 }
34
35 /// <summary>
36      /// 航测模式
37      /// </summary>
38      /// <param name="sender"></param>
39      /// <param name="e"></param>
40 private void btnAerial_Click(object sender, RoutedEventArgs e)
41 {
42 map1.Mode = new AerialMode(true);//参数为true的构造函数表示显示地理信息
43 }
复制代码

可以看到,Map控件已经把很多常用的功能封装得非常好了,只需要我们简单的调用就可以了,下面是程序运行后的效果:

   

 

3.在Map中使用位置服务(定位)和图钉(pushpin)

  上一篇笔记讲到了Windows Phone的位置服务,现在我们来学习如何在Map中使用位置服务,在地图中对我们的所在地进行定位;以及如何在地图中添加图钉(Pushpin)

增强地图应用的可用性。下面让我们来观察一个示例程序:

MainPage.xaml:

1       <!--ContentPanel - 在此处放置其他内容-->
2 <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
3 <my:Map Name="map1" Height="500" VerticalAlignment="Top" CredentialsProvider="你注册的Map Key"/>
4 <Button Content="定位" VerticalAlignment="Bottom" Name="btn_Location" Click="btn_Location_Click"/>
5 </Grid>

后台处理程序,MainPage.xaml.cs:

复制代码
 1 public partial class MainPage : PhoneApplicationPage
2 {
3 GeoCoordinateWatcher watcher;
4 // 构造函数
5 public MainPage()
6 {
7 InitializeComponent();
8 }
9
10 /// <summary>
11    /// 在地图上定位
12      /// </summary>
13    /// <param name="sender"></param>
14      /// <param name="e"></param>
15 private void btn_Location_Click(object sender, RoutedEventArgs e)
16 {
17 if (watcher == null)
18 {
19 watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.High); // 采用高精度
20 watcher.MovementThreshold = 20; // PositionChanged事件之间传送的最小距离
21           //绑定事件
22 watcher.PositionChanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(watcher_PositionChanged);
23 //开始从位置服务获取数据
24 watcher.Start();
25 }
26 }
27
28 //检测到位置更改时
29      //当定位服务已准备就绪并接收数据时,它将开始引发 PositionChanged 事件
30 void watcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
31 {
32 Location location = new Location();//实例化一个位置位置类的实例
33        //将当前的经纬度值赋给位置对象
34 location.Latitude = e.Position.Location.Latitude;
35 location.Longitude = e.Position.Location.Longitude;
36
37 Pushpin pushpin = new Pushpin();//实例化一个图钉实例
38 pushpin.Content = "当前位置";
39 pushpin.Location = location;
40
41 this.map1.Children.Add(pushpin);//将图钉显示在地图上
42 this.map1.SetView(location, 10);//缩放界别为10(1-16),始终将当前位置位于地图中心
43 }
44 }
复制代码

当我们点击"定位"按钮后,通过使用模拟器的位置模拟工具来模拟当前的位置,可以发现手机上的地图会始终将当前位置位于地图中心,并且会加上一个图钉来表示当前位置,下面的程序运行的效果:

 

4.使用Bing Maps SOAP Services  

  Bing Maps提供了一组SOAP Services,通过使用这些服务可以使我们能够使我们的应用实现地理位置计算、路径计算等额外的功能。现在让我们一起来了解如何使用其中的两个服务。

地理编码服务可以通过搜索地名来匹配在地图上对应的位置(经度和纬度),或者通过实际位置的经度和纬度来确定对应在地图上的位置。

路由功能服务可以通过计算地点的坐标来显示线路的功能,比如在百度地图中常用的驾车线路功能等。     

  下面让我们通过一个示例来了解如何使用这些服务,在Windows Phone中实现我们在地图应用中常见的出行路径计算的功能。首先添加前面给出地址的两个服务引用,下面让代码来说话:

MainPage.xaml代码:

复制代码
 1   <!--LayoutRoot 是包含所有页面内容的根网格-->
2 <Grid x:Name="LayoutRoot" Background="Transparent">
3 <Grid.RowDefinitions>
4 <RowDefinition Height="auto"/>
5 <RowDefinition Height="*"/>
6 </Grid.RowDefinitions>
7 <!--ContentPanel - 在此处放置其他内容-->
8 <Grid x:Name="ContentPanel" Grid.Row="0">
9 <Grid Height="530" VerticalAlignment="Top">
10 <my:Map Name="map1" CredentialsProvider="Map Key" />
11 </Grid>
12 </Grid>
13 <Grid Grid.Row="1" >
14 <StackPanel Orientation="Vertical">
15 <Grid>
16 <TextBlock Text="起点:" HorizontalAlignment="Left" VerticalAlignment="Center" FontSize="28" ></TextBlock>
17 <TextBox Width="400" Height="80" HorizontalAlignment="Right" Name="txtStartPath"></TextBox>
18 </Grid>
19 <Grid>
20 <TextBlock Text="终点:" HorizontalAlignment="Left" VerticalAlignment="Center" FontSize="28" ></TextBlock>
21 <TextBox Width="400" Height="80" HorizontalAlignment="Right" Name="txtStopPath"></TextBox>
22 </Grid>
23 <Button Height="80" Content="查找路径" FontSize="28" Name="btnQueryPath" Click="btnQueryPath_Click"></Button>
24 </StackPanel>
25 </Grid>
26 </Grid>
复制代码

 

后台处理程序,代码比较长:

View Code

编译运行,我们输入出发点和终点,程序会首先调用地理编码服务计算出起点和终点的经纬度,然后把他们放在一个集合中,作为参数向路由功能服务发送请求,计算起点和终点的路线信息,最后显示在地图中,下面是程序运行的效果:

  

 附:源码下载

参考资料:

  http://msdn.microsoft.com/en-us/library/ee681887.aspx(重要)

  http://www.microsoft.com/maps/isdk/silverlight/

  http://www.cnblogs.com/beniao/archive/2010/02/08/1665291.html(重要)

  https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032474384&Culture=zh-CN(重要)

  《Programming Windows Phone 7 Microsoft Silverlight Edition》

作者:晴天猪

出处:http://www.cnblogs.com/IPrograming

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

     Windows Phone开发者交流群:79339880,欢迎大家来一起讨论交流,共同学习进步。

本文转自gyzhao博客园博客,原文链接:http://www.cnblogs.com/IPrograming/archive/2012/03/04/WindowsPhone_Maps.html ,如需转载请自行联系原作者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值