Google Maps API v3-getBounds가 정의되지 않았습니다.


83

v2에서 v3 Google지도 API로 전환 중이며 gMap.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);

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

이제 gMap.getBounds()정의되지 않은 것을 경고합니다 .

클릭 이벤트에서 getBounds 값을 얻으려고 시도했지만 잘 작동하지만로드 맵 이벤트에서 동일한 결과를 얻을 수 없습니다.

또한 getBounds는 Google Maps API v2에서 문서를로드하는 동안 제대로 작동하지만 V3에서는 실패합니다.

이 문제를 해결하도록 도와 주시겠습니까?

답변:


136

v3 API의 초기에는이 getBounds()메서드가 올바른 결과를 반환하기 위해지도 타일의로드를 완료해야했습니다. 그러나 이제 bounds_changed이벤트 이전에도 시작되는 tilesloaded이벤트를 수신 할 수있는 것 같습니다 .

<!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

감사합니다! 많은 도움이되었습니다
user15 aug.

이것도 유용 할 수 있습니다. stackoverflow.com/questions/832692/…
dav

1
그만한 가치가있는 것은 안드로이드 폰에서 getBounds가 bounds_changed에 대한 첫 번째 호출 이후에 사용할 수 없다는 것을 발견했습니다 . 타일로드로 변경하면 문제가 해결되었습니다.
Chris Rae

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

@treznik : idle이벤트가 시작되기 전에 이벤트가 시작 되었는지 어떻게 결정 했 tilesloaded습니까? 나에게 tilesloaded이벤트 는 이벤트 전에 지속적으로 시작 idle됩니다.
Daniel Vassallo

이것은 내가 찾던 정확히
arjuncc

이 기능은 한 번만 실행해야하는 경우 더 나은 솔루션입니다.
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

11

여기에있는 다른 의견에서는 "idle"보다 "bounds_changed"이벤트를 사용하는 것이 좋습니다. 이에 동의합니다. 확실히 IE8에서는 적어도 내 dev 컴퓨터에서 "bounds_changed"전에 "유휴"를 트리거하여 getBounds에서 null에 대한 참조를 남깁니다.

그러나 "bounds_changed"이벤트는지도를 드래그 할 때 계속 트리거됩니다. 따라서이 이벤트를 사용하여 마커로드를 시작하려면 웹 서버에서 무겁습니다.

이 문제에 대한 내 멀티 브라우저 솔루션 :

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

1
이것이 제가 사용하는 방법입니다. 같은 이유로 :-)
oodavid

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.