Google地圖的web Services

如何通過經緯度獲取地址信息?

摘要

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 表示響應格式(通常爲 jsonxml)。

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

注意:boundsregion 參數只會影響地址解析器返回的結果,但不能對其進行完全限制。

實例一:創建查詢座標(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" 通常表示缺少查詢參數(addresslatlng)。

實例一:在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 }

輸出結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章