2012-03-23 7 views
18

गूगल के नक्शे API v2 में, हमारे देश के नक्शे को अच्छी तरह से साथ 700x400px नक्शा करने के लिए फिट किया गया था प्रभावित करने के लिए कैसे करें:map.fitBounds() की "कृपा मार्जिन"

map.getBoundsZoomLevel(<bounds of our country>) 

लेकिन में API v3, map.fitBounds() विधि उस ज़ूम स्तर पर 700x400 पर फिट नहीं है - यह एक स्तर को ज़ूम करता है।

इसका मतलब है कि map.fitBounds() कुछ "अनुग्रह मार्जिन" या कुछ के साथ मायने रखता है।

मैं इस मार्जिन के आकार को कैसे प्रभावित कर सकता हूं?

+0

क्या "अनुग्रह मार्जिन" आपकी वांछित सीमाओं का प्रतिशत हो सकता है? यदि यह मार्जिन तय किया गया है, तो आप फिट करने के लिए एक छोटे, मापा, सीमाओं को इनपुट कर सकते हैं बाउंड्स(), ताकि ग्रेस मार्जिन का अंत आपकी मूल रूप से वांछित सीमाओं से मेल खा सके। उम्मीद है कि यह समझ में आया। –

+0

@ हेइटरचांग, ​​यह वास्तव में हैकी और बेकार समाधान होगा, लेकिन फिर भी यह जानने के बिना कि फिटबॉउंड() द्वारा "कृपा मार्जिन" की गणना कैसे की जाती है, आप ऐसा नहीं कर सकते हैं। – TMS

+7

चारों ओर हैकिंग के बाद, मैंने निष्कर्ष निकाला कि v3 fitBounds() उस ज़ूम स्तर पर, लंबे आयाम पर कम से कम 45 पिक्सेल पैडिंग (आपके सीमाओं द्वारा परिभाषित आयत के दोनों किनारों पर) केवल ज़ूम करेगा। मान लीजिए कि यह एक करीबी कॉल है, नक्शा ज़ूम आउट हो जाएगा, जिससे एक बड़ा मार्जिन निकल जाएगा। मुझे आशा है कि यह आपके लिए उपयोगी हो सकता है। –

उत्तर

2

यहां एक समाधान है जो कस्टम मार्जिन के बिना जितना संभव हो सके मानचित्र में ज़ूम करेगा। यदि आप चाहते हैं तो आपको कुछ मार्जिन के लिए इसे अनुकूलित करने में सक्षम होना चाहिए।

मेरा समाधान this comment in a Google Groups thread पर आधारित है। दुर्भाग्यवश, helper.getProjection() पर कॉल हमेशा अपरिभाषित हो गया, इसलिए मैंने उपरोक्त उत्तर को थोड़ा सा अनुकूलित किया और इस कामकाजी कोड के साथ आया।

बस myFitBounds(map, bounds) साथ map.fitBounds(bounds) के लिए अपने मौजूदा कॉल की जगह:

function myFitBounds(myMap, bounds) { 
    myMap.fitBounds(bounds); 

    var overlayHelper = new google.maps.OverlayView(); 
    overlayHelper.draw = function() { 
     if (!this.ready) { 
      var projection = this.getProjection(), 
       zoom = getExtraZoom(projection, bounds, myMap.getBounds()); 
      if (zoom > 0) { 
       myMap.setZoom(myMap.getZoom() + zoom); 
      } 
      this.ready = true; 
      google.maps.event.trigger(this, 'ready'); 
     } 
    }; 
    overlayHelper.setMap(myMap); 
} 

// LatLngBounds b1, b2 -> zoom increment 
function getExtraZoom(projection, expectedBounds, actualBounds) { 
    var expectedSize = getSizeInPixels(projection, expectedBounds), 
     actualSize = getSizeInPixels(projection, actualBounds); 

    if (Math.floor(expectedSize.x) == 0 || Math.floor(expectedSize.y) == 0) { 
     return 0; 
    } 

    var qx = actualSize.x/expectedSize.x; 
    var qy = actualSize.y/expectedSize.y; 
    var min = Math.min(qx, qy); 

    if (min < 1) { 
     return 0; 
    } 

    return Math.floor(Math.log(min)/Math.log(2) /* = log2(min) */); 
} 

// LatLngBounds bnds -> height and width as a Point 
function getSizeInPixels(projection, bounds) { 
    var sw = projection.fromLatLngToContainerPixel(bounds.getSouthWest()); 
    var ne = projection.fromLatLngToContainerPixel(bounds.getNorthEast()); 
    return new google.maps.Point(Math.abs(sw.y - ne.y), Math.abs(sw.x - ne.x)); 
} 
+0

यह मेरे लिए अच्छा काम करता था, लेकिन मुझे एक फ्लोटिंग पॉइंट राउंडिंग त्रुटि से निपटने के लिए एक पंक्ति को संशोधित करना पड़ा जब 'अपेक्षित आकार' वास्तव में डबल 'वास्तविक आकार' है। 'GetSizeInPixels' के रिटर्न स्टेटमेंट को बदल दिया गया: 'नया google.maps.Point ( Math.round (10000 * Math.abs (sw.y - ne.y))/10000, Math.round (10000) * Math.abs (sw.x - ne.x))/10000 ); ' –

0

अब, विधि fitBounds एक दूसरा पैरामीटर कि गद्दी के आकार का प्रतिनिधित्व करता है। जो इसे हटाना चाहते हैं, उनके लिए आपको 0

Map.map.fitBounds(bounds, 0); 


New method signature: fitBounds(bounds:LatLngBounds|LatLngBoundsLiteral, padding?:number) 
संबंधित मुद्दे