How to find nearest location using latitude and longitude from a json data

前端 未结 3 1217
无人共我
无人共我 2021-02-06 15:19

I\'m trying to make a website that ask for user\'s location then find the closest location (100m radius) from it\'s position using GeoLocation and display the result in HTML.

相关标签:
3条回答
  • 2021-02-06 15:47

    To calculate the distance between two points (latitude, longitude), implemented a function of haversine formula in typescript.

    //There are 6200 points in the JSON file
    import 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);
      }
    
    }
    
    0 讨论(0)
  • 2021-02-06 15:54

    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>

    0 讨论(0)
  • 2021-02-06 15:55

    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's
    function 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 & longitude
    function getLocation() {
      if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(getPosition);
      } else {
        alert("Geolocation is not supported by this browser.");
      }
    }
    
    getLocation();
    
    0 讨论(0)
提交回复
热议问题