2012-06-24 29 views
8

से पहले जावास्क्रिप्ट ओपनलेयर मैं ज़ूम शुरू होने से पहले वेक्टर परत को प्रदर्शित न करने के लिए ओपनलेयर सेट अप करने की कोशिश कर रहा हूं और ज़ूम समाप्त होने के बाद इसे फिर से दिखाना चाहता हूं।ज़ूम ईवेंट श्रोता

map = new OpenLayers.Map('map_element', { eventListeners: { "zoomend": mapEvent}}); 

function mapEvent(event) { 
    if(event.type == "zoomend") { 
     hide_vector_layer(); 
     } 
} 

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

कारण मैं ऐसा करने का प्रयास कर रहा हूं, क्योंकि मुझे पसंद नहीं है कि बेस परत के रूप में Google मानचित्र का उपयोग करते समय वेक्टर परत अलग-अलग दर पर कैसे ज़ूम करता है। यह गलत लगता है, ऐसा लगता है कि सभी सुविधाएं गलत हैं, भले ही वे ज़ूम पूरा होने के बाद सही जगह पर उतरें।

कोई सुझाव?

उत्तर

2

इस उद्देश्य के लिए आपको ज़ूमिंग को छोड़कर किसी भी कार्रवाई के लिए ट्रिगर करने के लिए movestart ईवेंट को ट्रिगर करने के लिए OpenLayers.Map के ByPx विधियों को स्थानांतरित करना चाहिए।

+0

धन्यवाद, यह काम करता है। – renosis

2

मुझे वही समस्या थी जो ओपी था, और मैंने इसे ड्रनेक्स्टिस के समाधान के साथ हल करने की कोशिश की। लेकिन दुर्भाग्य से यह पूरी तरह से काम नहीं करता है :: zoomChanged ओपनलेयर में संपत्ति .Map.moveTo true का मूल्यांकन करता है न केवल जब ज़ूम स्तर बदल जाता है, बल्कि नक्शा का आकार बदलता है।

मेरा नक्शा उपयोगकर्ता की ब्राउज़र विंडो का 100% था, इसलिए यदि उन्होंने विंडो का आकार बदल दिया, तो ईवेंट ट्रिगर हो जाएगा। यह मेरे लिए अवांछनीय था, क्योंकि ज़ूम स्तर वास्तव में बदल गया था, क्योंकि मैं केवल घटना को ट्रिगर करना चाहता था। मेरा समाधान एक नया कार्यक्रम बनाना था, जिसे "ज़ूमस्टार्ट" कहा जाता था, जिसे मैंने OpenLayers.Map.moveTo के शीर्ष पर डाला था। कोड यह रहा:

var getZoom = this.getZoom(); 
if (!!getZoom && !!zoom && this.isValidZoomLevel(zoom) && getZoom != zoom) 
    this.events.triggerEvent("zoomstart", zoom); 

इस कोड को एक घटना श्रोता कि zoomstart के लिए पंजीकृत है को नए ज़ूम स्तर पारित करेंगे, और मेरे मामले में मैं नक्शे के restrictedExtent निर्धारित करने और कर नए ज़ूम स्तर के आधार पर अन्य सामग्री।

शांति आपके साथ रहें।

8

ओपनलेयर को 'पहले ज़ूम' ईवेंट जोड़ने में आसान है। बस नीचे दिया गया कोड जोड़ें जहां आपने अपना नक्शा ऑब्जेक्ट बनाया था।

map.zoomToProxy = map.zoomTo; 
map.zoomTo = function (zoom,xy){ 
    //Your Before Zoom Actions 

    //If you want zoom to go through call 
    map.zoomToProxy(zoom,xy); 
    //else do nothing and map wont zoom 
}; 

यह कैसे काम करता है:

गतिविधि जूमिंग के किसी भी प्रकार के लिए, OpenLayers एपीआई अंत में समारोह zoomTo कहा जाता है कहते हैं। तो इसे ओवरराइड करने से पहले, हम उस फ़ंक्शन को 'zoomToProxy' नामक एक नए फ़ंक्शन पर कॉपी करते हैं। हम इसे ओवरराइड करते हैं और हमारे सशर्त ज़ूम तर्क जोड़ते हैं। अगर हम ज़ूम करना चाहते हैं तो हम सिर्फ नए प्रॉक्सी फ़ंक्शन को कॉल करें :)

+0

यह दृष्टिकोण काम करता है, लेकिन केवल अधिक सुरक्षित होने के लिए आपको फ़ंक्शन के अंदर की रेखा को map.zoomToProxy में प्रतिस्थापित करना चाहिए।आवेदन करें (यह, तर्क); इसलिए यदि वे ज़ूम करने के लिए नए तर्क जोड़ते हैं तो वे भी पास हो जाते हैं। – Hoffmann

+0

आह मैं यह भी उल्लेख करना भूल गया था कि ओपनलेयर एपीआई ज़ूम करने से पहले ज़ूम करने के लिए ज़ूम करता है, ताकि आप चीजों को करने के लिए पहली टिप्पणी से पहले कोड का उपयोग कर सकें जैसे कि यह 'ज़ूमस्टार्ट' ईवेंट था। उदाहरण के लिए आप ज़ूम को होने से रोक सकते हैं। – Hoffmann

+0

दोनों मायने रखता है। धन्यवाद! – Shaunak

0

"शुनक" का समाधान मेरे लिए बहुत अच्छा काम करता है। मैं 11 से नीचे जूमिंग प्रतिबंधित करना चाहते हैं तो अपने कोड संपादित के रूप में

if (zoom > 11) { 
    map.zoomToProxy(zoom, xy); 
} 
+2

इसे शुनक के उत्तर पर * टिप्पणी * के रूप में पोस्ट किया जाना चाहिए, एक अलग उत्तर के रूप में नहीं। – colllin

1

"movestart" "zoomstart" संभालती है। ज़ूमस्टार्ट का पता लगाने के लिए, कोशिश करें:

map.events.register("movestart",map, function(e) { 
     if(e.zoomChanged) 
     { 
     //zoom start code here 
     } 

    }); 
संबंधित मुद्दे