Работа с географическими ограничениями в Google Maps JavaScript API строится вокруг двух ключевых подходов: смещение (biasing) и жёсткое ограничение (restricting) результатов. Эти механизмы определяют, какие объекты, адреса и места возвращаются при поиске, автодополнении и геокодировании, а также какие области карты доступны для взаимодействия.
Географическая фильтрация в Google Maps API не является единым переключателем. Она распределена по нескольким уровням:
Каждый из них использует собственные параметры, но логика едина:
Разница между ними критична: bias улучшает UX, restriction обеспечивает строгую географическую изоляцию.
На уровне карты используется параметр restriction,
который задаёт допустимые границы перемещения.
const map = new google.maps.Map(document.getElementById("map"), {
center: { lat: 48.0, lng: 66.9 },
zoom: 6,
restriction: {
latLngBounds: {
north: 55.0,
south: 40.0,
east: 80.0,
west: 50.0,
},
strictBounds: true
}
});
Определяет прямоугольную область, за пределы которой пользователь не может переместить карту.
true — жёсткое ограничение, карта «отталкивается» от
границfalse — допускается временный выход за пределы при
инерции или программных измененияхКомпонент автодополнения — один из основных источников географических данных, и он поддерживает несколько уровней фильтрации.
const autocomplete = new google.maps.places.Autocomplete(input, {
componentRestrictions: { country: "kz" }
});
Параметр componentRestrictions полностью исключает
результаты вне указанной страны.
const autocomplete = new google.maps.places.Autocomplete(input);
autocomplete.setBounds(
new google.maps.LatLngBounds(
{ lat: 42.0, lng: 46.0 },
{ lat: 55.0, lng: 87.0 }
)
);
Этот вариант не блокирует результаты, но повышает их релевантность внутри указанного прямоугольника.
autocomplete.setOptions({
strictBounds: true
});
При включении:
Geocoding API поддерживает параметр region, который
влияет на приоритет результатов.
const geocoder = new google.maps.Geocoder();
geocoder.geocode({
address: "Abay Street",
region: "kz"
}, (results, status) => {
console.log(results);
});
Дополнительно можно использовать bounds:
geocoder.geocode({
address: "Abay Street",
bounds: {
north: 55,
south: 40,
east: 80,
west: 50
}
});
При работе с Places Service используется комбинация viewport bias и радиуса поиска.
const request = {
location: { lat: 48.0, lng: 66.9 },
radius: 5000,
type: "restaurant"
};
service.nearbySearch(request, callback);
Здесь радиус задаёт строгую географическую границу.
const request = {
query: "coffee",
bounds: map.getBounds()
};
service.textSearch(request, callback);
Viewport влияет на ранжирование, но не полностью исключает внешние результаты.
Viewport (видимая область карты) часто используется как динамический фильтр:
google.maps.event.addListener(map, "bounds_changed", () => {
const bounds = map.getBounds();
const request = {
bounds: bounds,
query: "hotel"
};
placesService.textSearch(request, callback);
});
Такой подход обеспечивает синхронизацию карты и результатов поиска.
Bounding box — основной инструмент географической фильтрации:
const bounds = {
north: 50.5,
south: 49.0,
east: 76.0,
west: 73.0
};
Он применяется:
Часто границы формируются из текущего состояния карты:
const bounds = map.getBounds();
autocomplete.setBounds(bounds);
или:
const request = {
bounds: map.getBounds(),
type: "atm"
};
Это создаёт контекстно-зависимую систему поиска.
На практике одновременно используются несколько уровней:
componentRestrictions — странаbounds — регион или городstrictBounds — жёсткое ограничениеregion — языково-географический приоритетКомбинация выглядит так:
const autocomplete = new google.maps.places.Autocomplete(input, {
componentRestrictions: { country: "kz" }
});
autocomplete.setBounds(cityBounds);
autocomplete.setOptions({
strictBounds: true
});
componentRestrictionsЭти особенности требуют явного контроля логики на уровне приложения, а не только API параметров