Zoom to Percentage of Google Map Markers

by BaronGrivet

HTML

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://maps.googleapis.com/maps/api/js"></script>
    <div id="map" class="map">
    </div>
<a href="#" onclick="zoomMapToMarkers(5)">5%</a> - 
<a href="#" onclick="zoomMapToMarkers(10)">10%</a> - 
<a href="#" onclick="zoomMapToMarkers(20)">20%</a> - <a href="#" onclick="zoomMapToMarkers(40)">40%</a> - <a href="#" onclick="zoomMapToMarkers(60)">60%</a> - <a href="#" onclick="zoomMapToMarkers(80)">80%</a> - <a href="#" onclick="zoomMapToMarkers(100)">100%</a>

CSS

.map {
  height: 400px;
  width: 100%;
}

JavaScript

var map;
var markers = [];
var bounds = [];
var centreLat = 37.422000;
var centreLng = -122.084057;

$(document).ready(initMap());

function initMap() {
    map = new google.maps.Map(document.getElementById('map'), {
        center: {
            lat: centreLat,
            lng: centreLng
        },
        zoom: 1,
        disableDefaultUI: true
		});

		for (i = 0; i < 100; i++) { 
    	var lat = getRandomInRange(-45, 45, 3);
    	var lng = getRandomInRange(-180, 180, 3);
    	var position = new google.maps.LatLng(lat, lng);

    	markers[i] = new google.maps.Marker({
      	position: position,
       	map: map,
        icon: 'http://maps.google.com/mapfiles/ms/icons/red-dot.png'
      });
      markers[i].distance = distanceBetween(lat, lng, centreLat, centreLng);   	
		}

}
  
function zoomMapToMarkers(percent) {
    var bounds = new google.maps.LatLngBounds();
    var numberOfMarkers = parseInt(markers.length * (percent / 100));
    markers.sort(compareDistance);
    markers.forEach(function(marker) {
        if (numberOfMarkers > 0) {
            bounds.extend(marker.position);
            marker.setIcon( 'http://maps.google.com/mapfiles/ms/icons/green-dot.png');
            numberOfMarkers--;
        } else {
            marker.setIcon( 'http://maps.google.com/mapfiles/ms/icons/red-dot.png');
        
        }
    });
    map.fitBounds(bounds);
}

function distanceBetween(lat1, lng1, lat2, lng2) {
    var lat = lat1 - lat2;
    var lng = lng1 - lng2;
    return Math.sqrt(lat * lat + lng * lng);
}

function compareDistance(a, b) {
    if (a.distance < b.distance)
        return -1;
    if (a.distance > b.distance)
        return 1;
    return 0;
}

  
  
//From https://stackoverflow.com/a/6878845/348485
function getRandomInRange(from, to, fixed) {
    return (Math.random() * (to - from) + from).toFixed(fixed) * 1;
    // .toFixed() returns string, so ' * 1' is a trick to convert to number
}