2013-10-10 3 views
242

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

Доступные методы следующие

setZoom(zoom:number)

и

setCenter(latlng:LatLng)

Ни setCenter поддерживает Mult iple местоположение или Расположение входной массив, ни setZoom действительно есть этот тип функциональности

enter image description here

+1

См http://stackoverflow.com/questions/2362337/how-to-set-the-google-map-zoom-level-to-show-all-the-markers – palmsey

+0

вам нужно добавить 'latlng' в объект' bounds' каждый раз, когда вы добавляете маркер и устанавливаете карту в соответствии с окончательными границами. См. Ответ здесь: http://stackoverflow.com/questions/1556921/google-map-api-v3-set-bounds-and-center?rq=1 –

ответ

503

Вы должны использовать метод fitBounds().

var markers = [];//some array 
var bounds = new google.maps.LatLngBounds(); 
for (var i = 0; i < markers.length; i++) { 
bounds.extend(markers[i].getPosition()); 
} 

map.fitBounds(bounds); 

Reference:

+1

Откуда появился метод getPosition? – Pratheep

+3

@Pratheep - это часть класса google.maps.Marker; https://developers.google.com/maps/documentation/javascript/reference#Marker – Adam

+0

Работал как шарм! Thanks –

138

Чтобы продлить данный ответ с несколькими полезными трюками:

var markers = //some array; 
var bounds = new google.maps.LatLngBounds(); 
for(i=0;i<markers.length;i++) { 
    bounds.extend(markers[i].getPosition()); 
} 

//center the map to a specific spot (city) 
map.setCenter(center); 

//center the map to the geometric center of all markers 
map.setCenter(bounds.getCenter()); 

map.fitBounds(bounds); 

//remove one zoom level to ensure no marker is on the edge. 
map.setZoom(map.getZoom()-1); 

// set a minimum zoom 
// if you got only 1 marker or all markers are on the same address map will be zoomed too much. 
if(map.getZoom()> 15){ 
    map.setZoom(15); 
} 

//Alternatively this code can be used to set the zoom for just 1 marker and to skip redrawing. 
//Note that this will not cover the case if you have 2 markers on the same address. 
if(count(markers) == 1){ 
    map.setMaxZoom(15); 
    map.fitBounds(bounds); 
    map.setMaxZoom(Null) 
} 

UPDATE:
Дальнейших исследований в тему показывает, что fitBounds() является асинхронным и лучше всего сделать манипуляцию Zoom с прослушивателем, определенным перед вызовом Fit Bounds.
Спасибо @ Тим, @ xr280xr, больше примеров по теме: SO:setzoom-after-fitbounds

google.maps.event.addListenerOnce(map, 'bounds_changed', function(event) { 
    this.setZoom(map.getZoom()-1); 

    if (this.getZoom() > 15) { 
    this.setZoom(15); 
    } 
}); 
map.fitBounds(bounds); 
+3

Хорошие дополнения. Благодаря! –

+1

У меня был неопределенный возврат .getZoom(). [Этот ответ] (http://stackoverflow.com/a/13435411/263832) помог мне решить эту проблему с помощью 'addListenerOnce' на' zoom_changed', чтобы установить масштабирование после того, как его значение было инициализировано. – xr280xr

+1

Спасибо @ d.raev, но установка максимального увеличения, когда границы уже установлены, не работает. При инициализации вашей карты вам нужно установить параметр «maxZoom». https://developers.google.com/maps/documentation/javascript/reference?csw=1#MapOptions – Tim

4

Существует эта утилита стороне MarkerClusterer клиент для Google Map, как указано здесь, на Google Map developer Articles, здесь кратко на том, что его использование:

Есть много подходов к делать то, что вы просили:

  • сетка на основе кластерного
  • Расстояние на основе кластеризации
  • Viewport управления Маркер
  • Fusion Tables
  • Маркер кластеризатор
  • MarkerManager

Вы можете прочитать о них на поставленном выше ссылке.

Marker Clusterer использует Сетка на основе кластеризации для группировки всех маркеров, желающих сетки. Кластеризация на основе гридов работает путем деления карты на квадраты определенного размера (размер изменяется при каждом масштабировании), а затем группировка маркеров в каждый квадрат сетки.

Перед Кластеризация Before Clustering

После Кластеризация After Clustering

Я надеюсь, что это то, что вы искали & это решит вашу проблему :)

1

Размер массива должен быть больше нуля , В противном случае вы получите неожиданные результаты.

function zoomeExtends(){ 
    var bounds = new google.maps.LatLngBounds(); 
    if (markers.length>0) { 
     for (var i = 0; i < markers.length; i++) { 
     bounds.extend(markers[i].getPosition()); 
     }  
     myMap.fitBounds(bounds); 
    } 
} 
Смежные вопросы