2010-11-08 7 views
5
साथ सुविधाओं

लिंक: http://www1.qhoach.com/माउस खींचें OpenLayers

जब आप खींचते हैं, इस नक्शे ने उसे नकार दिया है ... लेकिन अगर आप के एम एल विशेषताएं (चक्र के साथ आइकन) पर खींचें, कुछ नहीं होता

उत्तर

13

सबसे पहले , आपके आवेदन में आपके प्रश्न में सर्कल आइकन के साथ वर्णित वेक्टर परत सहित चार स्तर के नक्शे हैं।

0: "Đường Sá"   ||---> Overlay Tiles 
    1: "Vệ Tinh"   ||---> Overlay Tiles 
    2: "TMS Overlay"  ||---> Markers ~ Icons 
    3: "KML"    ||---> Vector 

विश्लेषण: शून्य के साथ शुरू एक पिछले करने के लिए, केवल वेक्टर, पिछले एक लगता है दूसरों इस समस्या हम मार्कर परत पर ध्यान केंद्रित करने के लिए है आने के लिए tiles.In ओवरले के रूप में रहता है, अर्थात् सुविधाएँ (आइकन)।
जैसा कि आपने मानचित्र पर देखा है, click मानचित्र के लिए ईवेंट ट्रिगर किया गया है जब आप मानचित्र को खींचें। आप खींच नहीं सकते हैं क्योंकि ईवेंट पंजीकरण मार्कर परत के लिए पहले काम नहीं कर रहा है। इसका मतलब है मानचित्र को खींचने के लिए, क्लिक करने के बाद माउस (ड्रैग) को ले जाना चाहिए। चूंकि आप इसे वेक्टर परत पर आज़मा रहे हैं, तो घटना को ओवरले परतों को पारित करने का कोई मौका नहीं है।

समाधान:
मैं तुम्हें इस बग प्रकार समस्या को प्राप्त करने के दो तरीके का प्रस्ताव।

Let this be the long way
SelectFeatureHandler.Feature से विरासत में मिला है इस आम तौर पर नियंत्रित करने के रूप में जाना OpenLayers में एक नियंत्रण नहीं है hover.Which पर क्लिक करने पर ही किसी दिए गए परत से वेक्टर सुविधा का मतलब यह हैंडलर का जवाब कर सकते हैं अनुमति देता है किसी भी खींची गई सुविधाओं से संबंधित माउस इवेंट। केवल कॉलबैक सुविधाओं से जुड़े होते हैं, उनमें से एक की आवश्यकता पर क्लिक करें। अब हमें केवल ओवरले टाइल के लिए पैन करने के लिए ईवेंट पर क्लिक करना है।

var selectFeat = new OpenLayers.Control.SelectFeature(
        vector, {toggle: true, clickout:false}); 
    selectFeat.handlers['feature'].stopDown = false; 
    selectFeat.handlers['feature'].stopUp = false; 
    map.addControl(selectFeat);//instance of map 
    selectFeat.activate(); 

एक बार यह नियंत्रण सक्रिय होता है जब आप अपने परतों सुनिश्चित करने के लिए एक और layer.To के माध्यम से घटनाओं पारित करने के लिए है कि, बस

layer.events.fallThrough = true;//both for vector and marker layers 

के बाद इन सभी कार्यों को हम अब तक, एक आखिरी बात छोड़ दिया बनाया करते हैं करने के लिए: यह मार्कर और किमीएल परत के क्रम को स्विच कर रहा है।
And this should be the easiest way
layers.You पर z- सूचकांक परतों कि परत जो उच्चतम आईडी है के अनुक्रम ऊपर में जाँच कर सकते हैं कि यह भी उच्चतम z- सूचकांक है।

layer.setZIndex(...any number...); 

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

+0

आपको बहुत बहुत धन्यवाद! यह सही ढंग से काम करता है ... – KimKha

+0

मेरा प्रश्न भी उत्तर दिया! इसे थोड़ा सा संशोधित करना था लेकिन बेहद सहायक, धन्यवाद! – Jared

+0

भयानक दोस्त !!! धन्यवाद !!!! –

1

माउस घटनाएं नीचे परतों के लिए एक एसवीजी वेक्टर ओवरले के माध्यम से प्रचार नहीं करना चाहती हैं।

उपरोक्त समाधान सभी मार्कर HTML परतों की सभी वेक्टर एसवीजी परतों की तुलना में उच्च ज़िन्डेक्स की मांग करता है।

निम्नलिखित सीएसएस svg तत्व के माध्यम से घटनाओं का प्रचार,/आंशिक काम के आसपास एक क्षमता प्रदान करता है, लेकिन केवल जहां svg ओवरले के भीतर कोई वेक्टर तत्व:

/** Hack so mouse events propagate(bubble) through svg elements, but not the 
images within svg */ 
.olLayerDiv svg { 
    pointer-events: none; 
} 

.olLayerDiv svg * { 
    pointer-events: auto; 
} 

ऊपर CSS संयोजित fallThrough को जोड़ते समय : नक्शे, परतों और नियंत्रणों के भीतर सभी OpenLayers घटनाओं के ऑब्जेक्ट्स के लिए सच है।

// map events 
var map = new OpenLayers.Map(div, { fallThrough:true }); 

// layer events 
var lvec = new OpenLayers.Layer.Vector(....); 
lvec.events.fallThrough = true 
map.addLayers([lvec]) 

// all map controls 
var ctrl = new OpenLayers.Control.SelectFeature(lvec, {... 
    fallThrough: true, autoActivate:true }); 
map.addControl(ctrl) 
संबंधित मुद्दे