В версии 4 API геокодирования представлено несколько новых методов, заменяющих функциональность версии 3 API. В этом руководстве показано, как перевести ваше приложение на использование новых методов версии 4.
Вы можете использовать свои существующие ключи API с новыми методами версии 4. Однако, если вы запрашивали увеличение квоты для API версии 3, вам необходимо запросить увеличение квоты и для новых API версии 4.
Переход с v3 Forward Geocoding
Если вы используете геокодирование версии 3 для определения местоположения адресов, вам следует перейти на метод геокодирования адреса версии 4, который принимает GET-запрос.
В версии 4 API изменены названия, структура и поддержка ряда параметров. Мы настоятельно рекомендуем использовать маску поля для указания полей, которые вы хотите получить в ответе.
Запрос на изменение параметров
| Параметр v3 | Параметр v4 | Примечания |
|---|---|---|
address , components | address | Теперь в пути URL передается неструктурированный адрес ( address v3). Компоненты структурированного адреса ( components v3) можно передавать в качестве параметров запроса address.* . См. раздел «Воспроизведение фильтров компонентов v3» . |
bounds | locationBias.rectangle | Переименовано; структура изменена на объект. |
language | languageCode | Переименовано. |
region | regionCode | Переименовано. |
extra_computations | Удаленный | Заменено методом SearchDestinations . |
Изменения в поле ответа
| поле v3 | поле v4 | Примечания |
|---|---|---|
status , error_message | Удаленный | В версии v4 используются коды состояния HTTP и тела ошибок . |
results.address_components.long_name / results.address_components.short_name | results.addressComponents.longText / results.addressComponents.shortText | Переименовано. |
results.geometry.location_type | results.granularity | Переименовано. |
results.geometry.location | results.location | Названия полей: lat / lng -> latitude / longitude . |
results.geometry.viewport | results.viewport | Названия полей: northeast / southwest -> high / low . |
results.postcode_localities | results.postalCodeLocalities | Переименовано. Теперь возвращается для одного или нескольких населенных пунктов (требуется v3 >1). |
results.partial_match | Удаленный | |
| Новый | results.addressComponents.languageCode | Язык конкретного компонента адреса. |
| Новый | results.bounds | Явные границы с использованием high / low . |
| Новый | results.place | Название ресурса для данного места. |
| Новый | results.postalAddress | Структурированный объект PostalAddress . |
Воспроизвести фильтры компонентов версии 3
В версии 3 функции геокодирования (Forward Geocoding v3) был добавлен параметр components , позволяющий жестко фильтровать результаты по определенным компонентам (например, components=country:US ). В версии 4 функция Forward Geocoding не поддерживает подобную жесткую фильтрацию в параметрах запроса. В версии 4 вы можете предоставлять информацию об адресе либо в виде одной неструктурированной строки в пути, либо в виде структурированных параметров запроса, таких как address.addressLines , address.locality , address.administrativeArea , address.postalCode и address.regionCode . Структурированные параметры не действуют как жесткие фильтры. Вместо этого все предоставленные компоненты объединяются для формирования полного адреса, который API попытается геокодировать. API ищет наилучшее совпадение для всего указанного адреса по всем компонентам. Предоставление компонентов в структурированном виде может помочь API лучше понять намерение, особенно когда информация об адресе собирается из отдельных полей формы. Это может помочь API в обработке незначительных опечаток или неоднозначностей в каждом компоненте, поскольку тип информации в каждом поле понятен.
Для достижения поведения, аналогичного жесткой фильтрации компонентов в версии 3, необходимо реализовать фильтрацию на стороне клиента для массива results , возвращаемого API версии 4, на основе объектов postalAddress и addressComponents в ответе.
В следующей таблице показано наилучшее соответствие между фильтрами components версии 3 и полями postalAddress версии 4:
| фильтр компонентов v3 | поле ответа v4 |
|---|---|
country | postalAddress.regionCode |
postal_code | postalAddress.postalCode |
administrative_area | postalAddress.administrativeArea или addressComponents |
Примеры фильтрации на стороне клиента
Следующие примеры показывают, как фильтровать результаты для достижения поведения, аналогичного фильтрации компонента v3, для поддерживаемых полей: страна, административный район и почтовый индекс. Фильтрация по другим полям не рекомендуется, поскольку надежных критериев фильтрации не существует.
Фильтр по стране
Сопоставьте address.regionCode из вашего запроса с postalAddress.regionCode в каждом результате. Обратите внимание, что хотя API принимает коды регионов в нижнем регистре в запросе, он всегда возвращает их в верхнем регистре в ответе, поэтому перед сравнением необходимо преобразовать входные данные в верхний регистр.
Пример кода на Python
def filter_by_country(results, region_code): return [ res for res in results if res.get('postalAddress', {}).get('regionCode') == region_code.upper() ] # Example usage: # v4_response = ... # API call response # filtered = filter_by_country(v4_response.get('results', []), 'US')
Пример кода Node.js
function filterByCountry(results, regionCode) { return results.filter(res => res.postalAddress?.regionCode === regionCode.toUpperCase()); } // Example usage: // const v4Response = ... # API call response // const filtered = filterByCountry(v4Response.results, 'US');
Фильтр по административному району
Сопоставьте address.administrativeArea из вашего запроса с postalAddress.administrativeArea в каждом результате. Аналогично кодам стран, перед сравнением следует преобразовать входные данные в верхний регистр. Это надежно только в том случае, если administrativeArea в вашем запросе указана со стандартным двухбуквенным сокращением. postalAddress.administrativeArea в ответе может не совпадать напрямую с суффиксами кода ISO 3166-2 по нескольким причинам. Во-первых, в некоторых регионах подразделение, соответствующее коду ISO 3166-2, не является частью стандартного представления почтовых адресов. Например, в Испании административный район уровня 1 (например, «CN» для Канарских островов) может присутствовать в addressComponents , но postalAddress.administrativeArea может содержать район уровня 2 (например, «Санта-Крус-де-Тенерифе»). Во-вторых, в некоторых районах аббревиатура подразделения используется нечасто, и в postalAddress.administrativeArea она представлена более длинным именем (по аналогичным причинам addressComponents.shortText для компонента адреса, соответствующего подразделению, может не соответствовать суффиксу кода подразделения ISO 3166-2). Кроме того, в некоторых случаях подразделение может быть представлено в компоненте адреса для administrative_area_level_n со значением n больше 1. Для получения наиболее полных результатов следует проверить совпадение как в postalAddress.administrativeArea , так и в любых addressComponents с типом administrative_area_level_n (например, administrative_area_level_1 ).
Пример кода на Python
def filter_by_admin_area(results, admin_area): target = admin_area.upper() filtered = [] for res in results: # Check postalAddress pa_aa = res.get('postalAddress', {}).get('administrativeArea', '') if pa_aa == target: filtered.append(res) continue # Check all administrative area levels in addressComponents for comp in res.get('addressComponents', []): is_admin_level = any(t.startswith('administrative_area_level_') for t in comp.get('types', [])) if is_admin_level: short = comp.get('shortText', '') if short == target: filtered.append(res) break return filtered # Example usage: # filtered = filter_by_admin_area(v4_response.get('results', []), 'CA')
Пример кода Node.js
function filterByAdminArea(results, adminArea) { const target = adminArea.toUpperCase(); return results.filter(res => { // Check postalAddress.administrativeArea if (res.postalAddress?.administrativeArea === target) { return true; } // Check addressComponents for any administrative area level return res.addressComponents?.some(c => { const isAdmin = c.types?.some(t => t.startsWith('administrative_area_level_')); return isAdmin && c.shortText === target; }); }); } // Example usage: // const filtered = filterByAdminArea(v4Response.results, 'CA');
Фильтр по почтовому индексу
Сопоставьте address.postalCode из вашего запроса с postalAddress.postalCode индексом в каждом результате. Перед сравнением необходимо нормализовать как входные, так и результирующие почтовые индексы. Логика нормализации сильно зависит от региона. Простой подход включает удаление пробелов и дефисов и преобразование в единый регистр.
Для обработки префиксов почтовых индексов (например, «L2» в Великобритании) или суффиксов (например, «+4» в почтовых индексах США) может потребоваться более сложная нормализация. Конкретная необходимая логика нормализации будет варьироваться в зависимости от страны и форматов используемых почтовых индексов. Возможно, вам потребуется адаптировать предоставленные функции нормализации или реализовать более сложную логику для целевых регионов.
Приведенный пример обрабатывает почтовые индексы США и позволяет сопоставлять данные по 5-значной базе, даже если указан или возвращен ZIP+4.
Пример кода на Python (с упором на почтовые индексы США)
import re def normalize_postal_code_us(pc): # Basic normalization for US: uppercase, alphanumeric only if not pc: return "" normalized = re.sub(r'[^A-Z0-9]', '', pc.upper()) # Return only the first 5 digits for US ZIP codes return normalized[:5] def filter_by_postal_code_us(results, postal_code): normalized_input = normalize_postal_code_us(postal_code) if not normalized_input: return [] filtered_results = [] for res in results: pa_pc = res.get('postalAddress', {}).get('postalCode', '') if normalize_postal_code_us(pa_pc) == normalized_input: filtered_results.append(res) return filtered_results # Example usage: # Matches '94043', '94043-1351', '940431351' # filtered = filter_by_postal_code_us(v4_response.get('results', []), '94043') # filtered = filter_by_postal_code_us(v4_response.get('results', []), '94043-1234')
Пример кода Node.js (с упором на почтовые индексы США)
function normalizePostalCodeUs(pc) { // Basic normalization for US: uppercase, alphanumeric only const normalized = (pc || '').toUpperCase().replace(/[^A-Z0-9]/g, ''); // Return only the first 5 digits for US ZIP codes return normalized.substring(0, 5); } function filterByPostalCodeUs(results, postalCode) { const normalizedInput = normalizePostalCodeUs(postalCode); if (!normalizedInput) { return []; } return results.filter(res => { const paPc = res.postalAddress?.postalCode || ''; return normalizePostalCodeUs(paPc) === normalizedInput; }); } // Example usage: // Matches '94043', '94043-1351', '940431351' // const filtered = filterByPostalCodeUs(v4Response.results, '94043'); // const filtered = filterByPostalCodeUs(v4Response.results, '94043-1234');
Переход с версии 3 обратного геокодирования
Если вы используете функцию обратного геокодирования версии 3 для преобразования координат в адреса, вам следует перейти на метод обратного геокодирования местоположения версии 4, который принимает GET-запрос.
В версии 4 API изменены названия, структура и поддержка ряда параметров. Мы настоятельно рекомендуем использовать маску поля для указания полей, которые вы хотите получить в ответе.
Запрос на изменение параметров
| Параметр v3 | Параметр v4 | Примечания |
|---|---|---|
language | languageCode | Переименовано. |
region | regionCode | Переименовано. |
result_type | types | Переименовано; используются повторяющиеся параметры запроса. |
location_type | granularity | Переименовано; используются повторяющиеся параметры запроса. |
extra_computations | Удаленный | Заменено методом SearchDestinations . |
Изменения в поле ответа
| поле v3 | поле v4 | Примечания |
|---|---|---|
status , error_message | Удаленный | В версии v4 используются коды состояния HTTP и тела ошибок . |
results.address_components.long_name / results.address_components.short_name | results.addressComponents.longText / results.addressComponents.shortText | Переименовано. |
results.geometry.location_type | results.granularity | Переименовано. |
results.geometry.location | results.location | Названия полей: lat / lng -> latitude / longitude . |
results.geometry.viewport | results.viewport | Названия полей: northeast / southwest -> high / low . |
| Новый | results.addressComponents.languageCode | Язык конкретного компонента адреса. |
| Новый | results.bounds | Явные границы с использованием high / low . |
| Новый | results.place | Название ресурса для данного места. |
| Новый | results.postalAddress | Структурированный объект PostalAddress . |
Переход с дескрипторов адресов версии 3
Если вы используете address_descriptor для получения дополнительной информации о местоположении с помощью Geocoding v3, вам необходимо перейти на использование поля landmarks объекта SearchDestinationsResponse .
Перенос с версии 3. Размещение геокодирования.
Если вы используете place_id для получения адреса для конкретного идентификатора места с помощью Geocoding v3, вам необходимо перейти на метод геокодирования мест v4, который принимает GET-запрос.
В версии 4 API изменены названия, структура и поддержка ряда параметров. Мы настоятельно рекомендуем использовать маску поля для указания полей, которые вы хотите получить в ответе.
Запрос на изменение параметров
| Параметр v3 | Параметр v4 | Примечания |
|---|---|---|
place_id | place поле в протокол запроса | Идентификатор места теперь передается в качестве параметра пути places/{place} , например: https://geocode.googleapis.com/v4/geocode/places/ChIJj61dQgK6j4AR4GeTYWZsKWw . Это соответствует полю place в базовом запросе. |
language | languageCode | Переименовано. |
region | regionCode | Переименовано. |
Изменения в поле ответа
| поле v3 | поле v4 | Примечания |
|---|---|---|
status , error_message | Удаленный | В версии v4 используются коды состояния HTTP и тела ошибок . |
results | (корень) | Версия v4 возвращает один объект результата, а не массив results . |
results.address_components.long_name / results.address_components.short_name | addressComponents.longText / addressComponents.shortText | Переименовано. |
results.geometry.location_type | granularity | Переименовано. |
results.geometry.location | location | Названия полей: lat / lng -> latitude / longitude . |
results.geometry.viewport | viewport | Названия полей: northeast / southwest -> high / low . |
results.postcode_localities | postalCodeLocalities | Переименовано. Теперь возвращается для одного или нескольких населенных пунктов (требуется v3 >1). |
| Новый | addressComponents.languageCode | Язык конкретного компонента адреса. |
| Новый | bounds | Явные границы с использованием high / low . |
| Новый | place | Название ресурса для данного места. |
| Новый | postalAddress | Структурированный объект PostalAddress . |
Переход от геокодирования гиперлокальных данных к геолокационным данным о местоположении.
Следующие функции API геокодирования версии 3 заменяются методом SearchDestinations API геокодирования версии 4:
- Входы
- Навигационные точки
- Контуры здания
- Территория
Если вы использовали API геокодирования версии 3 для получения указанных выше объектов, воспользуйтесь этим документом, чтобы перейти к использованию метода SearchDestinations . В этом документе объясняется, где в ответе метода SearchDestinations можно найти эти объекты, а также описываются различия в представлении этих объектов в ответах API между API геокодирования версии 3 и методом SearchDestinations API геокодирования версии 4.
Входы
Чтобы получить список входов, связанных с destination , используйте поле destination.entrances .
Обратите внимание, что формат entrance немного отличается от формата входа в API геокодирования версии 3. Каждый вход в destination.entrances имеет следующие поля:
-
displayName— это новое необязательное поле, в котором будет отображаться удобочитаемое название входа, например, «Ворота B». -
location— это местоположение типаLatLng, которое отличается от формата, используемого в API геокодирования версии 3. -
tags— это то же самое, что и полеtagsвходов из API геокодирования версии 3. -
place— аналогично полюbuildingPlaceIdвходов в API геокодирования версии 3. Однако идентификатор места в этом поле может относиться к любому типу места, а не обязательно только к зданию.
Навигационные точки
Чтобы получить точки навигации, связанные с destination , используйте поле destination.navigationPoints .
Обратите внимание, что формат navigationPoint немного отличается от формата точек навигации в Geocoding API v3 . Каждая точка навигации в destination.navigationPoints имеет следующие поля:
-
displayName— это новое необязательное поле, которое будет содержать удобочитаемое имя для точки навигации, например, "5th Ave". -
location— это местоположение типаLatLng, которое отличается от формата, используемого в API геокодирования версии 3. -
travelModes— это поле аналогично полюrestrictedTravelModesв точках навигации из API геокодирования версии 3. Возможные значения перечисления те же, единственное отличие заключается в том, что теперь это поле представляет собой допустимые способы передвижения для точки навигации, а не запрещенные способы передвижения. -
usage— это новое поле, содержащее варианты использования, поддерживаемые точкой навигации. Обратите внимание, что для большинства точек навигации будет указано «ИспользованиеUNKNOWN, но это не обязательно означает, что использование точки навигации каким-либо образом ограничено.
Контуры здания
Чтобы получить контуры зданий, связанных с destination , следует использовать поле displayPolygon объектов placeView в destination , представляющих здания. Для каждого placeView можно проверить, является ли он зданием, с помощью поля placeView.structureType . Если тип структуры — BUILDING , то контур можно получить из поля placeView.displayPolygon . placeView также будет содержать дополнительные поля для здания, которых не было в API геокодирования версии 3.
Объект placeView в destination может представлять здание, отображая его в следующих полях:
-
destination.primary- это основное местоположение для пункта назначения. -
destination.containingPlaces— это повторяющееся поле, которое может содержать более крупные объекты, «содержащие» основное место. Например, если основное место являетсяsubpremise,containingPlacesобычно будет содержатьplaceView, представляющий здание. -
destination.subDestinations— это повторяющееся поле, которое может содержать подпункты основного места. Например, отдельные квартиры в здании. Обычно это поле не содержитplaceView, представляющего здание.
Обратите внимание, что формат placeView.displayPolygon соответствует формату контуров зданий в Geocoding API v3 , который представляет собой формат GeoJSON, использующий формат RFC 7946 .
Территория
Аналогично контурам зданий, чтобы получить информацию о территории, связанной с destination , следует использовать поле displayPolygon объектов placeView в destination , которые представляют собой территорию. Для каждого placeView можно проверить, является ли он территорией, с помощью поля placeView.structureType . Если тип структуры — GROUNDS , вы можете получить контур из поля placeView.displayPolygon . placeView также будет содержать дополнительные поля для территории, которых не было в API геокодирования версии 3.
destination placeView может представлять собой объект, содержащий информацию о территории, в следующих полях:
-
destination.primary -
destination.containingPlaces -
destination.subDestinations
Обратите внимание, что формат placeView.displayPolygon соответствует формату контура территории в Geocoding API v3 , который представляет собой формат GeoJSON, использующий формат RFC 7946 .
Точность результатов
В Geocoding API v3 поле location_type в геометрии ответа указывало на точность результатов, и некоторые клиенты ранжировали или фильтровали результаты на основе этих значений ( ROOFTOP , RANGE_INTERPOLATED , GEOMETRIC_CENTER и APPROXIMATE ). В стандартных миграциях Geocoding API v4 это поле переименовано в granularity .
В API Destinations (версия 4 SearchDestinations ) отсутствует поле location_type . Вместо этого пространственная информация обрабатывается иначе:
- Не требуется ручная фильтрация на стороне клиента : в то время как стандартное геокодирование предоставляет множество результатов с разной степенью детализации, метод
SearchDestinationsминимизирует неоднозначность, сводя результаты к одному оптимизированному пункту назначения, когда это возможно. Это избавляет клиентов от необходимости фильтровать данные по типу местоположения, чтобы определить, какой результат является наилучшим. - Пространственная информация представлена типом структуры и полигонами отображения : пространственная геометрия и структура обозначены следующим образом:
- Параметр
displayPolygon(для точной геометрии). - Поле
structureTypeв объектеplaceView.
- Параметр
- Сопоставление типов структур :
-
structureTypePOINT,BUILDINGилиSECTIONобычно соответствует тому, что ранее называлосьROOFTOP. -
structureTypeGROUNDSобычно соответствуетGEOMETRIC_CENTER.
-
Используйте маску поля для запроса этих функций.
Метод SearchDestinations требует указания маски поля, как поясняется в разделе «Выбор полей для возврата» . Маску поля можно установить на * для возврата всех полей или указать конкретные поля, которые вы хотите получить. Например, следующий API-запрос устанавливает маску поля для получения всех полей, необходимых для получения информации о входах, навигационных точках, контурах зданий и территории пункта назначения:
curl -X POST -d '{"place": "places/ChIJG3kh4hq6j4AR_XuFQnV0_t8"}' \
-H "X-Goog-Api-Key: API_KEY" \
-H "Content-Type: application/json" \
-H "X-Goog-FieldMask: destinations.entrances,destinations.navigationPoints,destinations.primary,destinations.containingPlaces,destinations.subDestinations" \
https://geocode.googleapis.com/v4/geocode/destinations
Вопросы безопасности
API геокодирования версии 4 разработан как API для взаимодействия между серверами. Для пользователей JavaScript нет прямого пути миграции с версии 3 на версию 4. Вызов методов версии 4 непосредственно из клиентского JavaScript (например, в браузере) с использованием ключа API подвергает ваш ключ API высокому риску кражи и неправомерного использования.
Ограничения HTTP Referer, хотя и полезны, не обеспечивают достаточной защиты для конечных точек веб-сервисов, поскольку злоумышленники могут легко их обойти, подделав заголовок Referer в своих запросах.
Рекомендуемый подход
Рекомендуемый способ использования API геокодирования v4 — с вашего собственного бэкэнд-сервера. Ваше клиентское приложение должно отправлять запросы на этот промежуточный сервер, который затем безопасно вызывает API Google, используя защищенный ключ API (например, ключ, хранящийся в переменной окружения или менеджере секретов). Это гарантирует, что ваш ключ API никогда не будет раскрыт во фронтенд-коде.
Альтернативные варианты для удовлетворения потребностей клиента.
Если ваши потребности на стороне клиента требуют геокодирования, рассмотрите возможность использования одного из существующих решений для клиентской части:
- Сервис геокодирования в JavaScript API карт: Сервис геокодирования продолжает использовать бэкэнд версии 3 и предназначен для использования в браузерной среде.
- Набор элементов пользовательского интерфейса «Места»: используйте набор элементов пользовательского интерфейса «Места », включая элементы автозаполнения , для элементов пользовательского интерфейса, связанных с адресами.