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);