Calculate distance between 2 GPS coordinates

前端 未结 29 3481
青春惊慌失措
青春惊慌失措 2020-11-21 23:34

How do I calculate distance between two GPS coordinates (using latitude and longitude)?

相关标签:
29条回答
  • 2020-11-22 00:05

    Here it is in C# (lat and long in radians):

    double CalculateGreatCircleDistance(double lat1, double long1, double lat2, double long2, double radius)
    {
        return radius * Math.Acos(
            Math.Sin(lat1) * Math.Sin(lat2)
            + Math.Cos(lat1) * Math.Cos(lat2) * Math.Cos(long2 - long1));
    }
    

    If your lat and long are in degrees then divide by 180/PI to convert to radians.

    0 讨论(0)
  • 2020-11-22 00:05

    This is version from "Henry Vilinskiy" adapted for MySQL and Kilometers:

    CREATE FUNCTION `CalculateDistanceInKm`(
      fromLatitude float,
      fromLongitude float,
      toLatitude float, 
      toLongitude float
    ) RETURNS float
    BEGIN
      declare distance float;
    
      select 
        6367 * ACOS(
                round(
                  COS(RADIANS(90-fromLatitude)) *
                    COS(RADIANS(90-toLatitude)) +
                    SIN(RADIANS(90-fromLatitude)) *
                    SIN(RADIANS(90-toLatitude)) *
                    COS(RADIANS(fromLongitude-toLongitude))
                  ,15)
                )
        into distance;
    
      return  round(distance,3);
    END;
    
    0 讨论(0)
  • 2020-11-22 00:05

    you can find a implementation of this (with some good explanation) in F# on fssnip

    here are the important parts:

    
    let GreatCircleDistance<[<Measure>] 'u> (R : float<'u>) (p1 : Location) (p2 : Location) =
        let degToRad (x : float<deg>) = System.Math.PI * x / 180.0<deg/rad>
    
        let sq x = x * x
        // take the sin of the half and square the result
        let sinSqHf (a : float<rad>) = (System.Math.Sin >> sq) (a / 2.0<rad>)
        let cos (a : float<deg>) = System.Math.Cos (degToRad a / 1.0<rad>)
    
        let dLat = (p2.Latitude - p1.Latitude) |> degToRad
        let dLon = (p2.Longitude - p1.Longitude) |> degToRad
    
        let a = sinSqHf dLat + cos p1.Latitude * cos p2.Latitude * sinSqHf dLon
        let c = 2.0 * System.Math.Atan2(System.Math.Sqrt(a), System.Math.Sqrt(1.0-a))
    
        R * c
    
    0 讨论(0)
  • 2020-11-22 00:05

    I needed to implement this in PowerShell, hope it can help someone else. Some notes about this method

    1. Don't split any of the lines or the calculation will be wrong
    2. To calculate in KM remove the * 1000 in the calculation of $distance
    3. Change $earthsRadius = 3963.19059 and remove * 1000 in the calculation of $distance the to calulate the distance in miles
    4. I'm using Haversine, as other posts have pointed out Vincenty's formulae is much more accurate

      Function MetresDistanceBetweenTwoGPSCoordinates($latitude1, $longitude1, $latitude2, $longitude2)  
      {  
        $Rad = ([math]::PI / 180);  
      
        $earthsRadius = 6378.1370 # Earth's Radius in KM  
        $dLat = ($latitude2 - $latitude1) * $Rad  
        $dLon = ($longitude2 - $longitude1) * $Rad  
        $latitude1 = $latitude1 * $Rad  
        $latitude2 = $latitude2 * $Rad  
      
        $a = [math]::Sin($dLat / 2) * [math]::Sin($dLat / 2) + [math]::Sin($dLon / 2) * [math]::Sin($dLon / 2) * [math]::Cos($latitude1) * [math]::Cos($latitude2)  
        $c = 2 * [math]::ATan2([math]::Sqrt($a), [math]::Sqrt(1-$a))  
      
        $distance = [math]::Round($earthsRadius * $c * 1000, 0) #Multiple by 1000 to get metres  
      
        Return $distance  
      }
      
    0 讨论(0)
  • 2020-11-22 00:06

    I needed to calculate a lot of distances between the points for my project, so I went ahead and tried to optimize the code, I have found here. On average in different browsers my new implementation runs 2 times faster than the most upvoted answer.

    function distance(lat1, lon1, lat2, lon2) {
      var p = 0.017453292519943295;    // Math.PI / 180
      var c = Math.cos;
      var a = 0.5 - c((lat2 - lat1) * p)/2 + 
              c(lat1 * p) * c(lat2 * p) * 
              (1 - c((lon2 - lon1) * p))/2;
    
      return 12742 * Math.asin(Math.sqrt(a)); // 2 * R; R = 6371 km
    }
    

    You can play with my jsPerf and see the results here.

    Recently I needed to do the same in python, so here is a python implementation:

    from math import cos, asin, sqrt
    def distance(lat1, lon1, lat2, lon2):
        p = 0.017453292519943295
        a = 0.5 - cos((lat2 - lat1) * p)/2 + cos(lat1 * p) * cos(lat2 * p) * (1 - cos((lon2 - lon1) * p)) / 2
        return 12742 * asin(sqrt(a))
    

    And for the sake of completeness: Haversine on wiki.

    0 讨论(0)
  • 2020-11-22 00:06

    i took the top answer and used it in a Scala program

    import java.lang.Math.{atan2, cos, sin, sqrt}
    
    def latLonDistance(lat1: Double, lon1: Double)(lat2: Double, lon2: Double): Double = {
        val earthRadiusKm = 6371
        val dLat = (lat2 - lat1).toRadians
        val dLon = (lon2 - lon1).toRadians
        val latRad1 = lat1.toRadians
        val latRad2 = lat2.toRadians
    
        val a = sin(dLat / 2) * sin(dLat / 2) + sin(dLon / 2) * sin(dLon / 2) * cos(latRad1) * cos(latRad2)
        val c = 2 * atan2(sqrt(a), sqrt(1 - a))
        earthRadiusKm * c
    }
    

    i curried the function in order to be able to easily produce functions that have one of the two locations fixed and require only a pair of lat/lon to produce distance.

    0 讨论(0)
提交回复
热议问题