Оптимизация использования квоты при геокодировании

Геокодирование – это процесс преобразования адресов (например, "1600 Amphitheatre Parkway, Mountain View, CA") в географические координаты (37.423021, -122.083739), которые можно использовать для размещения маркеров или позиционирования карты. API платформы Google Карт предлагают два подхода к геокодированию:

  • Клиентское геокодирование, которое выполняется в браузере, как правило, в ответ на действия пользователя. В 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 и других языков.

Квоты и расходы

Стратегии, описанные в этом документе, основаны на стоимости геокодирования, квотах и ограничении частоты запросов.

Стоимость

Лимиты на количество запросов геокодирования в день больше не действуют. Вместо этого каждый запрос геокодирования, будь то клиентский запрос через браузер или серверный запрос через веб-сервис Geocoding API, оплачивается поштучно. Чтобы контролировать расходы, вы можете ограничить дневную квоту.

Ограничение частоты запросов

Частота запросов к сервису геокодирования ограничена 3000 запросов в минуту. Это ограничение распространяется на все запросы,как на стороне клиента, так и на стороне сервера.

При выполнении клиентских запросов геокодирования через определенные промежутки времени, например в мобильном приложении, ваши запросы могут возвращать ошибки, если все пользователи отправляют запросы одновременно (например, в одну и ту же секунду каждой минуты). Чтобы избежать такой ситуации, рекомендуем:

Кеширование

Ознакомьтесь с правилами использования Geocoding API в отношении кеширования.

Когда использовать геокодирование на стороне клиента?

Ответ на этот вопрос почти всегда положительный. Причины:

  • Клиентские запросы и ответы обеспечивают более быстрое и интерактивное взаимодействие с пользователями.
  • Клиентский запрос может содержать информацию, которая повышает качество геокодирования: язык пользователя, регион и область просмотра.

В частности, клиентское геокодирование лучше всего подходит для геокодирования адресов на основе данных, введенных пользователем.

Существует две базовых архитектуры геокодирования на стороне клиента:

  • Геокодирование и отображение результатов выполняются полностью в браузере. Например, пользователь вводит адрес на вашей странице. Ваше приложение геокодирует его. Затем страница использует геокод, чтобы создать маркер на карте. Или ваше приложение выполняет простой анализ с использованием геокода. Данные на ваш сервер не отправляются, Это снижает нагрузку на сервер.
  • Геокодирование в браузере с последующей отправкой данных на сервер. Например, пользователь ввел адрес на странице. Ваше приложение геокодирует его в браузере. Затем приложение отправляет данные на ваш сервер. Сервер отвечает, отправляя некоторые данные, например информацию о достопримечательностях поблизости. Это позволяет настраивать ответ на основе собственных данных.

Когда использовать геокодирование на стороне сервера?

Геокодирование на стороне сервера лучше всего подходит для приложений, в которых нужно геокодировать адреса без ввода данных клиентом. Распространенный пример – когда набор данных поступает независимо от действий пользователя, например если у вас есть фиксированный, конечный и известный набор адресов, которые нужно геокодировать. Серверное геокодирование также может быть полезно в качестве резервного варианта, когда клиентское геокодирование не работает.

Возможные проблемы: увеличение задержки для пользователя и более низкое качество результатов геокодирования по сравнению с клиентской стороной, поскольку в запросе доступно меньше информации.