在地理編碼時最佳化配額用量

地理編碼是指將地址 (「1600 Amphitheatre Parkway, Mountain View, CA」) 轉換成地理座標 (37.423021, -122.083739) 的程序,您可以透過這種方式來放置標記或設定地圖位置。Google 地圖平台 API 提供兩種地理編碼方法:

  • 用戶端地理編碼,在瀏覽器中執行,通常是為了回應使用者動作。Maps JavaScript API 提供的類別可為您發出要求。如需此方法的說明,請參閱 Maps JavaScript API 說明文件
  • HTTP 伺服器端地理編碼:可讓伺服器直接查詢 Google 伺服器進行地理編碼。Geocoding API 是提供這項功能的網路服務。一般而言,您必須將這項服務與在伺服器端執行的其他程式碼整合。如需伺服器端地理編碼的說明,請參閱 Geocoding API 說明文件

用戶端和伺服器端地理編碼範例

以下的用戶端地理編碼範例可以接收地址、進行地理編碼、將地圖的中心移至該位置,並在其中加入地圖標記:

geocoder = new google.maps.Geocoder();
geocoder.geocode({ 'address': address }, function(results, status) {
  if (status == google.maps.GeocoderStatus.OK) {
    map.setCenter(results[0].geometry.location);
    var marker = new google.maps.Marker({
      map: map,
      position: results[0].geometry.location
    });
  }
});

如需更多範例,請參閱 Maps JavaScript API 說明文件

以下舉例說明如何使用 Python 執行伺服器端地理編碼要求:

import urllib2

address="1600+Amphitheatre+Parkway,+Mountain+View,+CA"
key="my-key-here"
url="https://maps.googleapis.com/maps/api/geocode/json?address=%s&key=%s" % (address, key)

response = urllib2.urlopen(url)

jsongeocode = response.read()

這會產生具有下列內容的 JSON 物件:

{
  "status": "OK",
  "results": [ {
    "types": street_address,
    "formatted_address": "1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA",
    "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": "San Jose",
      "short_name": "San Jose",
      "types": [ "administrative_area_level_3", "political" ]
    }, {
      "long_name": "Santa Clara",
      "short_name": "Santa Clara",
      "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
    } ],
    "geometry": {
      "location": {
        "lat": 37.4220323,
        "lng": -122.0845109
      },
      "location_type": "ROOFTOP",
      "viewport": {
        "southwest": {
          "lat": 37.4188847,
          "lng": -122.0876585
        },
        "northeast": {
          "lat": 37.4251799,
          "lng": -122.0813633
        }
      }
    }
  } ]
}

伺服器端地理編碼器也提供 XML 格式做為 JSON 的替代選項。如需更多範例,請參閱 Geocoding API 說明文件以及 Python 和其他語言適用的用戶端程式庫

配額和費用注意事項

地理編碼費用、配額和頻率限制會影響本文所述的策略。

費用

地理編碼要求 將不再使用每日配額 (QPD) 限制。換句話說,不論是用戶端透過瀏覽器,還是在伺服器端透過 Geocoding API 網路服務,每個地理編碼要求都會按每則價格計費。如要管理使用成本,建議您設定每日配額上限

頻率限制

地理編碼服務的處理速率上限為 3,000 QPM (每分鐘查詢),計算為用戶端和伺服器端查詢的總和。

定期執行用戶端地理編碼要求時 (例如在行動應用程式中),如果所有使用者同時發出要求 (例如每分每秒一秒) 發出要求,要求可能會傳回錯誤。如要避免這種情況,請考慮採用下列其中一種做法:

  • 在要求中加入隨機間隔 (時基誤差)。請確保要求隨機套用至整個使用者族群。
  • 如果是開發 Android 應用程式,請使用不精確的重複鬧鐘
  • 如要針對 Android 進行開發,請選取適當的位置策略

快取

如需快取的相關資訊,請參閱 Geocoding API 政策

使用用戶端地理編碼的時機

簡單來說,答案是「大多數情況下都會」。原因如下:

  • 用戶端要求和回應可讓使用者享有更快速、更具互動性的體驗。
  • 用戶端要求可包含可改善地理編碼品質的資訊,例如使用者語言、區域和可視區域。

尤其,根據使用者輸入內容進行地址地理編碼時,用戶端地理編碼最好。

用戶端地理編碼有以下兩種基本架構:

  • 完全在瀏覽器中進行地理編碼及顯示。例如,使用者在您的網頁上輸入地址。應用程式會進行地理編碼。接著,您的網頁會利用地理編碼在地圖上建立標記。或者,您的應用程式會使用地理編碼進行簡單的分析。系統不會傳送任何資料給您的伺服器。 這麼做可以降低伺服器的負載。
  • 在瀏覽器中進行地理編碼,然後傳送至伺服器。例如,使用者在您的網頁上輸入地址。應用程式會在瀏覽器中進行地理編碼。然後,應用程式會將資料傳送至您的伺服器。伺服器會回應一些資料,例如附近的搜尋點。這樣一來,您就能根據自己的資料自訂回應。

使用伺服器端地理編碼的時機

伺服器端地理編碼最適合需要在用戶端輸入的情況下,不必輸入地址進行地址地理編碼的應用程式。最常見的例子就是,您取得的資料集獨立於使用者輸入內容之外,例如有一組固定、有限且需要地理編碼的地址。當用戶端地理編碼失敗時,伺服器端地理編碼也可以做為備用選項。

有些疑慮是使用者的不必要的延遲時間增加,而地理編碼結果的品質也會低於用戶端,因為要求中的資訊越少。