代码之家  ›  专栏  ›  技术社区  ›  HCI

将infoWindow纳入gmaps markerclusterer时出现问题

  •  0
  • HCI  · 技术社区  · 8 年前

    我在将infoWindow添加到现有的gmaps markerclusterer项目中时遇到问题。我知道也有类似的问题,但我看到的答案并不奏效。这可能是因为我对这一点还很陌生,缺少了一些东西。

    下面是我没有信息窗口的代码。每个标记都是从中的lat/long生成的。jason数据文件。 “预尝试”代码:

        <script src="https://maps.googleapis.com/maps/api/js"></script>
        <script src="data.json"></script>
        <script type="text/javascript" src="markerclusterer.js"></script>
    
        <script>
          function initialize() {
            var center = new google.maps.LatLng(34.777491, 64.5852620);
    
            var map = new google.maps.Map(document.getElementById('map'), {
              zoom: 3,
              center: center,
              mapTypeId: google.maps.MapTypeId.ROADMAP
            });
    
            var markers = [];
            for (var i = 0; i < 100; i++) {
              var dataPhoto = data.photos[i];
              var latLng = new google.maps.LatLng(dataPhoto.latitude,
                  dataPhoto.longitude);
              var marker = new google.maps.Marker({
                position: latLng,
                icon: "images/gps.svg"
              });
              markers.push(marker);
            }
            var markerCluster = new MarkerClusterer(map, markers, 
            {imagePath:'images/m'});
          }
          google.maps.event.addDomListener(window, 'load', initialize);
          </script>
    
          <script>
          var _gaq = _gaq || [];
          _gaq.push(['_setAccount', 'UA-12846745-20']);
          _gaq.push(['_trackPageview']);
    
          (function() {
            var ga = document.createElement('script'); ga.type = 
          'text/javascript'; ga.async = true;
            ga.src = ('https:' === document.location.protocol ? 'https://ssl' : 
          'http://www') + '.google-analytics.com/ga.js';
            var s = document.getElementsByTagName('script')[0]; 
          s.parentNode.insertBefore(ga, s);
          })();
        </script>
    
      <body>
        <div id="map-container"><div id="map"></div></div>
      </body>
    

    尝试但不工作的代码:

    <script src="https://maps.googleapis.com/maps/api/js"></script>
        <script src="data.json"></script>
        <script type="text/javascript" src="markerclusterer.js"></script>
    
        <script>
          function initialize() {
            var center = new google.maps.LatLng(34.777491, 64.5852620);
    
            var map = new google.maps.Map(document.getElementById('map'), {
              zoom: 3,
              center: center,
              mapTypeId: google.maps.MapTypeId.ROADMAP
            });
    
            var markers = [];
            for (var i = 0; i < 100; i++) {
              var dataPhoto = data.photos[i];
              var infoWin = new google.maps.InfoWindow();
              var latLng = new google.maps.LatLng(dataPhoto.latitude,
                  dataPhoto.longitude);
              var marker = new google.maps.Marker({
                position: latLng,
                icon: "images/gps.svg"
              });
              google.maps.event.addListener(marker, 'click', function(evt) {
              infoWin.setContent('content here');
              infoWin.open(map, marker);
      })
              markers.push(marker);
            }
            var markerCluster = new MarkerClusterer(map, markers, {imagePath:'images/m'});
          }
          google.maps.event.addDomListener(window, 'load', initialize);
        </script>
    
        <script>
          var _gaq = _gaq || [];
          _gaq.push(['_setAccount', 'UA-12846745-20']);
          _gaq.push(['_trackPageview']);
    
          (function() {
            var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
            ga.src = ('https:' === document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
            var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
          })();
        </script>
    
      <body>
        <div id="map-container"><div id="map"></div></div>
      </body>
    

    我不知道我是否遗漏了一些明显的东西,或者单击缩放功能是否存在冲突。为了清楚起见,我希望在只有一个设备可点击时实现infoWindow,而不是集群。谢谢你的帮助,我真的很感激。

    更新:

    var data = { "count": 10785236,
     "photos": [{"photo_id": 27932, "photo_title": "Atardecer en Embalse", "photo_url": "http://www.panoramio.com/photo/27932", "photo_file_url": "http://mw2.google.com/mw-panoramio/photos/medium/27932.jpg", "longitude": -64.404945, "latitude": -32.202924, "width": 500, "height": 375, "upload_date": "25 June 2006", "owner_id": 4483, "owner_name": "Miguel Coranti", "owner_url": "http://www.panoramio.com/user/4483"}
    

    上面显示的var数据是中的一个示例。json文件。这是众多条目之一。

    1 回复  |  直到 8 年前
        1
  •  1
  •   rags2riches-prog    8 年前

    enter image description here 在您的 for loop function closure 缺少,因此您无法捕获infowindow对象并将其指定给其相对标记,更不用说显示其内容了。

    更改此项:

    google.maps.event.addListener(marker, 'click', function(evt) {
          infoWin.setContent('content here');
          infoWin.open(map, marker);
    })
    

    为此:

    (function(m, infoWindow, idx){
        google.maps.event.addListener(m, 'click', function(evt) {
        infoWindow.setContent('marker ' + idx);
        infoWindow.open(map, m);
    
            })
     })(marker, infoWin, i);
    

    为了重现这个问题,我在JSON对象中使用了100种不同的lat/lon,以及for循环中的迭代次数。

    Get the JSBIN with code sample here.