问题 Google Maps V3在确切位置重叠标记


我有标记重叠的问题,请不要投票,因为我没有在javascript高度学习,我也看了stackoverflow提供的不同答案,但未能使用它们找到解决方案所以请帮助!代码是基于我给出的静态点获取lat和long的php我只想在同一个标​​记中列出所有信息而不是让它重叠标记任何帮助都会受到高度赞赏这里是代码:

  <head>

<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<META HTTP-EQUIV="refresh" >
<title>Operations</title>

<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?key=APIKEY&sensor=false"></script>
<script src="oms.min.js"></script>
<script type="text/javascript">
//<![CDATA[

var customIcons = {      

restaurant: {        icon: 'mm_20_blue.png'      },      

bar: {        icon: 'mm_20_blue.png'      }    

};

function load() {
  var map = new google.maps.Map(document.getElementById("map"), {
    center: new google.maps.LatLng(32.298342, -64.791098),
    zoom: 17,
    mapTypeId: google.maps.MapTypeId.SATELLITE
  });
  var infoWindow = new google.maps.InfoWindow;

  // Change this depending on the name of your PHP file
  downloadUrl("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 id = markers[i].getAttribute("permitnumber");
      var point = new google.maps.LatLng(
          parseFloat(markers[i].getAttribute("lat")),
          parseFloat(markers[i].getAttribute("lng")));
      var html = "<b>" + name + "</b> <br/>" + address + "<br/>" + '<a href="http://server/editform.php?find=' + id + '" >More Info</a> <br/> <form action="del.php" method="post" enctype="multipart/form-data"> <input type="checkbox" name="checkbox" id="checkbox" value="' + id +'"> <input name="delete" type="submit" id="delete" value="Delete">  ' ;
      var icon = customIcons[type] || {};
      var marker = new google.maps.Marker({
        map: map,
        position: point,
        icon: icon.icon,
        shadow: icon.shadow,
        animation: google.maps.Animation.BOUNCE

      });

      bindInfoWindow(marker, map, infoWindow, html);
    }
   });
   }




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

   function downloadUrl(url, callback) {
   var request = window.ActiveXObject ?
      new ActiveXObject('Microsoft.XMLHTTP') :
      new XMLHttpRequest;

   request.onreadystatechange = function() {
     if (request.readyState == 4) {
      request.onreadystatechange = doNothing;
      callback(request, request.status);
    }
    };

   request.open('GET', url, true);
   request.send(null);
   }

    function doNothing() {}



   //]]>

  </script>


  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script>
  <script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.8.1/jquery.validate.min.js" type="text/javascript"></script>
  <script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-24568877-1']);
  _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>

   </head>

   <body onload="load()" bgcolor="#A8F748" >

  <div id="map" style="margin:auto; width: 90%; height: 470px"></div>






  </body>

8183
2017-11-06 19:37


起源

我建议你创建一个非重叠标记的数组。对于每个lat / lng点,检查到目前为止已创建的标记。如果X / Y坐标在该点的某个半径范围内,则假设它重叠。更新标记以包含其他信息。如果该点位于当前标记列表之外,请创建一个新标记并将其添加到列表中。 - OpenGeoCode.Org - Andrew - OpenGeoCode
可能重复 谷歌地图具有完全相同位置的多个标记不起作用 - geocodezip
重叠的标记具有完全相同的纬度和长点我只是希望有一个标记,其中包含不同标记的所有不同内容,不幸的是我不熟悉javascript以实现此目的。 @安德鲁 - Learning
我已经看过这个问题,但它不是从PHP MYSQL DB动态提取数据,我无法理解它会如何自动抓取附近的标记并将内容放入其中,但最终的结果实际上正是我想要的实现,我只是不确定如何在这种情况下实现它。 @geocodezip - Learning
任何想法我怎么能用这个代码实现该解决方案,因为我需要通过php获取我的标记信息我正在努力了解你是如何做你做的,因为它正是我想要的。 @geocodezip - Learning


答案:


如果您不希望标记重叠,则可能需要使用 谷歌,地图,工具库-V3。它有一个名为Marker Clusterer的功能,它基本上允许您将附近的标记放入一个单一标记中。可以对其进行配置,以便在用户放大到足够远时,这些标记再次显示为单独的实体。 这是一个高级演示


5
2017-11-06 19:51



喜欢这个演示。没有使用此谷歌功能。请问现在! - Andrew - OpenGeoCode
@Andrew它非常方便,特别是对于能够看到所有标记(或至少知道它们在某个区域中存在多少)的应用程序非常重要! - Wayne Whitty
非常感谢您的回复,我在其他论坛中看到了这一点,不幸的是我不确定这是否会起作用,因为我有完全相同的lat和长点的标记,因为它们适用于在同一建筑物中工作的不同人员理想的解决方案是为了将标记重叠的内容放在同一个标​​记上,以便该位置的所有信息都在一次单标记信息框中,再次感谢您的帮助! :) @WayneWhitty - Learning
我希望获得与geocodezip @WayneWhitty相同的最终结果 - Learning
演示链接转到404 - Google Maps Utility Library已移至github - user1380540


我用这个 - https://github.com/jawj/OverlappingMarkerSpiderfier

在这里看一个演示 - http://jawj.github.io/OverlappingMarkerSpiderfier/demo.html


3
2017-11-08 20:29



这个插件有一个缺点,就是无法判断标记何时完全隐藏在另一个标记后面。所以,由于最初的回购似乎被放弃了,我分配了回购并且选择了一个回购 轻推完美重叠的标记 从彼此之下: github.com/fritz-c/OverlappingMarkerSpiderfier - Chris
该演示不再存在...... 404。 - Shanimal
在这里演示: jawj.github.io/OverlappingMarkerSpiderfier/demo-3.html - candlejack


我通过大量搜索找到了一个解决方案,并且感谢@geocodezip的帖子,当我放大标记时,我仍然有一个小问题,任何直接在另一个上的标记将保持在聚集模式,我想实现infoWindow共享两个标记内容任何帮助都会很棒,再次感谢geocodezip你的帖子!

<!DOCTYPE html >
<head>

    <meta charset="utf-8"/>
    <title>Google Maps API V3 with Marker Manager</title>
    <meta name="description" content="Google Maps API V3 with MarkerCluster, Coincident Markers Share Infowindow" />
    <meta name="keywords" content="google maps api v3, markerclusterer, markers, infowindow" />
    <meta name="author" content="Casey P. Thomas" />
    <script type="text/javascript"  src="http://maps.google.com/maps/api/js?sensor=false"></script>
    <script type="text/javascript"  src="http://maps.caseypthomas.org/markerclusterer.js"></script>
<script type="text/javascript">
//<![CDATA[
        var map;

    //marker clusterer
    var mc;
    var mcOptions = {gridSize: 20, maxZoom: 17};
    var markers;        
    //global infowindow
    var infowindow = new google.maps.InfoWindow();

    //geocoder
    var geocoder = new google.maps.Geocoder(); 


  var customIcons = {
  restaurant: {
    icon: 'mm_20_blue.png',
    shadow: 'http://labs.google.com/ridefinder/images/mm_20_shadow.png'
  },
  bar: {
    icon: 'mm_20_blue.png',
    shadow: 'http://labs.google.com/ridefinder/images/mm_20_shadow.png'
  }
 };

 function load() {
  var cluster = [];
  var map = new google.maps.Map(document.getElementById("map"), {
    center: new google.maps.LatLng(32.298342, -64.791098),
    zoom: 13,
    mapTypeId: google.maps.MapTypeId.SATELLITE
  });
var infowindow = new google.maps.InfoWindow();

  // Change this depending on the name of your PHP file
  downloadUrl("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 id = markers[i].getAttribute("permitnumber");
      var point = new google.maps.LatLng(
          parseFloat(markers[i].getAttribute("lat")),
          parseFloat(markers[i].getAttribute("lng")));
      var html = "<b>" + name + "</b> <br/>" + address + "<br/>" + '<a href="http://server/editform.php?find=' + id + '" >More Info</a> <br/> <form action="del.php" method="post" enctype="multipart/form-data"> <input type="checkbox" name="checkbox" id="checkbox" value="' + id +'"> <input name="delete" type="submit" id="delete" value="Delete">  ' ;
      var icon = customIcons[type] || {};
      var marker = new google.maps.Marker({
        map: map,
        position: point,
        icon: icon.icon,
        shadow: icon.shadow,
        animation: google.maps.Animation.BOUNCE
      });

      google.maps.event.addListener(marker, 'click', (function(marker, i) {
                    return function() {
                         var id = markers[i].getAttribute("permitnumber");
                        var name = markers[i].getAttribute("name");
                        var address = markers[i].getAttribute("address");
                        var type = markers[i].getAttribute("type");
                        infowindow.setContent("<b>" + name + "</b> <br/>" + address + "<br/>" + '<a href="http://server/editform.php?find=' + id + '" >More Info</a> <br/> <form action="del.php" method="post" enctype="multipart/form-data"> <input type="checkbox" name="checkbox" id="checkbox" value="' + id +'"> <input name="delete" type="submit" id="delete" value="Delete">  ');
                        infowindow.open(map, marker);

                    }
                })(marker, i));
      cluster.push(marker);
    }
    var mc = new MarkerClusterer(map,cluster);
  });
}

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

function downloadUrl(url, callback) {
  var request = window.ActiveXObject ?
      new ActiveXObject('Microsoft.XMLHTTP') :
      new XMLHttpRequest;

  request.onreadystatechange = function() {
    if (request.readyState == 4) {
      request.onreadystatechange = doNothing;
      callback(request, request.status);
    }
  };

  request.open('GET', url, true);
  request.send(null);
  }

  function doNothing() {}

  //]]>
 </script> 



 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script>
 <script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.8.1/jquery.validate.min.js" type="text/javascript"></script>
 <script type="text/javascript">

var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-24568877-1']);
_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>


 </head>

 <body onload="load()" bgcolor="#A8F748" >

 <div id="map" style="margin:auto; width: 90%; height: 470px"></div>






</body>

</html>

1
2017-11-08 20:25



你设置了mcOptions的值,但没有在任何地方使用它......特别是maxZoom - Shanimal


您可以使用谷歌地图实用程序库中的MarkerClusterer。

这是一个循序渐进的例子: https://developers.google.com/maps/documentation/javascript/marker-clustering

你可以从google maps github repo下载这个库: https://github.com/googlemaps/v3-utility-library/tree/master/markerclusterer


0
2018-02-21 08:44





在标记纬度和经度上添加小的随机数。

这会使重叠标记绕其正确位置移动。放大时,标记将分开。较小的随机数提高了准确度,但需要更多的放大。同时更改标记图标或标签以指示其重叠。

在该示例中,使用四种不同的标记。如果有超过4个重叠点,则添加轻微的随机化。

例: http://waveneyramblers.org.uk/walks/next_eight_days

查看源代码以查看JavaScript。


0
2018-05-08 12:53