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

地理編碼是指將地址 (「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 格式做為替代方案。如需更多範例,請參閱 Geocoding API 說明文件,以及 Python 和其他語言的 用戶端程式庫

配額和費用注意事項

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

費用

每日地理編碼的配額 (QPD) 限制已不再使用。因此,每個地理編碼要求 (無論是透過瀏覽器或 Geocoding API 網路服務的伺服器端) 都會依價格計費。如要管理使用費,請考慮限制每日配額

頻率限制

地理編碼服務的頻率上限為 50 QPS (每秒查詢次數),計算方式為用戶端和伺服器端查詢次數的總和。

每隔固定的時間 (例如在行動應用程式中) 執行用戶端地理編碼要求時,如果所有使用者都同時送出要求 (例如每分鐘的同一秒),系統就會傳回錯誤。如要避免這種情況,請考慮下列其中一種做法:

  • 針對要求加入隨機間隔 (時基誤差)。確保要求能隨機套用至整個使用者群。
  • 針對 Android 進行開發作業,請使用未完成的重複鬧鐘
  • 針對 Android 進行開發作業,請選取適當的位置策略

快取

請參閱 Geocoding API 政策瞭解快取。

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

簡單來說,「幾乎」都是肯定的。原因如下:

  • 用戶端要求和回應可為使用者提供更快速、互動式的體驗。
  • 用戶端要求中可以加入改善地理編碼品質的資訊:使用者語言、區域和可視區域。

特別是,根據使用者輸入的地理編碼地址時,用戶端地理編碼功能是最佳選擇。

用戶端地理編碼有兩個基本架構:

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

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

伺服器端地理編碼最適合需要自行在無用戶端輸入地址進行地理編碼的應用程式使用。常見的例子是,如果您取得的資料集各自獨立於使用者輸入內容中,例如您有一個固定、有限且已知的地址,需要進行地理編碼,在用戶端地理編碼失敗時,伺服器端地理編碼也相當實用。

有些潛在的疑慮是使用者的延遲時間增加,且地理編碼結果的精確度會比用戶端低,因為要求中提供的資訊較少。