摘要
Google Maps API Web Services,是一个为您的地图应用程序提供地理数据的 Google 服务的 HTTP 接口集合。具体包括:Google Geocoding API、Google Directions API、Google Elevation API、Google Places API。本文将探讨如何通过Google Geocoding API服务来获取地址信息。
目录
什么是网络服务?
区分地址解析与反地址解析
地址查询(反地址解析)请求
地址查询(反地址解析)响应
处理响应结果
1. 什么是网络服务?
Google Maps API 提供这些网络服务作为从外部服务中请求 Google Maps API 数据以及在您的地图应用程序中使用它们的接口。这些网络服务使用特定网址的 HTTP 请求并将网址参数作为参数提供给服务。一般来讲,这些服务会在 HTTP 请求中以 JSON 或 XML 的形式传回数据,供您的应用程序进行解析和/或处理。
一个典型的网络服务请求通常采用以下形式:
http://maps.google.com/maps/api/service/output?parameters
其中 service
表示所请求的特定服务,output
表示响应格式(通常为 json
或 xml
)。
2.地址解析与反地址解析
地址解析是将地址(如“1600 Amphitheatre Parkway, Mountain View, CA”)转换为地理坐标(如纬度 37.423021 和经度 -122.083739)的过程,您可以根据转换得到的坐标放置标记或定位地图。Google Geocoding API 可让您通过 HTTP 请求直接访问地址解析器。此外,该服务还可让您执行反向操作(将坐标转换为地址),此过程称为“反向地址解析”(地址查询)。
3. 地址查询(反向地址解析)请求
Google Geocoding API 请求必须采用以下形式:
http://maps.google.com/maps/api/geocode/output?parameters
其中,output
可以是以下值之一:
json
(建议)表示以 JavaScript 对象表示法 (JSON) 的形式输出xml
表示以 XML 的形式输出
有些参数是必需的,有些是可选的。根据网址的标准,所有参数均使用字符 & (&
) 分隔。下面枚举了这些参数及其可能的值。
Google Geocoding API 使用以下网址参数定义地址查询请求:
latlng
(必需)- 您希望获取的、距离最近的、可人工读取地址的纬度/经度文本值。bounds
(可选)- 要在其中更显著地偏移地址解析结果的可视区域的边框。region
(可选)- 区域代码,指定为 ccTLD(“顶级域”)双字符值。language
(可选)- 传回结果时所使用的语言。请注意,我们会经常更新支持的语言,因此该列表可能并不详尽。如果未提供language
,地址解析器将尝试尽可能使用发送请求的区域的本地语言。sensor
(必需)- 指示地址解析请求是否来自装有位置传感器的设备。该值必须为true
或false
。
注意:bounds
和 region
参数只会影响地址解析器返回的结果,但不能对其进行完全限制。
实例一:创建查询坐标(39.910093,116.403945)的地址信息的请求,要求以xml格式输出响应,语言为简体中文(zh-CN)。
http://maps.google.com/maps/api/geocode/xml?latlng=39.910093,116.403945&language=zh-CN&sensor=false
注意:经纬度书写的顺序为(纬度,经度)。
实例二:利用C#在客户端程序中创建上述请求。
1 WebClient client = new WebClient(); 2 string url = "http://maps.google.com/maps/api/geocode/xml?latlng=39.910093,116.403945&language=zh-CN&sensor=false"; 3 client.Encoding = Encoding.UTF8; 4 string responseTest = client.DownloadString(url);
4. 地址查询(反向地址解析)响应
地址解析响应将以网址请求路径中的 output
标记所指示的格式传回。XML 响应包含一个 <GeocodeResponse>
和两个顶级元素:
<status>
包含请求中状态代码。(非常重要)零或多个
<result>
元素,每个元素都包含单独的一组地址解析地址信息和几何图形信息。
地址解析响应对象中的 "status"
字段包含请求的状态,并且可能包含调试信息,以帮助您追溯地址解析未正常工作的原因。
"status"
字段可能包含以下值:
"OK"
表示未发生错误;地址成功进行了解析并且至少传回了一个地址解析结果。(判断请求是否成功响应)"ZERO_RESULTS"
表示地址解析成功,但未返回结果。如果地址解析过程中传递的偏远位置address
或latlng
并不存在,则会出现这种情况。"OVER_QUERY_LIMIT"
表示您超出了配额。"REQUEST_DENIED"
表示您的请求被拒绝,通常是由于缺少sensor
参数。"INVALID_REQUEST"
通常表示缺少查询参数(address
或latlng
)。
实例一:在IE浏览中输入上述实例一中的请求,查看响应结果。
实例二:通过控制台输出上述实例二的响应。
C#代码:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Net; 6 7 namespace GeoCodeTest 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 WebClient client = new WebClient(); 14 string url = "http://maps.google.com/maps/api/geocode/xml?latlng=39.910093,116.403945&language=zh-CN&sensor=false"; 15 client.Encoding = Encoding.UTF8; 16 string responseTest = client.DownloadString(url); 17 18 Console.Write("{0}",responseTest); 19 20 Console.Read(); 21 22 } 23 } 24 }
5. 处理响应结果
通过上述内容,我们已经能够得到xml响应信息。但是,响应结果包含很多信息,因此我们需要解析出需要的地址信息。具体实现过程为:
第一步:判断status的状态信息。
第二步:获取formatted_address
地址信息。
注意:formatted_address
是一个字符串,包含此位置的人类可读地址。通常该地址相当于“邮政地址”,有时会因不同国家/地区而存在差异。
实现代码如下:
View Code
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Net; 6 using System.Xml; 7 8 namespace GeoCodeTest 9 { 10 class Program 11 { 12 static void Main(string[] args) 13 { 14 WebClient client = new WebClient();//webclient客户端对象 15 string url = "http://maps.google.com/maps/api/geocode/xml?latlng=39.910093,116.403945&language=zh-CN&sensor=false";//请求地址 16 client.Encoding = Encoding.UTF8;//编码格式 17 string responseTest = client.DownloadString(url);//下载xml响应数据 18 19 XmlDocument doc = new XmlDocument();//创建XML文档对象 20 21 if(!string.IsNullOrEmpty(responseTest)) 22 { 23 doc.LoadXml(responseTest);//加载xml字符串 24 25 //获取状态信息 26 string xpath = @"GeocodeResponse/status"; 27 XmlNode node = doc.SelectSingleNode(xpath); 28 string status = node.InnerText.ToString(); 29 30 if(status == "OK") 31 { 32 //获取地址信息 33 xpath = @"GeocodeResponse/result/formatted_address"; 34 node = doc.SelectSingleNode(xpath); 35 string address = node.InnerText.ToString(); 36 37 Console.WriteLine("地址:{0}",address);//输出地址信息 38 } 39 40 } 41 42 43 Console.Read(); 44 45 } 46 } 47 }