There are several solutions to the dense/overlapping marker problem. These solutions include:
In this example, we look at how user can change zIndex to reveal potentially hidden markers.
zIndex - All features are displayed on the map in order of their zIndex, with higher values displaying in front of features with lower values. Markers are always displayed in front of line-strings and polygons.
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no">
<meta charset="utf-8">
<title></title>
<script src="http://maps.googleapis.com/maps/api/js" type="text/javascript"></script>
<script src="../jquery/jquery.js" type="text/javascript"></script>
<style>
body{
padding:20px
font-family: Arial;
font-size: 16px;
}
#map-canvas{
height: 500px;
width: 600px;
}
pre {
border:1px solid #D6E0F5;
padding:5px;
margin:5px;
background:#EBF0FA;
}
/* fix for unwanted scroll bar in InfoWindow */
.scrollFix {
line-height: 1.35;
overflow: hidden;
white-space: nowrap;
}
</style>
<script type="text/javascript">
"use strict";
var markers = [];
$( document ).ready(function() {
// variable to hold a map
var map;
// variable to hold current active InfoWindow
var activeInfoWindow;
// ------------------------------------------------------------------------------- //
// initialize function
// ------------------------------------------------------------------------------- //
function initialize() {
// map options - lots of options available here
var mapOptions = {
zoom: 5,
draggable: true,
center: new google.maps.LatLng(44.960, -93.100),
mapTypeId: google.maps.MapTypeId.ROADMAP
};
// create map in div called map-canvas using map options defined above
map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
// define three Google Map LatLng objects representing geographic points
var stPaul = new google.maps.LatLng(44.95273,-93.08915);
var minneapolis = new google.maps.LatLng(44.97994,-93.26630);
var falconHeights = new google.maps.LatLng(44.9917,-93.1664);
// place markers
fnPlaceMarkers(stPaul,"St Paul",'icon-1.png');
fnPlaceMarkers(minneapolis,"Minneapolis",'icon-2.png');
fnPlaceMarkers(falconHeights,"Falcon Heights",'icon-3.png');
// ------------------------------------------------------------------------------- //
// LISTENERS
// ------------------------------------------------------------------------------- //
// on click of a href in infoWindow
$( "#map-canvas" ).on( "click", "a", function( event ) {
var seq = $(this).attr("data-seq");
setMarkerBack(seq)
return false;
});
}
// ------------------------------------------------------------------------------- //
// create markers on the map
// ------------------------------------------------------------------------------- //
function fnPlaceMarkers(myLocation, myCityName,myIcon) {
var marker = new google.maps.Marker({
position: myLocation,
zIndex: Math.round(myLocation.lat()*-100000)<<5,
icon: myIcon
});
// Renders the marker on the specified map
marker.setMap(map);
var i = markers.length;
// save marker
markers.push(marker);
// create an InfoWindow
var infoWnd = new google.maps.InfoWindow();
// add content to your InfoWindow
infoWnd.setContent('<div class="scrollFix">' + 'Welcome to ' + myCityName + '!<br/><br/>' +
'<a href="#" data-seq='+i+'>Click</a>' + ' to decrease marker\'s zIndex value. <br/>' +
'This will move marker to the back of the group <br/>' +
'zIndex is ' +marker.get('zIndex') + '<br/>' +
'</div>');
// add listener on InfoWindow - close last infoWindow before opening new one
google.maps.event.addListener(marker, 'click', function(){
//Close active window if exists - [one might expect this to be default behaviour no?]
if (activeInfoWindow != null) activeInfoWindow.close();
// Open InfoWindow
infoWnd.open(map, marker);
// Store new open InfoWindow in global variable
activeInfoWindow = infoWnd;
});
}
// ------------------------------------------------------------------------------- //
// set marker z-index back
// ------------------------------------------------------------------------------- //
function setMarkerBack(i){
var currentZ = markers[i].get('zIndex');
markers[i].set('zIndex', currentZ-100000);
activeInfoWindow.close();
}
// ------------------------------------------------------------------------------- //
// initial load
// ------------------------------------------------------------------------------- //
google.maps.event.addDomListener(window, 'load', initialize);
}); // end jquery
</script>
<br/>
<div id="map-canvas"></div>
<br/>