<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
    <meta charset="utf-8">
    <link href="style.css" rel="stylesheet" />
    <title>Google Maps with canvas overlay for displaying marker s with custom icons</title>
    <script src="https://maps.googleapis.com/maps/api/js"></script>
    <script type="text/javascript" src="https://rawgit.com/vgrem/6dd435ebacd720f0ad10/raw/4af8287e17c3aea92b50681d0a9061f2b620f70d/iconsoverlay.js"></script>
    <script src="map.js"></script>
  </head>
  <body>
    <div id="map"></div>
  </body>
</html>
html, body {
  height: 100%;
  margin: 0;
  padding: 0;
}

#map {
  height: 100%;
}

function initMap() {
  var map = new google.maps.Map(document.getElementById('map'), {
    center: {
      lat: -30.3647,
      lng: 149.555
    },
    zoom: 4,
    mapTypeId: google.maps.MapTypeId.TERRAIN
  });



  

 var overlay = new IconsOverlay(map);

  //1.load GeoJSON data
  var data = generateData(2000);
  //2.display custom icons
  data.features.forEach(function (f, id) {

    var position = new google.maps.LatLng(f.geometry.coordinates[1], f.geometry.coordinates[0]);

    if (id > 0 && id % 2 == 0) {
      //add circle icon
      var circleIconProperties = {
        id: id,
        path: google.maps.SymbolPath.CIRCLE,
        strokeWeight: 2,
        strokeColor: 'rgba(0, 0, 0, 1)',
        fillColor: 'rgba(160,16,0,0.5)',
        scale: 12
      }
      overlay.addIcon(position, circleIconProperties);
    }
    else if (id > 0 && id % 3 == 0) {

      //add path icon
      var pathIconProperties = {
        id: id,
        path: 'm5.219986,29.697235l23.795303,0l0,-25.117241l24.409424,0l0,25.117241l23.795288,0l0,25.765518l-23.795288,0l0,25.117264l-24.409424,0l0,-25.117264l-23.795303,0l0,-25.765518z',
        strokeWeight: 2,
        strokeColor: 'rgba(0, 0, 0, 1)',
        fillColor: 'rgba(160,16,0,0.5)',
        scale: 0.5
      }
      overlay.addIcon(position,pathIconProperties);
    } else {
      var arrowIconProperties = {
        id: id,
        path: google.maps.SymbolPath.BACKWARD_OPEN_ARROW,
        strokeColor: 'rgba(0, 0, 0, 1)',
        fillColor: 'rgba(160,16,0,0.5)',
        fillOpacity: 0.5,
        scale: 4
      }
      overlay.addIcon(position, arrowIconProperties);       
    }     
  });
}







//Helper methods

function generateData(count) {
  var data = {
    "type": "FeatureCollection",
    "features": []
  };

  for (var i = 0; i < count; i++) {
    var lat = getRandomArbitrary(-30.0,-15.0);
    var lng = getRandomArbitrary(120.0,150.0);

    data.features.push({
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [lng, lat]
      },
      "properties": {
        "id": i.toString(),
        "lat": lat.toString(),
        "long": lng.toString(),
      }
    });
  }
  return data;
}





function getRandomArbitrary(min, max) {
  return Math.random() * (max - min) + min;
}

function getRandomInt(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

google.maps.event.addDomListener(window, 'load', initMap);