public delegate void OnPositionChangedEventHandle(object sender, PositionChangedEventArgs e);
public delegate void OnAddressResolveredEventHandle(object sender, AddressResolverEventArgs e);

事件参数类型

    public class AddressResolverEventArgs : PositionChangedEventArgs
{
/// <summary>
/// 地址1
/// </summary>
public string Address1 { get; set; }
/// <summary>
/// 地址2
/// </summary>
public string Address2 { get; set; }
/// <summary>
/// 地址3
/// </summary>
public string Address3 { get; set; }
public AddressResolverEventArgs()
{ }
}
public class PositionChangedEventArgs : EventArgs
{
/// <summary>
/// 经度
/// </summary>
public double Longitude { get; set; }
/// <summary>
/// 纬度
/// </summary>
public double Latitude { get; set; } public object Tag { get; set; } public PositionChangedEventArgs()
{ }
}

添加命名空间

using System.Device.Location;
    public class DevicePositioning
{
private CivicAddressResolver _address = null;
private GeoCoordinateWatcher _location = null;
private GeoCoordinate _lastPosition = GeoCoordinate.Unknown;
private volatile bool _locationOn = true;
private bool _resolverByPositionChanged = true; public event OnAddressResolveredEventHandle OnAddressResolvered; /// <summary>
/// 当前位置
/// </summary>
public GeoCoordinate Position
{
get { return _lastPosition; }
} public DevicePositioning()
{
_location = new GeoCoordinateWatcher(GeoPositionAccuracy.High);
//
_location.MovementThreshold = 1.0;//1米
_location.PositionChanged += Location_PositionChanged;
//
_address = new CivicAddressResolver();
_address.ResolveAddressCompleted += Address_ResolveAddressCompleted;
}
/// <summary>
/// 异步定位取Position值
/// </summary>
public void Positioning()
{
bool started = false;
_resolverByPositionChanged = _locationOn = true;
try
{
started = _location.TryStart(true, TimeSpan.FromMilliseconds(1024));
//_location.TryStart(
//_location.Start(true);
//
if (started)
{
//if (_location.Position.Location.IsUnknown == false)
//{
// _address.ResolveAddressAsync(_location.Position.Location);
//}
}
}
catch (Exception ex)
{
Logs.CallerLog("Error->Positioning:" + ex.Message);
}
finally
{
if (!started && _locationOn)
{
System.Threading.Thread.Sleep(128);
Positioning();
}
}
}
public void UnPositioning()
{
try
{
_locationOn = false;
if (_location != null)
_location.Stop();
}
catch (Exception ex)
{
Logs.CallerLog("Error->UnPositioning:" + ex.Message);
}
} public void AddressResolver(double lat, double lon)
{
InnerAddressResolver(new GeoCoordinate(lat, lon));
}
private void InnerAddressResolver(GeoCoordinate position)
{
try
{
_lastPosition = position;
_address.ResolveAddressAsync(_lastPosition);
}
catch (Exception ex)
{
Logs.CallerLog("Error->AddressResolver:" + ex.Message);
}
}
private void Location_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
{
try
{
_lastPosition = e.Position.Location;
if (!_lastPosition.IsUnknown && _resolverByPositionChanged)
{
_address.ResolveAddressAsync(_lastPosition);
}
}
catch (Exception ex)
{
Logs.CallerLog("Error->Location_PositionChanged:" + ex.Message);
}
finally
{
_resolverByPositionChanged = false;
}
}
private void Address_ResolveAddressCompleted(object sender, ResolveAddressCompletedEventArgs e)
{
try
{
string address = string.Empty;
if (e.Address.IsUnknown)
{
address = "Unknown [" + _lastPosition.Longitude + "," + _lastPosition.Latitude + "] Address.";
}
else
{
//address = e.Address.AddressLine1;
//address = e.Address.AddressLine2;
address =
e.Address.CountryRegion +
e.Address.StateProvince +
e.Address.City +
e.Address.Building +
e.Address.FloorLevel;
}
if (OnAddressResolvered != null)
{
OnAddressResolvered.BeginInvoke(this, new AddressResolverEventArgs()
{
Longitude = _lastPosition.Longitude,
Latitude = _lastPosition.Latitude,
Address1 = e.Address.AddressLine1,
Address2 = e.Address.AddressLine2,
Address3 = address
}, End_CallBack, null);
}
}
catch (Exception ex)
{
Logs.CallerLog("Error->Address_ResolveAddressCompleted:" + ex.Message);
}
finally
{
}
} private void End_CallBack(IAsyncResult ar)
{
try
{
if (ar.IsCompleted)
{
if (OnAddressResolvered != null)
OnAddressResolvered.EndInvoke(ar);
}
}
catch (Exception ex)
{
Logs.CallerLog("Error->End_CallBack:" + ex.Message);
}
}
}

Demo 用到的程序集  System.Device.dll v4.0 本地电脑上会有的。

C#利用微软库完成设备网络定位(经纬度-地址)的更多相关文章

  1. 利用 Docker 搭建 IPFS 私有网络

    利用 Docker 搭建 IPFS 私有网络 本文原始地址:https://sitoi.cn/posts/40630.html 下载项目 项目地址:https://github.com/Sitoi/p ...

  2. Android Google Maps API 网络服务用于网络定位、计算路线、获取经纬度、获取详细地址等

    extends:http://blog.csdn.net/h7870181/article/details/12505883 Google Maps API 网络服务 官网地址 : https://d ...

  3. 高德网络定位之“移动WiFi识别”

    导读随着时代的发展,近10年来位置产业蓬勃发展,定位能力逐渐从低精度走向高精度,从部分场景走向泛在定位.设备和场景的丰富,使得定位技术和能力也不断的优化更新.定位能力包括GNSS.DR(航迹推算).M ...

  4. Android网络定位服务定制简述

    Android 添加高德或百度网络定位服务 Android的网络定位服务以第三方的APK方式提供服务,由于在国内Android原生自带的com.google.android.gms服务几乎处于不可用状 ...

  5. CocoaPods的安装及使用/利用开源库Diplomat实现分享及第三方登录/git的使用

    <<史上最简洁版本>> 1.gem sources -l查看 当前的源 //1.1 sudo -i..以下都是以管理员的身份来操作的 2.gem sources --remov ...

  6. Android开发之位置定位详解与实例解析(GPS定位、Google网络定位,BaiduLBS(SDK)定位)

    在android开发中地图和定位是很多软件不可或缺的内容,这些特色功能也给人们带来了很多方便.定位一般分为三种发方案:即GPS定位.Google网络定位以及基站定位 最简单的手机定位方式当然是通过GP ...

  7. 利用 VMWare 搭建随机拓扑网络

    这篇文章是计算机网络上机实验课的作业. 实验任务:利用 VMWare 搭建一个由 5 个主机组成的随机拓扑的网络.要求该网络中至少有 2 个子网,两个路由器 .实验的网络拓扑图如下: 网络中有两个路由 ...

  8. Android获取定位权限,获取设备所在的经纬度

    转载请标明出处:http://www.cnblogs.com/tangZH/p/8969898.html  前言: 有时候我们仅仅是想要获取设备所在的经纬度,那么直接调用Android相关的api就可 ...

  9. 如何利用 Chrome 来模拟移动网络来调试 FastAdmin 网站

    如何利用 Chrome 来模拟移动网络来高度 FastAdmin 网站 因为目前大多数都在开发移动类的网页,所以客户端的速度下载速度要也考虑. 虽然都已经 4G 了,但还是要看看在网络质量很差的情况 ...

随机推荐

  1. NOIP200805 笨小猴(低效算法)(一大桶水)【A006】

    [A006]笨小猴[难度A]—————————————————————————————————————————————————————————————— [题目要求] 笨小猴的词汇量很小,所以每次做英 ...

  2. three.js材质

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...

  3. curl 小结

    cURL可以使用URL的语法模拟浏览器来传输数据, 因为它是模拟浏览器,因此它同样支持多种协议,FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以 ...

  4. 聊下并发和Tomcat线程数(错误更正)

    本文前半部分结论存在严重错误,请看最后2015-1-20更新部分. 最近一直在解决线上一个问题,表现是: Tomcat每到凌晨会有一个高峰,峰值的并发达到了3000以上,最后的结果是Tomcat线程池 ...

  5. SQLite部署-无法加载 DLL“SQLite.Interop.dll”: 找不到指定的模块

    近期刚使用SQLite,主要引用的是System.Data.SQLite.dll这个dll,在部署到测试环境时报无法加载 DLL“SQLite.Interop.dll”: 找不到指定的模块. (异常来 ...

  6. 最小生成树のprim算法

    Problem A Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Sub ...

  7. 连连看final发布视频

    组名:天天向上 组长:王森 组员:张政.张金生.林莉.胡丽娜 代码地址:HTTPS:https://git.coding.net/jx8zjs/llk.git SSH:git@git.coding.n ...

  8. KnockoutJS:

    一.ko对象 js对象的改变都会导致viewmodel的变化,但view不一定变化 往ko对象里面push,viewmodel的变化,引起view的变化. 往js对象里面push,model的变化引起 ...

  9. 获取打开指定Action的所有应用包名

    获取打开指定功能的所有应用:发消息,分享等等. 如打开网页,下面代码即可查看所有的浏览器 //查找所有浏览器 private void queryPackage() { PackageManager ...

  10. URL转Drawable之 Android中获取网络图片的三种方法

    转载自: http://doinone.iteye.com/blog/1074283 Android中获取网络图片是一件耗时的操作,如果直接获取有可能会出现应用程序无响应(ANR:Applicatio ...