地図上に複数のマーカーを設定しています。ズームレベルと中心を静的に設定できますが、必要なのは、すべてのマーカーをカバーしてすべての市場を見えるようにできる限りズームすることです
利用可能な方法は以下の通りです
そして
setCenter
は複数の位置またはLocation配列入力をサポートしていませんし、setZoom
もこのタイプの機能を持っていません
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);
ドキュメント from developers.google.com/maps/documentation/javascript :
fitBounds(bounds[, padding])
パラメータ:
`bounds`: [`LatLngBounds`][1]|[`LatLngBoundsLiteral`][1] `padding` (optional): number|[`Padding`][1]
戻り値: なし
指定された境界を含むようにビューポートを設定します。
注 :マップがdisplay: none
に設定されている場合、fitBounds
関数はマップのサイズを0x0
として読み取るため、何もしません。地図が隠れているときにビューポートを変更するには、地図をvisibility: hidden
に設定して、地図divの実際のサイズを確保します。
いくつかの役に立つトリックで与えられた答えを拡張するために:
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)
}
更新:
このトピックのさらなる調査によると、fitBounds()は非同期であり、Fit Boundsを呼び出す前に定義されたリスナーを使用してズーム操作を行うのが最善です。
@Tim、@ 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);
Google Map開発者の記事 で、Google Mapで利用可能なこのMarkerClusterer
クライアント側のユーティリティがあります。
あなたが求めたことをするための多くのアプローチがあります:
あなたは上記の提供されたリンクでそれらについて読むことができます。
Marker Clusterer
using グリッドベースのクラスタリング は、グリッドを希望するすべてのマーカーをクラスタリングするために使用します。グリッドベースのクラスタリングは、マップを特定のサイズの正方形に分割し(サイズはズームごとに変わります)、マーカーを各グリッドの正方形にグループ化することによって機能します。
私はこれがあなたが探していたものであり、これがあなたの問題を解決することを願っています:)
配列のサイズはゼロより大きくなければなりません。それ以外の場合は、予期しない結果になります。
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);
}
}