Google-Markierungen an derselben Adresse zeigen nicht alle Markierungen an

16

Ich habe an dieser Karte gearbeitet - http://www.mediwales.com/mapping/test/

Unternehmen werden gut geplottet und gruppiert, aber es ist ein Problem mit Unternehmen im selben Gebäude mit derselben Adresse aufgetreten. Es wird nur eine Firma gezeigt, nicht alle.

Wie kann ich erreichen, dass alle Unternehmen unter derselben Adresse angezeigt werden?

Die Markierungen sind geokodiert nach Gebäudename / Hausnummer, Straße, Stadt, Postleitzahl. Ich schätze, die Marker sind da, da ein Gebäude mit 3 Firmen eine 3 im Cluster anzeigt. Wenn Sie darauf klicken, wird nur die eine Firma angezeigt.

AKTUALISIEREN:

Ich habe es geschafft, dass sie versetzt werden, aber es versetzt alle Marker, wenn ich nur möchte, dass es versetzt wird, wenn mehr als ein Marker gleich ist. (Dank der Antwort von Casey).

   <script type="text/javascript">
    //<![CDATA[

    var customIcons = {
      restaurant: {
        icon: 'http://labs.google.com/ridefinder/images/mm_20_blue.png',
        shadow: 'http://labs.google.com/ridefinder/images/mm_20_shadow.png'
      },
      bar: {
        icon: 'http://labs.google.com/ridefinder/images/mm_20_red.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(53.4788, -3.9551),
        zoom: 6,
        mapTypeId: 'roadmap'
      });
var infowindow = new google.maps.InfoWindow();
var min = .999999;
var max = 1.000001;

      // Change this depending on the name of your PHP file
      downloadUrl("<?php bloginfo('stylesheet_directory'); ?>/phpsqlajax_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 offsetLat = markers[i].getAttribute("lat") * (Math.random() * (max - min) + min);
          var offsetLng = markers[i].getAttribute("lng") * (Math.random() * (max - min) + min);



          var point = new google.maps.LatLng(offsetLat, offsetLng);
          var html = "<b>" + name + "</b> <br/>" + address;
          var icon = customIcons[type] || {};
          var marker = new google.maps.Marker({
            map: map,
            position: point,
            icon: icon.icon,
            shadow: icon.shadow
          });
          google.maps.event.addListener(marker, 'click', (function(marker, i) {
                        return function() {
                            infowindow.setContent(markers[i].getAttribute("name"));
                            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>

   <script type="text/javascript">
    //<![CDATA[

    var customIcons = {
      restaurant: {
        icon: 'http://labs.google.com/ridefinder/images/mm_20_blue.png',
        shadow: 'http://labs.google.com/ridefinder/images/mm_20_shadow.png'
      },
      bar: {
        icon: 'http://labs.google.com/ridefinder/images/mm_20_red.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(53.4788, -3.9551),
        zoom: 6,
        mapTypeId: 'roadmap'
      });
var infowindow = new google.maps.InfoWindow();

      // Change this depending on the name of your PHP file
      downloadUrl("<?php bloginfo('stylesheet_directory'); ?>/phpsqlajax_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 point = new google.maps.LatLng(
              parseFloat(markers[i].getAttribute("lat")),
              parseFloat(markers[i].getAttribute("lng")));
          var html = "<b>" + name + "</b> <br/>" + address;
          var icon = customIcons[type] || {};
          var marker = new google.maps.Marker({
            map: map,
            position: point,
            icon: icon.icon,
            shadow: icon.shadow
          });
          google.maps.event.addListener(marker, 'click', (function(marker, i) {
                        return function() {
                            infowindow.setContent(markers[i].getAttribute("name"));
                            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>
rauben
quelle

Antworten:

15

Der Clusterer wird korrekt angezeigt. Alle Marker werden geplottet. Das Problem ist, dass Sie nur auf die oberste Markierung klicken können, sodass es den Anschein hat, als gäbe es nur eine Markierung.

Um den Inhalt für übereinstimmende Marker anzuzeigen, müssen Sie den Infofensterinhalt der zugrunde liegenden Marker an den obersten Marker übergeben.

Verfolgen Sie dazu zunächst jeden Marker. Wenn Sie MarkerClusterer verwenden, enthält die markerClusterer-Instanz alle Marker. Vergleichen Sie bei jedem zurückkommenden Geocode-Ergebnis die Länge dieser Anforderung mit allen bereits gezeichneten Markierungen. Sie können Positionen mit der Methode equals des latlng- Objekts vergleichen.

Wenn der neue Marker mit der Position eines vorhandenen Markers übereinstimmt, nehmen Sie den Inhalt des Infofensters vom ersten Marker und hängen Sie ihn an den Inhalt des Infofensters des neuen Markers an. Wenn Sie auf die oberste Markierung (die zweite Firma) klicken, werden auf diese Weise Informationen von beiden Firmen angezeigt. Wenn es mehr als zwei Unternehmen gibt, müssen Sie den Inhalt des Infofensters für alle passenden Markierungen abrufen. Mit dieser Methode kann der Markierungsclusterer auch weiterhin die richtige Anzahl von Markierungen anzeigen.

Hier ist ein funktionierendes Beispiel und der Javascript-Code. Die erste und die zweite Adresse sind gleich. Wenn Sie auf die Markierung für 2 klicken, wird "2 & 1" angezeigt.

<script type="text/javascript"> 
var map;

//marker clusterer
var mc;
var mcOptions = {gridSize: 20, maxZoom: 17};

//global infowindow
var infowindow = new google.maps.InfoWindow();

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

var address = new Array("1000 Market St, Philadelphia, PA","1000 Market St, Philadelphia, PA","1002 Market St, Philadelphia, PA","1004 Market St, Philadelphia, PA");
var content = new Array("1","2","3","4");

function createMarker(latlng,text) {

    var marker = new google.maps.Marker({
        position: latlng
    });

    ///get array of markers currently in cluster
    var allMarkers = mc.getMarkers();

    //check to see if any of the existing markers match the latlng of the new marker
    if (allMarkers.length != 0) {
        for (i=0; i < allMarkers.length; i++) {
            var currentMarker = allMarkers[i];
            var pos = currentMarker.getPosition();

            if (latlng.equals(pos)) {
                text = text + " & " + content[i];
            }

        }
    }

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

    return marker;
}

function geocodeAddress(address,i) {

    geocoder.geocode( {'address': address}, function(results, status) {

        if (status == google.maps.GeocoderStatus.OK) {

            var marker = createMarker(results[0].geometry.location,content[i]);
            mc.addMarker(marker);

        } else { 
            alert("Geocode was not successful for the following reason: " + status); 
        } 
    });
}

function initialize(){

    var options = { 
        zoom: 13, 
        center: new google.maps.LatLng(39.96225,-75.13222), 
        mapTypeId: google.maps.MapTypeId.ROADMAP 
    }; 

    map = new google.maps.Map(document.getElementById('map'), options); 

    //marker cluster
    mc = new MarkerClusterer(map, [], mcOptions);

    for (i=0; i<address.length; i++) { 
        geocodeAddress(address[i],i);
    }

}       
</script> 

EDIT: Antwort auf Kommentar

Alternativ können Sie koinzidente Marker verschieben, indem Sie einen kleinen Multiplikator (Zufallszahl zwischen 0,999999 und 1,000001) auf die Position jedes koinzidenten Markers anwenden. Hier ist ein Beispiel. Hierbei werden die gleichen Daten wie im ersten Beispiel verwendet, außer dass die Markierungen 1 und 2 übereinander platziert sind und ein Infofenster gemeinsam genutzt wird. Die Markierung 2 wird von der Markierung 1 versetzt. Beachten Sie, dass Ihre Geocode-Ergebnisse a sein werden etwas weniger genau. Relevanter Code unten:

//min and max limits for multiplier, for random numbers
//keep the range pretty small, so markers are kept close by
var min = .999999;
var max = 1.000001;

    function createMarker(latlng,text) {

        ///get array of markers currently in cluster
        var allMarkers = mc.getMarkers();

        //final position for marker, could be updated if another marker already exists in same position
        var finalLatLng = latlng;

        //check to see if any of the existing markers match the latlng of the new marker
        if (allMarkers.length != 0) {
            for (i=0; i < allMarkers.length; i++) {
                var existingMarker = allMarkers[i];
                var pos = existingMarker.getPosition();

                //if a marker already exists in the same position as this marker
                if (latlng.equals(pos)) {

                    //update the position of the coincident marker by applying a small multipler to its coordinates
                    var newLat = latlng.lat() * (Math.random() * (max - min) + min);
                    var newLng = latlng.lng() * (Math.random() * (max - min) + min);

                    finalLatLng = new google.maps.LatLng(newLat,newLng);

                }                   
            }
        }

        var marker = new google.maps.Marker({
            position: finalLatLng
        });     

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

        return marker;
    }
Casey
quelle
Danke für die Antwort. Ich komme gerade auf dieses Projekt zurück! Richtig, wäre es möglich, die Markierungen ein wenig zu verschieben? Die Art der beteiligten Unternehmen würde darüber streiten, wer ansonsten im Infofenster ganz oben steht (kleinlich, wie ich weiß!).
Rob
Gute Arbeit @Casey. Das sieht gut aus!
RyanKDalton-OffTheGridMaps
@Casey Danke für die Antwort, wie könnte ich das in meinen Code einarbeiten? Ich kämpfe mit der Überarbeitung von Code wie diesem! Hier ist meine Quelle - Quelltext anzeigen
Rob
@Rob Verwenden Sie meine Beispielseite als Richtlinie. Ein großer Unterschied zwischen unserem Code ist, dass ich meinen Erstellungsmarkierungscode aus meinem Geocode-Adresscode herausgezogen und in seine eigene Funktion namens createMarker eingefügt habe. Sie müssen dies auch tun, um die Nudge-Technik zum Laufen zu bringen.
Casey
@Casey Ich hatte ein paar Versuche und kann es nicht zum Laufen bringen ... Ich möchte nicht, dass es so klingt, als würde ich dich nur dazu bringen, es zu tun, aber ich habe es am letzten Tag versucht.
Rob
3

Ich hatte das gleiche Problem mit mehreren Markern mit genau dem gleichen Lat / Long für eine Verkaufsgebiets-App. Dies war ein häufiges Szenario in meiner App mit mehreren Kunden an derselben Adresse, z. B. Kunden in demselben Wolkenkratzergebäude und damit an derselben physischen Straße.

Ich habe eine alternative Antwort mit vielleicht einer besseren Benutzererfahrung (UX) für überlappende Marker gefunden. Vielen Dank an George MacKerron für die Erstellung der OverlappingMarkerSpiderfier- Bibliothek. Diese JavaScript-Bibliothek für Google Maps v3 überschreibt das Standardklickverhalten für überlappende Markierungen. In der Bibliothek können Sie den Versatzradius für Überlappungen konfigurieren (standardmäßig 20 Pixel).

Beispiel-Screenshots von http://jawj.github.io/OverlappingMarkerSpiderfier/demo.html :

Screenshot von überlappenden Markierungen vor dem Klicken Screenshot des Klickens auf einen der überlappenden Marker Screenshot des Klickens auf einen Marker im "gespiderten" Netz überlappender Marker

Steve Jansen
quelle
0

Ich schlage vor, die obige Funktion wie folgt zu ändern, da mir die erzielten Ergebnisse besser erscheinen.

function adjustMarkerPlace(latlng) {
  ///get array of markers currently in cluster 
  //final position for marker, could be updated if another marker already exists in same position
  var finalLatLng = latlng;

  //check to see if any of the existing markers match the latlng of the new marker
  if (markers.length !== 0) {
      for (let i=0; i < markers.length; i++) {
          var existingMarker = markers[i];
          var pos = existingMarker.getPosition();

          //check if a marker already exists in the same position as this marker
          if (latlng.equals(pos)) {

              //update the position of the coincident marker by applying a small multipler to its coordinates
              var newLat = latlng.lat() + (Math.random() / 10000);
              var newLng = latlng.lng() + (Math.random() / 10000);

              finalLatLng = new google.maps.LatLng(newLat,newLng);

          }
      }
  }

  return finalLatLng;

}

Paul Bozan
quelle