白桦的天空

第一次的心动,永远的心痛!
  首页  :: 新随笔  :: 联系 :: 管理

连接Google Map API批量获取地理位置经纬度

Posted on 2011-09-16 15:41  白桦的天空  阅读(774)  评论(0编辑  收藏  举报

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
    }

}