自定义InfoWindow内容>谷歌地图

时间:2011-11-20 07:25:34

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

我正在使用Google Maps API的位置图。期望的结果是:

  1. 包含多个位置的地图(已完成,经过测试,可根据需要运行)。
  2. 自定义引脚(已完成,经过测试,可根据需要使用)。
  3. ---我无法弄清楚的事情---

    1. 信息窗口中的自定义内容(点击图钉,信息窗口会打开,其中包含姓名,地址等等。)
    2. 位置地图列表中的链接,用于定位地图并打开信息窗口。
    3. 到目前为止

      JavaScript:

      function initialize() {
        var myOptions = {
        zoom: 11,
        center: new google.maps.LatLng(-33.802544,151.20203),
        mapTypeId: google.maps.MapTypeId.ROADMAP
        }
        var map = new google.maps.Map(document.getElementById("map_canvas"),myOptions);
        setMarkers(map, lianaraine);
      }
      
      var lianaLocations = [
        ['1', -33.750829,151.24086, 1],
        ['2', -33.846405,151.211677, 2],
        ['3', -33.876321,151.241171, 3],
        ['4', -33.871511,151.159599, 4],
        ['5', -33.901535,151.161743, 5],
        ['5', -33.676461,151.304244, 6]
      ];
      
      function setMarkers(map, locations) {
        var image = new google.maps.MarkerImage('images/icon_mapPin.png',
          new google.maps.Size(30, 40),
          new google.maps.Point(0,0),
          new google.maps.Point(0, 40));
        var shadow = new google.maps.MarkerImage('images/icon_mapPin_shadow.png',
          new google.maps.Size(26, 20),
          new google.maps.Point(0,0),
          new google.maps.Point(-13,21));
        var shape = {
          coord: [1, 1, 1, 40, 30, 40, 30 , 1],
          type: 'poly'
        };
        for (var i = 0; i < locations.length; i++) {
        var liana = locations[i];
        var myLatLng = new google.maps.LatLng(liana[1], liana[2]);
        var marker = new google.maps.Marker({
            position: myLatLng,
            map: map,
            shadow: shadow,
            icon: image,
            shape: shape,
            title: liana[0],
            zIndex: liana[3]
        });
        }
      }
      

      我正在使用V3 ......如果重要的话?

      我知道我很平静。任何协助或指示将不胜感激。

      提前致谢。

      @rrfive

1 个答案:

答案 0 :(得分:4)

所以你想要做的就是拥有一个infowindow,但它会为每个标记获得不同的内容。即内容及其位置响应用户点击而改变。因此,在创建标记的循环中,您还需要创建infowindow。但是,您需要将其分离到另一个函数,否则您最终会遇到每个信息窗口只包含最后一个标记的内容的情况。

function setMarkers(map, locations) {
  ...
  var infowindow =  new google.maps.InfoWindow({
    content: ''
  });

  for (var i = 0; i < locations.length; i++) {
    var liana = locations[i];
    var myLatLng = new google.maps.LatLng(liana[1], liana[2]);
    var marker = new google.maps.Marker({
      position: myLatLng,
      map: map,
      shadow: shadow,
      icon: image,
      shape: shape,
      title: liana[0],
      zIndex: liana[3]
    });

    // add an event listener for this marker
    bindInfoWindow(marker, map, infowindow, "<p>" + liana[0] + "</p>");
  }
}

function bindInfoWindow(marker, map, infowindow, html) {
    google.maps.event.addListener(marker, 'click', function() {
        infowindow.setContent(html);
        infowindow.open(map, marker);
    });
} 

我不确定你从哪里获得地址详细信息 - 在我的例子中,我只是使用你的数组的相同部分,你传递给'title'属性,然后我在infowindow中显示。可能你必须使用Geocoder service来查找每个latLng的地址,这可能是数组中的另一列。

更新:如果您需要一个正常的链接触发器,就像您点击了标记一样,您需要做的是将您的标记放在一个数组中(使其成为一个全局变量) ,在创建后将标记推入数组中)。单击链接会调用javascript函数,传入一个数字以标识要使用的数组中的哪个元素。然后,您'触发'点击该标记,例如

<a href="#" onclick="showWindow(0); return false">One</a>
<a href="#" onclick="showWindow(1); return false">Two</a>

function showWindow(id) {
    google.maps.event.trigger(markersArray[id], 'click');
}