创建事件监听器以动态创建google-map标记

时间:2015-08-08 03:51:40

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

我正在尝试创建一个页面,我将使用vba与excel集成。 。我希望在单击时将事件侦听器添加到标记。我几乎无法创建一个"点击监听器"单个标记,但我无法使用循环动态创建的多个标记。

点击标记时,我希望街景视图更新为新点击标记的位置。

我真的很感激任何建议。 谢谢。

这就是我所拥有的(来自这里和那里)。

<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
    <meta charset="utf-8">
    <title>Simple markers</title>
    <style>
      html, body, #map-canvas {
        height: 100%;
        margin: 0;
        padding: 0;
      }

    </style>
    <script src="https://maps.googleapis.com/maps/api/js?v=3.exp"></script>
    <script>


var labels = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; //me
var labelIndex = 0;                        //me
var map;
var panorama;

//this will be created from server side

    var markers = [
  { lat: 39.976784, lng: -75.234347, name: "marker 1" },
  { lat: 39.977043, lng: -75.235087, name: "marker 2" },
  { lat: 39.976097, lng: -75.234508, name: "marker 3" },
  { lat: 39.977059, lng: -75.233682, name: "marker 4" }
];
var myLatlng = new google.maps.LatLng(markers[0].lat,markers[0].lng);


function initialize() {
//var sv = new google.maps.StreetViewService();
panorama = new google.maps.StreetViewPanorama(document.getElementById('pano'));  


var mapOptions = {
  zoom: 16,
  center: myLatlng
 }
map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
var panoramaOptions = {

    navigationControl: true,
    position: myLatlng,
    //pov: {
    //heading: 34,
    //pitch: 10
    //}
};
// Set the initial Street View camera to the center of the map
new google.maps.StreetViewPanorama(document.getElementById('pano'),       
panoramaOptions);

//this is the loop that will creat the marker
for (index in markers) addMarker(markers[index]);
function addMarker(data) {
  // Create the marker
  var marker = new google.maps.Marker({
    position: new google.maps.LatLng(data.lat, data.lng),
    map: map,
    label: labels[labelIndex++ % labels.length],
    title: data.name
  });

}

}

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

</script>
</head>
<body>
<div id="map-excel" style="width: 60%; height: 100%;float:left"></div>
<div id="pano" style="width: 40%; height: 50%;float:right"></div>
<div id="map-canvas" style="width: 40%; height: 50%;float:right"></div>

</body>
</html>

3 个答案:

答案 0 :(得分:3)

  1. 保留对全景图的引用:
  2. // Set the initial Street View camera to the center of the map
    new google.maps.StreetViewPanorama(document.getElementById('pano'), panoramaOptions);
    

    应该是:

    // Set the initial Street View camera to the center of the map
    panorama = new google.maps.StreetViewPanorama(document.getElementById('pano'), panoramaOptions);
    
    1. 更改panorama点击监听器中的marker的位置。
    2. google.maps.event.addListener(marker,'click', function(e) {
         pano.setPosition(marker.getPosition());
      });
      

      proof of concept fiddle

      代码段

      &#13;
      &#13;
      var labels = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; //me
      var labelIndex = 0; //me
      var map;
      var panorama;
      
      //this will be created from server side
      
      var markers = [{
        lat: 39.976784,
        lng: -75.234347,
        name: "marker 1"
      }, {
        lat: 39.977043,
        lng: -75.235087,
        name: "marker 2"
      }, {
        lat: 39.976097,
        lng: -75.234508,
        name: "marker 3"
      }, {
        lat: 39.977059,
        lng: -75.233682,
        name: "marker 4"
      }];
      var myLatlng = new google.maps.LatLng(markers[0].lat, markers[0].lng);
      
      
      function initialize() {
        //var sv = new google.maps.StreetViewService();
        panorama = new google.maps.StreetViewPanorama(document.getElementById('pano'));
      
      
        var mapOptions = {
          zoom: 16,
          center: myLatlng
        }
        map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
        var panoramaOptions = {
      
          navigationControl: true,
          position: myLatlng,
          //pov: {
          //heading: 34,
          //pitch: 10
          //}
        };
        // Set the initial Street View camera to the center of the map
        pano = new google.maps.StreetViewPanorama(document.getElementById('pano'),
          panoramaOptions);
      
        //this is the loop that will creat the marker
        for (var index in markers) addMarker(markers[index]);
      
        function addMarker(data) {
          // Create the marker
          var marker = new google.maps.Marker({
            position: new google.maps.LatLng(data.lat, data.lng),
            map: map,
            label: labels[labelIndex++ % labels.length],
            title: data.name
          });
          google.maps.event.addListener(marker, 'click', function(e) {
            pano.setPosition(marker.getPosition());
          });
        }
      
      }
      
      google.maps.event.addDomListener(window, 'load', initialize);
      &#13;
      html,
      body,
      #map-canvas {
        height: 100%;
        margin: 0;
        padding: 0;
      }
      &#13;
      <script src="https://maps.googleapis.com/maps/api/js"></script>
      <div id="map-excel" style="width: 60%; height: 100%;float:left"></div>
      <div id="pano" style="width: 40%; height: 50%;float:right"></div>
      <div id="map-canvas" style="width: 40%; height: 50%;float:right"></div>
      &#13;
      &#13;
      &#13;

答案 1 :(得分:0)

在你的函数中(function(data){....})(data); 因为你使用了标记数组。

function addMarker(data) {
  (function(data){   <<-- New line added 
  // Create the marker
  var marker = new google.maps.Marker({
    position: new google.maps.LatLng(data.lat, data.lng),
    map: map,
    label: labels[labelIndex++ % labels.length],
    title: data.name
  });

  google.maps.event.addListener(marker, 'click', function(){// <<---- New line added
       // Code event listener .... 
  });// <<---- New line added

  })(data); // <<---- New line added
}

在此处查看更多示例:https://developers.google.com/maps/documentation/javascript/examples/infowindow-simple

答案 2 :(得分:-1)

//将此代码包含在循环中

var infowindow = new google.maps.InfoWindow({
    content: 'info content'
});
google.maps.event.addListener(marker, 'click', function() {
    infowindow.open(map,marker);
});