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
}
}