How to find nearest location using latitude and longitude from a json data
To calculate distance between two co-ordinates, you can't just subtract the values. That's fine but it gives you the co-ordinates that are within a square. This may be suitable but mostly people do tend to want to search locations by radius. This function will do that...
function distance(lat1, lon1, lat2, lon2, unit) { var radlat1 = Math.PI * lat1/180 var radlat2 = Math.PI * lat2/180 var theta = lon1-lon2 var radtheta = Math.PI * theta/180 var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta); if (dist > 1) { dist = 1; } dist = Math.acos(dist) dist = dist * 180/Math.PI dist = dist * 60 * 1.1515 if (unit=="K") { dist = dist * 1.609344 } if (unit=="N") { dist = dist * 0.8684 } return dist}
It's a common piece of code which I copied from here...
https://www.geodatasource.com/developers/javascript
And here it is, used in your example...
function distance(lat1, lon1, lat2, lon2, unit) { var radlat1 = Math.PI * lat1/180 var radlat2 = Math.PI * lat2/180 var theta = lon1-lon2 var radtheta = Math.PI * theta/180 var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta); if (dist > 1) { dist = 1; } dist = Math.acos(dist) dist = dist * 180/Math.PI dist = dist * 60 * 1.1515 if (unit=="K") { dist = dist * 1.609344 } if (unit=="N") { dist = dist * 0.8684 } return dist}var data = [{ "code": "0001", "lat": "1.28210155945393", "lng": "103.81722480263163", "location": "Stop 1"}, { "code": "0003", "lat": "1.2777380589964", "lng": "103.83749709165197", "location": "Stop 2"}, { "code": "0002", "lat": "1.27832046633393", "lng": "103.83762574759974", "location": "Stop 3"}];var html = "";var poslat = 1.28210155945393;var poslng = 103.81722480263163;for (var i = 0; i < data.length; i++) { // if this location is within 0.1KM of the user, add it to the list if (distance(poslat, poslng, data[i].lat, data[i].lng, "K") <= 0.1) { html += '<p>' + data[i].location + ' - ' + data[i].code + '</p>'; }}$('#nearbystops').append(html);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script><div id="nearbystops"></div>
get current user's location using HTML5 geolocation and find nearest location within 100 meters.
include and use below google maps libs
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false&libraries=geometry"> </script>
Snippet
//calculates distance between two points in km'sfunction calcDistance(p1, p2) { return (google.maps.geometry.spherical.computeDistanceBetween(p1, p2) / 1000).toFixed(2);}function getPosition(position) { var userPosition = { lat: position.coords.latitude, lng: position.coords.longitude }; $.getJSON("places.json", function(data) { for (var i = 0; i < data.length; i++) { var p1 = new google.maps.LatLng(userPosition.lat, userPosition.lng); var p2 = new google.maps.LatLng(data[i].lat, data[i].lng); var distance = calcDistance(p1, p2) * 1000; if ((distance * 1000) <= 100) { html += '<p>' + data[i].location + ' - ' + data[i].code + '</p>'; $('#nearbystops').append(html); } } })}// get user's current latitude & longitudefunction getLocation() { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(getPosition); } else { alert("Geolocation is not supported by this browser."); }}getLocation();
To calculate the distance between two points (latitude, longitude), implemented a function of haversine formula in typescript.
//There are 6200 points in the JSON fileimport data from './json/test.json';let radians = function (degree: number) { // degrees to radians let rad: number = degree * Math.PI / 180; return rad;}const haversine = (lat1: number, lon1: number, lat2: number, lon2: number) => { let dlat, dlon, a, c, R: number; R = 6372.8; // km dlat = radians(lat2 - lat1); dlon = radians(lon2 - lon1); lat1 = radians(lat1); lat2 = radians(lat2); a = Math.sin(dlat / 2) * Math.sin(dlat / 2) + Math.sin(dlon / 2) * Math.sin(dlon / 2) * Math.cos(lat1) * Math.cos(lat2) c = 2 * Math.asin(Math.sqrt(a)); return R * c;}let test = function () { const keys = Object.keys(data); let count: number = keys.length; for (var _i = 0; _i < count; _i++) { var _dummy: number = haversine( 36.12, -86.67, data[_i].position.lat, data[_i].position.lng); }}