API Карт Google v3 - выпуск результатов геокодирования с ограничениями
Цель: я хочу иметь функцию пользовательского поиска (геокодирования) и иметь возможность перечислить и щелкнуть
каждый результат и отобразить его на карте.
Требуется. Отрегулируйте границы карты/уровень масштабирования соответственно, т.е. поиск "MA, USA" должен увеличить карту, чтобы я мог видеть все состояние штата Массачусетс, ища "Boston, MA, USA" следует увеличить область Бостона. При перечислении нескольких результатов то же самое следует применять при нажатии на результат.
Проблема. Я могу использовать объект geometry.bounds с помощью fitBounds. Но - некоторые результаты, которые вы получаете с помощью геокодера, не имеют этого объекта geometry.bounds.
Быстрый пример: поиск "Boston" возвращает
Бостон, Массачусетс, США
Boston, IN, США
Бостон, KY, США
Boston, GA 31626, США
Бостон, Салем, VA 22713, США
Бостон, Нью-Йорк 14025, США
Оба "Бостон, Кентукки" и "Бостон Нью-Йорк 14025" не имеют границ.
Вопрос: существует ли надежный способ отображения любого результата геокодирования на карте с соответствующим увеличением
уровень?
Сейчас я использую что-то подобное, но я считаю это уродливым и не решает проблему с масштабированием.
if (results[0].geometry.bounds) {
map.fitBounds(results[0].geometry.bounds);
} else {
map.setCenter(results[0].geometry.location);
// eventually set zoom here to some middle-range value (ugly)
}
Ответы
Ответ 1
Right. После тестирования обоих методов и тестирования выясняется, что:
- объект
geometry.bounds
"optionnaly возвращается", как сообщает doc
- мы точно не знаем, что объект
geometry.bounds
основан на
-
geometry.bounds
"может не соответствовать рекомендуемому видовому экрану" и часто не
-
geometry.bounds
возвращает квадрат или прямоугольник любого размера и формы, в то время как функции viewport всегда возвращают прямоугольник с тем же соотношением сторон (около 1,43), независимо от размеров вашего карточного контейнера, насколько я проверял.
Ниже приведен пример Сан-Франциско, Калифорния, упомянутого в документе.
Красным цветом используется geometry.bounds
и синим цветом, используя функции просмотра.
![San Francisco, CA]()
Решение достаточно простое и надежное.
var resultBounds = new google.maps.LatLngBounds(
results[0].geometry.viewport.getSouthWest(),
results[0].geometry.viewport.getNorthEast()
);
map.fitBounds(resultBounds);
Ответ 2
Объект viewport имеет информацию, необходимую для создания объекта bounds. Что-то вроде этого:
var bounds = new google.maps.LatLngBounds(
new google.maps.LatLng(results[0].geometry.viewport.southwest.lat, results[0].geometry.viewport.southwest.lng),
new google.maps.LatLng(results[0].geometry.viewport.northeast.lat, results[0].geometry.viewport.northeast.lng)
);
Затем вы можете использовать fitBounds для этого нового объекта bounds, как и для объекта возвращенных границ. Вот так:
map.fitBounds(bounds);