将 infoWindow 包含到 gmaps markerclusterer 中的问题

Posted

技术标签:

【中文标题】将 infoWindow 包含到 gmaps markerclusterer 中的问题【英文标题】:Trouble including infoWindow into gmaps markerclusterer 【发布时间】:2018-08-03 08:55:45 【问题描述】:

我在将 infoWindow 添加到现有 gmaps markerclusterer 项目时遇到问题。我知道有类似的问题,但我看到的答案没有奏效。这可能是因为我对此很陌生并且错过了一些东西。

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

    <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 文件中的一个示例。这是众多条目之一。

【问题讨论】:

要明确的是,我希望在只有一个设备可点击时实现 infoWindow,而不是集群。我不明白这一点;您想停止集群行为并在集群点击时使用信息窗口吗?或者您想在到达特定位置的最后一个标记时(即集群已经打开时)使用信息窗口? 您能否也包括data.photos 以更全面地重现该问题? 我想在到达某个位置的最后一个标记时使用信息窗口,所以当集群已经打开或某个区域中只有一个标记时可以使用。 【参考方案1】:

Inside 你的for loop 缺少function closure,因此您无法捕获信息窗口对象并将它们分配给它们的相关标记,更不用说显示它们的内容了。

改变这个:

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 个不同的纬度/经度,至于 for 循环中的迭代次数。

Get the JSBIN with code sample here.

【讨论】:

明白,完美运行,正是我想要的。感谢您的帮助,非常感谢!

以上是关于将 infoWindow 包含到 gmaps markerclusterer 中的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何打开正在使用的 infoWindow 谷歌地图?

将标记 infoWindow 添加到 Mapbox 注释

标记点击;用户将自定义信息添加到 infoWindow

使用 jQuery mobile、google maps API v3 将 infoWindow 添加到地图标记

如何将自定义的 InfoWindow 添加到 google-maps swift ui 中的标记?

如何将codeigniter视图文件gmap存储到redis以使视图显示更快?