Tối ưu hoá việc sử dụng hạn mức khi mã hoá địa lý

Mã hoá địa lý là quá trình chuyển đổi địa chỉ ("1600 Amphitheatre Parkway, Mountain View, CA") thành toạ độ địa lý (37.423021, -122.083739) mà bạn có thể dùng để đặt điểm đánh dấu hoặc định vị bản đồ. Các API của Google Maps Platform cung cấp hai phương pháp mã hoá địa lý:

  • Mã hoá địa lý phía máy khách, được thực thi trong trình duyệt, thường là để phản hồi hành động của người dùng. Maps JavaScript API cung cấp các lớp đưa ra yêu cầu cho bạn. Phương pháp này được mô tả trong tài liệu về Maps JavaScript API.
  • Mã hoá địa lý phía máy chủ HTTP, cho phép máy chủ của bạn trực tiếp truy vấn máy chủ của Google để lấy mã địa lý. Geocoding API là dịch vụ web cung cấp chức năng này. Thông thường, bạn sẽ tích hợp dịch vụ này với mã khác đang chạy phía máy chủ. Tính năng mã hoá địa lý phía máy chủ được mô tả trong tài liệu về Geocoding API.

Ví dụ về mã hoá địa lý phía máy khách và phía máy chủ

Dưới đây là ví dụ về mã hoá địa lý phía máy khách, lấy một địa chỉ, mã hoá địa lý địa chỉ đó, di chuyển tâm của bản đồ đến vị trí đó và thêm điểm đánh dấu trên bản đồ tại đó:

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
    });
  }
});

Để xem thêm ví dụ, hãy tham khảo tài liệu về Maps JavaScript API.

Dưới đây là ví dụ về cách sử dụng Python để thực hiện yêu cầu mã hoá địa lý phía máy chủ trong Geocoding API phiên bản 4:

import json
import urllib.request

address = "1600+Amphitheatre+Parkway,+Mountain+View,+CA"
key = "my-key-here"
url = f"https://geocode.googleapis.com/v4/geocode/address/{address}"
headers = {"X-Goog-Api-Key": key}

req = urllib.request.Request(url, headers=headers)
with urllib.request.urlopen(req) as response:
    result = json.loads(response.read().decode("utf-8"))

Thao tác này sẽ tạo ra một đối tượng JSON có nội dung như sau:

{
  "results": [
    {
      "place": "places/ChIJiSSC8QK6j4AR98Thup8mqTc",
      "placeId": "ChIJiSSC8QK6j4AR98Thup8mqTc",
      "location": {
        "latitude": 37.4224864,
        "longitude": -122.0855962
      },
      "granularity": "ROOFTOP",
      "viewport": {
        "low": {
          "latitude": 37.4211700197085,
          "longitude": -122.08691558029149
        },
        "high": {
          "latitude": 37.4238679802915,
          "longitude": -122.08421761970851
        }
      },
      "bounds": {
        "low": {
          "latitude": 37.4221145,
          "longitude": -122.0860002
        },
        "high": {
          "latitude": 37.4228775,
          "longitude": -122.085133
        }
      },
      "formattedAddress": "Google Building 41, 1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA",
      "postalAddress": {
        "regionCode": "US",
        "languageCode": "en",
        "postalCode": "94043-1351",
        "administrativeArea": "CA",
        "locality": "Mountain View",
        "addressLines": [
          "1600 Amphitheatre Pkwy"
        ]
      },
      "addressComponents": [
        {
          "longText": "Google Building 41",
          "shortText": "Google Building 41",
          "types": [
            "premise"
          ],
          "languageCode": "en"
        },
        {
          "longText": "1600",
          "shortText": "1600",
          "types": [
            "street_number"
          ]
        },
        {
          "longText": "Amphitheatre Parkway",
          "shortText": "Amphitheatre Pkwy",
          "types": [
            "route"
          ],
          "languageCode": "en"
        },
        {
          "longText": "Mountain View",
          "shortText": "Mountain View",
          "types": [
            "locality",
            "political"
          ],
          "languageCode": "en"
        },
        {
          "longText": "Santa Clara County",
          "shortText": "Santa Clara County",
          "types": [
            "administrative_area_level_2",
            "political"
          ],
          "languageCode": "en"
        },
        {
          "longText": "California",
          "shortText": "CA",
          "types": [
            "administrative_area_level_1",
            "political"
          ],
          "languageCode": "en"
        },
        {
          "longText": "United States",
          "shortText": "US",
          "types": [
            "country",
            "political"
          ],
          "languageCode": "en"
        },
        {
          "longText": "94043",
          "shortText": "94043",
          "types": [
            "postal_code"
          ]
        },
        {
          "longText": "1351",
          "shortText": "1351",
          "types": [
            "postal_code_suffix"
          ]
        }
      ],
      "types": [
        "premise",
        "street_address"
      ]
    }
  ]
}

Để xem thêm ví dụ, hãy xem phần Tổng quan về Geocoding API phiên bản 4 và Hướng dẫn mã hoá địa lý cho địa chỉ.

Những điều cần cân nhắc về hạn mức và chi phí

Chi phí, hạn mức và giới hạn tốc độ mã hoá địa lý thúc đẩy các chiến lược được nêu trong tài liệu này.

Chi phí

Hạn mức mỗi ngày (QPD) không được áp dụng cho các yêu cầu mã hoá địa lý. Thay vào đó, mỗi yêu cầu mã hoá địa lý (cho dù là phía máy khách thông qua trình duyệt hay phía máy chủ thông qua dịch vụ web Geocoding API) đều được tính phí theo giá mỗi yêu cầu. Để quản lý chi phí sử dụng, hãy cân nhắc việc quản lý hạn mức sử dụng và hạn mức.

Giới hạn số lượng yêu cầu

Dịch vụ mã hoá địa lý có giới hạn tốc độ là 3.000 QPM (số truy vấn mỗi phút), được tính bằng tổng số truy vấn phía máy khách và phía máy chủ.

Khi chạy các yêu cầu mã hoá địa lý phía máy khách theo định kỳ, chẳng hạn như trong một ứng dụng di động, các yêu cầu của bạn có thể trả về lỗi nếu tất cả người dùng đều gửi yêu cầu cùng một lúc (ví dụ: tất cả đều gửi yêu cầu vào cùng một giây của mỗi phút). Để tránh tình trạng này, hãy cân nhắc một trong những cách sau:

  • Thêm khoảng thời gian ngẫu nhiên vào các yêu cầu (jitter). Đảm bảo các yêu cầu được phân phối ngẫu nhiên trên toàn bộ cơ sở người dùng của bạn.
  • Nếu bạn đang phát triển cho Android, hãy sử dụng chuông báo lặp lại không chính xác.
  • Nếu bạn đang phát triển cho Android, hãy chọn một chiến lược vị trí phù hợp.

Đang lưu vào bộ nhớ đệm

Xem Chính sách của Geocoding API về việc lưu vào bộ nhớ đệm.

Kiến trúc phía máy chủ so với kiến trúc phía máy khách trong phiên bản 4

Geocoding API phiên bản 4 (bao gồm SearchDestinations, GeocodeAddress, GeocodeLocation và GeocodePlace) được thiết kế dưới dạng API giữa máy chủ với máy chủ. Việc gọi các điểm cuối phiên bản 4 từ máy chủ phụ trợ mang lại những lợi ích quan trọng sau:

  • Thông tin đến theo từng khu vực cụ thể: Phương thức SearchDestinations (POST /v4/geocode/destinations) chỉ được cung cấp thông qua các yêu cầu REST hoặc gRPC phía máy chủ và trả về lối vào toà nhà, điểm đi theo tuyến đường, đường viền toà nhà và địa danh lân cận không có trong bộ mã hoá địa lý của trình duyệt phía máy khách.
  • Tăng cường bảo mật API: Các lệnh gọi phía máy chủ giúp bảo vệ khoá API và mã thông báo OAuth của bạn khỏi bị lộ trong trình duyệt của ứng dụng. Xem phần Bảo mật API.
  • Mặt nạ trường phản hồi: Điểm cuối phiên bản 4 phía máy chủ hỗ trợ mặt nạ trường, cho phép bạn chỉ yêu cầu những trường mà ứng dụng cần để giảm thiểu kích thước tải trọng và độ trễ.

Trường hợp nên sử dụng tính năng tra cứu trình duyệt phía máy khách

Đối với các ứng dụng trình duyệt tương tác phản hồi thao tác gõ phím trực tiếp, hãy cân nhắc kết hợp tính năng Tự động hoàn thành địa điểm phía máy khách (để phân biệt thông tin đầu vào của người dùng và lấy Mã địa điểm) với lệnh gọi phụ trợ đến SearchDestinations hoặc GeocodePlace để truy xuất thông tin chi tiết hoặc toạ độ theo từng khu vực cụ thể một cách an toàn.