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. 首师大附中互测题:50229234海岛帝国:独立之战【C002】

    [C002]50229234海岛帝国:独立之战[难度C]———————————————————————————————————————————————————————————————————————— ...

  2. python操作mongodb数据库

    一.MongoDB 数据库操作 连接数据库 import pymongo conn = pymongo.Connection() # 连接本机数据库 conn = pymongo.Connection ...

  3. Python中输出格式化的字符串

    在Python中,采用的格式化方式和C语言是一致的,用%实现,举例如下: >>> 'Hello, %s' % 'world' 'Hello, world' >>> ...

  4. django manytomany

    转载:http://my.oschina.net/u/572994/blog/105280 例如有如下模型 models.py ? 1 2 3 4 5 6 7 from django.db impor ...

  5. Simplify Path

    Given an absolute path for a file (Unix-style), simplify it. For example, path = "/home/", ...

  6. 读书笔记 —— 《css秘密花园》

    浏览器兼容性有效性信息查询 : Can I Use? http://caniuse.com/ 自动为css添加浏览器厂商前缀 https://autoprefixer.github.io/ 在线编辑H ...

  7. 安卓中級教程(7):annotation中的 public @interface的用法

    package com.example.ele_me.util; import java.lang.annotation.Retention; import java.lang.annotation. ...

  8. System memory,AGP memory和video memory【转】

    system  memory就是电脑的内存条上的,一般都很大.显卡不能访问 . video memory就是显示卡上的显存,一般是32,64,128M这样,速度最快,显卡可直接访问 .用来描述电脑上一 ...

  9. MySQL 在 LIMIT 条件后注入

    from:https://rateip.com/blog/sql-injections-in-mysql-limit-clause/ 此方法适用于MySQL 5.x中,在limit语句后面的注入例如: ...

  10. Python 2.7 - CentOS 7 - ImportError: No module named Tkinter

    It's simple. sudo yum -y install tkinter Just want to say, "I'm back".