[源码下载]

与众不同 windows phone (44) - 8.0 位置和地图

作者:webabcd

介绍
与众不同 windows phone 8.0 之 位置和地图

  • 位置(GPS) - Location API
  • 诺基亚地图

示例
1、演示新 Location API 的应用
GPS/Demo.xaml

<phone:PhoneApplicationPage
x:Class="Demo.GPS.Demo"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
mc:Ignorable="d"
shell:SystemTray.IsVisible="True"> <Grid x:Name="LayoutRoot">
<StackPanel> <TextBlock Name="lblMsg" TextWrapping="Wrap" /> <Button x:Name="btnDemo" Content="通过 GPS 获取当前位置" Click="btnDemo_Click" /> </StackPanel>
</Grid> </phone:PhoneApplicationPage>

GPS/Demo.xaml.cs

/*
* 演示新 Location API 的应用
*
* wp7 时代的 Location API 也是支持的(能不用就别用了),参见:http://www.cnblogs.com/webabcd/archive/2012/08/09/2629636.html
*
*
* 注:
* 1、需要在 manifest 中增加配置 <Capability Name="ID_CAP_LOCATION" />
* 2、在获取位置数据之前,需要提供隐私策略并得到用户的允许
* 3、目前 wp 机器的位置提供程序都是 GPS
*/ using System;
using System.Windows;
using Microsoft.Phone.Controls;
using Windows.Devices.Geolocation; namespace Demo.GPS
{
public partial class Demo : PhoneApplicationPage
{
// 新的 Location API
Geolocator geolocator; public Demo()
{
InitializeComponent();
} protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
geolocator = new Geolocator(); // 期望的精度级别(PositionAccuracy.Default 或 PositionAccuracy.High)
geolocator.DesiredAccuracy = PositionAccuracy.High;
// 期望的数据精度(米)
geolocator.DesiredAccuracyInMeters = ; // 移动距离超过此值后,触发 PositionChanged 事件
geolocator.MovementThreshold = ;
// 在两次位置更新的时间点中间,请求位置数据的最小间隔(毫秒)
geolocator.ReportInterval = ; // 位置更新时触发的事件
geolocator.PositionChanged += geolocator_PositionChanged;
// 位置服务的状态发生改变时触发的事件
geolocator.StatusChanged += geolocator_StatusChanged; base.OnNavigatedTo(e);
} protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
geolocator.PositionChanged -= geolocator_PositionChanged;
geolocator.StatusChanged -= geolocator_StatusChanged;
geolocator = null; base.OnNavigatedFrom(e);
} private async void btnDemo_Click(object sender, RoutedEventArgs e)
{
try
{
// 获取位置信息
Geoposition geoposition = await geolocator.GetGeopositionAsync(); lblMsg.Text = "位置精度(米): " + geoposition.Coordinate.Accuracy.ToString();
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "海拔精度(米): " + geoposition.Coordinate.AltitudeAccuracy.ToString();
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "纬度: " + geoposition.Coordinate.Latitude.ToString("0.00");
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "经度: " + geoposition.Coordinate.Longitude.ToString("0.00");
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "海拔(米): " + geoposition.Coordinate.Altitude.ToString();
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "行进方向(相对于正北的度数): " + geoposition.Coordinate.Heading.ToString();
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "行进速度(米/秒): " + geoposition.Coordinate.Speed.ToString();
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "确定位置的时间(UTC0): " + geoposition.Coordinate.Timestamp.ToString("yyyy-MM-dd hh:mm:ss");
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "数据源(Satellite, WiFi, Cellular): " + geoposition.Coordinate.PositionSource.ToString();
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "卫星的位置精度衰减: " + geoposition.Coordinate.SatelliteData.PositionDilutionOfPrecision.ToString();
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "卫星的水平精度衰减: " + geoposition.Coordinate.SatelliteData.HorizontalDilutionOfPrecision.ToString();
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "卫星的垂直精度衰减: " + geoposition.Coordinate.SatelliteData.VerticalDilutionOfPrecision.ToString();
lblMsg.Text += Environment.NewLine;
lblMsg.Text += Environment.NewLine; if (geoposition.CivicAddress != null)
{
lblMsg.Text = "国家名称: " + geoposition.CivicAddress.Country;
lblMsg.Text += Environment.NewLine;
lblMsg.Text = "省名称: " + geoposition.CivicAddress.State;
lblMsg.Text += Environment.NewLine;
lblMsg.Text = "城市名称: " + geoposition.CivicAddress.City;
lblMsg.Text += Environment.NewLine;
lblMsg.Text = "邮编: " + geoposition.CivicAddress.PostalCode;
lblMsg.Text += Environment.NewLine;
lblMsg.Text = "确定位置的时间(UTC0): " + geoposition.CivicAddress.Timestamp;
}
}
catch (Exception ex)
{
if ((uint)ex.HResult == 0x80004004)
{
lblMsg.Text = "定位服务当前是关闭状态,请打开它";
}
else
{
lblMsg.Text = ex.ToString();
}
}
} // 位置服务的状态变化了
void geolocator_StatusChanged(Geolocator sender, StatusChangedEventArgs args)
{
// 获取位置服务的状态
PositionStatus status = geolocator.LocationStatus; // 获取位置服务的状态
status = args.Status; switch (args.Status)
{
case PositionStatus.Disabled: // 位置提供程序已禁用,即用户尚未授予应用程序访问位置的权限
break;
case PositionStatus.Initializing: // 初始化中
break;
case PositionStatus.NoData: // 无有效数据
break;
case PositionStatus.Ready: // 已经准备好了相关数据
break;
case PositionStatus.NotAvailable: // 位置服务传感器不可用
break;
case PositionStatus.NotInitialized: // 尚未初始化
break;
}
} // 位置变化了
void geolocator_PositionChanged(Geolocator sender, PositionChangedEventArgs args)
{
this.Dispatcher.BeginInvoke(delegate()
{
Geoposition geoposition = args.Position; lblMsg.Text = "纬度: " + geoposition.Coordinate.Latitude.ToString("0.00");
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "经度: " + geoposition.Coordinate.Longitude.ToString("0.00");
});
}
}
}

2、演示诺基亚地图的应用
Map/Demo.xaml

<phone:PhoneApplicationPage
x:Class="Demo.Map.Demo"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
mc:Ignorable="d"
shell:SystemTray.IsVisible="True" xmlns:maps="clr-namespace:Microsoft.Phone.Maps.Controls;assembly=Microsoft.Phone.Maps"> <Grid x:Name="LayoutRoot" Background="Transparent">
<StackPanel> <!--
Microsoft.Phone.Maps.Controls.Map - 诺基亚地图
CenterChanged - 地图的中心点发生变化时触发的事件
-->
<maps:Map x:Name="map" Width="480" Height="440" CenterChanged="map_CenterChanged" /> <StackPanel Orientation="Horizontal">
<Button Name="btnRoad" Content="道路图" Click="btnRoad_Click" />
<Button Name="btnAerial" Content="卫星图" Click="btnAerial_Click" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<Button Name="btnHybrid" Content="卫星图叠加道路图" Click="btnHybrid_Click" />
<Button Name="btnTerrain" Content="自然地形叠加道路图" Click="btnTerrain_Click" />
</StackPanel> <StackPanel Orientation="Horizontal">
<Button Name="btnZoomIn" Content="放大" Click="btnZoomIn_Click" />
<Button Name="btnZoomOut" Content="缩小" Click="btnZoomOut_Click" />
</StackPanel> <StackPanel Orientation="Horizontal">
<Button Name="btnMoveTop" Content="上移" Click="btnMoveTop_Click" />
<Button Name="btnMoveBottom" Content="下移" Click="btnMoveBottom_Click" />
<Button Name="btnMoveLeft" Content="左移" Click="btnMoveLeft_Click" />
<Button Name="btnMoveRight" Content="右移" Click="btnMoveRight_Click" />
</StackPanel> <TextBlock Name="lblMsg" /> </StackPanel>
</Grid> </phone:PhoneApplicationPage>

Map/Demo.xaml.cs

/*
* 演示诺基亚地图的应用
*
*
* 本例仅用于说明诺基亚地图的基本使用方式,更多的内容,如:路线绘制,图钉等功能请参见 Microsoft.Phone.Maps.Controls.Map 控件文档和 Windows Phone Toolkit 文档
*
*
* 注:
* 1、需要在 manifest 中增加配置 <Capability Name="ID_CAP_MAP" />
* 2、相关的 Launcher 参见本项目的 Launchers 文件夹内的地图相关的演示
* 3、Bing 地图虽然仍可用,但是能不用就别用了
* 4、关于 pin 之类的地图扩展,请使用 Windows Phone Toolkit,参见 http://phone.codeplex.com/
*
*
* 另:与地图相关的协议说明如下,你的 app 如果支持这些协议将会在用户请求时启动(只有你一个 app 支持时)或出现在启动列表中(多个 app 支持时)
* 1、驾车到指定地点:ms-drive-to:?destination.latitude=<latitude>&destination.longitude=<longitude>&destination.name=<name>
* 2、散步到指定地点:ms-walk-to:?destination.latitude=<latitude>&destination.longitude<longitude>&destination.name=<name>
*/ using System.Windows;
using Microsoft.Phone.Controls;
using System.Device.Location;
using Microsoft.Phone.Maps.Controls; namespace Demo.Map
{
public partial class Demo : PhoneApplicationPage
{
// 地图的中心点,经纬度坐标
private GeoCoordinate _center;
// ZoomLevel: 1 - 最小, 20 - 最大
private double _zoomLevel = ;
// Heading: 0 到 360 之间的任意数字。例:上为正北则为0,上为正西则为90,上为正南则为180,上为正东则为270
private double _heading = ;
// Pitch: 0 到 180 之间的任意数字,代表地图绕 X 轴倾斜的角度(以实现 3D 效果)
private double _pitch = ; public Demo()
{
InitializeComponent(); this.Loaded += Demo_Loaded;
} void Demo_Loaded(object sender, RoutedEventArgs e)
{
map.LandmarksEnabled = true; // 是否显示地标(ZoomLevel 16 级以上才会显示)
map.PedestrianFeaturesEnabled = true; // 是否显示步行街(ZoomLevel 16 级以上才会显示)
map.ColorMode = MapColorMode.Light; // 颜色模式(Light 或 Dark) _center = new GeoCoordinate(39.909, 116.397); // map.Center = _center;
// map.ZoomLevel = _zoomLevel;
// map.Heading = _heading;
// map.Pitch = _pitch; // SetView() - 通过指定的 Center, ZoomLevel, Heading, Pitch, MapAnimationKind 参数来显示地图
// MapAnimationKind - 代表地图过渡时的动画效果。None:无动画;Linear:线性动画;Parabolic:抛物线动画
map.SetView(_center, _zoomLevel, _heading, _pitch, MapAnimationKind.Parabolic);
} private void btnRoad_Click(object sender, RoutedEventArgs e)
{
// 道路地图
map.CartographicMode = MapCartographicMode.Road;
} private void btnAerial_Click(object sender, RoutedEventArgs e)
{
// 卫星地图
map.CartographicMode = MapCartographicMode.Aerial;
} private void btnHybrid_Click(object sender, RoutedEventArgs e)
{
// 卫星地图上叠加道路地图
map.CartographicMode = MapCartographicMode.Hybrid;
} private void btnTerrain_Click(object sender, RoutedEventArgs e)
{
// 自然地形地图上叠加道路地图
map.CartographicMode = MapCartographicMode.Terrain;
} private void btnZoomIn_Click(object sender, RoutedEventArgs e)
{
// 放大地图
map.SetView(_center, ++_zoomLevel, _heading, _pitch, MapAnimationKind.Linear);
} private void btnZoomOut_Click(object sender, RoutedEventArgs e)
{
// 缩小地图
map.SetView(_center, --_zoomLevel, _heading, _pitch, MapAnimationKind.Linear);
} private void btnMoveTop_Click(object sender, RoutedEventArgs e)
{
// 上移地图,可以看到地图切换时线性过渡的效果(MapAnimationKind.Linear)
_center = new GeoCoordinate(map.Center.Latitude + 0.1, map.Center.Longitude);
map.SetView(_center, _zoomLevel, _heading, _pitch, MapAnimationKind.Linear);
} private void btnMoveBottom_Click(object sender, RoutedEventArgs e)
{
// 下移地图,可以看到地图切换时线性过渡的效果(MapAnimationKind.Linear)
_center = new GeoCoordinate(map.Center.Latitude -0.1, map.Center.Longitude);
map.SetView(_center, _zoomLevel, _heading, _pitch, MapAnimationKind.Linear);
} private void btnMoveLeft_Click(object sender, RoutedEventArgs e)
{
// 左移地图,可以看到地图切换时抛物线过渡的效果(MapAnimationKind.Parabolic)
_center = new GeoCoordinate(map.Center.Latitude, map.Center.Longitude - 0.1);
map.SetView(_center, _zoomLevel, _heading, _pitch, MapAnimationKind.Parabolic);
} private void btnMoveRight_Click(object sender, RoutedEventArgs e)
{
// 右移地图,可以看到地图切换时抛物线过渡的效果(MapAnimationKind.Parabolic)
_center = new GeoCoordinate(map.Center.Latitude, map.Center.Longitude + 0.1);
map.SetView(_center, _zoomLevel, _heading, _pitch, MapAnimationKind.Parabolic);
} private void map_CenterChanged(object sender, MapCenterChangedEventArgs e)
{
// CenterChanged - 中心点发生变化时触发的事件
// 类似的事件还有:CartographicModeChanged, HeadingChanged, PitchChanged, ZoomLevelChanged, ViewChanging, ViewChanged 等等
lblMsg.Text = string.Format("经度:{0},纬度{1}", map.Center.Longitude, map.Center.Latitude);
}
}
}

OK
[源码下载]

与众不同 windows phone (44) - 8.0 位置和地图的更多相关文章

  1. 与众不同 windows phone (35) - 8.0 新的启动器: ShareMediaTask, SaveAppointmentTask, MapsTask, MapsDirectionsTask, MapDownloaderTask

    [源码下载] 与众不同 windows phone (35) - 8.0 新的启动器: ShareMediaTask, SaveAppointmentTask, MapsTask, MapsDirec ...

  2. 与众不同 windows phone (41) - 8.0 相机和照片: 通过 AudioVideoCaptureDevice 捕获视频和音频

    [源码下载] 与众不同 windows phone (41) - 8.0 相机和照片: 通过 AudioVideoCaptureDevice 捕获视频和音频 作者:webabcd 介绍与众不同 win ...

  3. 与众不同 windows phone (42) - 8.0 相机和照片: 通过 PhotoCaptureDevice 捕获照片

    [源码下载] 与众不同 windows phone (42) - 8.0 相机和照片: 通过 PhotoCaptureDevice 捕获照片 作者:webabcd 介绍与众不同 windows pho ...

  4. 与众不同 windows phone (34) - 8.0 新的控件: LongListSelector

    [源码下载] 与众不同 windows phone (34) - 8.0 新的控件: LongListSelector 作者:webabcd 介绍与众不同 windows phone 8.0 之 新的 ...

  5. 与众不同 windows phone (36) - 8.0 新的瓷贴: FlipTile, CycleTile, IconicTile

    [源码下载] 与众不同 windows phone (36) - 8.0 新的瓷贴: FlipTile, CycleTile, IconicTile 作者:webabcd 介绍与众不同 windows ...

  6. 与众不同 windows phone (37) - 8.0 文件系统: StorageFolder, StorageFile, 通过 Uri 引用文件, 获取 SD 卡中的文件

    [源码下载] 与众不同 windows phone (37) - 8.0 文件系统: StorageFolder, StorageFile, 通过 Uri 引用文件, 获取 SD 卡中的文件 作者:w ...

  7. 与众不同 windows phone (38) - 8.0 关联启动: 使用外部程序打开一个文件或URI, 关联指定的文件类型或协议

    [源码下载] 与众不同 windows phone (38) - 8.0 关联启动: 使用外部程序打开一个文件或URI, 关联指定的文件类型或协议 作者:webabcd 介绍与众不同 windows ...

  8. 与众不同 windows phone (39) - 8.0 联系人和日历

    [源码下载] 与众不同 windows phone (39) - 8.0 联系人和日历 作者:webabcd 介绍与众不同 windows phone 8.0 之 联系人和日历 自定义联系人存储的增删 ...

  9. 与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能

    [源码下载] 与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能 作者:webabcd 介绍与众不同 windows ...

随机推荐

  1. wordpress自动保存远程图片插件 DX-auto-save-images

    wordpress自动保存远程图片插件DX-auto-save-images 解决了保存文章就可以自动将远程图片保存到你的服务器上了. 具体操作步骤如下: 1.安装启用wordpress自动保存远程图 ...

  2. 计算A/3,不用除法

    int DividedBy3(int A) { ; ; i <= ; i += ) p += A << i; return (-p); }

  3. 【原】android本地推送

    android本地推送的实现原理:开启一个BroadcastReceiver和一个AlarmManager,闹钟设置推送唤醒时间,BroadcastReceiver一直在检测是否应该推送. 目前遗留问 ...

  4. Debug Assertion Failed! Expression: _pFirstBlock == pHead

    点击Abort之后,查看调用栈,发现异常在函数return时被时产生,进一步看是vector的析构函数被调用时产生,以前没开发过C++项目,没什么经验,这个错误让我很困惑,第一,我电脑上并没有f盘:第 ...

  5. LoadRunner执行过程报错“Failed to connect to server "xxx.xxx.xxx.xxx:xx":[10060] connetion time out”

    执行性能测试过程中,LR报错: Action.c(6):Error -27796: Failed to connect to server "xxx.xxx.xxx.xxx:xx" ...

  6. 关于android中线性布局的layout_gravity属性

    当 android:orientation="vertical"  时, 只有水平方向的设置才起作用,垂直方向的设置不起作用.即:left,right,center_horizon ...

  7. win7任务栏还原为xp样式

    win7的确是非常强大的操作系统,值得一提的是超级任务栏,非常新颖,不过,不是很适应win7的超级任务栏,今天,我们恢复win7超级任务栏还原xp任务栏. 方法/步骤: 1.在win7超级任务栏空白处 ...

  8. mysql 性能优化 配置优化

    http://download.csdn.net/album/detail/1397/2

  9. php生成随机密码(php自定义函数)转自先锋教程网

    php生成随机密码(php自定义函数) 时间:2015-12-16 20:43:49来源:网络 导读:php随机密码的生成代码,使用php自定义函数生成指定长度的随机密码,密码规则为小写字母与数字的随 ...

  10. SNF开发平台WinForm之二-开发-单表表单管理页面-SNF快速开发平台3.3-Spring.Net.Framework

    2.1运行效果: 2.2开发实现: 2.2.1 这个开发与第一个开发操作步骤是一致的,不同之处就是在生成完代码之后,留下如下圈红程序,其它删除. 第一个开发地址:开发-单表表格编辑管理页面 http: ...