认知尚浅,如有错误,愿闻其详
概述
便签项目中因个人需求原因,需要在便签中加入天气显示功能。而天气的显示需要去获取当前设备的地理位置,然后通过地理位置去获得相应的天气信息。那怎么获取地理位置呢?
方案有两个:
①:通过百度等开放平台API去直接获取当前设备的地理位置。
②:通过微软提供的
System.Device.Location
库中方法去获取设备经纬度,然后获取相应的地理位置。
当然,首选第二个方式去获得。毕竟有封装方法,而且通过第三方API去获取难免会存在一些问题,就比如说访问次数限制、频率限制等。
方法
有需要的同学可以看一下官方文档System.Device.Location里面会详细的说明。如果想直接使用成功案例的朋友看Part-2,Part-1是个坑。
- 我们先看看使用它的类有哪些: System.Device.Location下的类
- 其次,我们需要先引入命名空间,且我需要的是获取经纬度,然后使用的是
GeoCoordinateWatcher
类
Part-1
这是其官方的示例是这样的,为同步方法:
using System;
using System.Device.Location;
namespace GetLocationProperty
{
class Program
{
static void Main(string[] args)
{
GetLocationProperty();
}
static void GetLocationProperty()
{
//创建一个获取经纬度位置数据的对象
GeoCoordinateWatcher watcher = new GeoCoordinateWatcher();
//开始获取来自当前的位置提供的数据。
watcher.TryStart(false, TimeSpan.FromMilliseconds(1000));
//将获取到的坐标数据赋值地理坐标
GeoCoordinate coord = watcher.Position.Location;
if (coord.IsUnknown != true)
{
Console.WriteLine("Lat: {0}, Long: {1}",
coord.Latitude,
coord.Longitude);
}
else
{
Console.WriteLine("Unknown latitude and longitude.");
}
}
}
}
重点:最后上述代码输出的是空的,赋值的GeoCoordinate coord
是IsUnknown
,输出Unknown latitude and longitude ,说明并没有获取到位置信息,同样的使用了watcher.Start()
亦是如此。
Part-2
最后使用了PositionChanged
位置改变事件的方式,才获取到了想要的数据:
using System;
using System.Device.Location;
namespace GetLocationEvent
{
class Program
{
static void Main(string[] args)
{
CLocation myLocation = new CLocation();
//开启位置变化监听
myLocation.GetLocationEvent();
Console.WriteLine("Enter any key to quit.");
Console.ReadLine();
}
class CLocation
{
GeoCoordinateWatcher watcher;
public void GetLocationEvent()
{
this.watcher = new GeoCoordinateWatcher();
//添加事件
this.watcher.PositionChanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(watcher_PositionChanged);
bool started = this.watcher.TryStart(false, TimeSpan.FromMilliseconds(2000));
if (!started)
{
Console.WriteLine("GeoCoordinateWatcher timed out on start.");
}
}
void watcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
{
PrintPosition(e.Position.Location.Latitude, e.Position.Location.Longitude);
}
void PrintPosition(double Latitude, double Longitude)
{
Console.WriteLine("Latitude: {0}, Longitude {1}", Latitude, Longitude);
}
}
}
}
最后的问题
PS:得到经纬度后,再使用CivicAddress
类和上述得到的经纬度去解析出省市信息,结果也无法获取,不太晓得出了什么问题!最后还是迫不得已去通过百度API去通过经纬度获得对应省市名。
网友评论