Find Google Maps closest marker

Finds closest marker to user clicked spot.

by Rene Korss

HTML

<script src="https://maps.googleapis.com/maps/api/js?key=&amp;v=3.0&amp;sensor=true&amp;language=ee&amp;libraries=geometry"></script>
<div id="map-canvas"></div>

CSS

#map-canvas {
    width: 500px;
    height: 500px;
}

JavaScript

var map;
var markers = [];
var marker, i;
var infowindow = new google.maps.InfoWindow({
    content: ''
});
var locations = [
    ['A', 3.180967, 101.715546, 1],
    ['B', 3.200848, 101.616669, 2],
    ['C', 3.147372, 101.597443, 3],
    ['D', 3.19125, 101.710052, 4]
];

function initialize() {
    var haightAshbury = new google.maps.LatLng(3.171368, 101.653404);
    var mapOptions = {
        zoom: 12,
        center: haightAshbury,
        mapTypeId: google.maps.MapTypeId.TERRAIN
    };

    map = new google.maps.Map(document.getElementById('map-canvas'),
    mapOptions);

    google.maps.event.addListener(map, 'click', function (event) {
        // Dont add this marker if you don't want users markers. Closest function will still work.
        addMarker(event.latLng);
    });

    google.maps.event.addListener(map, 'click', find_closest_marker);

    for (i = 0; i < locations.length; i++) {
        marker = new google.maps.Marker({
            title: locations[i][0],
            position: new google.maps.LatLng(locations[i][1], locations[i][2]),
            map: map
        });
        markers.push(marker);

        google.maps.event.addListener(marker, 'click', (function (marker, i) {
            return function () {
                infowindow.setContent(locations[i][0]);
                infowindow.open(map, marker);
            }
        })(marker, i));
    }
}

function addMarker(location) {
    var marker = new google.maps.Marker({
        title: 'User added marker',
        // Just to differ from default markers
        icon: {
            path: google.maps.SymbolPath.BACKWARD_CLOSED_ARROW,
            scale: 5
        },
        position: location,
        map: map
    });
    // You can not add it to markers array. Otherwise added marker will be always the closest to itself
    //markers.push(marker); 
}

function find_closest_marker(event) {
    var distances = [];
    var closest = -1;
    for (i = 0; i < markers.length; i++) {
        var d =...