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. 怎样上传网页到ftp中

    1.下载filezilla软件软件并安装 打开刚刚装好的FileZilla,点击菜单中的"文件"             2.点击站点管理器 3.点击新站点

  2. oracle 监听启动、停止、查看命令

    1.su oracle 然后启动监听器 1.lsnrctl start  会看到启动成功的界面; 1.lsnrctl stop  停止监听器命令. 1.lsnrctl status  查看监听器命令. ...

  3. [NOIP2016]换教室 D1 T3 Floyed+期望DP

    [NOIP2016]换教室 D1 T3 Description 对于刚上大学的牛牛来说, 他面临的第一个问题是如何根据实际情况中情合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第 ...

  4. 纯CSS完成tab实现5种不同切换对应内容效果

    很常用的一款特效纯CSS完成tab实现5种不同切换对应内容效果 实例预览 下载地址 实例代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ...

  5. 怎样去除织梦版权信息中的Power by DedeCms

    用织梦建站时,网站底部调用的版权信息最后总会多出一个Power by DedeCms链接,此链接是织梦系统中默认的指向织梦官网的外链.本文就介绍两种去除这个外链的方法. 1.为什么要去除Power b ...

  6. info.plist、pch和四大对象(UIApplication、UIApplicationDelegate、UIWindow、UIViewController)

    本文目录 1.程序配置文件info.plist,全局头文件pch 2.应用程序对象UIApplication介绍 3.UIApplicationDelegate介绍,程序启动过程 4.UIWindow ...

  7. matlab处理图像代码

    1.图像的读取MATLAB中从图像文件中读取数据用函数imread(),这个函数的作用就是将图像文件的数据读入矩阵中,此外还可以用imfinfo()函数查看图像文件的信息(见例1)%例1:图像数据及图 ...

  8. JavaScript 函数声明,函数表达式,匿名函数,立即执行函数之区别

    函数声明:function fnName () {-};使用function关键字声明一个函数,再指定一个函数名,叫函数声明. 函数表达式 var fnName = function () {-};使 ...

  9. 经典的javascript函数实例,css的. #区别

    先贴javascript经典例子代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &quo ...

  10. 解决Win10图片打开方式没有“Windows照片查看器”问题

    1.打开注册表编辑器(Win+R,Regedit),定位至(建议修改前备份注册表): HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Photo Viewe ...