Microsoft 地理位置服务允许开发者为 Windows Phone 创建位置感知应用程序。该服务从获得来源(如 GPS、Wi-Fi 和蜂窝)获取位置数据。它可以使用一个或多个来源推导出 Windows Phone 的位置,从而根据应用程序的需要平衡性能和电能利用。通过事件驱动的托管代码接口向应用程序公开位置。

◇定位服务体系结构:

第一层由 Windows Phone 设备中的硬件组成。这包括 GPS 接收器、Wi-Fi 和蜂窝收音机。这些可以全部充当精度和能耗级别各不相同的位置数据的提供程序;

在硬件的上面是本机代码层。该层直接与可用的位置数据来源通信并决定使用哪个来源,根据数据的可用性以及应用程序指定的性能要求确定设备的位置。本机代码层还借助 Microsoft 托管的 Web 服务与 Internet 通信,以从数据库查找与位置有关的信息;

定位服务的顶层是托管接口,通过 Windows Phone SDK 附带的 DLL 公开。应用程序使用该接口启动和停止定位服务,设置应用程序所需的精度级别以及从本机代码层(当它变为可用时)接收位置数据。

◇创建使用Location Service程序的最佳实践:

创建位置感知应用程序时,开发人员必须平衡应用程序的以下两个要求:具有精确位置数据;耗电量最小。在移动设备上,这两个应用程序要求是反比关系。生成不太精确位置信息的硬件(如 Wi-Fi 和蜂窝收音机)使用的电量要比 GPS 接收器(通常,可以获得更精确的位置数据)使用的电量小。设计应用程序时,要遵循两个基本原则。

为位置数据选择适当的精度级别:尽管定位服务使用多个位置信息来源,但是在任何给定的时间任何来源都可能会不可用(例如,无法访问 GPS 卫星或基站),本机代码层负责计算可用数据并选择最佳来源集。您的应用程序所需要做的就是在高精度或默认的电量优化设置之间进行选择。可以在初始化主定位服务类 GeoCoordinateWatcher 时设置该值。

GeoCoordinateWatcher watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.Default);

设置合理的移动阈值:由于移动设备中的 GPS 硬件没有天线,因此传感器通常设计为非常敏感。这种灵敏度可能会导致信号中有少量来自表面反射以及其他环境影响的噪音。主定位服务类 GeoCoordinateWatcher 显示 MovementThreshold 属性。该属性指定在引发 PositionChanged 事件之前必须进行的位置方面的最小更改。如果您将 MovementThreshold 属性设置为一个非常低的值,则可能会导致您的应用程序接收实际上是由信号噪音所导致的事件。为了平滑信号以便仅表示位置中的重大更改,请将 MovementThreshold 属性设置为至少 20 米。这也会使您应用程序的耗电量降低。将移动阈值设置为 0 米将导致频繁引发事件,一秒钟一个事件。该设置对于导航应用程序可能非常有用。

下面给出一个例子演示如何从 Windows Phone 的定位服务获取数据:

MainPage.xaml代码如下:

View Code

<phone:PhoneApplicationPage     x:Class="GeoPosition.MainPage"    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"    mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"    FontFamily="{StaticResource PhoneFontFamilyNormal}"    FontSize="{StaticResource PhoneFontSizeNormal}"    Foreground="{StaticResource PhoneForegroundBrush}"    SupportedOrientations="Portrait" Orientation="Portrait"    shell:SystemTray.IsVisible="True">

    <!--LayoutRoot is the root grid where all page content is placed-->    <Grid x:Name="LayoutRoot" Background="Transparent">        <Grid.RowDefinitions>            <RowDefinition Height="Auto"/>            <RowDefinition Height="*"/>        </Grid.RowDefinitions>

        <!--TitlePanel contains the name of the application and page title-->        <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">            <TextBlock x:Name="ApplicationTitle" Text="演示程序" Style="{StaticResource PhoneTextNormalStyle}"/>            <TextBlock x:Name="PageTitle" Text="地理位置" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>        </StackPanel>

        <!--ContentPanel - place additional content here-->        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">            <TextBlock Height="30" HorizontalAlignment="Left" Margin="27,76,0,0" Name="textBlock1" Text="经度" VerticalAlignment="Top" />            <TextBlock Height="30" HorizontalAlignment="Left" Margin="24,153,0,0" Name="textBlock2" Text="纬度" VerticalAlignment="Top" />            <TextBox Height="72" HorizontalAlignment="Left" Margin="70,50,0,0" Name="logTxtBox" Text="" VerticalAlignment="Top" Width="460" />            <TextBox Height="72" HorizontalAlignment="Left" Margin="70,128,0,0" Name="latTxtBox" Text="" VerticalAlignment="Top" Width="460" />            <Button Content="开始" Height="72" HorizontalAlignment="Left" Margin="70,299,0,0" Name="button1" VerticalAlignment="Top" Width="160" Click="button1_Click" />            <Button Content="结束" Height="72" HorizontalAlignment="Left" Margin="248,299,0,0" Name="button2" VerticalAlignment="Top" Width="160" Click="button2_Click" />            <TextBlock Height="30" HorizontalAlignment="Left" Margin="24,230,0,0" Name="textBlock3" Text="状态" VerticalAlignment="Top" />            <TextBox Height="72" HorizontalAlignment="Left" Margin="70,206,0,0" Name="statusTxtBox" Text="" VerticalAlignment="Top" Width="460" />        </Grid>    </Grid>

    <!--Sample code showing usage of ApplicationBar-->    <!--<phone:PhoneApplicationPage.ApplicationBar>        <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">            <shell:ApplicationBarIconButton IconUri="/Images/appbar_button1.png" Text="Button 1"/>            <shell:ApplicationBarIconButton IconUri="/Images/appbar_button2.png" Text="Button 2"/>            <shell:ApplicationBar.MenuItems>                <shell:ApplicationBarMenuItem Text="MenuItem 1"/>                <shell:ApplicationBarMenuItem Text="MenuItem 2"/>            </shell:ApplicationBar.MenuItems>        </shell:ApplicationBar>    </phone:PhoneApplicationPage.ApplicationBar>-->

</phone:PhoneApplicationPage>
复制代码

MainPage.xaml.cs代码如下:

View Code

using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Shapes;using Microsoft.Phone.Controls;

using System.Device.Location;

namespace GeoPosition{    public partial class MainPage : PhoneApplicationPage    {        GeoCoordinateWatcher watcher;        // Constructor        public MainPage()        {            InitializeComponent();        }

        private void button1_Click(object sender, RoutedEventArgs e)        {            if (watcher == null)            {                watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.High);// using high accuracy                watcher.MovementThreshold = 20;// use MovementThreshold to ignore noise in the signal                //为 StatusChanged 和 PositionChanged 事件添加事件处理程序                watcher.StatusChanged += new EventHandler<GeoPositionStatusChangedEventArgs>(watcher_StatusChanged);                watcher.PositionChanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(watcher_PositionChanged);                //                watcher.Start();            }        }

        void watcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)        {            //回调,多线程操作            Dispatcher.BeginInvoke(() =>                {                    logTxtBox.Text = e.Position.Location.Longitude.ToString("0.000");                    latTxtBox.Text = e.Position.Location.Latitude.ToString("0.000");                });        }

        void watcher_StatusChanged(object sender, GeoPositionStatusChangedEventArgs e)        {            switch (e.Status)            {                 case GeoPositionStatus.Disabled :                    if (watcher.Permission == GeoPositionPermission.Denied)                    {                        // The user has disabled the Location Service on their device.                        statusTxtBox.Text = "you have this application access to location.";                    }                    else                    {                        statusTxtBox.Text = "location is not functioning on this device";                    }                    break;                case GeoPositionStatus.Initializing :                    // The Location Service is initializing.                    // Disable the Start Location button.                                        break;                case  GeoPositionStatus.NoData :                    statusTxtBox.Text = "location data is not available.";                    break;                case  GeoPositionStatus.Ready:                    statusTxtBox.Text = "location data is available";                    break;            }        }

        private void button2_Click(object sender, RoutedEventArgs e)        {            watcher.Stop();        }    }}
复制代码

(注意这个多线程操作~)

在模拟器上运行效果如图:

具体请参见MSDN:Windows Phone 的位置(http://msdn.microsoft.com/zh-cn/library/ff431803(v=vs.92).aspx)

希望对大家有帮助~

地理位置服务(Location Service)相关推荐

  1. 地理位置服务带来多少新玩法

    2010年之所以被称为中国移动互联网元年,是因为源自美国的Groupon(团购)和Foursquare(位置服务网站)两大网站推出的创新业务为整个互联网带来了生机. Foursquare的兴起使地理位 ...

  2. windows phone7 学习笔记14——地理位置服务与反应性扩展框架

    使用Location Service能帮助开发者为windows Phone 开发具备位置感知(Location-Aware)功能的应用程序.比如很多导航的软件,查找附近吃饭.娱乐甚至厕所的应用程序, ...

  3. 基于地理位置服务(LBS)技术平台

    以互联网为代表的新媒体诞生以来,技术平台的更新便令人目不暇接,从最初以Blog Bus.新浪为代表的博客,发展到以人人网.开心网为代表的SNS,以及以新浪微博为代表的Twitter,各种平台的不断涌现 ...

  4. 浅谈服务治理、微服务与Service Mesh(一二三)

    本文为转载#原文链接:易商阜极 引言 本系列文章将为大家介绍当下最流行的服务治理.微服务等相关内容,从服务治理.SOA.微服务到最新的服务网格(Service Mesh)进行综合介绍和分析.作为本系列 ...

  5. WCF4.0新特性体验(6):路由服务Routing Service(下)

    紧接前文WCF4.0新特性体验(5):路由服务Routing Service(上).今天我们介绍WCF4.0消息路由的实现机制,然后会讲解路由服务的实现过程. [4]WCF与路由服务: 其实在介绍WC ...

  6. 在Openstack上部署compute节点上时,开启服务openstack-nova-compute.service无法启动的解决方法

    在Openstack上部署compute节点上时,开启服务openstack-nova-compute.service无法启动的解决方法 参考文章: (1)在Openstack上部署compute节点 ...

  7. CentOS使用chkconfig增加开机服务提示service xxx does not support chkconfig的问题解决

    CentOS使用chkconfig增加开机服务提示service xxx does not support chkconfig的问题解决 参考文章: (1)CentOS使用chkconfig增加开机服 ...

  8. Android服务之Service(其一)

    转载地址:http://www.cnblogs.com/zhangdongzi/archive/2012/01/08/2316711.html android中服务是运行在后台的东西,级别与activ ...

  9. S/4HANA服务订单Service Order的批量创建

    我工作中接到一个任务,需要在性能测试系统里创建一亿条服务订单service order来做性能测试. 这么大规模的数据量,当然只能用代码来创建了. 本文提到的所有ABAP代码,我均已上传到我的Gith ...

最新文章

  1. idea远程调试修改代码_使用IDEA远程调试线上代码
  2. Mysql的int类型探究
  3. linux文件上传,给文件或目录添加apache权限
  4. 【计算理论】计算理论总结 ( 正则表达式转为非确定性有限自动机 NFA ) ★★
  5. Python Django 模板继承(header,body,footer抽取)
  6. 防火墙简介(二)——firewalld防火墙
  7. (转)springboot:添加JSP支持
  8. linux tomcat PermGen space
  9. flask结合令牌桶算法实现上传和下载速度限制
  10. 用Prettier和ESlint来统一提交代码
  11. 使用标准测试函数测试全套 MATLAB 优化算法
  12. java高级类_Java私塾跟我学系列——JAVA篇 第五章 Java高级类特性
  13. 验证身份证的所在地址和前6位号码
  14. Kaggle——TMDB 5000 Movie Dataset电影数据分析
  15. 单相电机正反转接线图_单相电机正反转原理及接线图(多图)
  16. Centos7安装源地址
  17. WIFI热点软件测试,用手机WiFi热点已OUT 华为随行WiFi Plus评测
  18. 【整理】TAC码是什么?TAC码和IMEI有什么关系?
  19. 姓杨取名:杨姓女孩文雅有寓意的名字,真的是万里挑一
  20. 视频教程-【吴刚大讲堂】电商品牌文案设计方法-电子商务

热门文章

  1. 西北大学计算机系王海,西 北 大 学 院(系)课 程 表 - 西北大学经管学院 .doc
  2. 学生正确使用计算机法方,浅谈计算机技术在教育中的多方应用
  3. 计算机网络 文件传输小程序代码,懒得打开电脑传文件?这四类小程序把这事解决了...
  4. 微信小程序input输入框
  5. idea使用SVN返回历史版本
  6. Noi 题库:求小数的某一位
  7. RPG_Items4.0.9—经典的RPG插件[去后门][全版本]
  8. 新MacBook Air搭载苹果M1升级版
  9. 石家庄计算机专接本教育机构哪个好,河北专接本哪个院校比较好?
  10. 深度学习技术在自动驾驶中的应用