【问题标题】:Changing data in the info window with Google Map markers使用 Google 地图标记更改信息窗口中的数据
【发布时间】:2013-02-27 14:47:02
【问题描述】:

我已关注 this tutorial 创建自定义 Google 地图。我已经包含了一些其他元素,例如将其链接到 Wordpress 并将标记聚类。

除了每个标记的信息窗口中的信息外,一切都很好。我似乎无法更改每个信息中的信息。我认为通过更改以下几行会改变它,但没有任何影响:

var html = "<b>" + name + "</b> <br/>" + address;

This is the working map

我可以在哪里将自己的自定义数据放入窗口中?另外,如果我可以在上面设置窗口样式会更好。


看来是clusterer的问题,主要是这个部分,怎么把html内容放到info window里面?

function load() {
  var cluster = [];
  var map = new google.maps.Map(document.getElementById("map"), {
    center: new google.maps.LatLng(52.375599, -3.471680),
    zoom: 8,
    mapTypeId: 'roadmap'
  });
  var infowindow = new google.maps.InfoWindow();
  var min = .999999;
  var max = 1.000002;

  // Change this depending on the name of your PHP file
  downloadUrl("<?php bloginfo('stylesheet_directory'); ?>/phpsqlajax_genxml.php ", function(data) {
    var xml = data.responseXML;
    var markers = xml.documentElement.getElementsByTagName("marker");
    for (var i = 0; i < markers.length; i++) {
      var name = markers[i].getAttribute("name");
      var address = markers[i].getAttribute("address");
      var type = markers[i].getAttribute("type");

      var offsetLat = markers[i].getAttribute("lat") * (Math.random() * (max - min) + min);
      var offsetLng = markers[i].getAttribute("lng") * (Math.random() * (max - min) + min);

      var point = new google.maps.LatLng(offsetLat, offsetLng);
      var html = "<b>" + name + "</b> <br/>" + address;
      var icon = customIcons[type] || {};
      var marker = new google.maps.Marker({
        map: map,
        position: point,
        icon: icon.icon,
        shadow: icon.shadow
      });
      google.maps.event.addListener(marker, 'click', (function(marker, i) {
                    return function() {
                        // infowindow.setContent(markers[i].getAttribute("name"));
                        // infowindow.open(map, marker, html);
                        infowindow.setContent(html); infowindow.open(map, marker);
                    }
                })(marker, i));
      cluster.push(marker);
    }
    var mc = new MarkerClusterer(map,cluster);
  });
}

具体这个,不是把html内容通过clusterer放...至少这实际上是在改变window中的数据,只需要在不破坏clusterer的情况下输出html内容:

      google.maps.event.addListener(marker, 'click', (function(marker, i) {
                    return function() {
                        infowindow.setContent(markers[i].getAttribute("name"));
                        infowindow.open(map, marker, html);
                    }
                })(marker, i));
      cluster.push(marker);

到目前为止,我拥有的最接近的是这个,但它为每个标记显示相同的信息。它正在显示 html 内容:

      google.maps.event.addListener(marker, 'click', (function(marker, i) {
                    return function() {
                        // infowindow.setContent(markers[i].getAttribute("name"));
                        // infowindow.open(map, marker, html);
                        infowindow.setContent(html); infowindow.open(map, marker);
                    }
                })(marker, i));
      cluster.push(marker);

【问题讨论】:

  • 你能给你的代码加上html使用吗?
  • 首先我们需要创建 infowindow 对象吗?或者你省略了它。 var infowindow = 新的 google.maps.InfoWindow({content: html})。而在 addListener 中,infowindow.open(map, marker);从 addListener link 中删除 infowindow.setContent
  • 另一个linklink 2
  • 请尝试我提供的链接。特别是带有link2的那个
  • 将 addListener 中的 infowindow 代码替换为 infowindow.setContent(html); infowindow.open(地图, 标记);

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


【解决方案1】:

不敢相信我没有早点想到这个!

这只是在侦听器中构建字符串的一种情况。

  // Change this depending on the name of your PHP file
  downloadUrl("<?php bloginfo('stylesheet_directory'); ?>/phpsqlajax_genxml.php ", function(data) {
    var xml = data.responseXML;
    var markers = xml.documentElement.getElementsByTagName("marker");
    for (var i = 0; i < markers.length; i++) {
      var type = markers[i].getAttribute("type");

      var offsetLat = markers[i].getAttribute("lat") * (Math.random() * (max - min) + min);
      var offsetLng = markers[i].getAttribute("lng") * (Math.random() * (max - min) + min);

      var point = new google.maps.LatLng(offsetLat, offsetLng);
      var icon = customIcons[type] || {};
      var marker = new google.maps.Marker({
        map: map,
        position: point,
        icon: icon.icon,
        shadow: icon.shadow
      });
      google.maps.event.addListener(marker, 'click', (function(marker, i) {
                    return function() {
                        var name = markers[i].getAttribute("name");
                        var address = markers[i].getAttribute("address");
                        var html = "<b>" + name + "</b> <br/>" + address;
                        infowindow.setContent(html);
                        infowindow.open(map, marker, html);
                        // infowindow.setContent(html);
                        // infowindow.open(map, marker);
                    }
                })(marker, i));
      cluster.push(marker);
    }

【讨论】:

  • 它工作正常。在侦听器中构建 html 字符串就可以了。
  • 我现在也刚刚这样做了,是的,很有魅力。性能也比在侦听器外部的信息窗口的主构造函数中执行要好得多。在我的地图上获得巨大的性能提升!!!
【解决方案2】:

如果我没看错的话。您正在尝试在设置标记之后设置内容。

这应该是相反的。在将 html 推送到集群之前,将其移动到您设置 html 的位置。


编辑:

for (var i = 0; i < markers.length; i++) {
  var name = markers[i].getAttribute("name");
  var address = markers[i].getAttribute("address");
  var type = markers[i].getAttribute("type");

  var offsetLat = markers[i].getAttribute("lat") * (Math.random() * (max - min) + min);
  var offsetLng = markers[i].getAttribute("lng") * (Math.random() * (max - min) + min);

  var point = new google.maps.LatLng(offsetLat, offsetLng);
  //var html = "<b>" + name + "</b> <br/>" + address;
  var infowindow = new google.maps.InfoWindow({content: "<b>" + name + "</b> <br/>" + address});

  var icon = customIcons[type] || {};
  var marker = new google.maps.Marker({
    map: map,
    position: point,
    icon: icon.icon,
    shadow: icon.shadow
  });
  //google.maps.event.addListener(marker, 'click', (function(marker, i) {
  //              return function() {
  //                  infowindow.setContent(markers[i].getAttribute("name"));
  //                  infowindow.open(map, marker, html);
  //              }
  //          })(marker, i));
  google.maps.event.addListener(marker, 'click',  function(marker, i){infowindow.open(map,marker);})(marker, i);

  cluster.push(marker);
}

不确定 (marker, i) 部分。我假设标记管理器使用它们来跟踪是什么。这两个更改(我注释掉了您的行并在下面添加了一个)似乎是下一个合乎逻辑的步骤。

【讨论】:

  • 它非常接近工作,我刚刚尝试了 Ankit 的评论(上图),但它为每个标记显示相同的信息......不过它正在获取 html 内容。
  • 更改顺序似乎没有什么不同。
  • 感谢您回来。刚刚尝试了编辑后的答案,它似乎只绘制了一个没有信息窗口的标记。看来markers[i] 是必不可少的。我已经用最接近的方式更新了我的问题。
  • 您似乎正在尝试(并管理)使用 infowindow 对象而不实际定义它。您是否尝试过只输入一个定义以便它知道信息窗口是什么?
  • Infowindow 被进一步定义。我已将完整代码添加到我的问题中(第二个代码框)。
【解决方案3】:

我有一个类似的问题,我想通了,要更改标记信息窗口中的内容

    var marker = new MarkerWithLabel({
        id: "costume_ID",/*<---this is the start of the trick*/
        position: new google.maps.LatLng(lat,lon),
        icon: "../images/icon-bla.png",
        map: map,
        title: 'bla',
        labelContent: 'bla,bla,
        labelClass: "labels", 
        labelStyle: {opacity: 1.0}
    })
    google.maps.event.addListener(marker, 'click', (function() {
        return function(){
        infowindow.setContent(infor(this.id));/*<--- here is the trick*/
        infowindow.open(map, this);
        map.setCenter(this.getPosition());
    }});

然后设置将输出任何你想要的函数,如果你在变量中有信息的话。

    function infor(im){
        return "<div><b>INFOWINDOW</b><br>Date: "+var[im].date+"<br>Sync:  "+var[im].sync+"...bla,bla,bla</div>";
    }/*THIS FUNCTION RETURN THE STING TO SHOW ION THE INFOWINDOW*/

【讨论】:

    【解决方案4】:

    问题在于您的关闭。 for 循环未正确处理您的范围。将 for 循环中的所有代码提取到一个单独的函数中,闭包应该可以工作。

    【讨论】:

      猜你喜欢
      • 2011-02-24
      • 1970-01-01
      • 1970-01-01
      • 2014-09-26
      • 2017-08-09
      • 2018-10-15
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      相关资源
      最近更新 更多