根据经纬度坐标取得地理位置名称 以及各种特殊情况

根据经纬度坐标取得地理位置名称

using System;

using System.Collections.Generic;

using System.Text;

using System.Xml;

using System.Threading;

 

namespace GetLatLng

{

    class Program

    {

        static void Main(string[] args)

        {

            //输出提示信息

            Console.WriteLine("正在添加经纬度...");

            Console.WriteLine("");

 

            //定义一个泛型队列,用于存储地理位置名称

            Queue<string> Locations = new Queue<string>();

 

            //向队列中添加地理位置名称

            Locations.Enqueue("39.910093,116.403945");

            Locations.Enqueue("36.98243,120.68244");

            Locations.Enqueue("70.910093,16.403945");

            Locations.Enqueue("39.910093,160.403945");

 

            Console.WriteLine("经纬度添加完成!");

            Console.WriteLine("");

            Console.WriteLine("正在与Google Map API连接解析地址...");

 

            //定义Google Map API指定的xml响应地址

            string strUrl = "http://maps.google.com/maps/api/geocode/xml?latlng={0}&language=zh-CN&sensor=false";

 

            //定义当前读取的字符串,初始化为空

            string strCurrent = string.Empty;

 

            //定义一个xml文档的引用

            XmlDocument xmldoc;

 

            //定义一个xml文档的根节点引用

            XmlNode root;

 

            //定义xml文档中有关经纬度信息的节点引用

            XmlNode latlng;

 

            //定义一个随机数实例,用于生成等待时间长度的整型值

            Random rnd = new Random();

 

            //定义一个等待时间的值变量

            int waitTime;

 

        //代码块标记NEXT

        //用于在加载xml文档出现错误后指引跳转的方位

        NEXT:

 

            //循环读出排在队首的信息

            //依次加载返回经纬度

            while (Locations.Count != 0)

            {

                strCurrent = string.Empty;

                xmldoc = null;

                root = null;

                latlng = null;

 

                //删除并返回位于队首的信息

                //生成xmldoc的实例

                strCurrent = Locations.Dequeue();

                xmldoc = new XmlDocument();

 

                //尝试加载xml文档

                //如果出错,随机生成一个等待时间

                //在这个时间范围内执行线程休眠

                //时间一到,跳转至NEXT

                try

                {

                    xmldoc.Load(string.Format(strUrl, strCurrent));

                }

                catch (Exception ee)

                {

                    waitTime = rnd.Next(300000, 600000);

 

                    //鸣响PC喇叭

                    Console.Beep();

 

                    Console.WriteLine("加载XML文档出现错误,以下是错误描述:");

                    Console.WriteLine(ee.Message);

                    Console.WriteLine(string.Format("{0}秒后将重新连接至Google Map API", waitTime / 1000));

                    Console.WriteLine("");

 

                    //线程休眠

                    //时间长度由rnd生成

                    Thread.Sleep(waitTime);

 

                    //跳转至NEXT

                    goto NEXT;

                }

 

                //如果成功加载到xml文档

                //指引根节点至GeocodeResponse

                root = xmldoc.SelectSingleNode("GeocodeResponse");

 

                //如果节点内信息为OK,表示成功解析

                //输出地理位置名称和经纬度

                if (root.FirstChild.InnerText == "OK")

                {

                    latlng = root.SelectSingleNode("result/geometry/location");

                    Console.WriteLine(string.Format("{0}  纬度:{1},经度:{2}",

                                                    strCurrent,

                                                    latlng.ChildNodes[0].InnerText,

                                                    latlng.ChildNodes[1].InnerText));

                }

                //Google Map API规定普通用户每天仅有2,500 个地理位置查询请求

                //如果超出会提示错误OVER_QUERY_LIMIT

                //此处进行单独处理

                else if (root.FirstChild.InnerText == "OVER_QUERY_LIMIT")

                {

                    Console.Beep();

                    Console.WriteLine("已超出Google Map API规定的地址解析请求次数的最高值!程序已经退出...");

                    break;

                }

                //若返回其它错误进行提示

                else

                {

                    Console.Beep();

                    Console.WriteLine(string.Format("{0}  错误:{1}",

                                      strCurrent, root.FirstChild.InnerText));

                }

 

 

                //当成功解析一个地址后

                //执行线程休眠,目的是为了避免因频繁请求被Google认为是恶意请求

                //当然,如果地理位置数量较少,可忽略此方法

                Thread.Sleep(rnd.Next(3000, 10000));

 

 

            }//end while

 

            //若队列里元素数量为0

            //表示全部成功解析

            if (Locations.Count == 0)

            {

                Console.WriteLine("");

                Console.WriteLine("地理位置解析完毕!");

            }

 

        }//end Main

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值