【问题标题】:Multiple kml layers overlapping info window多个 kml 图层重叠信息窗口
【发布时间】:2014-05-23 22:24:21
【问题描述】:

我的谷歌地图中有 5 个 kml 图层,但是当从 A 层显示信息窗口并从 B 层单击标记时,B 的标记将重叠,或者有时“隐藏”在 A 层的信息窗口后面取决于 z-index。如果您单击同一图层中的另一个标记,则另一个信息窗口将关闭。我希望一次只打开一个信息窗口或最后一次单击的具有最高 z-index 的信息窗口(意思是在顶部)。

我已阅读 this 和 this 和 this。第一个链接告诉我以另一个顺序加载 kml 层(对我来说不是一个选项),第二个链接我不明白,第三个链接是首选行为。我认为第三个链接实际上是第二个链接的实现。

我尝试了第三个链接中给出的修复,我将它与我自己的代码结合起来:

    var map;
    var layers = [];
var infowindow = new google.maps.InfoWindow({});
// create a new info window for the KML (outage) layer and the geo-coded house marker
function addKmlClickHandler(layers) {
    google.maps.event.addListener(layers, "click", function(event) {
        infowindow.close();
        infowindow.setOptions({
            pixelOffset:    event.pixelOffset,
            content:        event.featureData.infoWindowHtml,
            position:       event.latLng
        });
        infowindow.open(map);
    });
}


      var lat = position.coords.latitude;
      var long = position.coords.longitude;
      var myLatLng = new google.maps.LatLng(lat,long);
        var myOptions = {
            zoom: 15,
    keyboardShortcuts : false, 
    mapTypeControl : false, 
    mapMaker : false, 
    overviewMapControl : false, 
    panControl : false, 
    rotateControl : false, 
    scaleControl : false, 
    scrollwheel : false, 
    streetViewControl : false,
    zoomControl : false, 
          center: myLatLng,
          mapTypeId: google.maps.MapTypeId.ROADMAP
        }
    //  alert('Your latitude is '+lat+' and longitude is '+long);



        map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
        layers [0] = new google.maps.KmlLayer('...', 
      {preserveViewport: true, suppressInfoWindows: false, map: map});
      google.maps.event.addListener(layers, 'click', function(kmlEvent) {
        alert('test');
    });
      layers [1] = new google.maps.KmlLayer('...', 
      {preserveViewport: true, suppressInfoWindows: false, map: map});
    layers [2] = new google.maps.KmlLayer('...', 
      {preserveViewport: true, suppressInfoWindows: false, map: map});
    layers [3] = new google.maps.KmlLayer('...', 
      {preserveViewport: true, suppressInfoWindows: false, map: map});
    layers [4] = new google.maps.KmlLayer('...', 
      {preserveViewport: true, suppressInfoWindows: false, map: map});
        /*var kmlUrl = '';
    var kmlOptions = {
      suppressInfoWindows: true,
      preserveViewport: true,
      map: map
    };

    var kmlLayer = new google.maps.KmlLayer(kmlUrl, kmlOptions); */
    //alert('kml data geladen?');
          var infowindow = new google.maps.InfoWindow({
          content: 'You are here!',
      });
        var image = '...';
        var marker = new google.maps.Marker({
          position: myLatLng,
          map: map,
          icon: image,
          title: 'You are here!',
      });
      infowindow.open(map,marker);

    }
 addKmlClickHandler(layers); // this should do the trick
for (var i = 0; i < layers.length; i++) {
        layers[i].setMap(null);
      }
  }

function toggleLayer(i) {
  if (layers[i].getMap() === null) {
    layers[i].setMap(map);
  }
  else {
    layers[i].setMap(null);
  }

}

但这不起作用。我究竟做错了什么?是否可以更容易地做到这一点,例如在kml layer marker 上查找点击事件,如果是,隐藏所有其他信息窗口?

    google.maps.event.addListener(layers[0], 'click', function(hideotherinfowindows) {
    ...
});

不幸的是,如果实际上可以隐藏除单击的信息窗口之外的所有信息窗口,我还没有找到任何地方。

【问题讨论】:

  • 您的代码无法正常工作。你能修复它并提供一个演示问题的小提琴吗?

标签: google-maps kml infowindow


【解决方案1】:
  1. 抑制 KmlLayers 上的自动信息窗口。
  2. 添加您自己的点击侦听器以打开点击信息窗口
  3. 只创建一个信息窗口,在标记之间移动它(使用相同的信息窗口作为“你在这里”标记)。

example

var infoWindow = new google.maps.InfoWindow();

function openIW(KMLevent) {
  infoWindow.close();
  infoWindow.setOptions(
    { 
     content: KMLevent.featureData.infoWindowHtml,
     position: KMLevent.latLng,
     pixelOffset: KMLevent.pixelOffset
    });
  infoWindow.open(map);
}

google.maps.event.addListener(layers[0], "click", openIW);
google.maps.event.addListener(layers[1], "click", openIW);
google.maps.event.addListener(layers[2], "click", openIW);
google.maps.event.addListener(layers[3], "click", openIW);
google.maps.event.addListener(layers[4], "click", openIW);
google.maps.event.addListener(map, "click", function() { infoWindow.close();});

working fiddle

【讨论】:

  • 1.我将每个 KML 层的 suppressInfoWindows:false 更改为 suppressInfoWindows:true。 2. 我已经添加了你的脚本,并包含了一个alert('test');。 3. 我已经添加了 5 次google.maps.event.addListener(layers[i], "click", openIW);,其中 i 是一个从 0 到 4 的数字。当我单击标记时,我看到一条警告消息,这意味着单击侦听器正常。当我删除警报时,我的信息窗口没有内容并显示在 gmap 的左上角(不在标记附近)。我不确定infoWindow.setOptions、FTevent.infoWindowHtml 和FTevent.latLng 是什么?到目前为止谢谢!
  • 您是否将您的代码与工作示例进行了比较?任何 javascript 错误?你能创建一个显示问题的小提琴吗?
  • 是的,我比较了我的代码,唯一不同的是你发布的答案。没有js错误。我做了一个 jsfiddle:jsfiddle.net/9nVN3 但我不知道为什么,只显示了 1 个 kml 提要(你应该看到 5 个不同颜色的标记)。我是使用 jsfiddle 的新手,所以在复制粘贴时我可能做错了什么。 (您需要接受地理位置才能看到它的工作)。
  • 请返工它不需要 GPS。这不会是问题的一个因素,只会让它变得更复杂(目标应该是Minimal, Complete, Tested and Readable example
  • 更新了我的答案,以说明 KmlMouseEvent 和 FusionTablesMouseEvent 之间的区别(原始代码来自 FusionTablesLayer 示例)。 working fiddle (does not require geolocation)
猜你喜欢
  • 2013-02-05
  • 1970-01-01
  • 1970-01-01
  • 2013-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-26
  • 2011-05-21
相关资源
最近更新 更多