Google मानचित्र Api v3 - getBounds अपरिभाषित है


83

मैं v2 से v3 गूगल मैप्स एपि पर स्विच कर रहा हूं और 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 मान प्राप्त करने की कोशिश की है और यह मेरे लिए ठीक काम करता है, लेकिन मुझे लोड मैप इवेंट में समान परिणाम नहीं मिल सकते हैं।

Google मैप्स API v2 में दस्तावेज़ लोड होने के दौरान getBounds ठीक काम करता है, लेकिन यह V3 में विफल रहता है।

क्या आप इस समस्या को हल करने में मेरी मदद कर सकते हैं?

जवाबों:


136

V3 एपीआई के शुरुआती दिनों में, 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
ठीक वैसा ही मुझे चाहिए! धन्यवाद =)। इसने मेरी समस्या हल कर दी।
डोल्सेविटा

यह मेरे लिए बहुत उपयोगी है, मैंने इसके लिए लगभग 2 घंटे बर्बाद किए
arjuncc

धन्यवाद! इसने मेरी बहुत मदद की
user15

यह उपयोगी हो सकता है साथ ही stackoverflow.com/questions/832692/…
dav

1
इसके लायक क्या है, मैंने पाया है कि, एंड्रॉइड फोन पर, गेटबाउंड पहले कॉल के बाद bounds_changed के लिए उपलब्ध नहीं है , लेकिन बाद वाले के बाद है। इसे बदलकर टाइल्स से तय किया गया (हालांकि कुछ बदसूरत रिफ्रेश के लिए बनाया गया था)।
क्रिस राए

20

यह काम कर रहा होना चाहिए, गेटबाउंड्स () के लिए प्रलेखन के अनुसार कम से कम। फिर भी:

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
डैनियल वैसलो

यह वही है जिसकी मैं तलाश कर रहा था
arjuncc

यह बेहतर समाधान है यदि आपको केवल एक बार चलाने के लिए फ़ंक्शन की आवश्यकता है।
bbodenmiller

15

मैं कह रहा था कि सलमान का समाधान बेहतर है क्योंकि idleघटना को पहले की तुलना में बुलाया जाता है tilesloaded, क्योंकि यह सभी टाइलों के लोड होने का इंतजार करता है। लेकिन करीब से देखने पर, यह bounds_changedपहले भी कहा जाता है और यह भी अधिक समझ में आता है, क्योंकि आप सीमा की तलाश कर रहे हैं, है ना? :)

तो मेरा समाधान होगा:

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

1
जब यह सवाल पूछा गया था, bounds_changedतो काम नहीं किया होगा, क्योंकि getBounds()टाइलों को लोड करना आवश्यक था। इसे सुझाने के लिए +1। मैं अपना जवाब अपडेट करूंगा।
डैनियल वैसलो

11

यहां अन्य टिप्पणियों में, "आइडल" पर "बाउंड्स_चेंज" इवेंट का उपयोग करने की सलाह दी जाती है, जिससे मैं सहमत हूं। निश्चित रूप से IE8 के तहत जो कम से कम मेरी देव मशीन पर "bounds_changed" से पहले "बेकार" को ट्रिगर करता है, मुझे getBounds पर अशक्त करने के लिए एक संदर्भ के साथ छोड़ देता है।

जब आप मानचित्र को खींचेंगे तो "bounds_changed" ईवेंट को लगातार ट्रिगर किया जाएगा। वहाँ, यदि आप मार्कर लोड करने की शुरुआत करने के लिए इस घटना का उपयोग करना चाहते हैं, तो यह आपके वेबसर्वर पर भारी पड़ेगा।

इस समस्या के लिए मेरा मल्टी ब्राउज़र समाधान:

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

1
यह वही विधि है जो मैं
नियत करता हूं

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();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.