简体   繁体   English

Google Maps v3 自定义标记图标位于中心,不会在地图上保持其位置

[英]Google Maps v3 custom marker icon is in center and does not keep its position on map

I am trying to implement FontAwesome icons as a marker on Google Maps.我正在尝试将FontAwesome图标实现为 Google 地图上的标记。 So far I made it work, but at the moment icons are in the middle of the screen, at they stay there no matter what (they refuse to be on the dedicated positions).到目前为止,我使它工作,但目前图标位于屏幕中间,无论如何它们都留在那里(它们拒绝在专用位置上)。

Example of the code at this JsFiddleJsFiddle中的代码示例

JS code: JS代码:

function FontAwesomeMarker(latlng, map, args) {
  this.latlng = latlng;
  this.args = args;
  this.setMap(map);
}

FontAwesomeMarker.prototype = new google.maps.OverlayView();

FontAwesomeMarker.prototype.draw = function() {
  var self = this,
    panes = this.getPanes(),
    marker = this.marker;

  if (!marker) {
    marker = this.marker = document.createElement('div');
    marker.className = 'marker';

    var icon = document.createElement('i');
    icon.className = 'fa fa-' + this.args.icon;
    icon.style.fontSize = this.args.fontSize;
    icon.style.color = this.args.color;
    icon.anchorPoint = new google.maps.Point(0, 49)
    marker.appendChild(icon);

    var point = this.getProjection().fromLatLngToDivPixel(this.latlng);
    if (point) {
      marker.style.left = (point.x - 25) + 'px';
      marker.style.top = (point.y - 25) + 'px';
    }

    google.maps.event.addDomListener(marker, "click", function(event) {
      alert('You clicked on a custom marker!');
      google.maps.event.trigger(self, "click");
    });

    panes.overlayImage.appendChild(marker);
  }
};

FontAwesomeMarker.prototype.remove = function() {
  if (this.marker) {
    this.marker.parentNode.removeChild(this.marker);
    this.marker = null;
  }
};

FontAwesomeMarker.prototype.getPosition = function() {
  return this.latlng;
};

function initialize() {
  var myLatlng = new google.maps.LatLng(-33.9, 151.2),
    mapOptions = {
      zoom: 15,
      center: myLatlng,
      disableDefaultUI: true
    };

  var map = new google.maps.Map(document.getElementById('map'), mapOptions);
  var markers = [{
      latLan: new google.maps.LatLng(-33.9, 151.2),
      icon: 'cutlery',
      color: '#346698',
      fontSize: '35px'
    },
    {
      latLan: new google.maps.LatLng(-33.8939, 151.207333),
      icon: 'anchor',
      color: '#B90C13',
      fontSize: '35px'
    },
    {
      latLan: new google.maps.LatLng(-33.895, 151.195),
      icon: 'automobile',
      color: '#39A00F',
      fontSize: '35px'
    },
    {
      latLan: new google.maps.LatLng(-33.905, 151.195),
      icon: 'headphones',
      color: '#000',
      fontSize: '35px'
    },
    {
      latLan: new google.maps.LatLng(-33.9039, 151.207333),
      icon: 'child',
      color: '#26C2C3',
      fontSize: '35px'
    },
  ]

  markers.forEach(function(item) {
    new FontAwesomeMarker(
      item.latLan,
      map, {
        icon: item.icon,
        color: item.color,
        fontSize: item.fontSize
      }
    );
  });
}

google.maps.event.addDomListener(window, 'load', initialize);

What am I doing wrong here?我在这里做错了什么?

You are missing marker.style.position = 'absolute';你缺少marker.style.position = 'absolute';

if (!marker) {
  marker = this.marker = document.createElement('div');
  marker.className = 'marker';
  marker.style.position = 'absolute';
  // <snip>

To get the markers to drag with the map, you also need to break the draw method apart, put some of it into an onAdd method (see the related question):要让标记与地图一起拖动,您还需要将draw方法分开,将其中的一部分放入onAdd方法中(请参阅相关问题):

FontAwesomeMarker.prototype.onAdd = function() {
      marker = this.marker = document.createElement('div');
      marker.className = 'marker';
    marker.style.position = 'absolute';

      var icon = document.createElement('i');
      icon.className = 'fa fa-' + this.args.icon;
      icon.style.fontSize = this.args.fontSize;
      icon.style.color = this.args.color;
    icon.anchor = new google.maps.Point(0, 49)
      marker.appendChild(icon);
    var panes = this.getPanes();
      panes.overlayImage.appendChild(marker);
}

FontAwesomeMarker.prototype.draw = function() {
    var self = this,
    marker = this.marker;

    var point = this.getProjection().fromLatLngToDivPixel(this.latlng);
        if (point) {
          marker.style.left = (point.x - 25) + 'px';
          marker.style.top = (point.y - 25) + 'px';
        }

      google.maps.event.addDomListener(marker, "click", function(event) {
        alert('You clicked on a custom marker!');           
        google.maps.event.trigger(self, "click");
      });

};

from this related question on HTMLMarker: Adding Custom Markers (HTMLMarkers) to Clustering来自关于 HTMLMarker 的相关问题: 将自定义标记 (HTMLMarkers) 添加到聚类

proof of concept fiddle概念证明小提琴

结果地图的屏幕截图

 function FontAwesomeMarker(latlng, map, args) { this.latlng = latlng; this.args = args; this.setMap(map); } FontAwesomeMarker.prototype = new google.maps.OverlayView(); FontAwesomeMarker.prototype.onAdd = function() { marker = this.marker = document.createElement('div'); marker.className = 'marker'; marker.style.position = 'absolute'; var icon = document.createElement('i'); icon.className = 'fa fa-' + this.args.icon; icon.style.fontSize = this.args.fontSize; icon.style.color = this.args.color; icon.anchor = new google.maps.Point(0, 49) marker.appendChild(icon); var panes = this.getPanes(); panes.overlayImage.appendChild(marker); google.maps.event.addDomListener(marker, "click", function(event) { alert('You clicked on a custom marker!'); google.maps.event.trigger(self, "click"); }); } FontAwesomeMarker.prototype.draw = function() { var self = this, marker = this.marker; var point = this.getProjection().fromLatLngToDivPixel(this.latlng); if (point) { marker.style.left = (point.x - 25) + 'px'; marker.style.top = (point.y - 25) + 'px'; } }; FontAwesomeMarker.prototype.remove = function() { if (this.marker) { this.marker.parentNode.removeChild(this.marker); this.marker = null; } }; FontAwesomeMarker.prototype.getPosition = function() { return this.latlng; }; function initialize() { var myLatlng = new google.maps.LatLng(-33.9, 151.2), mapOptions = { zoom: 15, center: myLatlng, disableDefaultUI: true }; var map = new google.maps.Map(document.getElementById('map'), mapOptions); var markers = [{ latLan: new google.maps.LatLng(-33.9, 151.2), icon: 'cutlery', color: '#346698', fontSize: '35px' }, { latLan: new google.maps.LatLng(-33.8939, 151.207333), icon: 'anchor', color: '#B90C13', fontSize: '35px' }, { latLan: new google.maps.LatLng(-33.895, 151.195), icon: 'automobile', color: '#39A00F', fontSize: '35px' }, { latLan: new google.maps.LatLng(-33.905, 151.195), icon: 'headphones', color: '#000', fontSize: '35px' }, { latLan: new google.maps.LatLng(-33.9039, 151.207333), icon: 'child', color: '#26C2C3', fontSize: '35px' }, ] markers.forEach(function(item) { new FontAwesomeMarker( item.latLan, map, { icon: item.icon, color: item.color, fontSize: item.fontSize } ); }); } google.maps.event.addDomListener(window, 'load', initialize);
 html, body, #map { height: 100%; } body { margin: 0; }
 <script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk"></script> <link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css"> <div id="map"></div>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM