Ограничение по типам мест

Работа с местами в Google через Google Maps JavaScript API и библиотеку Places неизбежно связана с фильтрацией результатов по типам объектов. Типизация мест определяет, какие категории точек интереса возвращаются при поиске, автодополнении и запросах к сервису мест.

Система типов мест и её назначение

Каждое место в экосистеме Google Maps относится к одной или нескольким категориям. Эти категории называются place types и описывают функциональную или географическую сущность объекта:

  • restaurant
  • cafe
  • hospital
  • school
  • lodging
  • store
  • tourist_attraction
  • park
  • airport
  • train_station

Типы используются для:

  • ограничения результатов поиска;
  • повышения релевантности выдачи;
  • структурирования данных Places API;
  • оптимизации автодополнения.

Типизация работает как фильтр верхнего уровня: сервис сначала находит кандидатов, затем применяет ограничения по типам.


Ограничения типов в различных сервисах Places

Nearby Search (поиск поблизости)

Метод nearbySearch в PlacesService позволяет ограничивать выдачу по типам через параметр type.

const service = new google.maps.places.PlacesService(map);

service.nearbySearch(
  {
    location: { lat: 51.1694, lng: 71.4491 },
    radius: 1500,
    type: "restaurant"
  },
  callback
);

Особенности ограничений:

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

Пример поведения: при type: "restaurant" могут возвращаться также заведения с подтипами вроде meal_takeaway или food, если они классифицированы системой как релевантные.


Text Search (текстовый поиск)

Метод textSearch использует параметр type как мягкий фильтр:

service.textSearch(
  {
    query: "coffee",
    type: "cafe"
  },
  callback
);

Ограничения:

  • тип не является строгим фильтром;
  • запрос может вернуть результаты вне указанной категории, если текстовая релевантность выше;
  • используется совместно с текстом запроса, а не вместо него.

Таким образом, тип здесь работает как приоритет сортировки, а не жёсткое ограничение.


Autocomplete (автодополнение)

Autocomplete в Places Library использует параметр types, который ограничивает список предложений:

const autocomplete = new google.maps.places.Autocomplete(input, {
  types: ["establishment"]
});

Основные ограничения:

  • допускается массив типов, но с ограниченной семантикой;

  • часто используется только один из режимов:

    • geocode
    • address
    • establishment
    • (regions)
    • (cities)
  • точечные типы (например, restaurant) в автодополнении работают не всегда напрямую и часто заменяются общим establishment.

Особенность заключается в том, что Autocomplete работает не с финальными объектами, а с предсказаниями, поэтому фильтрация типов носит статистический характер.


Иерархия и пересечения типов

Типы мест в системе Google Maps не являются строго иерархическими деревьями, но имеют перекрывающиеся категории.

Например:

  • restaurantfood_and_drink
  • cafefood_and_drink
  • tourist_attraction может пересекаться с museum
  • store может включать подтипы book_store, clothing_store

Из-за этого ограничения типов работают не как жёсткая фильтрация, а как семантическое сужение пространства поиска.


Поддерживаемые и неподдерживаемые типы

Не все типы доступны во всех методах API.

Типичные ограничения:

  • Autocomplete поддерживает ограниченный набор обобщённых типов;
  • Nearby Search поддерживает более конкретные категории;
  • Text Search работает с наименьшей строгостью;
  • Place Details не фильтрует типы, а возвращает уже известный набор данных.

Примеры несовместимости:

  • train_station может не работать в Autocomplete;
  • administrative_area_level_3 используется только в геокодировании;
  • некоторые специализированные типы доступны только в обновлённых версиях Places API.

Множественные типы и их обработка

Каждое место может иметь массив типов:

"types": ["restaurant", "food", "establishment"]

Особенности:

  • первый тип часто считается основным;
  • остальные определяют контекст;
  • фильтрация по типу проверяет наличие совпадения в массиве.

Логика фильтра:

  • совпадение по любому типу → место включается в результат;
  • отсутствие совпадений → исключение из выдачи.

Ограничения при комбинировании фильтров

Типы часто используются вместе с другими параметрами:

  • radius
  • location
  • keyword
  • rankBy

Однако существуют ограничения:

  • нельзя одновременно использовать строгую сортировку rankBy: DISTANCE и keyword в некоторых конфигурациях;
  • фильтр type не может заменить текстовый поиск;
  • слишком узкая комбинация (например, редкий тип + маленький радиус) может вернуть пустой результат.

Практика поведения системы при конфликте фильтров

Если фильтры противоречат друг другу:

  • приоритет отдаётся географическому ограничению;
  • затем типу;
  • затем текстовой релевантности.

Пример конфликта:

  • type: "hospital"
  • keyword: "restaurant"

В таком случае результаты либо будут пустыми, либо система отдаст приоритет типу в зависимости от метода.


Типы в обновлённой Places API (conceptual distinction)

В новых версиях Places API (v1) вводятся более точные поля:

  • includedPrimaryTypes
  • excludedPrimaryTypes

Особенности:

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

Пример логики:

  • включить: restaurant, cafe
  • исключить: fast_food

Такой подход уменьшает неоднозначность, характерную для старого type параметра.


Поведение при отсутствии совпадений типов

Если ни одно место не соответствует типу:

  • Nearby Search возвращает пустой массив;
  • Text Search расширяет область поиска и может игнорировать тип;
  • Autocomplete предлагает альтернативные категории.

Это поведение связано с приоритетом пользовательского запроса над фильтрами.


Особенности индексации типов

Система Places использует внутреннюю индексацию:

  • каждый объект хранится в нескольких типовых индексах;
  • поиск по типу выполняется через эти индексы;
  • обновление типов может задерживаться после изменения данных места.

Это означает:

  • новое место может временно отсутствовать в фильтре по типу;
  • изменения категории могут распространяться с задержкой.

Практическое значение ограничений типов

Ограничения типов влияют на:

  • точность выдачи;
  • скорость поиска;
  • стоимость запросов;
  • поведение автодополнения;
  • консистентность пользовательского опыта.

Типизация выступает как основной механизм семантической фильтрации в Google Maps JavaScript API, определяя структуру взаимодействия с данными мест.