2009-11-17 13 views
5

मेरा कोड एक .pantolatlong करता है तो एक .showinfoboxमैं बिंग मानचित्रों में एक इन्फोबॉक्स कैसे केन्द्रित और दिखा सकता हूं?

जानकारी बॉक्स दिखाई नहीं देता है, जब तक कि मैं pantolatlong को हटा नहीं देता। मुझे लगता है कि यह इसे रोक रहा है। मैंने इसे एंडपेन इवेंट में जोड़ने की कोशिश की लेकिन यह काम नहीं किया।

पुशपिन पर पैन करने और इसके लिए इन्फोबॉक्स प्रदर्शित करने का सबसे आसान तरीका क्या है?

मैं सेट सेंसर का उपयोग कर रहा था, लेकिन मुझे पता चला कि कभी-कभी सेट सेंसर पैन होता है, और यह इसे तोड़ देता है।

उत्तर

4

कुछ पागल गुगलिंग के बाद, मैं समाधान के साथ आया, और मैं इसे यहां साझा करूंगा ताकि अन्य उम्मीद कर सकें कि मैं जिस दुःख से गुजर रहा हूं।

मैंने शुद्ध जावास्क्रिप्ट, कोई एसडीके या आईफ्रेम समाधान का उपयोग करके अपने बिंग मानचित्र को बनाया और पावर किया। मेरे कोड में, मैं मानचित्र को इच्छित सभी पिन जोड़ने के लिए जावास्क्रिप्ट उत्पन्न करता हूं, और इसे एएसपीनेट लेबल का उपयोग करके इंजेक्ट करता हूं।

यदि आप अपने बिंग मानचित्र पर setCenter() विधि को कॉल करते हैं, तो यह आपके द्वारा निर्दिष्ट निर्देशांक को तत्काल मानचित्र, आश्चर्यचकित आश्चर्य सेट करना होगा। और यह ... ज्यादातर समय करता है। कभी-कभी, यह अंक के बीच पैन करने का फैसला करता है। यदि आप एक SetCenter करते हैं, तो ShowInfoBox के बाद, यह तब तक अच्छा काम करेगा जब तक कि यह पैन करने का निर्णय नहीं लेता।

समाधान? हम महान प्रोग्रामर होने के नाते, हम एसडीके में कूदते हैं, और यह पता चलता है कि ऐसी घटनाएं हैं जिनसे हम इनसे निपटने के लिए हुक कर सकते हैं। एक जबरदस्त घटना है, जो एक पैन पूरा होने के बाद ट्रिगर किया जाता है। एक ऑनवेंजव्यू इवेंट भी है, जो नक्शा कूदता है जब ट्रिगर करता है।

तो हम इन घटनाओं में हुक करते हैं, और हमारे पुशपिन आकार के लिए इन्फोबॉक्स प्रदर्शित करने का प्रयास करते हैं ... लेकिन कुछ भी नहीं होता है। क्यों नहीं?

घटना को बुलाए जाने पर अज्ञात कारणों से, आपको अपनी सांस पकड़ने के लिए कुछ मिलीसेकंड देना होगा। 10 मिलीसेकंड के साथ सेटटाइमआउट का उपयोग करना ठीक लगता है। आपका बॉक्स इसके बाद बहुत अच्छा दिखाई देगा।

अगली समस्या यह है कि आप इसे तब दिखाना चाहते हैं जब आप इसे अपने पुशपिन (मेरे मामले में, ऑनक्लिक विधियों वाली एक तालिका) के बीच फ्लिक करने के लिए इस्तेमाल करते हैं। मैं फ्लाई पर इवेंट हैंडलर बना/नष्ट करता हूं, हालांकि अन्य विकल्प हैं जैसे ग्लोबल वैरिएबल का उपयोग करने के लिए यह ट्रैक करने के लिए कि क्या उपयोगकर्ता पैनिंग कर रहा है, या यदि सिस्टम क्लिक के जवाब में पैनिंग कर रहा है।

अंत में, आपके पास एक बग है जो इससे आता है। यदि आप अपनी सूची में किसी स्थान पर क्लिक करते हैं, और यह उस स्थान पर कूदता/पैन करता है, तो इन्फोबॉक्स ठीक प्रदर्शित होगा। यदि उपयोगकर्ता इसे खारिज कर देता है, फिर सूची आइटम पर फिर से क्लिक करता है, तो मानचित्र नहीं चलता है, और इसलिए कोई ईवेंट ट्रिगर नहीं होता है।

मेरा समाधान यह पता लगाने के लिए है कि नक्शा स्थानांतरित हो गया है या नहीं, अपने लंबे/अक्षांश को रिकॉर्ड करके, और एक और सेटटाइमआउट विधि का उपयोग करके, यह पता लगाने के बाद कि क्या उन्होंने 100ms बाद में बदल दिया है। अगर उन्होंने नहीं किया, तो इन्फोबॉक्स प्रदर्शित करें।

ऐसी अन्य चीजें हैं जिन पर आपको ट्रैक रखने की आवश्यकता है, क्योंकि घटनाक्रमकों को पैरामीटर पास करने के लिए कोई रास्ता नहीं है, इसलिए मैं इसके लिए वैश्विक जावास्क्रिप्ट चर का उपयोग करता हूं - आपको यह जानना होगा कि आप किस पुशपिन आकार को प्रदर्शित कर रहे हैं, और यह देखने के लिए कि क्या वे बदल गए हैं, जांचने से पहले पिछले मैकोकोर्डिनेट्स का भी ट्रैक रखें।

मुझे यह सब एक साथ टुकड़ा करने में थोड़ी देर लग गई, लेकिन ऐसा लगता है कि यह काम करता है।

// An array of our pins to allow panning to them 
var myPushPins = []; 

// Used by the eventhandler 
var eventPinIndex; 
var oldMapCenter; 

// Zoom in and center on a pin, then show its information box 
function ShowPushPin(pinIndex) { 
    eventPinIndex = pinIndex; 
    oldMapCenter = map.GetCenter(); 
    map.AttachEvent("onendpan", EndPanHandler); 
    map.AttachEvent("onchangeview", ChangeViewHandler); 
    setTimeout("DetectNoMapChange();", 200); 

    map.SetZoomLevel(9); 
    map.SetCenter(myPushPins[pinIndex].GetPoints()[0]); 

} 


function EndPanHandler(e) { 
    map.DetachEvent("onendpan", EndPanHandler); 

    setTimeout("map.ShowInfoBox(myPushPins[eventPinIndex]);", 10); 

} 

function ChangeViewHandler(e) { 
    map.DetachEvent("onchangeview", ChangeViewHandler); 

    setTimeout("map.ShowInfoBox(myPushPins[eventPinIndex]);", 10); 

} 

function DetectNoMapChange(centerofmap) { 

    if (map.GetCenter().Latitude == oldMapCenter.Latitude && map.GetCenter().Longitude == oldMapCenter.Longitude) { 
     map.ShowInfoBox(myPushPins[eventPinIndex]); 
    } 
} 
3

यहाँ एक और तरीका है::

function addPushpin(lat,lon,pinNumber) { 
    var pinLocation = new Microsoft.Maps.Location(lat, lon); 

    var pin = new Microsoft.Maps.Pushpin(map.getCenter(), { text: pinNumber.toString() }); 

    pinInfobox = new Microsoft.Maps.Infobox(pinLocation, 
      { title: 'Details', 
       description: 'Latitude: ' + lat.toString() + ' Longitude: ' + lon.toString(), 
       offset: new Microsoft.Maps.Point(0, 15) 
      }); 


    map.entities.push(pinInfobox); 
    map.entities.push(pin); 

    pin.setLocation(pinLocation); 
    map.setView({ center: pinLocation}); 
} 
यहाँ मेरी कोड, कुछ वर्गों को निकाल दिया जाता है
संबंधित मुद्दे