Google Maps APIv3-getBoundsは未定義です


83

v2からv3のgooglemaps apiに切り替えていますが、gMap.getBounds()機能に問題があります。

マップの初期化後にマップの境界を取得する必要があります。

これが私のjavascriptコードです:


var gMap;
$(document).ready(

    function() {

        var latlng = new google.maps.LatLng(55.755327, 37.622166);
        var myOptions = {
            zoom: 12,
            center: latlng,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        };
        gMap = new google.maps.Map(document.getElementById("GoogleMapControl"), myOptions);

        alert(gMap.getBounds());
    }
);

だから今それgMap.getBounds()は未定義であることを私に警告します。

クリックイベントでgetBounds値を取得しようとしましたが、正常に機能しますが、ロードマップイベントで同じ結果を取得できません。

また、ドキュメントがGoogle Maps API v2に読み込まれている間、getBoundsは正常に機能しますが、V3では失敗します。

この問題を解決するのを手伝ってくれませんか。

回答:


136

v3 APIの初期の頃、このgetBounds()メソッドでは、正しい結果を返すために、マップタイルの読み込みが完了している必要がありました。ただしbounds_changedtilesloadedイベントの前でも発生するイベントを聞くことができるようになりました。

<!DOCTYPE html>
<html> 
<head> 
   <meta http-equiv="content-type" content="text/html; charset=UTF-8"/> 
   <title>Google Maps v3 - getBounds is undefined</title> 
   <script src="http://maps.google.com/maps/api/js?sensor=false" 
           type="text/javascript"></script> 
</head> 
<body> 
   <div id="map" style="width: 500px; height: 350px;"></div> 

   <script type="text/javascript"> 
      var map = new google.maps.Map(document.getElementById("map"), {
         zoom: 12,
         center: new google.maps.LatLng(55.755327, 37.622166),
         mapTypeId: google.maps.MapTypeId.ROADMAP
      });

      google.maps.event.addListener(map, 'bounds_changed', function() {
         alert(map.getBounds());
      });
   </script> 
</body> 
</html>

1
それがまさに私が必要としているものです!ありがとう=)。それは私の問題を解決しました。
DolceVita 2010年

これは私にとって非常に便利です、私はこれのためにほとんど2時間を無駄にしました
arjuncc 2012年

ありがとうございました!それは私を大いに助けました
user15 2012

これは、同様に役立つことができstackoverflow.com/questions/832692/...
DAV

1
その価値については、Androidスマートフォンでは、bounds_changedを最初に呼び出した後は、getBoundsを使用できませんが、その後は使用できることがわかりました。それをtilesloadedに変更すると、それが修正されました(ただし、いくつかの醜い更新のために作成されました)。
Chris Rae 2018

20

少なくともgetBounds()のドキュメントによれば、機能しているはずです。それにもかかわらず:

var gMap;
$(document).ready(function() {
    var latlng = new google.maps.LatLng(55.755327, 37.622166);
    var myOptions = {
        zoom: 12,
        center: latlng,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    gMap = new google.maps.Map(document.getElementById("GoogleMapControl"), myOptions);
    google.maps.event.addListenerOnce(gMap, 'idle', function(){
        alert(this.getBounds());
    });
});

ここで動作するのを見てください


これは受け入れられた答えでなければなりません。アイドルは、すべてのタイルがロードされるのを待つ必要があるよりもずっと早く呼び出されています。
treznik 2010年

@treznik:idleイベントがtilesloadedイベントの前に発生したことをどのように判断しましたか?私にとって、tilesloadedイベントは常にidleイベントの前に発生します。
Daniel Vassallo 2010年

これはまさに私が探していたものです
arjuncc 2012年

関数を1回だけ実行する必要がある場合は、これがより適切なソリューションです。
bbodenmiller 2014

15

すべてのタイルがロードされるのを待つため、idleイベントがイベントよりも早く呼び出されるため、Salmanのソリューションの方が優れていると言っていましたtilesloaded。しかし、よく見ると、bounds_changedはもっと早く呼ばれているようで、境界を探しているので、それはより理にかなっていますよね?:)

したがって、私の解決策は次のようになります。

google.maps.event.addListenerOnce(gMap, 'bounds_changed', function(){
    alert(this.getBounds());
});

1
この質問がされたとき、タイルをロードする必要があるため、bounds_changed機能しませんでしたgetBounds()。それを提案するための+1。答えを更新します。
Daniel Vassallo 2010年

11

ここでの他のコメントでは、「idle」ではなく「bounds_changed」イベントを使用することをお勧めします。これには同意します。確かに、少なくとも私の開発マシンでは「bounds_changed」の前に「idle」をトリガーするIE8の下では、getBoundsでnullへの参照が残ります。

ただし、「bounds_changed」イベントは、マップをドラッグすると継続的にトリガーされます。そのため、このイベントを使用してマーカーの読み込みを開始する場合は、Webサーバーに負荷がかかります。

この問題に対する私のマルチブラウザソリューション:

google.maps.event.addListenerOnce(gmap, "bounds_changed", function(){
   loadMyMarkers();
   google.maps.event.addListener(gmap, "idle", loadMyMarkers);
});

1
これは私が採用している方法です。同じ理由で:
oodavid 2012年

1

手遅れかどうかはわかりませんが、gmaps.jsプラグインを使用した解決策は次のとおりです。

map = new GMaps({...});

// bounds loaded? if not try again after 0.5 sec
var check_bounds = function(){

        var ok = true;

        if (map.getBounds() === undefined)
            ok = false;

        if (! ok) 
            setTimeout(check_bounds, 500);
        else {
             //ok to query bounds here
              var bounds = map.getBounds();
        }   
    }

    //call it
    check_bounds();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.