Геокодирование – это процесс преобразования адресов (например, "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 запросов в минуту. Это ограничение распространяется на все запросы,как на стороне клиента, так и на стороне сервера.
При выполнении клиентских запросов геокодирования через определенные промежутки времени, например в мобильном приложении, ваши запросы могут возвращать ошибки, если все пользователи отправляют запросы одновременно (например, в одну и ту же секунду каждой минуты). Чтобы избежать такой ситуации, рекомендуем:
- Ввести произвольные интервалы запросов (дрожание). Убедитесь, что запросы случайны для всей пользовательской базы.
- Если вы разрабатываете приложение для Android, используйте неточное повторяющееся оповещение.
- Если вы разрабатываете приложение для Android, выберите подходящую стратегию определения местоположения.
Кеширование
Ознакомьтесь с правилами использования Geocoding API в отношении кеширования.
Когда использовать геокодирование на стороне клиента?
Ответ на этот вопрос почти всегда положительный. Причины:
- Клиентские запросы и ответы обеспечивают более быстрое и интерактивное взаимодействие с пользователями.
- Клиентский запрос может содержать информацию, которая повышает качество геокодирования: язык пользователя, регион и область просмотра.
В частности, клиентское геокодирование лучше всего подходит для геокодирования адресов на основе данных, введенных пользователем.
Существует две базовых архитектуры геокодирования на стороне клиента:
- Геокодирование и отображение результатов выполняются полностью в браузере. Например, пользователь вводит адрес на вашей странице. Ваше приложение геокодирует его. Затем страница использует геокод, чтобы создать маркер на карте. Или ваше приложение выполняет простой анализ с использованием геокода. Данные на ваш сервер не отправляются, Это снижает нагрузку на сервер.
- Геокодирование в браузере с последующей отправкой данных на сервер. Например, пользователь ввел адрес на странице. Ваше приложение геокодирует его в браузере. Затем приложение отправляет данные на ваш сервер. Сервер отвечает, отправляя некоторые данные, например информацию о достопримечательностях поблизости. Это позволяет настраивать ответ на основе собственных данных.
Когда использовать геокодирование на стороне сервера?
Геокодирование на стороне сервера лучше всего подходит для приложений, в которых нужно геокодировать адреса без ввода данных клиентом. Распространенный пример – когда набор данных поступает независимо от действий пользователя, например если у вас есть фиксированный, конечный и известный набор адресов, которые нужно геокодировать. Серверное геокодирование также может быть полезно в качестве резервного варианта, когда клиентское геокодирование не работает.
Возможные проблемы: увеличение задержки для пользователя и более низкое качество результатов геокодирования по сравнению с клиентской стороной, поскольку в запросе доступно меньше информации.