の最大ズームレベルを設定する方法はありfitBounds()
ますか?私の問題は、マップに1つの場所しかフィードされない場合、可能な限りズームインすることです。これにより、マップがコンテキストから外れ、役に立たなくなります。おそらく私は間違ったアプローチを取っていますか?
前もって感謝します!
の最大ズームレベルを設定する方法はありfitBounds()
ますか?私の問題は、マップに1つの場所しかフィードされない場合、可能な限りズームインすることです。これにより、マップがコンテキストから外れ、役に立たなくなります。おそらく私は間違ったアプローチを取っていますか?
前もって感謝します!
私は mrt のソリューションが好きです (特に、マッピングまたは調整するポイントの数がわからない場合)。ただし、マーカーがマップの中心にならないようにマーカーをオフにします。緯度と経度から .01 を差し引いた追加のポイントで単純に拡張したので、マーカーが中央に保持されます。素晴らしい作品、mrt に感謝します!
// Pan & Zoom map to show all markers
function fitToMarkers(markers) {
var bounds = new google.maps.LatLngBounds();
// Create bounds from markers
for( var index in markers ) {
var latlng = markers[index].getPosition();
bounds.extend(latlng);
}
// Don't zoom in too far on only one marker
if (bounds.getNorthEast().equals(bounds.getSouthWest())) {
var extendPoint1 = new google.maps.LatLng(bounds.getNorthEast().lat() + 0.01, bounds.getNorthEast().lng() + 0.01);
var extendPoint2 = new google.maps.LatLng(bounds.getNorthEast().lat() - 0.01, bounds.getNorthEast().lng() - 0.01);
bounds.extend(extendPoint1);
bounds.extend(extendPoint2);
}
map.fitBounds(bounds);
// Adjusting zoom here doesn't work :/
}
次のよう maxZoom
にMapOptions
(api-reference)でマップをセットアップできます。
var map = new google.maps.Map(document.getElementById("map"), { maxZoom: 10 });
これにより、使用時にマップがそれ以上ズームしなくfitBounds()
なり、ズーム コントロールからズーム レベルが削除されます。
別の解決策は、fitBounds() を実行する前に境界が小さすぎることがわかった場合に境界を拡張することです。
var bounds = new google.maps.LatLngBounds();
// here you extend your bound as you like
// ...
if (bounds.getNorthEast().equals(bounds.getSouthWest())) {
var extendPoint = new google.maps.LatLng(bounds.getNorthEast().lat() + 0.01, bounds.getNorthEast().lng() + 0.01);
bounds.extend(extendPoint);
}
map.fitBounds(bounds);
すべての実際の境界を追加したら、これらの行を追加します
var offset = 0.002;
var center = bounds.getCenter();
bounds.extend(new google.maps.LatLng(center.lat() + offset, center.lng() + offset));
bounds.extend(new google.maps.LatLng(center.lat() - offset, center.lng() - offset));
実際の境界の中心を取得し、中心の北東に 1 つ、南西に 1 つの 2 つの追加ポイントを追加します。
これは効果的に最小ズームを設定し、オフセットの値を変更してズームを増減します
var map = new google.maps.Map(document.getElementById("map"), { maxZoom: 10 });
MaxZoom オプションを使用すると、ズームしてマークに近づかないようにするのに最適です。
単一の場所の場合は、代わりに setCenter() と setZoom() を使用できます。
私は mrt のソリューションが本当に好きで、作業するポイントが常に 1 つしかない場合に完全に機能します。ただし、バウンディング ボックスが 1 つのポイントに基づいていなくても、ポイントが非常に接近している場合でも、マップがズームインしすぎる可能性があることがわかりました。
ポイントが互いに定義された距離内にあるかどうかを最初に確認する方法を次に示します。次に、それらがその最小距離よりも小さい場合は、その最小距離だけ境界を拡張します。
var bounds = new google.maps.LatLngBounds();
// here you extend your bound as you like
// ...
var minDistance = 0.002;
var sumA = bounds.getNorthEast().lng() - bounds.getSouthWest().lng();
var sumB = bounds.getNorthEast().lat() - bounds.getSouthWest().lat();
if((sumA < minDistance && sumA > -minDistance)
&& (sumB < minDistance && sumB > -minDistance)){
var extendPoint1 = new google.maps.LatLng(bounds.getNorthEast().lat() + minDistance, bounds.getNorthEast().lng() + minDistance);
var extendPoint2 = new google.maps.LatLng(bounds.getNorthEast().lat() - minDistance, bounds.getNorthEast().lng() - minDistance);
bounds.extend(extendPoint1);
bounds.extend(extendPoint2);
}
これが誰かを助けることを願っています!
Google マップ V3 はイベント ドリブンであるため、このチャンクで解決しました。
zoom_changedイベントがトリガーされたときにズームを適切な量に戻すように API に指示できます。
var initial = true
google.maps.event.addListener(map, "zoom_changed", function() {
if (intial == true){
if (map.getZoom() > 11) {
map.setZoom(11);
intial = false;
}
}
});
私は最初に、最終的なfitBoundsが permorfed になったときにマップをズームしすぎないようにしました。それがなければ、11 を超えるズーム イベントはユーザーにとって不可能です。
境界を合わせるときに最大ズームを制限することに基づいた魂があります。私のために動作します(Win7でテスト済み-IE9、FF 13、Chrome 19):
// When fitting bounds:
var bounds = new google.maps.LatLngBounds();
// ...
// extend bounds as you like
// ..
// now set global variable when fitting bounds
window.fittingBounds = true;
map.fitBounds(bounds);
window.fittingBounds = false;
// attach this event listener after map init
google.maps.event.addListener(map, 'zoom_changed', function() {
// set max zoom only when fitting bounds
if (window.fittingBounds && map.getZoom() > 16) {
this.setZoom(16);
}
});
そして..ここにもう1つあります。
mrt や Ryan と同じ考えですが、
(*) 注: ボックスが既に十分に大きい場合、これら 2 つの余分なポイントを追加しても効果はありません。したがって、これ以上のチェックは必要ありません。
function calcBounds(markers) {
// bounds that contain all markers
var bounds = new google.maps.LatLngBounds();
// Using an underscore _.each(). Feel free to replace with standard for()
_.each(markers, function(marker) {
bounds.extend(marker.getPosition());
});
// prevent lat/lng distortion at the poles
var lng0 = bounds.getNorthEast().lng();
var lng1 = bounds.getSouthWest().lng();
if (lng0 * lng1 < 0) {
// Take the cos at the equator.
var cos = 1;
}
else {
var cos0 = Math.cos(lng0);
var cos1 = Math.cos(lng1);
// Prevent division by zero if the marker is exactly at the pole.
var cos_safe = Math.max(cos0, cos1, 0.0001);
}
var cos0 = Math.cos(bounds.getNorthEast.lng() * Math.PI / 180);
var cos1 = Math.cos(bounds.getSouthWest.lng() * Math.PI / 180);
// "radius" in either direction.
// 0.0006 seems to be an ok value for a typical city.
// Feel free to make this value a function argument.
var rLat = 0.0006;
var rLng = rLat / cos_safe;
// expand the bounds to a minimum width and height
var center = bounds.getCenter();
var p0 = new google.maps.LatLng(center.lat() - rLat, center.lng() - rLng);
var p1 = new google.maps.LatLng(lat.center() + rLat, center.lng() + rLng);
bounds.extend(p0);
bounds.extend(p1);
return bounds;
}
編集:メルカトル図法があることを考えると、比率の計算が正しいかどうかは正確にはわかりません。これを再編集するかもしれません..
すでにここで回答されていますGoogle Maps v3: Enforcing min. fitBounds を使用する場合のズーム レベルは期待どおりに機能します :) したがって、フィット境界のズームが 13 未満の場合は、好みの新しいズームを設定できます