zoukankan      html  css  js  c++  java
  • 连接Google Map API批量获取地理位置经纬度

    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("北京");
                Locations.Enqueue("上海");
                Locations.Enqueue("广州");
                Locations.Enqueue("深圳");

                Console.WriteLine("地理位置添加完成!");
                Console.WriteLine("");
                Console.WriteLine("正在与Google Map API连接解析地址...");

                //定义Google Map API指定的xml响应地址
                string strUrl = "http://maps.google.com/maps/api/geocode/xml?address={0}&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
        }

    }

  • 相关阅读:
    洛谷P5304 [GXOI/GZOI2019]旅行者
    洛谷P3758 [TJOI2017]可乐
    洛谷P5341 [TJOI2019]甲苯先生和大中锋的字符串
    洛谷P5338 [TJOI2019]甲苯先生的滚榜
    洛谷P5340 [TJOI2019]大中锋的游乐场
    AC自动机
    左偏树(可并堆)实现
    splay区间翻转
    平衡树模板【splay的实现】
    洛谷P4113 [HEOI2012]采花
  • 原文地址:https://www.cnblogs.com/chinatefl/p/2178837.html
Copyright © 2011-2022 走看看