Calculate distance between 2 GPS coordinates

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

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

29条回答
  •  醉话见心
    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
    

提交回复
热议问题