【问题标题】:Google maps custom layer with clickable markers带有可点击标记的谷歌地图自定义图层
【发布时间】:2020-01-22 16:19:07
【问题描述】:

有没有办法在 Google 地图上添加自定义图层而不会丢失点击标记的选项?

https://jsfiddle.net/hxyn9Lae/3/

到目前为止,我有这段代码,但标记不再是可点击的。而且我不想用InfoWindow,因为以后层会复杂很多。

var locations = [];


// Locations
locations = [
  ['1', 'Colliers Wood Station', 51.418187, -0.178096],
  ['2', 'Tandem Centre', 51.413675, -0.1772],
  ['3', 'Horatio Nelson Memorial', 51.413728, -0.192231]
];

function initialize() {

    var mapOptions = {
            mapTypeId: google.maps.MapTypeId.ROADMAP,
        };

        map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);

        var bounds = new google.maps.LatLngBounds();

        var layer = `
            <div class="map-layer">
                <h6></h6>
            </div>
        `;

        for (i = 0; i < locations.length; i++) {
            marker = new google.maps.Marker({
                title: locations[i][1],
                position: new google.maps.LatLng(locations[i][2], locations[i][3]),
                map: map
            });

            bounds.extend(marker.position);

            google.maps.event.addListener(marker, 'click', (function (marker, i) {
                return function () {
                    $('#map-canvas').prepend(layer);
                    $('#map-canvas h6').text(locations[i][1]);
                }
            })(marker, i));
        }

        map.fitBounds(bounds);
}


initialize();

任何帮助都会很棒。

【问题讨论】:

    标签: javascript google-maps google-maps-api-3 google-maps-markers


    【解决方案1】:

    尽管您的代码使用的是覆盖的 div 而不是真正的 custom overlay,但您仍然可以通过在 CSS 中为覆盖的 pointer-events 禁用 pointer-events 来实现所需的行为div(在您的情况下,它是map-layer 类)。

    这允许您“点击”在地图上分层的div

    使用小提琴代码的示例:

    var locations = [];
    
    // Locations
    locations = [
      ['1', 'Colliers Wood Station', 51.418187, -0.178096],
      ['2', 'Tandem Centre', 51.413675, -0.1772],
      ['3', 'Horatio Nelson Memorial', 51.413728, -0.192231]
    ];
    
    function initialize() {
    
      var mapOptions = {
        scrollwheel: false,
        draggable: true,
        navigationControl: false,
        mapTypeControl: false,
        scaleControl: false,
        streetViewControl: false,
        mapTypeId: google.maps.MapTypeId.ROADMAP,
      };
    
      map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
    
      var bounds = new google.maps.LatLngBounds();
    
    
      var layer = `
                <div class="map-layer">
                	<h6></h6>
                </div>
            `;
    
      for (i = 0; i < locations.length; i++) {
        marker = new google.maps.Marker({
          title: locations[i][1],
          position: new google.maps.LatLng(locations[i][2], locations[i][3]),
          map: map
        });
    
        bounds.extend(marker.position);
    
        google.maps.event.addListener(marker, 'click', (function(marker, i) {
          return function() {
            $('#map-canvas').prepend(layer);
            $('#map-canvas h6').text(locations[i][1]);
          }
        })(marker, i));
      }
    
      map.fitBounds(bounds);
    
      var listener = google.maps.event.addListener(map, "idle", function() {
        map.setZoom(14);
        google.maps.event.removeListener(listener);
      });
    
    }
    
    
    initialize();
    #map-canvas {
      width: 100%;
      height: 300px;
    }
    
    .map-layer {
      position: absolute;
      pointer-events: none;
      z-index: 1;
      top: 0;
      right: 0;
      bottom: 0;
      left: 0;
      background-color: rgba(255, 255, 255, .5);
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://maps.googleapis.com/maps/api/js?sensor=false"></script>
    <div id="map-canvas"></div>

    请注意,您也可以在子元素上启用pointer-events,即使它们在父元素上被禁用。

    【讨论】:

    • 这听起来不错,谢谢你的建议。我注意到我实际上并没有很好地解释我需要什么。我实际上不需要单击标记,我想更改单击图标的路径,例如google.com/mapfiles/marker_green.png 并移到图层上方,因此会被强调。更新jsfiddle.net/hxyn9Lae/5
    • 更新了 JS Fiddle 与关闭功能 jsfiddle.net/hxyn9Lae/7 所以唯一缺少的是以某种方式将点击的标记移动到图层上方。
    • 我使用多边形创建了一个新版本,但现在图层上方的所有标记。我需要移动图层下的所有标记,除了我刚刚单击的标记。 jsfiddle.net/hxyn9Lae/9
    • @levipadre 您可以设置其他标记的不透明度,使它们看起来好像在单击的标记后面。请参阅小提琴:jsfiddle.net/jmg157/ntfejsxk 在单击第二个、第三个等标记后,您需要添加一行来重置其他未单击标记的不透明度,但这应该使用相同的代码非常简单。
    • 我看到这个答案最近被否决了。有什么解释可以让我改进答案吗?
    猜你喜欢
    • 1970-01-01
    • 2016-09-20
    • 2013-05-20
    • 2015-01-28
    • 1970-01-01
    • 2012-09-27
    • 2017-09-04
    • 2015-12-04
    • 2013-08-21
    相关资源
    最近更新 更多