美文网首页
.NET 下获取设备经纬度

.NET 下获取设备经纬度

作者: Memoyu | 来源:发表于2019-07-10 14:38 被阅读0次

    认知尚浅,如有错误,愿闻其详

    概述

      便签项目中因个人需求原因,需要在便签中加入天气显示功能。而天气的显示需要去获取当前设备的地理位置,然后通过地理位置去获得相应的天气信息。那怎么获取地理位置呢?
      方案有两个:

         ①:通过百度等开放平台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 coordIsUnknown ,输出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去通过经纬度获得对应省市名。

    相关文章

      网友评论

          本文标题:.NET 下获取设备经纬度

          本文链接:https://www.haomeiwen.com/subject/tsxckctx.html