Google Maps API v3 - проблема результатов геокодера с границами - PullRequest
12 голосов
/ 29 февраля 2012

Цель : я хочу использовать функцию пользовательского поиска (геокодирование) и иметь возможность перечислять и нажимать каждый результат и отобразить его на карте.

Требуется : соответственно отрегулируйте границы карты / уровень масштабирования, т. Е. При поиске «MA, USA» следует увеличить масштаб карты, чтобы я мог видеть весь штат Массачусетс, а при поиске «Boston, MA, USA» следует увеличить масштаб Бостона. При перечислении нескольких результатов то же самое должно применяться при нажатии на результат.

Проблема : я могу использовать объект geometry.bounds с помощью fitBounds, но некоторые результаты, полученные с помощью геокодера, не имеют этого объекта geometry.bounds.

Быстрый пример: поиск «Бостон» возвращает

Бостон, Массачусетс, США
Бостон, Индиана, США
Бостон, Кентукки, США
Бостон, Джорджия 31626, США
Бостон, Салем, Вирджиния 22713, США
Бостон, Нью-Йорк 14025, США

Оба «Бостон, KY» и «Бостон Нью-Йорк 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)
}

Ответы [ 2 ]

18 голосов
/ 01 марта 2012

правый.После попытки обоих методов и тестирования выясняется, что:

  1. объект geometry.bounds "необязательно возвращен", как говорит доктор:
  2. мы точно не знаем, что такое geometry.bounds объект основан на
  3. geometry.bounds "может не соответствовать рекомендованному окну просмотра" и часто не
  4. geometry.bounds возвращает квадрат или прямоугольник любого размера и формы во время просмотраНасколько я тестировал, функции всегда возвращают прямоугольник с одинаковым соотношением сторон (около 1,43), какими бы ни были размеры контейнера вашей карты.

Ниже приведен пример Сан-Франциско, Калифорния, упомянутый вdoc.
Красным цветом - geometry.bounds, синим цветом - функции видового экрана.

San Francisco, CA

Решение достаточно простое и надежное.

var resultBounds = new google.maps.LatLngBounds(

    results[0].geometry.viewport.getSouthWest(), 
    results[0].geometry.viewport.getNorthEast()
);

map.fitBounds(resultBounds);
1 голос
/ 29 февраля 2012

Объект области просмотра имеет информацию, необходимую для создания объекта границ.Примерно так:

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, так же, как вы делаете для возвращенного объекта Bounds.Как это:

map.fitBounds(bounds);
...