Google Maps Api v3 - find nearest markers

Google MapsGoogle Maps-Api-3

Google Maps Problem Overview


When i click on map, which will be best way to find nearest marker or markers? is there some functions in api that will help me to do that?

it's google map api v3.

Google Maps Solutions


Solution 1 - Google Maps

First you have to add the eventlistener

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

Then create a function that loops through the array of markers and uses the haversine formula to calculate the distance of each marker from the click.

function rad(x) {return x*Math.PI/180;}
function find_closest_marker( event ) {
	var lat = event.latLng.lat();
	var lng = event.latLng.lng();
	var R = 6371; // radius of earth in km
	var distances = [];
	var closest = -1;
	for( i=0;i<map.markers.length; i++ ) {
		var mlat = map.markers[i].position.lat();
		var mlng = map.markers[i].position.lng();
  		var dLat  = rad(mlat - lat);
  		var dLong = rad(mlng - lng);
		var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
          	Math.cos(rad(lat)) * Math.cos(rad(lat)) * Math.sin(dLong/2) * Math.sin(dLong/2);
  		var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
  		var d = R * c;
  		distances[i] = d;
  		if ( closest == -1 || d < distances[closest] ) {
  			closest = i;
  		}
	}
	
	alert(map.markers[closest].title);
}

This keeps track of the closest markers and alerts its title.

I have my markers as an array on my map object

Solution 2 - Google Maps

You can use the computeDistanceBetween() method in the google.maps.geometry.spherical namespace.

Solution 3 - Google Maps

I'd like to expand on Leor's suggestion and provide a working solution:

I'm using markers in a markers array e.g. var markers = [];.

Then let's have our position as something like var location = new google.maps.LatLng(51.99, -0.74);

Then we simply reduce our markers against the location we have like so:

markers.reduce(function (prev, curr) {

    var cpos = google.maps.geometry.spherical.computeDistanceBetween(location.position, curr.position);
    var ppos = google.maps.geometry.spherical.computeDistanceBetween(location.position, prev.position);

    return cpos < ppos ? curr : prev;

}).position

What pops out is your closest marker LatLng object.

Solution 4 - Google Maps

The formula above didn't work for me, but I used this without any issue. Pass your current location to the function, and loop through an array of markers to find the closest:

function find_closest_marker( lat1, lon1 ) {    
    var pi = Math.PI;
    var R = 6371; //equatorial radius
    var distances = [];
    var closest = -1;
        
    for( i=0;i<markers.length; i++ ) {	
        var lat2 = markers[i].position.lat();
        var lon2 = markers[i].position.lng();
        
	    var chLat = lat2-lat1;
        var chLon = lon2-lon1;
    
        var dLat = chLat*(pi/180);
	    var dLon = chLon*(pi/180);

        var rLat1 = lat1*(pi/180);
        var rLat2 = lat2*(pi/180);

        var a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
                    Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(rLat1) * Math.cos(rLat2); 
        var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
        var d = R * c;

        distances[i] = d;
        if ( closest == -1 || d < distances[closest] ) {
            closest = i;
        }
    }

    // (debug) The closest marker is:
    console.log(markers[closest]);
}

Solution 5 - Google Maps

Are you aware of Mysql Spatial extensions?

You could use something like MBRContains(g1,g2).

Solution 6 - Google Maps

Here is another function that works great for me, returns distance in kilometers:

 function distance(lat1, lng1, lat2, lng2) {
        var radlat1 = Math.PI * lat1 / 180;
        var radlat2 = Math.PI * lat2 / 180;
        var radlon1 = Math.PI * lng1 / 180;
        var radlon2 = Math.PI * lng2 / 180;
        var theta = lng1 - lng2;
        var radtheta = Math.PI * theta / 180;
        var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
        dist = Math.acos(dist);
        dist = dist * 180 / Math.PI;
        dist = dist * 60 * 1.1515;

        //Get in in kilometers
        dist = dist * 1.609344;

        return dist;
    }

Solution 7 - Google Maps

Use computeDistanceBetween() https://developers.google.com/maps/documentation/javascript/reference/geometry#spherical.computeDistanceBetween">Google map API method to calculate near marker between your location and markers list on google map.

Steps:-

  1. Create marker on google map.
    function addMarker(location) { var marker = new google.maps.Marker({ title: 'User added marker', icon: { path: google.maps.SymbolPath.BACKWARD_CLOSED_ARROW, scale: 5 }, position: location, map: map }); }

  2. On Mouse click create event for getting lat, long of your location and pass that to find_closest_marker().

    function find_closest_marker(event) {
    	  var distances = [];
    	  var closest = -1;
    	  for (i = 0; i < markers.length; i++) {
    		var d = google.maps.geometry.spherical.computeDistanceBetween(markers[i].position, event.latLng);
    		distances[i] = d;
    		if (closest == -1 || d < distances[closest]) {
    		  closest = i;
    		}
    	  }
    	  alert('Closest marker is: ' + markers[closest].getTitle());
    	}
    

visit https://github.com/vikesh-tonpe/Nearer-marker-to-given-location">this link follow the steps. You will able to get nearer marker to your location.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser198003View Question on Stackoverflow
Solution 1 - Google MapsGalenView Answer on Stackoverflow
Solution 2 - Google MapsLeorView Answer on Stackoverflow
Solution 3 - Google MapsJonathanView Answer on Stackoverflow
Solution 4 - Google MapsmheaversView Answer on Stackoverflow
Solution 5 - Google MapsArgiropoulos StavrosView Answer on Stackoverflow
Solution 6 - Google MapsChris PanayotoffView Answer on Stackoverflow
Solution 7 - Google MapsvikeshView Answer on Stackoverflow