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

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

  • Геокодирование на стороне клиента , которое выполняется в браузере, как правило, в ответ на действия пользователя. API JavaScript Карт предоставляет классы, которые отправляют запросы за вас. Этот подход описан в документации Maps JavaScript API .
  • Геокодирование на стороне сервера HTTP , которое позволяет вашему серверу напрямую запрашивать геокоды у серверов Google. 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. Дополнительные примеры см. в документации API геокодирования и клиентских библиотеках для Python и других языков.

Вопросы квот и затрат

Затраты на геокодирование, квоты и ограничения скорости определяют стратегии, изложенные в этом документе.

Расходы

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

Ограничения ставок

Скорость службы геокодирования ограничена 3000 QPM (запросов в минуту), рассчитывается как сумма запросов на стороне клиента и на стороне сервера.

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

Кэширование

О кэшировании см. Политики API геокодирования .

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

Короткий ответ: «почти всегда». Причины:

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

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

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

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

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

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

Некоторые возможные проблемы — это ненужное увеличение задержки для пользователя и результаты геокодирования худшего качества, чем на стороне клиента, поскольку в запросе доступно меньше информации.