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. Java基础知识梳理《一》

    一.Java数据类型(简单称之为“四类八种”) java 基本的数据类型长度都是固定的,好处是在实现跨平台时就统一了. 1.整型 byte short int long (分别是1,2,4,8个字节) ...

  2. 转载:持续集成之解决jenkins内存溢出问题

    在jenkins master-slave配置中,总是出现内存溢出问题,更换了机器设备仍然跑不起来: 问题如下: Status Code: 500    Exception: org.apache.c ...

  3. MD5 、 加密工具

    package com.cgcyiliao.server.util; import java.security.MessageDigest; import java.security.NoSuchAl ...

  4. 2014亚马逊在线笔试题目及解决方案(MMChess问题)

    整体思路:关键是需要知道当前Steps数组中的全排列即可,而且需要不重复的全排列.即关键在于非递归的全排列实现即可~ 其实直接利用STL中的next_permutation算法的,这里我又自己实现了一 ...

  5. pushState与ajax实现无刷新加载

    一.JS代码: $(document).ready(function() { getContent();//初始化页面 $("nav a").click(function() { ...

  6. tachyon of zybo cluster

    把Tachyon层加入spark和hadoop之间,以加速集群 官网:http://tachyon-project.org/ github:https://github.com/amplab/tach ...

  7. js 中将日期转换为星期需要注意的

    new Date(strDate); 中strDate需要是1998/10/30这样的格式,如果是1998-10-30的格式,不一定旧版本的web能兼容

  8. 使用C#模拟键盘输入、鼠标移动和点击、设置光标位置及控制应用程序的显示

    1.模拟键盘输入(SendKeys) 功能:将一个或多个按键消息发送到活动窗口,就如同在键盘上进行输入一样. 语法:SendKeys.Send(string keys);SendKeys.SendWa ...

  9. Sony Z1 flashtool 刷机笔记

    第一次硬刷,(相较于recovery的卡刷)差点变成无限重启..记录一些关键步骤: 1 unlock bootloader http://developer.sonymobile.com/unlock ...

  10. HTML 播放器 写给自己

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...