2012-06-15 18 views
18

के साथ Google मानचित्र API v3 मार्कर मैं जेएस और Google एपीआई के लिए नया हूं और मैं प्रत्येक लेबल को एकाधिक मार्कर बनाने की कोशिश कर रहा हूं।लेबल

छोटे स्निपेट से मैं देख रहा हूं, Google मानचित्र API v3 में किसी मार्कर को लेबल संलग्न करने का कोई आसान तरीका नहीं था। Google और stackoverflow खोजों के बीच, प्रत्येक ने एक चौराहे प्रक्रिया का उपयोग किया जिसमें लेबल वर्ग बनाने या संपादित करने में शामिल था।

मैं सिर्फ यह जानना चाहता हूं कि प्रत्येक मार्कर को एक सरल तरीके से लेबल कैसे संलग्न करें क्योंकि मैं अभी जेएस/Google एपीआई v3 सीखना शुरू कर रहा हूं।

धन्यवाद

संपादित # 3: ठीक है, मैं अंत में पता लगा है कि क्या गलत था और सही ढंग से Lilina के कोड का उपयोग लेबल के साथ कई मार्कर लागू किया। स्पष्ट रूप से हम दोनों ने अलग-अलग नक्शा को अलग-अलग परिभाषित किया है और यह स्वयं हमारे कोड दोनों को सिंक्रनाइज़ करने में असमर्थ बनाता है।

मेरे पास अब एक अतिरिक्त प्रश्न है कि मैं प्रत्येक मार्कर के लिए लेबल का उपयोग करने में सक्षम हूं। मैं उपयोगकर्ता के ज़ूम स्तर के आधार पर मार्कर और उनके लेबल को छिपाने में सक्षम होना चाहता हूं।

Google Maps API v3 - Different markers/labels on different zoom levels

उत्तर

39

मैं इसे सरल है गारंटी नहीं दे सकते, लेकिन मैं MarkerWithLabel पसंद है। जैसा कि the basic example में दिखाया गया है, सीएसएस शैलियों ने लेबल की उपस्थिति को परिभाषित किया है और जावास्क्रिप्ट में विकल्प सामग्री और प्लेसमेंट को परिभाषित करते हैं।

.labels { 
    color: red; 
    background-color: white; 
    font-family: "Lucida Grande", "Arial", sans-serif; 
    font-size: 10px; 
    font-weight: bold; 
    text-align: center; 
    width: 60px;  
    border: 2px solid black; 
    white-space: nowrap; 
} 

जावास्क्रिप्ट:

var marker = new MarkerWithLabel({ 
    position: homeLatLng, 
    draggable: true, 
    map: map, 
    labelContent: "$425K", 
    labelAnchor: new google.maps.Point(22, 0), 
    labelClass: "labels", // the CSS class for the label 
    labelStyle: {opacity: 0.75} 
}); 

ही हिस्सा भ्रमित किया जा सकता है कि labelAnchor है। डिफ़ॉल्ट रूप से, लेबल का शीर्ष बायां कोने मार्कर पुशपिन के एंडपॉइंट तक लाइन करेगा। सीएसएस चौड़ाई संपत्ति में परिभाषित आधे चौड़ाई तक लेबल एंकर का एक्स-वैल्यू सेट करना लेबल को केंद्रित करेगा। आप new google.maps.Point(22, 50) जैसे एंकर पॉइंट के साथ मार्कर पुशपिन के ऊपर लेबल फ़्लोट कर सकते हैं।

यदि उपरोक्त लिंक तक पहुंच अवरुद्ध है, तो मैंने इस JSFiddle demo में मार्करविथलैबेल के packed source की प्रतिलिपि बनाई और चिपका दी।मुझे उम्मीद है कि चीन में जेएसएफडल की अनुमति है: |

+0

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

+0

शायद पृष्ठ को लोड होने के क्रम में करना होगा, उदाहरण के लिए, यदि शरीर लोड होने के बाद जावास्क्रिप्ट लोड हो जाता है। –

+0

यह एक अच्छा है .. लेकिन मार्करों की संख्या बहुत बड़ी होने पर लेबल को प्रदर्शित करने में काफी समय लगता है .. क्या इस समस्या –

5

मानचित्र आप एक कस्टम ओवरले बनाने की जरूरत के लिए एक लेबल जोड़ने के लिए। http://blog.mridey.com/2009/09/label-overlay-example-for-google-maps.html पर नमूना एक कस्टम क्लास, Layer का उपयोग करता है, जो Google मानचित्र API से OverlayView (जो MVCObject से प्राप्त होता है) से प्राप्त होता है। उन्होंने कहा कि एक संशोधित संस्करण है (दृश्यता के लिए समर्थन जोड़ता, zindex और एक क्लिक करें घटना) यहां पाया जा सकता है जो: http://blog.mridey.com/2011/05/label-overlay-example-for-google-maps.html

निम्नलिखित कोड सीधे मार्क Ridey के ब्लॉग (ऊपर संशोधित लिंक) से लिया जाता है।

लेयर वर्ग

// Define the overlay, derived from google.maps.OverlayView 
function Label(opt_options) { 
    // Initialization 
    this.setValues(opt_options); 


    // Label specific 
    var span = this.span_ = document.createElement('span'); 
    span.style.cssText = 'position: relative; left: -50%; top: -8px; ' + 
    'white-space: nowrap; border: 1px solid blue; ' + 
    'padding: 2px; background-color: white'; 


    var div = this.div_ = document.createElement('div'); 
    div.appendChild(span); 
    div.style.cssText = 'position: absolute; display: none'; 
}; 
Label.prototype = new google.maps.OverlayView; 


// Implement onAdd 
Label.prototype.onAdd = function() { 
    var pane = this.getPanes().overlayImage; 
    pane.appendChild(this.div_); 


    // Ensures the label is redrawn if the text or position is changed. 
    var me = this; 
    this.listeners_ = [ 
    google.maps.event.addListener(this, 'position_changed', function() { me.draw(); }), 
    google.maps.event.addListener(this, 'visible_changed', function() { me.draw(); }), 
    google.maps.event.addListener(this, 'clickable_changed', function() { me.draw(); }), 
    google.maps.event.addListener(this, 'text_changed', function() { me.draw(); }), 
    google.maps.event.addListener(this, 'zindex_changed', function() { me.draw(); }), 
    google.maps.event.addDomListener(this.div_, 'click', function() { 
     if (me.get('clickable')) { 
     google.maps.event.trigger(me, 'click'); 
     } 
    }) 
    ]; 
}; 

// Implement onRemove 
Label.prototype.onRemove = function() { 
this.div_.parentNode.removeChild(this.div_); 

// Label is removed from the map, stop updating its position/text. 
for (var i = 0, I = this.listeners_.length; i < I; ++i) { 
    google.maps.event.removeListener(this.listeners_[i]); 
} 
}; 

// Implement draw 
Label.prototype.draw = function() { 
var projection = this.getProjection(); 
var position = projection.fromLatLngToDivPixel(this.get('position')); 

var div = this.div_; 
div.style.left = position.x + 'px'; 
div.style.top = position.y + 'px'; 
div.style.display = 'block'; 

this.span_.innerHTML = this.get('text').toString(); 
}; 

प्रयोग

<html> 
    <head> 
    <meta http-equiv="content-type" content="text/html; charset=utf-8"> 
    <title> 
     Label Overlay Example 
    </title> 
    <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> 
    <script type="text/javascript" src="label.js"></script> 
    <script type="text/javascript"> 
     var marker; 


     function initialize() { 
     var latLng = new google.maps.LatLng(40, -100); 


     var map = new google.maps.Map(document.getElementById('map_canvas'), { 
      zoom: 5, 
      center: latLng, 
      mapTypeId: google.maps.MapTypeId.ROADMAP 
     }); 


     marker = new google.maps.Marker({ 
      position: latLng, 
      draggable: true, 
      zIndex: 1, 
      map: map, 
      optimized: false 
     }); 


     var label = new Label({ 
      map: map 
     }); 
     label.bindTo('position', marker); 
     label.bindTo('text', marker, 'position'); 
     label.bindTo('visible', marker); 
     label.bindTo('clickable', marker); 
     label.bindTo('zIndex', marker); 


     google.maps.event.addListener(marker, 'click', function() { alert('Marker has been clicked'); }) 
     google.maps.event.addListener(label, 'click', function() { alert('Label has been clicked'); }) 
     } 


     function showHideMarker() { 
     marker.setVisible(!marker.getVisible()); 
     } 


     function pinUnpinMarker() { 
     var draggable = marker.getDraggable(); 
     marker.setDraggable(!draggable); 
     marker.setClickable(!draggable); 
     } 
    </script> 
    </head> 
    <body onload="initialize()"> 
    <div id="map_canvas" style="height: 200px; width: 200px"></div> 
    <button type="button" onclick="showHideMarker();">Show/Hide Marker</button> 
    <button type="button" onclick="pinUnpinMarker();">Pin/Unpin Marker</button> 
    </body> 
</html> 
+0

क्या फ़ंक्शन लेबल डिफ़ॉल्ट Google से अलग है? यदि हां, तो मैं इसे कैसे बदलूं? मैं वर्तमान में कोड के दूसरे ब्लॉक से अपने लेबल स्निपेट को लागू करने की कोशिश कर रहा हूं, लेकिन मुझे कोई लेबल दिखाने के लिए नहीं मिल रहा है। – krikara

+0

लेबल क्लास एक कस्टम क्लास है जो एपीआई का हिस्सा नहीं है। ऊपर दूसरे स्निपेट में label.js का संदर्भ है, जहां पहला कोड स्निपेट रहता है। आपको कुछ कोड पोस्ट करने की आवश्यकता हो सकती है ताकि हम देख सकें कि क्या हो रहा है। – Jonathan

+2

आपके पास MarkerWithTag.prototype.onRemove दिखाई देता है और आपके जावास्क्रिप्ट में दो बार आकर्षित होता है, केवल एक बार कार्यों की आवश्यकता होती है। –

1

ऊपर समाधान ipad-2

हाल ही में मैं एक सफारी ब्राउज़र दुर्घटना मुद्दा जबकि मार्कर की साजिश रचने भले ही मार्करों के कम संख्या में हैं किया था पर अभ्यस्त काम। शुरुआत में मैं मार्कर को प्लॉट करने के लिए लेबल (markerwithlabel.js) लाइब्रेरी के साथ मार्कर का उपयोग कर रहा था, जब मैं Google मूल मार्कर का उपयोग करता हूं तो यह बड़ी संख्या में मार्करों के साथ भी ठीक काम कर रहा था लेकिन मुझे अनुकूलित मार्कर चाहिए, इसलिए मैं जोनाथन द्वारा दिए गए उपरोक्त समाधान को संदर्भित करता हूं लेकिन अभी भी क्रैशिंग मुद्दे को हल करने के बाद हल नहीं किया गया है, मुझे http://nickjohnson.com/b/google-maps-v3-how-to-quickly-add-many-markers इस ब्लॉग पर पता चला है और अब मेरी नक्शा खोज आईपैड -2 पर आसानी से काम कर रही है :)