Google Maps JavaScript API предоставляет механизм Nearby Search через сервис PlacesService, предназначенный для поиска объектов поблизости относительно заданной географической точки. Этот режим используется для получения списка мест в радиусе или в порядке удалённости от координат, с возможностью фильтрации по типам, ключевым словам и другим параметрам.
Nearby Search реализуется через метод nearbySearch
объекта google.maps.places.PlacesService. Он работает
асинхронно и возвращает результаты через callback-функцию.
Основная сигнатура:
service.nearbySearch(request, callback);
Где:
request — объект параметров поискаcallback — функция обработки результатаCallback имеет форму:
function(results, status, pagination) {}
Объект запроса определяет поведение поиска и включает следующие поля:
Обязательный параметр, задающий центр поиска:
location: new google.maps.LatLng(lat, lng)
Именно от этой точки строится радиус или вычисляется сортировка по расстоянию.
Радиус поиска в метрах. Используется совместно с
location:
radius: 1500
Ограничивает область поиска кругом вокруг точки.
Строка для текстового поиска по названиям и описаниям мест:
keyword: "coffee"
Используется для гибкого поиска без строгой привязки к типу.
Фильтрация по типу места:
type: "restaurant"
Поддерживаются стандартные категории Places API, такие как:
restaurantcafehospitalbankstoreОпределяет способ сортировки результатов. Возможные значения:
google.maps.places.RankBy.PROMINENCEgoogle.maps.places.RankBy.DISTANCEПри использовании DISTANCE параметр radius
не применяется, и обязательным становится отсутствие
radius.
Фильтрация по уровню цен (0–4):
minPriceLevel: 1,
maxPriceLevel: 3
Callback возвращает:
Массив объектов PlaceResult, содержащих информацию о
найденных местах:
Основные поля:
name — названиеgeometry.location — координатыvicinity — краткий адресrating — рейтингtypes — массив типовplace_id — уникальный идентификаторСтатус выполнения запроса:
OK — успешное выполнениеZERO_RESULTS — ничего не найденоOVER_QUERY_LIMIT — превышен лимит запросовREQUEST_DENIED — отказ в доступеINVALID_REQUEST — ошибка параметровОбъект для постраничной загрузки результатов.
Nearby Search возвращает ограниченное количество объектов за один запрос. Для получения следующей страницы используется:
pagination.nextPage();
Однако вызов возможен только после небольшой задержки, так как API требует завершения текущего цикла обработки.
const service = new google.maps.places.PlacesService(map);
const request = {
location: new google.maps.LatLng(49.806, 73.085),
radius: 2000,
type: "restaurant"
};
service.nearbySearch(request, (results, status, pagination) => {
if (status === google.maps.places.PlacesServiceStatus.OK) {
for (let i = 0; i < results.length; i++) {
const place = results[i];
console.log(place.name, place.geometry.location.toString());
}
if (pagination && pagination.hasNextPage) {
setTimeout(() => {
pagination.nextPage();
}, 1000);
}
}
});
При одновременном использовании keyword и
type происходит пересечение фильтров, что может существенно
сузить выборку:
const request = {
location: new google.maps.LatLng(49.81, 73.09),
radius: 3000,
keyword: "pizza",
type: "restaurant"
};
В таком режиме результаты будут включать только рестораны, содержащие текстовое совпадение с «pizza».
Режим сортировки по расстоянию изменяет структуру запроса:
const request = {
location: new google.maps.LatLng(49.81, 73.09),
rankBy: google.maps.places.RankBy.DISTANCE,
type: "cafe"
};
В этом режиме:
Объект результата может содержать расширенные поля, зависящие от запроса:
{
name: "Example Cafe",
place_id: "abc123",
vicinity: "Street 10",
geometry: {
location: LatLng
},
rating: 4.5,
types: ["cafe", "food", "establishment"],
opening_hours: {
open_now: true
}
}
Некоторые поля доступны только при определённых условиях или дополнительных запросах Place Details.
Nearby Search поддерживает ограниченный набор фильтров, поэтому часто применяется комбинация:
type для жёсткой категорииkeyword для семантического уточненияradius для пространственного ограниченияrankBy для изменения логики сортировкиСложные сценарии часто требуют дополнительного вызова Place Details
по place_id.
Nearby Search в рамках Places Service имеет ряд ограничений:
При интенсивной нагрузке предпочтительно минимизировать количество
повторных запросов и кэшировать place_id.
Используется для отображения:
Nearby Search часто применяется вместе с:
Marker)MarkerClusterer)InfoWindow)При событии bounds_changed или idle:
google.maps.event.addListener(map, "idle", () => {
const center = map.getCenter();
service.nearbySearch({
location: center,
radius: 1500,
type: "store"
}, callback);
});
Такой подход создаёт интерактивную карту с обновляемыми результатами.
При отсутствии результатов или некорректных параметрах API возвращает:
resultsZERO_RESULTS или
INVALID_REQUESTПри этом callback всё равно вызывается, что требует обязательной
проверки status.
В современных версиях Google Maps JavaScript API часть функциональности Nearby Search постепенно мигрирует в Places API (New), где используется иной подход:
Однако классический PlacesService.nearbySearch остаётся
широко используемым в существующих проектах и поддерживается для
обратной совместимости.