谷歌地圖 API 開發之 Geocoding API

大部分項目仍是都有要獲取當前點擊的座標經緯度或者獲取當前街道的信息的,然而谷歌API 的文檔也並非很直觀。
官網地理編碼服務地址:https://developers.google.com...
在服務欄裏的地理編碼裏,爲何說是服務呢,用谷歌翻譯了下,發現想獲取座標以及街道詳情,須要調用谷歌的地理編碼接口(不是徹底免費的哦),因此,算是谷歌的接口服務吧。而後人家就來了個限制政策,以下:javascript

使用地理編碼服務的標準java

  • 天天2500免費請求,客戶端和的總和來計算服務器端的 查詢; 啓用結算進入更高的每日配額,以$ 0.50計費美圓/ 1000其餘要求,達10萬天天的請求。json

  • 每秒50個請求,做爲客戶端和的總和來計算服務器端 的查詢。api

然而這個服務看了很久,也沒看出怎麼請求,因而乎,又不停的找谷歌api,找了很久,終於不負有心人,讓勞資給找到了這個Google Maps Geocoding API 地址:https://developers.google.com...數組

下面進入正文。其實下面的都是從谷歌API copy 過來的,不要吐槽我,一點一點的粘貼複製整理也好累的 >_<服務器

什麼是地理編碼?

地理編碼是將地址(如「1600 Amphitheatre Parkway, Mountain View, CA」)轉換爲地理座標(如緯度 37.423021 和經度 -122.083739)的過程,您能夠藉此在地圖上放置標記,或在地圖上定位。post

反向地理編碼是將地理座標轉換爲可人工讀取的地址的過程。Google Maps Geocoding API 的反向地理編碼服務還可以讓您找到對應於給定的地點 ID 的地址。ui

Google Maps Geocoding API 請求格式

Google Maps Geocoding API 請求必須採用如下形式:google

https://maps.googleapis.com/maps/api/geocode/output?parameters

其中,output 能夠是如下值之一:編碼

  • json(推薦)指示以 JavaScript 對象標記 (JSON) 輸出

  • xml 指示以 XML 格式輸出

如需經過 HTTP 訪問 Google Maps Geocoding API,請使用:http://maps.googleapis.com/maps/api/geocode/output?parameters

對於請求中包含敏感用戶數據(例如用戶的位置)的應用,不建議使用 HTTP。
有些參數是必填的,而有些是可選的。依照 URL 的標準,參數都使用「與」字符 (&) 分隔。
由於每種請求類型使用的參數不一樣,因此本頁面的其他部分分別介紹了地理編碼反向地理編碼

地理編碼(緯度/經度查詢)

地理編碼請求中的必填參數:

  • address- 要進行地理編碼的街道地址,採用相關國家/地區的全國郵政服務所使用的格式。應避免其餘地址元素,例如企業名稱以及單元號、套房號或樓層。

    components - 您但願得到其地理編碼的組成部分過濾器。若是提供了 address,還將接受組成部分過濾器做爲可選參數。

  • key – 您的應用的 API 密鑰。此密鑰能夠標識您的應用,以便進行配額管理。

地理編碼請求中的可選參數:

  • bounds – 視口的邊框,在其中可使地理編碼結果更顯著地發生偏向。此參數只會影響,而不會徹底限制地理編碼器中的結果。

  • language – 返回結果時使用的語言。請注意,咱們會常常更新支持的語言,所以,此列表可能並不全面。若是未提供 language,地理編碼器將盡量嘗試使用發送請求區域的當地語言。

  • region – 地區代碼,指定爲一個 ccTLD(「頂級域名」)雙字符值。此參數只會影響,而不會徹底限制地理編碼器中的結果。

  • components – 組成部分過濾器,用管道符號 (|) 分隔。每一個組成部分過濾器由一個 component:value 對組成,將徹底限制地理編碼器中的結果。

地理編碼響應

地理編碼響應以 URL 請求路徑中 output 標誌指示的格式返回。

在此示例中,Google Maps Geocoding API 請求針對「1600 Amphitheatre Parkway, Mountain View, CA」查詢的 json 響應。

此請求演示瞭如何使用 JSON output 標誌:

https://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&key=YOUR_API_KEY

此請求演示瞭如何使用 XML output 標誌:

https://maps.googleapis.com/maps/api/geocode/xml?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&key=YOUR_API_KEY

在此只演示下Json響應結果實例:

{
   "results" : [
      {
         "address_components" : [
            {
               "long_name" : "1600",
               "short_name" : "1600",
               "types" : [ "street_number" ]
            },
            {
               "long_name" : "Amphitheatre Pkwy",
               "short_name" : "Amphitheatre Pkwy",
               "types" : [ "route" ]
            },
            {
               "long_name" : "Mountain View",
               "short_name" : "Mountain View",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Santa Clara County",
               "short_name" : "Santa Clara County",
               "types" : [ "administrative_area_level_2", "political" ]
            },
            {
               "long_name" : "California",
               "short_name" : "CA",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "United States",
               "short_name" : "US",
               "types" : [ "country", "political" ]
            },
            {
               "long_name" : "94043",
               "short_name" : "94043",
               "types" : [ "postal_code" ]
            }
         ],
         "formatted_address" : "1600 Amphitheatre Parkway, Mountain View, CA 94043, USA",
         "geometry" : {
            "location" : {
               "lat" : 37.4224764,
               "lng" : -122.0842499
            },
            "location_type" : "ROOFTOP",
            "viewport" : {
               "northeast" : {
                  "lat" : 37.4238253802915,
                  "lng" : -122.0829009197085
               },
               "southwest" : {
                  "lat" : 37.4211274197085,
                  "lng" : -122.0855988802915
               }
            }
         },
         "place_id" : "ChIJ2eUgeAK6j4ARbn5u_wAGqWA",
         "types" : [ "street_address" ]
      }
   ],
   "status" : "OK"
}

請注意,JSON 響應包含兩個根元素:

  • "status" 包含請求的元數據。請參閱下面的狀態代碼

  • "results" 包含一個有關地理編碼地址信息和幾何信息的數組。

狀態代碼

地理編碼響應對象中的 "status" 字段包含了請求的狀態,還可能包含調試信息,以幫助您查明地理編碼不工做的緣由。"status" 字段能夠包含如下值:

  • "OK" 表示未出現任何錯誤;已成功解析地址,而且至少返回了一個地理編碼。

  • "ZERO_RESULTS" 表示地理編碼成功,但未返回任何結果。若是向地理編碼器傳遞了一個不存在 address,就可能會發生這種狀況。

  • "OVER_QUERY_LIMIT" 表示您已超出配額。

  • "REQUEST_DENIED" 表示系統已拒絕您的請求。

  • "INVALID_REQUEST" 通常表示缺乏查詢(address、components 或 latlng)。

  • "UNKNOWN_ERROR" 表示因爲服務器發生錯誤,所以沒法處理該請求。若是您重試一次,請求可能會成功

結果

當地理編碼器返回結果時,會將這些結果放在一個 (JSON) results 數組中。即便地理編碼器沒有返回任何結果(例如,若是地址不存在),它仍然會返回一個空的 results 數組。(XML 響應包含零個或更多個 <result> 元素。)

典型的結果由如下字段組成:

  • types[]數組表示返回結果的類型。此數組包含一組標記(可能爲零個或多個),用於標識結果中所返回特徵的類型。例如,「芝加哥」的地理編碼返回「locality」,這代表「芝加哥」是一個城市,而且還返回「political」,這代表它是一個政治實體。

  • formatted_address:是一個包含此位置可人工讀取的地址的字符串。一般此地址至關於「郵政地址」,有時會因國家/地區而異。(請注意,因爲許可限制,某些國家(如英國)不容許發佈真實的郵政地址。)此地址一般由一個或多個地址組成部分組成。例如,地址「111 8th Avenue, New York, NY」包含如下地址組成部分:「111」(街道號)、「8th Avenue」(道路)、「New York」(城市)和「NY」(美國的一個州)。這些地址組成部分包含以下所述的附加信息。

  • address_components[] 是包含獨立的地址組成部分的數組,如上所述。一般,每一個 address_component均包含:

    `types[]`,一個表示地址組成部分類型的數組。
    `long_name` 是地理編碼器返回的地址組成部分的完整文本說明或名稱。
    `short_name` 是地址組成部分的文本名稱縮寫(若有)。例如,Alaska 州的地址組成部分能夠有 long_name「Alaska」和 short_name「AK」(使用雙字母郵政縮寫表示)。

    請注意,address_components[] 中包含的地址組成部分可能比 formatted_address 中記錄的更多。

  • postcode_localities[] 是一個數組,表示一個郵政編碼中包含的全部地方。只有當結果是一個包含多個地方的郵政編碼時,纔會有此數組。

  • geometry 包含如下信息:

    • location:其中包含地理編碼經度、緯度值。對於普通的地址查找,此字段一般是最重要的。

    • location_type 存儲有關指定位置的附加數據。目前支持如下值:

      "ROOFTOP" 表示返回的結果是一個精確的地理編碼,咱們使其位置信息精確到街道地址的精度。
      "RANGE_INTERPOLATED" 表示返回的結果反映了兩個精確點(例如交叉路口)之間用內插法計算獲得的近似值(一般在道路上)。當某個街道地址的 rooftop 地理編碼不可用時,一般會返回內插值結果。
      "GEOMETRIC_CENTER" 表示返回的結果是某個位置(如多段線(例如街道)或多邊形(地區))的幾何中心。
      "APPROXIMATE" 表示返回的結果是近似值。
    • viewport 包含用於顯示返回結果的推薦視口,指定爲兩個緯度、經度值,分別定義視口邊框的 southwestnortheast 角。視口一般用來在向用戶顯示結果時爲該結果加邊框。

    • bounds(可選返回)存儲可徹底包含返回結果的邊框。請注意,這些邊界可能與推薦的視口不一致。(例如,舊金山包含費拉隆島,理論上它是這個城市的一部分,但可能不該該在視口中返回。)

  • partial_match 表示雖然地理編碼器可以匹配所請求的地址的一部分,但它未能返回原始請求的精確匹配項。您不妨檢查一下原始請求中是否有拼寫錯誤和/或地址不完整的狀況。
    對於請求中所傳遞的行政區劃內不存在的街道地址,最常發生部分匹配的狀況。當請求與同一行政區劃中的兩個或更多位置相匹配時,也可能會返回部分匹配。例如,「21 Henr St, Bristol, UK」將返回 Henry Street 和 Henrietta Street 這兩項部分匹配結果。請注意,若是請求中包含拼寫錯誤的地址組成部分,地理編碼服務可能會建議一個備選地址。以這種方式觸發的建議也將標記爲部分匹配。

  • place_id 是惟一一個能夠與其餘 Google API 結合使用的標識符。例如,您能夠在 Google Places API 請求中使用 place_id 獲取當地企業的詳情,如電話號碼、營業時間、用戶評論等。

地址類型和地址組成部分類型

結果中的 types[] 數組表示地址類型。地址類型的示例包括街道地址、國家/地區或政治實體。在 address_components[] 中也有一個 types[] 數組,用來表示地址各個部分的類型。示例包括門牌號碼或國家/地區。(如下是類型的完整列表。)地址可能有多種類型。這些類型可能會被視爲「標記」。例如,許多城市都標有 politicallocality 類型。

地理編碼器以地址類型和地址組成部分類型數組這兩種形式支持並返回如下類型:

street_address 表示精確的街道地址。
route:表示已命名的路線(例如「US 101」)
intersection:表示主要交叉路口,一般是兩條主要道路的交叉路口
political:表示政治實體。一般,這種類型表示某個民政管理部門的多邊形
country:表示國家政治實體,一般是由地理編碼器返回的最高級別類型
administrative_area_level_1:表示國家/地區級別如下的一級行政實體。在美國,這種行政級別就是州。並不是全部國家都設有這類行政級別
administrative_area_level_2:表示國家/地區級別如下的二級行政實體。在美國,這種行政級別就是縣。並不是全部國家都設有這類行政級別
administrative_area_level_3:表示國家/地區級別如下的三級行政實體。此類型表示較小的行政區劃單位。並不是全部國家都設有這類行政級別
administrative_area_level_4:表示國家/地區級別如下的四級行政實體。此類型表示較小的行政區劃單位。並不是全部國家都設有這類行政級別
administrative_area_level_5:表示國家/地區級別如下的五級行政實體。此類型表示較小的行政區劃單位。並不是全部國家都設有這類行政級別
colloquial_area:表示實體的經常使用替代名稱
locality 表示合併的城市或城鎮政治實體。
ward 表示一種特定的日本行政區劃類型,以便於區分某個日本地址中的多個行政區劃組成部分。
sublocality:表示 locality 如下的一級行政實體。某些位置可能會收到其餘類型之一:從 sublocality_level_1 到 sublocality_level_5。每一個 sublocality 級別都是一個行政實體。數字越大,表示的地理區域越小
neighborhood 表示已命名的街區
premise 表示已命名的位置,一般是具備常見名稱的一棟或一羣建築物
subpremise 表示指定位置如下的一級實體,一般是同名建築羣中的單個建築物
postal_code 表示郵政編碼,用於國內的地址郵寄。
natural_feature:表示著名的天然景觀
airport:表示機場
park:表示已命名的公園。
point_of_interest 表示已命名的景點。一般,這些「景點」是不容易納入其餘類別的著名地方實體,如「帝國大廈」或「自由女神像」。

除了上述類型以外,地址組成部分還可能包括下列類型。

floor:表示某個建築物地址的樓層
establishment 一般表示某個還沒有歸類的地方。
point_of_interest 表示已命名的景點。
parking 表示停車場或停車設施。
post_box 表示特定的郵政信箱。
postal_town 表示地理區域的分組,如 locality 和 sublocality,在某些國家/地區用於郵寄地址。
room 表示某個建築物地址的房間。
street_number 表示確切的門牌號碼。
bus_station、train_station 和 transit_station 表示巴士、火車或公交車站的位置。

反向地理編碼(地址查找)

術語地理編碼通常是指將可人工讀取的地址轉換爲地圖上的某個位置。與之相反,將地圖上的某個位置轉換爲可人工讀取的地址的過程,就稱爲反向地理編碼。

必填參數:您必須在反向地理編碼請求中提供下列參數之一,但不可同時提供這兩個參數:

  • 要麼:latlng – 經緯度值,用於指定但願得到其最接近的、可人工讀取的地址的位置。

  • 或者:place_id – 您但願得到其可人工讀取的地址的地方的地點 ID。地點 ID 是惟一一個能夠與其餘 Google API 結合使用的標識符。例如,您可使用由 Google Maps Roads API 返回的 placeID 來獲取某個拍攝點的地址。

反向地理編碼請求中的可選參數:

  • key – 您的應用的 API 密鑰,可從 Google API Console 得到。此密鑰能夠標識您的應用,以便進行配額管理。

  • language – 返回結果時使用的語言。請參閱支持的區域語言列表。請注意,咱們會常常更新支持的語言,所以,此列表可能並不全面。若是未提供 language,地理編碼器將盡量嘗試使用發送請求區域的當地語言。

  • result_type – 一個或多個地址類型,用管道符號 (|) 分隔。地址類型的示例:countrystreet_addresspostal_code。如需查看容許值的完整列表,請參閱此頁面上的地址類型。若是指定了一種類型,會將結果限制於這種類型。若是指定了多種類型,該 API 將返回匹配其中任何類型的全部地址。注:此參數僅適用於包括 API 密鑰或客戶端 ID 的請求。

  • location_type – 一個或多個位置類型,用管道符號 (|) 分隔。若是指定了一種類型,會將結果限制於這種類型。若是指定了多種類型,該 API 將返回匹配其中任何類型的全部地址。注:此參數僅適用於包括 API 密鑰或客戶端 ID 的請求。可支持如下值:

    "ROOFTOP" 將結果限制爲咱們使其位置信息精確到街道地址精度的地址。
    "RANGE_INTERPOLATED" 將結果限制爲反映了兩個精確點(例如交叉路口)之間用內插法計算獲得的近似值(一般在道路上)的地址。內插的範圍一般表示某個街道地址的 rooftop 地理編碼不可用。
    "GEOMETRIC_CENTER" 將結果限制爲某個位置(如多段線(例如街道)或多邊形(地區))的幾何中心。
    "APPROXIMATE" 將結果限制爲是近似值的地址。

    若是 result_typelocation_type 限制同時存在,那麼該 API 將只返回同時匹配 result_type 和 location_type 限制的結果。

經緯度反向地理編碼

如下查詢包含了布魯克林某個位置的緯度/經度值:

https://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&key=YOUR_API_KEY

注:確保在將緯度和經度值傳入 latlng 參數時,二者之間沒有空格。

上述查詢返回如下結果:

{
   "results" : [
      {
         "address_components" : [
            {
               "long_name" : "277",
               "short_name" : "277",
               "types" : [ "street_number" ]
            },
            {
               "long_name" : "Bedford Avenue",
               "short_name" : "Bedford Ave",
               "types" : [ "route" ]
            },
            {
               "long_name" : "Williamsburg",
               "short_name" : "Williamsburg",
               "types" : [ "neighborhood", "political" ]
            },
            {
               "long_name" : "Brooklyn",
               "short_name" : "Brooklyn",
               "types" : [ "sublocality", "political" ]
            },
            {
               "long_name" : "Kings",
               "short_name" : "Kings",
               "types" : [ "administrative_area_level_2", "political" ]
            },
            {
               "long_name" : "New York",
               "short_name" : "NY",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "United States",
               "short_name" : "US",
               "types" : [ "country", "political" ]
            },
            {
               "long_name" : "11211",
               "short_name" : "11211",
               "types" : [ "postal_code" ]
            }
         ],
         "formatted_address" : "277 Bedford Avenue, Brooklyn, NY 11211, USA",
         "geometry" : {
            "location" : {
               "lat" : 40.714232,
               "lng" : -73.9612889
            },
            "location_type" : "ROOFTOP",
            "viewport" : {
               "northeast" : {
                  "lat" : 40.7155809802915,
                  "lng" : -73.9599399197085
               },
               "southwest" : {
                  "lat" : 40.7128830197085,
                  "lng" : -73.96263788029151
               }
            }
         },
         "place_id" : "ChIJd8BlQ2BZwokRAFUEcm_qrcA",
         "types" : [ "street_address" ]
      },

  ... Additional results[] ...

請注意,反向地理編碼器返回了多個結果。"formatted_address" 的結果不只有郵政地址,還包括對某個位置的任何地理命名方式。例如,對芝加哥市的某個點進行地理編碼時,地理編碼的點能夠表示爲街道地址、城市(芝加哥)、所在州(伊利諾伊州)或國家/地區(美國)。全部這些都是地理編碼器的「地址」。反向地理編碼器返回這些類型中的任何一種做爲有效結果。

反向地理編碼器會匹配政治實體(國家/地區、省、市和街區)、街道地址及郵政編碼。

由之前的查詢返回的 formatted_address 值的完整列表以下所示。

"formatted_address" : "277 Bedford Avenue, Brooklyn, NY 11211, USA",
"formatted_address" : "Grand St/Bedford Av, Brooklyn, NY 11211, USA",
"formatted_address" : "Grand St/Bedford Av, Brooklyn, NY 11249, USA",
"formatted_address" : "Bedford Av/Grand St, Brooklyn, NY 11211, USA",
"formatted_address" : "Brooklyn, NY 11211, USA",
"formatted_address" : "Williamsburg, Brooklyn, NY, USA",
"formatted_address" : "Brooklyn, NY, USA",
"formatted_address" : "New York, NY, USA",
"formatted_address" : "New York, USA",
"formatted_address" : "United States",

一般,返回的地址按精確度從最具體到最不具體的順序排列;正如本例中所示,最準確的地址在結果中擺在最突出的位置。請注意,咱們會返回不一樣類型的地址,從最具體的街道地址到不那麼具體的政治實體,如街區、市、縣、州等。

地點 ID 的反向地理編碼

如下查詢包含了布魯克林某個位置的地點 ID:

https://maps.googleapis.com/maps/api/geocode/json?place_id=ChIJd8BlQ2BZwokRAFUEcm_qrcA&key=YOUR_API_KEY

接口返回值就很少羅列了,都差很少。

受類型限制的反向地理編碼

如下示例將返回的地址限制爲位置類型是 ROOFTOP 且地址類型是 street_address 的地址。

https://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&location_type=ROOFTOP&result_type=street_address&key=YOUR_API_KEY

反向地理編碼響應

反向地理編碼響應的格式與地理編碼響應相同。請參閱地理編碼響應。下面是反向地理編碼響應中可能出現的狀態代碼。
地理編碼響應對象中的 "status" 字段包含了請求的狀態,還可能包含調試信息,以幫助您查明反向地理編碼不工做的緣由。"status" 字段能夠包含如下值:

"OK" 表示未出現任何錯誤,而且至少返回了一個地址。
"ZERO_RESULTS" 表示反向地理編碼成功,但未返回任何結果。若是向地理編碼器傳遞了某個偏遠位置的 latlng 參數,就可能會發生這種狀況。
"OVER_QUERY_LIMIT" 表示您已超出配額。
"REQUEST_DENIED" 表示系統已拒絕該請求。這多是由於該請求包含了 result_type 或 location_type 參數,但未包含 API 密鑰或客戶端 ID。
"INVALID_REQUEST" 一般表示下列狀況之一:
缺乏查詢(address、components 或 latlng)。
提供的 result_type 或 location_type 無效。
"UNKNOWN_ERROR" 表示因爲服務器發生錯誤,所以沒法處理該請求。若是您重試一次,請求可能會成功

sensor 參數

Google Maps API 以前要求您將 sensor 參數包括在內,以指示您的應用是否使用傳感器來肯定用戶的位置。但該參數如今再也不是必填項。

相關文章
相關標籤/搜索