【问题标题】:Google Maps V3 marker with label带标签的 Google Maps V3 标记
【发布时间】:2012-06-19 07:14:26
【问题描述】:

如果我的标记是在每个结果的 ajax 成功时填充的,我如何向我的标记添加标签。

map.gmap('addMarker', { 'position': new google.maps.LatLng(result.latitude, result.longitude) });

我试过这样,但没有成功:

map.gmap('addMarker', { 
    'position': new google.maps.LatLng(result.latitude, result.longitude), 
    'bounds': true,
    'icon': markerIcon,
    'labelContent': 'A',
    'labelAnchor': new google.maps.Point(result.latitude, result.longitude),
    'labelClass': 'labels', // the CSS class for the label
    'labelInBackground': false
});

【问题讨论】:

    标签: google-maps-api-3


    【解决方案1】:

    如果您只想在标记下方显示标签,那么您可以扩展 google maps Marker 为标签添加 setter 方法,您可以通过像这样扩展 google maps overlayView 来定义标签对象..

    <script type="text/javascript">
        var point = { lat: 22.5667, lng: 88.3667 };
        var markerSize = { x: 22, y: 40 };
    
    
        google.maps.Marker.prototype.setLabel = function(label){
            this.label = new MarkerLabel({
              map: this.map,
              marker: this,
              text: label
            });
            this.label.bindTo('position', this, 'position');
        };
    
        var MarkerLabel = function(options) {
            this.setValues(options);
            this.span = document.createElement('span');
            this.span.className = 'map-marker-label';
        };
    
        MarkerLabel.prototype = $.extend(new google.maps.OverlayView(), {
            onAdd: function() {
                this.getPanes().overlayImage.appendChild(this.span);
                var self = this;
                this.listeners = [
                google.maps.event.addListener(this, 'position_changed', function() { self.draw();    })];
            },
            draw: function() {
                var text = String(this.get('text'));
                var position = this.getProjection().fromLatLngToDivPixel(this.get('position'));
                this.span.innerHTML = text;
                this.span.style.left = (position.x - (markerSize.x / 2)) - (text.length * 3) + 10 + 'px';
                this.span.style.top = (position.y - markerSize.y + 40) + 'px';
            }
        });
        function initialize(){
            var myLatLng = new google.maps.LatLng(point.lat, point.lng);
            var gmap = new google.maps.Map(document.getElementById('map_canvas'), {
                zoom: 5,
                center: myLatLng,
                mapTypeId: google.maps.MapTypeId.ROADMAP
            });
            var myMarker = new google.maps.Marker({
                map: gmap,
                position: myLatLng,
                label: 'Hello World!',
                draggable: true
            });
        }
    </script>
    <style>
        .map-marker-label{
            position: absolute;
        color: blue;
        font-size: 16px;
        font-weight: bold;
        }
    </style>
    

    这会起作用。

    【讨论】:

    • 发挥了作用。谢谢大佬,你真棒!我希望你得到更多的支持,你的回答比蒂姆的回答要彻底 100%。
    • 绝对是最好的想法和答案。请记住,它可以使用更好的标签定位。此类也可以用作独立标签 - 没有标记。谢谢! :)
    • 谢谢你的回答帮助我。但是我在这里有一个问题,如何删除以前加载的多个标记的标签?谢谢提前。
    • "Uncaught TypeError: Cannot read property 'prototype' of undefined" for line "google.maps.Marker.prototype.setLabel = function(label)..." Google Maps API 已加载并正常工作.添加标记工作正常,但访问标记原型失败。
    • 绝对应该是公认的答案。无需插件,并且很容易根据您的特定需求进行调整。非常感谢您提供的出色解决方案!
    【解决方案2】:

    我怀疑标准库是否支持这一点。

    但您可以使用谷歌地图实用程序库:

    http://code.google.com/p/google-maps-utility-library-v3/wiki/Libraries#MarkerWithLabel

    var myLatlng = new google.maps.LatLng(-25.363882,131.044922);
    
    var myOptions = {
        zoom: 8,
        center: myLatlng,
        mapTypeId: google.maps.MapTypeId.ROADMAP
      };
    
    map = new google.maps.Map(document.getElementById('map_canvas'), myOptions);
    
    var marker = new MarkerWithLabel({
       position: myLatlng,
       map: map,
       draggable: true,
       raiseOnDrag: true,
       labelContent: "A",
       labelAnchor: new google.maps.Point(3, 30),
       labelClass: "labels", // the CSS class for the label
       labelInBackground: false
     });
    

    关于标记的基础知识可以在这里找到:https://developers.google.com/maps/documentation/javascript/overlays#Markers

    【讨论】:

    • 我对这些东西真的很陌生,所以我被卡住了。如果我添加 var 标记,map 属性有什么用?地图画布?
    • 谢谢,我猜的问题也是我使用jquery-ui-map。还是谢谢!
    • 好东西!我没有意识到有一个“MarkerWithLabel”类。
    • @AdrianFlorescu 你找到使用 jquery-ui-map 的解决方案了吗?
    【解决方案3】:

    在 3.21 版(2015 年 8 月)中对单字符标记标签的支持是 added to Google Maps。请参阅new marker label API

    您现在可以像这样创建标签标记:

    var marker = new google.maps.Marker({
      position: new google.maps.LatLng(result.latitude, result.longitude), 
      icon: markerIcon,
      label: {
        text: 'A'
      }
    });
    

    如果您希望取消 1 个字符的限制,请投票给this issue

    2016 年 10 月更新:

    此问题was fixed 和从版本 3.26.10 开始,Google 地图原生支持多个字符标签与使用 MarkerLabels 的自定义图标组合。

    【讨论】:

    • 仍然有极其有限的用途。当前的实际解决方案仍然是 MarkerWithLabel (或一些自滚动的实现)
    【解决方案4】:

    不使用插件的方法是创建 google 的 OverlayView() 方法的子类。

    https://developers.google.com/maps/documentation/javascript/reference?hl=en#OverlayView

    您创建一个自定义函数并将其应用于地图。

    function Label() { 
        this.setMap(g.map);
    };
    

    现在您为子类制作原型并添加 HTML 节点:

    Label.prototype = new google.maps.OverlayView; //subclassing google's overlayView
    Label.prototype.onAdd = function() {
            this.MySpecialDiv               = document.createElement('div');
            this.MySpecialDiv.className     = 'MyLabel';
            this.getPanes().overlayImage.appendChild(this.MySpecialDiv); //attach it to overlay panes so it behaves like markers
    

    }

    您还必须按照 API 文档中的说明实现 remove 和 draw 函数,否则这将不起作用。

    Label.prototype.onRemove = function() {
    ... // remove your stuff and its events if any
    }
    Label.prototype.draw = function() {
          var position = this.getProjection().fromLatLngToDivPixel(this.get('position')); // translate map latLng coords into DOM px coords for css positioning
    var pos = this.get('position');
                $('.myLabel')
                .css({
                    'top'   : position.y + 'px',
                    'left'  : position.x + 'px'
                })
            ;
    }
    

    这就是它的要点,你必须在你的具体实现中做更多的工作。

    【讨论】:

    • 抱歉,您的代码中的问号太多,无法使用:1)为什么“var pos = this.get('position');”在您的代码中,它未使用? 2)“函数标签(){”中的“g.map”在哪里引用? 3)没有关于如何使用代码的例子?我们应该用“new Label()”替换“new google.maps.Marker()”吗?
    【解决方案5】:

    您现在可以通过 google.maps.MarkerLabel 接口向标记标签添加类名。 例如:

    const marker = new google.maps.Marker({
          position: position_var,
          map,
          label: {
            text: 'label text',
            className: "my-label-class",
          },
          title: "Marker Title",
    });
    

    有关选项的完整列表,请参阅谷歌地图参考文档: https://developers.google.com/maps/documentation/javascript/reference/marker#MarkerLabel

    【讨论】:

      猜你喜欢
      • 2012-06-18
      • 2017-11-29
      • 1970-01-01
      • 1970-01-01
      • 2019-12-16
      • 2013-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多