Google Maps JS API v3 – Eenvoudig voorbeeld van meerdere markeringen

Behoorlijk nieuw voor de Google Maps API. Ik heb een reeks gegevens die ik wil doorlopen en op een kaart wil plotten. Het lijkt vrij eenvoudig, maar alle tutorials met meerdere markers die ik heb gevonden zijn behoorlijk ingewikkeld.

Laten we als voorbeeld de gegevensarray van de site van Google gebruiken:

var locations = [
  ['Bondi Beach', -33.890542, 151.274856, 4],
  ['Coogee Beach', -33.923036, 151.259052, 5],
  ['Cronulla Beach', -34.028249, 151.157507, 3],
  ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
  ['Maroubra Beach', -33.950198, 151.259302, 1]
];

Ik wil gewoon al deze punten plotten en een infoVenster laten verschijnen wanneer erop wordt geklikt om de naam weer te geven.


Antwoord 1, autoriteit 100%

Dit is het eenvoudigste dat ik zou kunnen reduceren tot:

<!DOCTYPE html>
<html> 
<head> 
  <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> 
  <title>Google Maps Multiple Markers</title> 
  <script src="https://maps.google.com/maps/api/js?sensor=false" 
          type="text/javascript"></script>
</head> 
<body>
  <div id="map" style="width: 500px; height: 400px;"></div>
  <script type="text/javascript">
    var locations = [
      ['Bondi Beach', -33.890542, 151.274856, 4],
      ['Coogee Beach', -33.923036, 151.259052, 5],
      ['Cronulla Beach', -34.028249, 151.157507, 3],
      ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
      ['Maroubra Beach', -33.950198, 151.259302, 1]
    ];
    var map = new google.maps.Map(document.getElementById('map'), {
      zoom: 10,
      center: new google.maps.LatLng(-33.92, 151.25),
      mapTypeId: google.maps.MapTypeId.ROADMAP
    });
    var infowindow = new google.maps.InfoWindow();
    var marker, i;
    for (i = 0; i < locations.length; i++) {  
      marker = new google.maps.Marker({
        position: new google.maps.LatLng(locations[i][1], locations[i][2]),
        map: map
      });
      google.maps.event.addListener(marker, 'click', (function(marker, i) {
        return function() {
          infowindow.setContent(locations[i][0]);
          infowindow.open(map, marker);
        }
      })(marker, i));
    }
  </script>
</body>
</html>

?????

SCREENSHOT

Google Maps Meerdere markeringen

Er vindt wat magie plaats als het callback-argument wordt doorgegeven aan de addListener-methode. Dit kan een behoorlijk lastig onderwerp zijn als je niet bekend bent met hoe sluitingen werken. Ik zou aanraden om het volgende Mozilla-artikel te lezen voor een korte introductie als dat het geval is:

? Mozilla Dev Center: werken met sluitingen


Antwoord 2, autoriteit 5%

Hier is nog een voorbeeld van het laden van meerdere markeringen met een unieke titleen infoWindow-tekst. Getest met de nieuwste Google Maps API V3.11.

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
        <title>Multiple Markers Google Maps</title>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
        <script src="https://maps.googleapis.com/maps/api/js?v=3.11&sensor=false" type="text/javascript"></script>
        <script type="text/javascript">
        // check DOM Ready
        $(document).ready(function() {
            // execute
            (function() {
                // map options
                var options = {
                    zoom: 5,
                    center: new google.maps.LatLng(39.909736, -98.522109), // centered US
                    mapTypeId: google.maps.MapTypeId.TERRAIN,
                    mapTypeControl: false
                };
                // init map
                var map = new google.maps.Map(document.getElementById('map_canvas'), options);
                // NY and CA sample Lat / Lng
                var southWest = new google.maps.LatLng(40.744656, -74.005966);
                var northEast = new google.maps.LatLng(34.052234, -118.243685);
                var lngSpan = northEast.lng() - southWest.lng();
                var latSpan = northEast.lat() - southWest.lat();
                // set multiple marker
                for (var i = 0; i < 250; i++) {
                    // init markers
                    var marker = new google.maps.Marker({
                        position: new google.maps.LatLng(southWest.lat() + latSpan * Math.random(), southWest.lng() + lngSpan * Math.random()),
                        map: map,
                        title: 'Click Me ' + i
                    });
                    // process multiple info windows
                    (function(marker, i) {
                        // add click event
                        google.maps.event.addListener(marker, 'click', function() {
                            infowindow = new google.maps.InfoWindow({
                                content: 'Hello, World!!'
                            });
                            infowindow.open(map, marker);
                        });
                    })(marker, i);
                }
            })();
        });
        </script>
    </head>
    <body>
        <div id="map_canvas" style="width: 800px; height:500px;"></div>
    </body>
</html>

Screenshot van 250 markeringen:

Google Maps API V3.11 met meerdere markeringen

Het zal de Lat/Lng automatisch willekeurig maken om het uniek te maken. Dit voorbeeld is erg handig als u 500, 1000, xxx-markeringen en prestaties wilt testen.


Antwoord 3, autoriteit 3%

Ik dacht dat ik dit hier zou plaatsen omdat het een populair landingspunt lijkt te zijn voor mensen die Google Maps API’s beginnen te gebruiken. Meerdere markeringen die aan de clientzijde worden weergegeven, is waarschijnlijk de ondergang van veel prestatiegerichte kaarttoepassingen. Het is moeilijk om te benchmarken, op te lossen en in sommige gevallen zelfs vast te stellen dat er een probleem is (vanwege verschillen in browserimplementatie, hardware die beschikbaar is voor de klant, mobiele apparaten, de lijst gaat maar door).

De eenvoudigste manier om dit probleem aan te pakken, is door een oplossing voor markerclustering te gebruiken. Het basisidee is om geografisch vergelijkbare locaties in een groep te groeperen met het aantal weergegeven punten. Als de gebruiker op de kaart inzoomt, breiden deze groepen zich uit om individuele markeringen eronder te onthullen.

Misschien is de eenvoudigste te implementeren de bibliotheek markerclusterer-bibliotheek . Een basisimplementatie zou als volgt zijn (na bibliotheekimport):

<script type="text/javascript">
  function initialize() {
    var center = new google.maps.LatLng(37.4419, -122.1419);
    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 location = yourData.location[i];
      var latLng = new google.maps.LatLng(location.latitude,
          location.longitude);
      var marker = new google.maps.Marker({
        position: latLng
      });
      markers.push(marker);
    }
    var markerCluster = new MarkerClusterer(map, markers);
  }
  google.maps.event.addDomListener(window, 'load', initialize);
</script>

De markeringen worden niet rechtstreeks aan de kaart toegevoegd, maar worden aan een array toegevoegd. Deze array wordt vervolgens doorgegeven aan de bibliotheek die complexe berekeningen voor u afhandelt en aan de kaart wordt toegevoegd.

Deze implementaties verhogen niet alleen de prestaties aan de clientzijde enorm, maar leiden in veel gevallen ook tot een eenvoudigere en minder rommelige gebruikersinterface en een eenvoudigere verwerking van gegevens op grotere schaal.

Andere implementatieszijn verkrijgbaar bij Google.

Ik hoop dat dit enkele van de nieuwere helpt bij de nuances van het in kaart brengen.


Antwoord 4, autoriteit 2%

Asynchrone versie :

<script type="text/javascript">
  function initialize() {
    var locations = [
      ['Bondi Beach', -33.890542, 151.274856, 4],
      ['Coogee Beach', -33.923036, 151.259052, 5],
      ['Cronulla Beach', -34.028249, 151.157507, 3],
      ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
      ['Maroubra Beach', -33.950198, 151.259302, 1]
    ];
    var map = new google.maps.Map(document.getElementById('map'), {
      zoom: 10,
      center: new google.maps.LatLng(-33.92, 151.25),
      mapTypeId: google.maps.MapTypeId.ROADMAP
    });
    var infowindow = new google.maps.InfoWindow();
    var marker, i;
    for (i = 0; i < locations.length; i++) {  
      marker = new google.maps.Marker({
        position: new google.maps.LatLng(locations[i][1], locations[i][2]),
        map: map
      });
      google.maps.event.addListener(marker, 'click', (function(marker, i) {
        return function() {
          infowindow.setContent(locations[i][0]);
          infowindow.open(map, marker);
        }
      })(marker, i));
    }
}
function loadScript() {
  var script = document.createElement('script');
  script.type = 'text/javascript';
  script.src = 'https://maps.googleapis.com/maps/api/js?v=3.exp&' +
      'callback=initialize';
  document.body.appendChild(script);
}
window.onload = loadScript;
  </script>

Antwoord 5

Dit is de werkende voorbeeldkaartafbeelding

var arr = new Array();
    function initialize() { 
        var i;  
        var Locations = [
                {
                  lat:48.856614, 
                  lon:2.3522219000000177, 
                  address:'Paris',
                  gval:'25.5',
                  aType:'Non-Commodity',
                  title:'Paris',
                  descr:'Paris'           
                },        
                    {
                  lat: 55.7512419, 
                  lon: 37.6184217,
                  address:'Moscow',
                  gval:'11.5',
                  aType:'Non-Commodity',
                  title:'Moscow',
                  descr:'Moscow Airport'              
                },     
                {
              lat:-9.481553000000002, 
              lon:147.190242, 
              address:'Port Moresby',
              gval:'1',
              aType:'Oil',
              title:'Papua New Guinea',
              descr:'Papua New Guinea 123123123'              
            },
            {
           lat:20.5200,
           lon:77.7500,
           address:'Indore',
            gval:'1',
            aType:'Oil',
            title:'Indore, India',
            descr:'Airport India'
        }
    ];
    var myOptions = {
        zoom: 2,
        center: new google.maps.LatLng(51.9000,8.4731),
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    var map = new google.maps.Map(document.getElementById("map"), myOptions);
    var infowindow =  new google.maps.InfoWindow({
        content: ''
    });
    for (i = 0; i < Locations.length; i++) {
            size=15;        
            var img=new google.maps.MarkerImage('marker.png',           
                new google.maps.Size(size, size),
                new google.maps.Point(0,0),
                new google.maps.Point(size/2, size/2)
           );
        var marker = new google.maps.Marker({
            map: map,
            title: Locations[i].title,
            position: new google.maps.LatLng(Locations[i].lat, Locations[i].lon),           
                icon: img
        });
        bindInfoWindow(marker, map, infowindow, "<p>" + Locations[i].descr + "</p>",Locations[i].title);  
    }
}
function bindInfoWindow(marker, map, infowindow, html, Ltitle) { 
    google.maps.event.addListener(marker, 'mouseover', function() {
            infowindow.setContent(html); 
            infowindow.open(map, marker); 
    });
    google.maps.event.addListener(marker, 'mouseout', function() {
        infowindow.close();
    }); 
} 

Volledig werkend voorbeeld. Je kunt gewoon kopiëren, plakken en gebruiken.


Antwoord 6

Van Google Map-API voorbeelden:

function initialize() {
  var myOptions = {
    zoom: 10,
    center: new google.maps.LatLng(-33.9, 151.2),
    mapTypeId: google.maps.MapTypeId.ROADMAP
  }
  var map = new google.maps.Map(document.getElementById("map_canvas"),
                                myOptions);
  setMarkers(map, beaches);
}
/**
 * Data for the markers consisting of a name, a LatLng and a zIndex for
 * the order in which these markers should display on top of each
 * other.
 */
var beaches = [
  ['Bondi Beach', -33.890542, 151.274856, 4],
  ['Coogee Beach', -33.923036, 151.259052, 5],
  ['Cronulla Beach', -34.028249, 151.157507, 3],
  ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
  ['Maroubra Beach', -33.950198, 151.259302, 1]
];
function setMarkers(map, locations) {
  // Add markers to the map
  // Marker sizes are expressed as a Size of X,Y
  // where the origin of the image (0,0) is located
  // in the top left of the image.
  // Origins, anchor positions and coordinates of the marker
  // increase in the X direction to the right and in
  // the Y direction down.
  var image = new google.maps.MarkerImage('images/beachflag.png',
      // This marker is 20 pixels wide by 32 pixels tall.
      new google.maps.Size(20, 32),
      // The origin for this image is 0,0.
      new google.maps.Point(0,0),
      // The anchor for this image is the base of the flagpole at 0,32.
      new google.maps.Point(0, 32));
  var shadow = new google.maps.MarkerImage('images/beachflag_shadow.png',
      // The shadow image is larger in the horizontal dimension
      // while the position and offset are the same as for the main image.
      new google.maps.Size(37, 32),
      new google.maps.Point(0,0),
      new google.maps.Point(0, 32));
      // Shapes define the clickable region of the icon.
      // The type defines an HTML &lt;area&gt; element 'poly' which
      // traces out a polygon as a series of X,Y points. The final
      // coordinate closes the poly by connecting to the first
      // coordinate.
  var shape = {
      coord: [1, 1, 1, 20, 18, 20, 18 , 1],
      type: 'poly'
  };
  for (var i = 0; i < locations.length; i++) {
    var beach = locations[i];
    var myLatLng = new google.maps.LatLng(beach[1], beach[2]);
    var marker = new google.maps.Marker({
        position: myLatLng,
        map: map,
        shadow: shadow,
        icon: image,
        shape: shape,
        title: beach[0],
        zIndex: beach[3]
    });
  }
}

Antwoord 7

Hier is nog een versie die ik heb geschreven om onroerend goed op de kaart te bewaren, waarbij de infowindow-aanwijzer op de werkelijke lat en langevan de markering wordt geplaatst, terwijl de markering tijdelijk wordt verborgen terwijl het infovenster wordt weergegeven.

Het maakt ook een einde aan de standaard ‘marker’-toewijzing en versnelt
verwerking door de nieuwe markering direct toe te wijzen aan de markeringenreeks bij het maken van markeringen. Merk echter op dat er extra eigenschappen zijn toegevoegd aan zowel de markering als het infovenster, dus deze benadering is een beetje onconventioneel… maar dat ben ik!

In deze infovenstervragen wordt nooit vermeld dat het standaard infovenster NIETaan de lat en lengte van het markeringspunt wordt geplaatst, maar eerder aan de bovenkant van de markeringsafbeelding. De zichtbaarheid van de markering moet verborgen zijn om dit te laten werken, anders schuift de Maps API het infowindow-anker weer terug naar de bovenkant van de markeringsafbeelding.

Verwijzingen naar de markeringen in de ‘markeringen’-array worden onmiddellijk gemaakt na markeringsdeclaratie voor eventuele aanvullende verwerkingstaken die later gewenst kunnen zijn (verbergen/tonen, de coördinaten pakken, enz…). Dit bespaart de extra stap van het toewijzen van het marker-object aan ‘marker’, en dan het pushen van de ‘marker’ naar de markers-array… veel onnodige verwerking in mijn boek.

Hoe dan ook, een andere kijk op infowindows, en ik hoop dat het je helpt te informeren en inspireren.

   var locations = [
      ['Bondi Beach', -33.890542, 151.274856, 4],
      ['Coogee Beach', -33.923036, 151.259052, 5],
      ['Cronulla Beach', -34.028249, 151.157507, 3],
      ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
      ['Maroubra Beach', -33.950198, 151.259302, 1]
    ];
    var map;
    var markers = [];
    function init(){
      map = new google.maps.Map(document.getElementById('map_canvas'), {
        zoom: 10,
        center: new google.maps.LatLng(-33.92, 151.25),
        mapTypeId: google.maps.MapTypeId.ROADMAP
      });
      var num_markers = locations.length;
      for (var i = 0; i < num_markers; i++) {  
        markers[i] = new google.maps.Marker({
          position: {lat:locations[i][1], lng:locations[i][2]},
          map: map,
          html: locations[i][0],
          id: i,
        });
        google.maps.event.addListener(markers[i], 'click', function(){
          var infowindow = new google.maps.InfoWindow({
            id: this.id,
            content:this.html,
            position:this.getPosition()
          });
          google.maps.event.addListenerOnce(infowindow, 'closeclick', function(){
            markers[this.id].setVisible(true);
          });
          this.setVisible(false);
          infowindow.open(map);
        });
      }
    }
google.maps.event.addDomListener(window, 'load', init);

Hier is een werkende JSFiddle

Aanvullende opmerking
U ziet in dit gegeven Google-voorbeeldgegevens een vierde plaats in de ‘locaties’-array met een nummer. Gezien dit in het voorbeeld, zou je deze waarde ook kunnen gebruiken voor de markerings-ID in plaats van de huidige luswaarde, zodat…

var num_markers = locations.length;
for (var i = 0; i < num_markers; i++) {  
  markers[i] = new google.maps.Marker({
    position: {lat:locations[i][1], lng:locations[i][2]},
    map: map,
    html: locations[i][0],
    id: locations[i][3],
  });
};

Antwoord 8

Geaccepteerd antwoord, herschreven in ES6:

$(document).ready(() => {
  const mapEl = $('#our_map').get(0); // OR document.getElementById('our_map');
  // Display a map on the page
  const map = new google.maps.Map(mapEl, { mapTypeId: 'roadmap' });
  const buildings = [
    {
      title: 'London Eye, London', 
      coordinates: [51.503454, -0.119562],
      info: 'carousel'
    },
    {
      title: 'Palace of Westminster, London', 
      coordinates: [51.499633, -0.124755],
      info: 'palace'
    }
  ];
  placeBuildingsOnMap(buildings, map);
});
const placeBuildingsOnMap = (buildings, map) => {
  // Loop through our array of buildings & place each one on the map  
  const bounds = new google.maps.LatLngBounds();
  buildings.forEach((building) => {
    const position = { lat: building.coordinates[0], lng: building.coordinates[1] }
    // Stretch our bounds to the newly found marker position
    bounds.extend(position);
    const marker = new google.maps.Marker({
      position: position,
      map: map,
      title: building.title
    });
    const infoWindow = new google.maps.InfoWindow();
    // Allow each marker to have an info window
    google.maps.event.addListener(marker, 'click', () => {
      infoWindow.setContent(building.info);
      infoWindow.open(map, marker);
    })
    // Automatically center the map fitting all markers on the screen
    map.fitBounds(bounds);
  })
})

Antwoord 9

Een markering in uw programma toevoegen is heel eenvoudig. Je kunt gewoon deze code toevoegen:

var marker = new google.maps.Marker({
  position: myLatLng,
  map: map,
  title: 'Hello World!'
});

De volgende velden zijn bijzonder belangrijk en worden vaak ingesteld wanneer u een markering maakt:

  • position(vereist) specificeert een LatLng die de initiële locatie van de markering identificeert. Een manier om een ​​LatLng op te halen is door de Geocoding-servicete gebruiken.
  • map(optioneel) specificeert de kaart waarop de markering moet worden geplaatst. Als u geen kaart opgeeft bij de constructie van de markering, wordt de markering gemaakt, maar wordt deze niet aan (of weergegeven op) de kaart bevestigd. U kunt de markering later toevoegen door de setMap()-methode van de markering aan te roepen.

Opmerking, in het voorbeeld stelt het titelveld de titel van de markering in die als knopinfo wordt weergegeven.

U kunt hier.


Dit is een compleet voorbeeld om éénmarkering op een kaart in te stellen. Wees voorzichtig, u moet YOUR_API_KEYvervangen door uw google API-sleutel:

<!DOCTYPE html>
<html>
<head>
   <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
   <meta charset="utf-8">
   <title>Simple markers</title>
<style>
  /* Always set the map height explicitly to define the size of the div
   * element that contains the map. */
  #map {
    height: 100%;
  }
  /* Optional: Makes the sample page fill the window. */
  html, body {
    height: 100%;
    margin: 0;
    padding: 0;
  }
</style>
</head>
<body>
 <div id="map"></div>
<script>
  function initMap() {
    var myLatLng = {lat: -25.363, lng: 131.044};
    var map = new google.maps.Map(document.getElementById('map'), {
      zoom: 4,
      center: myLatLng
    });
    var marker = new google.maps.Marker({
      position: myLatLng,
      map: map,
      title: 'Hello World!'
    });
  }
</script>
<script async defer
src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap">
</script>


Als u nu markeringen van een array op een kaart wilt plotten, moet u dit als volgt doen:

var locations = [
  ['Bondi Beach', -33.890542, 151.274856, 4],
  ['Coogee Beach', -33.923036, 151.259052, 5],
  ['Cronulla Beach', -34.028249, 151.157507, 3],
  ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
  ['Maroubra Beach', -33.950198, 151.259302, 1]
];
function initMap() {
  var myLatLng = {lat: -33.90, lng: 151.16};
  var map = new google.maps.Map(document.getElementById('map'), {
    zoom: 10,
    center: myLatLng
    });
  var count;
  for (count = 0; count < locations.length; count++) {  
    new google.maps.Marker({
      position: new google.maps.LatLng(locations[count][1], locations[count][2]),
      map: map,
      title: locations[count][0]
      });
   }
}

Dit voorbeeld geeft me het volgende resultaat:

voer hier de afbeeldingsbeschrijving in


Je kunt ook een infoWindow aan je pin toevoegen. Je hebt alleen deze code nodig:

var marker = new google.maps.Marker({
    position: new google.maps.LatLng(locations[count][1], locations[count][2]),
    map: map
    });
marker.info = new google.maps.InfoWindow({
    content: 'Hello World!'
    });

Je kunt de Google-documentatie over infoWindows hiervinden .


Nu kunnen we het infoVenster openen als de markering “klik” is, zoals dit:

var marker = new google.maps.Marker({
     position: new google.maps.LatLng(locations[count][1], locations[count][2]),
     map: map
     });
marker.info = new google.maps.InfoWindow({
     content: locations [count][0]
     });
google.maps.event.addListener(marker, 'click', function() {  
    // this = marker
    var marker_map = this.getMap();
    this.info.open(marker_map, this);
    // Note: If you call open() without passing a marker, the InfoWindow will use the position specified upon construction through the InfoWindowOptions object literal.
            });

Opmerking, u kunt documentatie hebben over Listenerhierin Google Developer.


En ten slotte kunnen we een infoVenster in een markering plotten als de gebruiker erop klikt. Dit is mijn volledige code:

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
    <meta charset="utf-8">
    <title>Info windows</title>
    <style>
    /* Always set the map height explicitly to define the size of the div
    * element that contains the map. */
    #map {
        height: 100%;
    }
    /* Optional: Makes the sample page fill the window. */
    html, body {
        height: 100%;
        margin: 0;
        padding: 0;
    }
    </style>
</head>
<body>
    <div id="map"></div>
    <script>
    var locations = [
        ['Bondi Beach', -33.890542, 151.274856, 4],
        ['Coogee Beach', -33.923036, 151.259052, 5],
        ['Cronulla Beach', -34.028249, 151.157507, 3],
        ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
        ['Maroubra Beach', -33.950198, 151.259302, 1]
    ];
    // When the user clicks the marker, an info window opens.
    function initMap() {
        var myLatLng = {lat: -33.90, lng: 151.16};
        var map = new google.maps.Map(document.getElementById('map'), {
            zoom: 10,
            center: myLatLng
            });
        var count=0;
        for (count = 0; count < locations.length; count++) {  
            var marker = new google.maps.Marker({
                position: new google.maps.LatLng(locations[count][1], locations[count][2]),
                map: map
                });
            marker.info = new google.maps.InfoWindow({
                content: locations [count][0]
                });
            google.maps.event.addListener(marker, 'click', function() {  
                // this = marker
                var marker_map = this.getMap();
                this.info.open(marker_map, this);
                // Note: If you call open() without passing a marker, the InfoWindow will use the position specified upon construction through the InfoWindowOptions object literal.
                });
        }
    }
    </script>
    <script async defer
    src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap">
    </script>
</body>
</html>

Normaal gesproken zou u dit resultaat moeten hebben:

Uw resultaat


Antwoord 10

Bron Link

Demo Link

Volledige HTML-code

  • Infovenster weergeven bij klikken of zweven.
  • Er wordt slechts één InfoWindow weergegeven

voer hier de afbeeldingsbeschrijving in

   <!DOCTYPE html>
    <html>
    <head>
        <style>
            /*  <span class="metadata-marker" style="display: none;" data-region_tag="css"></span>       Set the size of the div element that contains the map */
            #map {
                height: 400px;
                /* The height is 400 pixels */
                width: 100%;
                /* The width is the width of the web page */
            }
        </style>
        <script>
            var map;
            var InforObj = [];
            var centerCords = {
                lat: -25.344,
                lng: 131.036
            };
            var markersOnMap = [{
                    placeName: "Australia (Uluru)",
                    LatLng: [{
                        lat: -25.344,
                        lng: 131.036
                    }]
                },
                {
                    placeName: "Australia (Melbourne)",
                    LatLng: [{
                        lat: -37.852086,
                        lng: 504.985963
                    }]
                },
                {
                    placeName: "Australia (Canberra)",
                    LatLng: [{
                        lat: -35.299085,
                        lng: 509.109615
                    }]
                },
                {
                    placeName: "Australia (Gold Coast)",
                    LatLng: [{
                        lat: -28.013044,
                        lng: 513.425586
                    }]
                },
                {
                    placeName: "Australia (Perth)",
                    LatLng: [{
                        lat: -31.951994,
                        lng: 475.858081
                    }]
                }
            ];
            window.onload = function () {
                initMap();
            };
            function addMarkerInfo() {
                for (var i = 0; i < markersOnMap.length; i++) {
                    var contentString = '<div id="content"><h1>' + markersOnMap[i].placeName +
                        '</h1><p>Lorem ipsum dolor sit amet, vix mutat posse suscipit id, vel ea tantas omittam detraxit.</p></div>';
                    const marker = new google.maps.Marker({
                        position: markersOnMap[i].LatLng[0],
                        map: map
                    });
                    const infowindow = new google.maps.InfoWindow({
                        content: contentString,
                        maxWidth: 200
                    });
                    marker.addListener('click', function () {
                        closeOtherInfo();
                        infowindow.open(marker.get('map'), marker);
                        InforObj[0] = infowindow;
                    });
                    // marker.addListener('mouseover', function () {
                    //     closeOtherInfo();
                    //     infowindow.open(marker.get('map'), marker);
                    //     InforObj[0] = infowindow;
                    // });
                    // marker.addListener('mouseout', function () {
                    //     closeOtherInfo();
                    //     infowindow.close();
                    //     InforObj[0] = infowindow;
                    // });
                }
            }
            function closeOtherInfo() {
                if (InforObj.length > 0) {
                    /* detach the info-window from the marker ... undocumented in the API docs */
                    InforObj[0].set("marker", null);
                    /* and close it */
                    InforObj[0].close();
                    /* blank the array */
                    InforObj.length = 0;
                }
            }
            function initMap() {
                map = new google.maps.Map(document.getElementById('map'), {
                    zoom: 4,
                    center: centerCords
                });
                addMarkerInfo();
            }
        </script>
    </head>
    <body>
        <h3>My Google Maps Demo</h3>
        <!--The div element for the map -->
        <div id="map"></div>
        <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>
    </body>
    </html>

Antwoord 11

In navolging van Daniel Vassallo’s antwoord, is hier een versie die het sluitingsprobleem op een eenvoudigere manier aanpakt.

Aangezien alle markeringen een individueel InfoWindowhebben en JavaScript het niet uitmaakt of u extra eigenschappen aan een object toevoegt, hoeft u alleen maar een InfoWindownaar de eigenschappen van de Markeren roep vervolgens de .open()op het InfoWindowzelf aan!

Bewerken:met voldoende gegevens kan het laden van de pagina veel tijd in beslag nemen, dus in plaats van het InfoWindowmet de markering te bouwen, zou de constructie alleen moeten gebeuren als dat nodig is. Merk op dat alle gegevens die worden gebruikt om het InfoWindowte construeren, als eigenschap (data) aan de Markermoeten worden toegevoegd. Houd er ook rekening mee dat na de eerste klikgebeurtenis infoWindowzal blijven bestaan ​​als een eigenschap van zijn markering, zodat de browser niet constant hoeft te reconstrueren.

var locations = [
  ['Bondi Beach', -33.890542, 151.274856, 4],
  ['Coogee Beach', -33.923036, 151.259052, 5],
  ['Cronulla Beach', -34.028249, 151.157507, 3],
  ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
  ['Maroubra Beach', -33.950198, 151.259302, 1]
];
var map = new google.maps.Map(document.getElementById('map'), {
  center: new google.maps.LatLng(-33.92, 151.25)
});
for (i = 0; i < locations.length; i++) {  
  marker = new google.maps.Marker({
    position: new google.maps.LatLng(locations[i][1], locations[i][2]),
    map: map,
    data: {
      name: locations[i][0]
    }
  });
  marker.addListener('click', function() {
    if(!this.infoWindow) {
      this.infoWindow = new google.maps.InfoWindow({
        content: this.data.name;
      });
    }
    this.infoWindow.open(map,this);
  })
}

Antwoord 12

Hier is een bijna complete voorbeeld-javascript-functie waarmee meerdere markeringen kunnen worden gedefinieerd in een JSONObject.

Het geeft alleen de markeringen weer die zich binnen de grenzen van de kaart bevinden.

Dit is belangrijk, zodat u geen extra werk doet.

U kunt ook een limiet instellen voor de markeringen, zodat u niet een extreem aantal markeringen laat zien (als er een mogelijkheid is dat u iets gebruikt);

het zal ook geen markeringen weergeven als het midden van de kaart niet meer dan 500 meter is veranderd.
Dit is belangrijk, want als een gebruiker op de markering klikt en per ongeluk de kaart versleept, wil je niet dat de kaart de markeringen opnieuw laadt.

Ik heb deze functie gekoppeld aan de inactieve gebeurtenislistener voor de kaart, zodat markeringen alleen worden weergegeven als de kaart inactief is en de markeringen opnieuw worden weergegeven na een andere gebeurtenis.

In actie screenshot
er is een kleine verandering in de schermafbeelding die meer inhoud in het infovenster laat zien.
voer hier de afbeeldingsbeschrijving in
geplakt van pastbin.com

<script src="//pastebin.com/embed_js/uWAbRxfg"></script>

Antwoord 13

  • Ik weet dat dit antwoord erg laat is. Maar ik zou willen dat dit ook andere ontwikkelaars zou helpen. 🙂
  • De volgende code voegt meerdere markeringen toe aan de Google Maps met het informatievenster.
  • En deze code kan worden gebruikt om een ​​willekeurig aantal markeringen op de kaart te plotten.
  • Plaats uw Google Map API-sleutel op de juiste positie van deze code. (Ik heb dat gemarkeerd als “Uw API-sleutel”)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>My Google Map</title>
    <style>
        #map{
            height: 600px;
            width: 100%;
        }
    </style>
</head>
<body>
<h1>My Google Map`</h1>
<div id="map"></div>
    <script>
        function initMap(){
          //Map options
            var options = {
                zoom:9,
                center:{lat:42.3601, lng:-71.0589}
            }
            // new map
            var map = new google.maps.Map(document.getElementById('map'), options);
            // customer marker
            var iconBase = 'https://maps.google.com/mapfiles/kml/shapes/parking_lot_maps.png';
            //array of Marrkeers
            var markers = [
              {
                coords:{lat: 42.4668, lng: -70.9495},img:iconBase,con:'<h3> This Is your Content <h3>'
              },
              {
                coords:{lat: 42.8584, lng: -70.9300},img:iconBase,con:'<h3> This Is your Content <h3>'
              },
              {
                coords:{lat: 42.7762, lng: -71.0773},img:iconBase,con:'<h3> This Is your Content <h3>'
              }
            ];
            //loopthrough markers
            for(var i = 0; i <markers.length; i++){
              //add markeers
              addMarker(markers[i]);
            }
            //function for the plotting markers on the map
            function addMarker (props){
              var marker = new google.maps.Marker({
                position: props.coords,
                map:map,
                icon:props.img
              });
              var infoWindow = new google.maps.InfoWindow({
                content:props.con,
              });
              marker.addListener("click", () => {
                infoWindow.open(map, marker);
              });
            }
        }
    </script>
    <script
      src="https://maps.googleapis.com/maps/api/js?key=**YourAPIKey**&callback=initMap"
      defer
    ></script>
</body>
</html>

Antwoord 14

Hier is een voorbeeld van meerdere markeringen in Reactjs.

voer hier de afbeeldingsbeschrijving in

Hieronder staat de kaartcomponent

import React from 'react';
import PropTypes from 'prop-types';
import { Map, InfoWindow, Marker, GoogleApiWrapper } from 'google-maps-react';
const MapContainer = (props) => {
  const [mapConfigurations, setMapConfigurations] = useState({
    showingInfoWindow: false,
    activeMarker: {},
    selectedPlace: {}
  });
  var points = [
    { lat: 42.02, lng: -77.01 },
    { lat: 42.03, lng: -77.02 },
    { lat: 41.03, lng: -77.04 },
    { lat: 42.05, lng: -77.02 }
  ]
  const onMarkerClick = (newProps, marker) => {};
  if (!props.google) {
    return <div>Loading...</div>;
  }
  return (
    <div className="custom-map-container">
      <Map
        style={{
          minWidth: '200px',
          minHeight: '140px',
          width: '100%',
          height: '100%',
          position: 'relative'
        }}
        initialCenter={{
          lat: 42.39,
          lng: -72.52
        }}
        google={props.google}
        zoom={16}
      >
        {points.map(coordinates => (
          <Marker
            position={{ lat: coordinates.lat, lng: coordinates.lng }}
            onClick={onMarkerClick}
            icon={{
              url: 'https://res.cloudinary.com/mybukka/image/upload/c_scale,r_50,w_30,h_30/v1580550858/yaiwq492u1lwuy2lb9ua.png',
            anchor: new google.maps.Point(32, 32), // eslint-disable-line
            scaledSize: new google.maps.Size(30, 30)  // eslint-disable-line
            }}
            name={name}
          />))}
        <InfoWindow
          marker={mapConfigurations.activeMarker}
          visible={mapConfigurations.showingInfoWindow}
        >
          <div>
            <h1>{mapConfigurations.selectedPlace.name}</h1>
          </div>
        </InfoWindow>
      </Map>
    </div>
  );
};
export default GoogleApiWrapper({
  apiKey: process.env.GOOGLE_API_KEY,
  v: '3'
})(MapContainer);
MapContainer.propTypes = {
  google: PropTypes.shape({}).isRequired,
};

Antwoord 15

De recentste eenvoudigste na wijziging in huidige kaartmarkeringen en clustereralgoritme:

Aanpassing op: https://developers.google .com/maps/documentation/javascript/marker-clustering[![voerafbeeldingsbeschrijving hier in]1]1

<!DOCTYPE Html>
<html>
<head>
<meta Content-Security-Policy="default-src  'self'; script-src 'self' 'unsafe-eval' https://*/;">
<link type="text/css" href="http://www.mapsmarker.com/wp-content/uploads/leaflet-maps-marker-icons/bar_coktail.png">
<link rel="icon" href="data:,">
<title>App</title>
</head>
<style type="text/css">
   #map {
    height: 500
}
</style>
<body>
<div id='map' style="width:100%; height:400px"></div>
<script type='text/javascript'>
    function initMap() {
        maps = new google.maps.Map(document.getElementById('map'), {
            center: new google.maps.LatLng(12.9824855, 77.637094),
            zoom: 5,
            disableDefaultUI: false,
            mapTypeId: google.maps.MapTypeId.HYBRID
        });
        var labels='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
        var markerImage = 'http://www.mapsmarker.com/wp-content/uploads/leaflet-maps-marker-icons/bar_coktail.png';
        marker = locations.map(function (location, i) {
            return new google.maps.Marker({
                position: new google.maps.LatLng(location.lat, location.lng),
                map: maps,
                title: "Map",
                label: labels[i % labels.length],
                icon: markerImage
            });
        });
        var markerCluster = new MarkerClusterer(maps, marker, {
            imagePath: 'https://developers.google.com/maps/documentation/javascript/examples/markerclusterer/m'
        });
    }
    var locations = [
            { lat: 12.9824855, lng: 77.637094},
            { lat: 11.9824855, lng: 77.154312 },
            { lat: 12.8824855, lng: 77.637094},
            { lat: 10.8824855, lng: 77.054312 },
            { lat: 12.9824855, lng: 77.637094},
            { lat: 11.9824855, lng: 77.154312 },
            { lat: 12.8824855, lng: 77.637094},
            { lat: 13.8824855, lng: 77.054312 },
            { lat: 14.9824855, lng: 54.637094},
            { lat: 15.9824855, lng: 54.154312 },
            { lat: 16.8824855, lng: 53.637094},
            { lat: 17.8824855, lng: 52.054312 },
            { lat: 18.9824855, lng: 51.637094},
            { lat: 19.9824855, lng: 69.154312 },
            { lat: 20.8824855, lng: 68.637094},
            { lat: 21.8824855, lng: 67.054312 },
            { lat: 12.9824855, lng: 76.637094},
            { lat: 11.9824855, lng: 75.154312 },
            { lat: 12.8824855, lng: 74.637094},
            { lat: 10.8824855, lng: 74.054312 },
            { lat: 12.9824855, lng: 73.637094},
            { lat: 3.9824855, lng: 72.154312 },
            { lat: 2.8824855, lng: 71.637094},
            { lat: 1.8824855, lng: 70.054312 }
        ];
</script>
<script src="https://unpkg.com/@google/[email protected]/dist/markerclustererplus.min.js">
</script>
<script src="https:maps.googleapis.com/maps/api/js?key=AIzaSyDWu6_Io9xA1oerfOxE77YAv31etN4u3Dw&callback=initMap">
</script>
<script type='text/javascript'></script>

LEAVE A REPLY

Please enter your comment!
Please enter your name here

10 − four =

Other episodes