Ever wonder what happens when you put your team from work in a locked room for 24 hours and ‘force’ them to make a site based on a certain ‘issue’. If you do take a look at Les 24 heures de Tam Tam (In Dutch though). Last Friday we had this ‘event’ for the first time and as you can on the pictures / movies we had a lot of fun.
It was for this event that I had brush up my Virtual Earth skills, since as a team we decided to make a small ‘route planner’ based on Virtual Earth. The idea was to create a new map, set up a layer containing a set of pushpins with the locations of all Snack corners, and based on the current location of the user show a route to the nearest Snack Corner. Pretty plain and simple we thought. It happens to be a bit complicated though; the Virtual Earth API doesn’t have an option to get nearest pushpin, and getting the route for each pushpin and then deciding what the nearest location is would probably fail when there are more than 5 pushpins.
Then the old school math struck me: why not use Pythagoras do decide what the nearest pushpin is (though it might be not as precise as getting the Route and determine the exact distance, but getting the overall distance it is a great improvement on performance).
So assuming you have a map, containing a set of pushpins (tip: check the veLayerSpec with GeoRSS), you can loop trough each pushpin and set the latitude and longitude to an array, and define two vars, one for the ID of the pushpin and one of the value of the Pushpin ( I used 999). Then the next simple function will be sufficient (comments inline):
function GetNearest(latlon)
// latlon should be the location searchin from
{
var temp = new String(latlon);
var mySplitResult = temp.split(",")
var searchLat = mySplitResult[0];
var searchLon = mySplitResult[1];
// latlon is striped in to two values
// pushPinsLat is the lenght of the array that we will check our current lat/lon against
// So we loop trough the array with pushpin locations
for (var i=0, len=pushPinsLat.length; i<len; ++i )
{
var ppLat = pushPinsLat[i];
var ppLon = pushPinsLon[i];
// Math.abs returns an absolute value;
var latcount = Math.abs(ppLat - searchLat);
var loncount = Math.abs(ppLon - searchLon);
//Math.pows gets our lat/lon raised to the power of 2
var temp = Math.pow(latcount, 2);
var temp2 = Math.pow(loncount, 2);
// When we have the lat / lon we can do a square root
// the dst will resemble the 'distance',
var dst = Math.sqrt(temp+temp2);
// Then only set the the pushpinVar containing the ID when the current ID is smaller
// When were done looping trough the set ppID contains the pushpin ID nearest to current location
if (dst < ppValue)
{
ppValue = dst;
ppID = latlon;
}
}
}
So the math saved the day, since the actual getting of the route is easy; the API allows you to get a route with map.GetDirections(locations, options).