您的位置:首页 > 编程语言 > Go语言

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

2010-10-26 20:51 337 查看
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

}

}



试运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: