How can I create numbered map markers in Google Maps V3?

后端 未结 16 911
予麋鹿
予麋鹿 2020-11-28 18:13

I\'m working on a map that has multiple markers on it.

These markers use a custom icon, but I\'d also like to add numbers on top. I\'ve seen how this has been accomp

相关标签:
16条回答
  • 2020-11-28 18:48

    This how I do it in V3:

    I start by loading the google maps api and within the callback method initialize() I load MarkerWithLabel.js that I found here:

    function initialize() {
    
                $.getScript("/js/site/marker/MarkerWithLabel.js#{applicationBean.version}", function(){
    
                var mapOptions = {
                    zoom: 8,
                    center: new google.maps.LatLng(currentLat, currentLng),
                    mapTypeId: google.maps.MapTypeId.ROADMAP,
                    streetViewControl: false,
                    mapTypeControl: false
                };
    
                var map = new google.maps.Map(document.getElementById('mapholder'),
                        mapOptions);
    
                var bounds = new google.maps.LatLngBounds();
    
                for (var i = 0; i < mapData.length; i++) {
                    createMarker(i+1, map, mapData[i]); <!-- MARKERS! -->
                    extendBounds(bounds, mapData[i]);
                }
                map.fitBounds(bounds);
                var maximumZoomLevel = 16;
                var minimumZoomLevel = 11;
                var ourZoom = defaultZoomLevel; // default zoom level
    
                var blistener = google.maps.event.addListener((map), 'bounds_changed', function(event) {
                    if (this.getZoom(map.getBounds) &gt; 16) {
                        this.setZoom(maximumZoomLevel);
                    }
                    google.maps.event.removeListener(blistener);
                });
                });
            }
    
            function loadScript() {
                var script = document.createElement('script');
                script.type = 'text/javascript';
                script.src = "https://maps.googleapis.com/maps/api/js?v=3.exp&amp;libraries=places&amp;sensor=false&amp;callback=initialize";
                document.body.appendChild(script);
            }
    
            window.onload = loadScript;
    
        </script> 
    

    I then create the markers with createMarker():

    function createMarker(number, currentMap, currentMapData) {
    
       var marker = new MarkerWithLabel({
           position: new google.maps.LatLng(currentMapData[0], currentMapData[1]),
                     map: currentMap,
                     icon: '/img/sticker/empty.png',
                     shadow: '/img/sticker/bubble_shadow.png',
                     transparent: '/img/sticker/bubble_transparent.png',
                     draggable: false,
                     raiseOnDrag: false,
                     labelContent: ""+number,
                     labelAnchor: new google.maps.Point(3, 30),
                     labelClass: "mapIconLabel", // the CSS class for the label
                     labelInBackground: false
                    });
                }
    

    Since I added mapIconLabel class to the marker I can add some css rules in my css:

    .mapIconLabel {
        font-size: 15px;
        font-weight: bold;
        color: #FFFFFF;
        font-family: 'DINNextRoundedLTProMediumRegular';
    }
    

    And here is the result:

    MarkerWithIconAndLabel

    0 讨论(0)
  • 2020-11-28 18:51

    My two cents showing how to use the Google Charts API to solve this problem.

    0 讨论(0)
  • 2020-11-28 18:53

    This has now been added to the Mapping documentation and requires no third party code.

    You can combine these two samples:

    https://developers.google.com/maps/documentation/javascript/examples/marker-labels

    https://developers.google.com/maps/documentation/javascript/examples/icon-simple

    To get code like this:

    var labelIndex = 0;
    var labels = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789';
    
    function initialize() {
      var bangalore = { lat: 12.97, lng: 77.59 };
      var map = new google.maps.Map(document.getElementById('map-canvas'), {
        zoom: 12,
        center: bangalore
      });
    
      // This event listener calls addMarker() when the map is clicked.
      google.maps.event.addListener(map, 'click', function(event) {
        addMarker(event.latLng, map);
      });
    
      // Add a marker at the center of the map.
      addMarker(bangalore, map);
    }
    
    // Adds a marker to the map.
    function addMarker(location, map) {
      // Add the marker at the clicked location, and add the next-available label
      // from the array of alphabetical characters.
      var marker = new google.maps.Marker({
        position: location,
        label: labels[labelIndex],
        map: map,
        icon: 'image.png'
      });
    }
    
    google.maps.event.addDomListener(window, 'load', initialize);
    

    Note that if you have more than 35 markers, this method will not work as the label only shows the first character (using A-Z and 0-9 makes 35). Please vote for this Google Maps Issue to request that this restriction be lifted.

    0 讨论(0)
  • 2020-11-28 18:54

    I don't have enough reputation to comment on answers but wanted to note that the Google Chart API has been deprecated.

    From the API homepage:

    The Infographics portion of Google Chart Tools has been officially deprecated as of April 20, 2012.

    0 讨论(0)
  • 2020-11-28 18:54

    How about this? (year 2015)

    1) Get a custom marker image.

    var imageObj = new Image();
        imageObj.src = "/markers/blank_pin.png"; 
    

    2) Create a canvas in RAM and draw this image on it

    imageObj.onload = function(){
        var canvas = document.createElement('canvas');
        var context = canvas.getContext("2d");
        context.drawImage(imageObj, 0, 0);
    }
    

    3) Write anything above it

    context.font = "40px Arial";
    context.fillText("54", 17, 55);
    

    4) Get raw data from canvas and provide it to Google API instead of URL

    var image = {
        url: canvas.toDataURL(),
     };
     new google.maps.Marker({
        position: position,
        map: map,
        icon: image
     });
    

    Full code:

    function addComplexMarker(map, position, label, callback){
        var canvas = document.createElement('canvas');
        var context = canvas.getContext("2d");
        var imageObj = new Image();
        imageObj.src = "/markers/blank_pin.png";
        imageObj.onload = function(){
            context.drawImage(imageObj, 0, 0);
    
            //Adjustable parameters
            context.font = "40px Arial";
            context.fillText(label, 17, 55);
            //End
    
            var image = {
                url: canvas.toDataURL(),
                size: new google.maps.Size(80, 104),
                origin: new google.maps.Point(0,0),
                anchor: new google.maps.Point(40, 104)
            };
            // the clickable region of the icon.
            var shape = {
                coords: [1, 1, 1, 104, 80, 104, 80 , 1],
                type: 'poly'
            };
            var marker = new google.maps.Marker({
                position: position,
                map: map,
                labelAnchor: new google.maps.Point(3, 30),
                icon: image,
                shape: shape,
                zIndex: 9999
            });
            callback && callback(marker)
        };
    });
    
    0 讨论(0)
  • 2020-11-28 18:54

    Google Maps version 3 has built-in support for marker labels. No need to generate your own images anymore or implement 3rd party classes. Marker Labels

    0 讨论(0)
提交回复
热议问题