文章目錄
摘要
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 Program10 {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 Program11 {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 }
輸出結果:
作者:可米小子
出處:http://liuhaorain.cnblogs.com
歡迎轉載或分享,但請務必聲明文章出處。如果文章對您有協助,希望你能推薦或關注。