Google Maps API v3: Могу я setZoom после fitBounds?

У меня есть ряд точек, которые я хочу вывести на печать на встроенном Google Map (API v3). Я хотел бы, чтобы границы разместили все точки, если уровень масштабирования не является слишком низким (т.е. уменьшил масштаб слишком много). Мой подход был похож на это:

var bounds = new google.maps.LatLngBounds();

// extend bounds with each point

gmap.fitBounds(bounds); 
gmap.setZoom( Math.max(6, gmap.getZoom()) );

Это не работает. Последняя строка "gmap.setZoom ()" не изменяет уровень масштабирования карты, если названо непосредственно после fitBounds.

Существует ли способ получить уровень масштабирования границы, не применяя его к карте? Другие идеи решить это?

196
задан Skynet 14 September 2014 в 18:07
поделиться

9 ответов

Я использую:

gmap.setZoom(24); //this looks a high enough zoom value
gmap.fitBounds(bounds); //now the fitBounds should make the zoom value only less

Это будет использовать меньшее из 24 и необходимый уровень масштабирования в соответствии с вашим кодом, однако он, вероятно, все равно изменяет масштаб и не заботится о том, насколько вы уменьшили масштаб.

3
ответ дан 23 November 2019 в 05:18
поделиться

Попробуйте это.

// Find out what the map's zoom level is
zoom = map.getZoom();
if (zoom == 1) {
  // If the zoom level is that low, means it's looking around the
world.
  // Swap the sw and ne coords
  viewportBounds = new
google.maps.LatLngBounds(results[0].geometry.location, initialLatLng);
  map.fitBounds(viewportBounds);
}

Если это будет полезно для вас.

Всего наилучшего

0
ответ дан 23 November 2019 в 05:18
поделиться

Я не люблю это предлагать, но если вы должны попробовать - сначала вызовите

gmap.fitBounds (bounds);

Затем создайте новый Thread / AsyncTask, дайте ему спать примерно 20-50 мс, а затем вызовите

gmap.setZoom (Math.max (6, gmap.getZoom ()));

из потока пользовательского интерфейса (используйте обработчик или onPostExecute метод для AsyncTask).

Не знаю, работает ли это, просто предложение.Кроме того, вам придется каким-то образом вычислить уровень масштабирования по вашим точкам самостоятельно, проверить, не слишком ли он низкий, исправить его и затем просто вызвать gmap.setZoom (correctedZoom)

0
ответ дан 23 November 2019 в 05:18
поделиться

Я решил аналогичную проблему в одном из своих приложений. Меня немного смутило ваше описание проблемы, но я думаю, что у вас та же цель, что и у меня ...

В моем приложении я хотел нанести один или несколько маркеров и убедиться, что карта показывает их все. Проблема заключалась в том, что если бы я полагался исключительно на метод fitBounds, тогда уровень масштабирования был бы максимальным при наличии единственной точки - это было бесполезно.

Решением было использовать fitBounds, когда было много точек, и setCenter + setZoom, когда была только одна точка.

if (pointCount > 1) {
  map.fitBounds(mapBounds);
}
else if (pointCount == 1) {
  map.setCenter(mapBounds.getCenter());
  map.setZoom(14);
}
67
ответ дан 23 November 2019 в 05:18
поделиться

В этой функции необходимо динамически добавлять метаданные для хранения типа геометрии только потому, что функция принимает любую геометрию.

"fitGeometries" - это JSON-функция, расширяющая объект map.

"geometries" - это общий массив javascript, а не MVCArray().

geometry.metadata = { type: "point" };
var geometries = [geometry];

fitGeometries: function (geometries) {
    // go and determine the latLngBounds...
    var bounds = new google.maps.LatLngBounds();
    for (var i = 0; i < geometries.length; i++) {
        var geometry = geometries[i];
        switch (geometry.metadata.type)
        {
            case "point":
                var point = geometry.getPosition();
                bounds.extend(point);
                break;
            case "polyline":
            case "polygon": // Will only get first path
                var path = geometry.getPath();
                for (var j = 0; j < path.getLength(); j++) {
                    var point = path.getAt(j);
                    bounds.extend(point);
                }
                break;
        }
    }
    this.getMap().fitBounds(bounds);
},
1
ответ дан 23 November 2019 в 05:18
поделиться

Я использую это, чтобы гарантировать, что уровень масштабирования не превышает установленный уровень, чтобы я знал, что спутниковые изображения будут доступны.

Добавить слушателя к событию zoom_changed . Это также дает дополнительное преимущество управления масштабированием в пользовательском интерфейсе.

Выполняйте setZoom только при необходимости, поэтому оператор if предпочтительнее, чем Math.max или Math.min

   google.maps.event.addListener(map, 'zoom_changed', function() { 
      if ( map.getZoom() > 19 ) { 
        map.setZoom(19); 
      } 
    });
    bounds = new google.maps.LatLngBounds( ... your bounds ... )
    map.fitBounds(bounds);

Чтобы предотвратить слишком большое уменьшение масштаба:

   google.maps.event.addListener(map, 'zoom_changed', function() { 
      if ( map.getZoom() < 6 ) { 
        map.setZoom(6); 
      } 
    });
    bounds = new google.maps.LatLngBounds( ... your bounds ... )
    map.fitBounds(bounds);
1
ответ дан 23 November 2019 в 05:18
поделиться

После расчета границ вы можете проверить расстояние между верхним левым и нижним правым углом; затем вы сможете понять уровень масштабирования, проверив расстояние (если расстояние слишком велико, уровень масштабирования будет низким), затем вы можете выбрать, будет ли он использовать метод setbound или setZoom ..

0
ответ дан 23 November 2019 в 05:18
поделиться

Если я не ошибаюсь, я предполагаю, что вы хотите, чтобы все ваши точки были видны на карте с максимально возможным уровнем масштабирования. Я добился этого, установив уровень масштабирования карты на 16 (не уверен, что это максимально возможный уровень масштабирования в V3).

var map = new google.maps.Map(document.getElementById('map_canvas'), {
  zoom: 16,
  center: marker_point,
  mapTypeId: google.maps.MapTypeId.ROADMAP
});

После этого я проделал работу с границами:

var bounds = new google.maps.LatLngBounds();

// You can have a loop here of all you marker points
// Begin loop
bounds.extend(marker_point);
// End loop

map.fitBounds(bounds);

Результат: Успех!

4
ответ дан 23 November 2019 в 05:18
поделиться

Все, что я сделал, это:

map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));

И он работает на V3 API.

-3
ответ дан 23 November 2019 в 05:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: