Calculate distance between 2 GPS coordinates

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

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

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

    Java Version of Haversine Algorithm based on Roman Makarov`s reply to this thread

    public class HaversineAlgorithm {
    
        static final double _eQuatorialEarthRadius = 6378.1370D;
        static final double _d2r = (Math.PI / 180D);
    
        public static int HaversineInM(double lat1, double long1, double lat2, double long2) {
            return (int) (1000D * HaversineInKM(lat1, long1, lat2, long2));
        }
    
        public static double HaversineInKM(double lat1, double long1, double lat2, double long2) {
            double dlong = (long2 - long1) * _d2r;
            double dlat = (lat2 - lat1) * _d2r;
            double a = Math.pow(Math.sin(dlat / 2D), 2D) + Math.cos(lat1 * _d2r) * Math.cos(lat2 * _d2r)
                    * Math.pow(Math.sin(dlong / 2D), 2D);
            double c = 2D * Math.atan2(Math.sqrt(a), Math.sqrt(1D - a));
            double d = _eQuatorialEarthRadius * c;
    
            return d;
        }
    
    }
    
    0 讨论(0)
  • 2020-11-22 00:11

    This Lua code is adapted from stuff found on Wikipedia and in Robert Lipe's GPSbabel tool:

    local EARTH_RAD = 6378137.0 
      -- earth's radius in meters (official geoid datum, not 20,000km / pi)
    
    local radmiles = EARTH_RAD*100.0/2.54/12.0/5280.0;
      -- earth's radius in miles
    
    local multipliers = {
      radians = 1, miles = radmiles, mi = radmiles, feet = radmiles * 5280,
      meters = EARTH_RAD, m = EARTH_RAD, km = EARTH_RAD / 1000, 
      degrees = 360 / (2 * math.pi), min = 60 * 360 / (2 * math.pi)
    }
    
    function gcdist(pt1, pt2, units) -- return distance in radians or given units
      --- this formula works best for points close together or antipodal
      --- rounding error strikes when distance is one-quarter Earth's circumference
      --- (ref: wikipedia Great-circle distance)
      if not pt1.radians then pt1 = rad(pt1) end
      if not pt2.radians then pt2 = rad(pt2) end
      local sdlat = sin((pt1.lat - pt2.lat) / 2.0);
      local sdlon = sin((pt1.lon - pt2.lon) / 2.0);
      local res = sqrt(sdlat * sdlat + cos(pt1.lat) * cos(pt2.lat) * sdlon * sdlon);
      res = res > 1 and 1 or res < -1 and -1 or res
      res = 2 * asin(res);
      if units then return res * assert(multipliers[units])
      else return res
      end
    end
    
    0 讨论(0)
  • 2020-11-22 00:14

    Look for haversine with Google; here is my solution:

    #include <math.h>
    #include "haversine.h"
    
    #define d2r (M_PI / 180.0)
    
    //calculate haversine distance for linear distance
    double haversine_km(double lat1, double long1, double lat2, double long2)
    {
        double dlong = (long2 - long1) * d2r;
        double dlat = (lat2 - lat1) * d2r;
        double a = pow(sin(dlat/2.0), 2) + cos(lat1*d2r) * cos(lat2*d2r) * pow(sin(dlong/2.0), 2);
        double c = 2 * atan2(sqrt(a), sqrt(1-a));
        double d = 6367 * c;
    
        return d;
    }
    
    double haversine_mi(double lat1, double long1, double lat2, double long2)
    {
        double dlong = (long2 - long1) * d2r;
        double dlat = (lat2 - lat1) * d2r;
        double a = pow(sin(dlat/2.0), 2) + cos(lat1*d2r) * cos(lat2*d2r) * pow(sin(dlong/2.0), 2);
        double c = 2 * atan2(sqrt(a), sqrt(1-a));
        double d = 3956 * c; 
    
        return d;
    }
    
    0 讨论(0)
  • 2020-11-22 00:14

    Here's my implementation in Elixir

    defmodule Geo do
      @earth_radius_km 6371
      @earth_radius_sm 3958.748
      @earth_radius_nm 3440.065
      @feet_per_sm 5280
    
      @d2r :math.pi / 180
    
      def deg_to_rad(deg), do: deg * @d2r
    
      def great_circle_distance(p1, p2, :km), do: haversine(p1, p2) * @earth_radius_km
      def great_circle_distance(p1, p2, :sm), do: haversine(p1, p2) * @earth_radius_sm
      def great_circle_distance(p1, p2, :nm), do: haversine(p1, p2) * @earth_radius_nm
      def great_circle_distance(p1, p2, :m), do: great_circle_distance(p1, p2, :km) * 1000
      def great_circle_distance(p1, p2, :ft), do: great_circle_distance(p1, p2, :sm) * @feet_per_sm
    
      @doc """
      Calculate the [Haversine](https://en.wikipedia.org/wiki/Haversine_formula)
      distance between two coordinates. Result is in radians. This result can be
      multiplied by the sphere's radius in any unit to get the distance in that unit.
      For example, multiple the result of this function by the Earth's radius in
      kilometres and you get the distance between the two given points in kilometres.
      """
      def haversine({lat1, lon1}, {lat2, lon2}) do
        dlat = deg_to_rad(lat2 - lat1)
        dlon = deg_to_rad(lon2 - lon1)
    
        radlat1 = deg_to_rad(lat1)
        radlat2 = deg_to_rad(lat2)
    
        a = :math.pow(:math.sin(dlat / 2), 2) +
            :math.pow(:math.sin(dlon / 2), 2) *
            :math.cos(radlat1) * :math.cos(radlat2)
    
        2 * :math.atan2(:math.sqrt(a), :math.sqrt(1 - a))
      end
    end
    
    0 讨论(0)
  • 2020-11-22 00:16

    I recently had to do the same thing. I found this website to be very helpful explaining spherical trig with examples that were easy to follow along with.

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