来源:https://www.open-open.com/lib/view/open1430573897802.html
原理亦可参考:https://blog.csdn.net/gaocuisheng/article/details/126060795
cpp
#include <cmath>
#define EARTH_RADIUS 6371.0;// 地球半径,单位千米
static double HaverSin(double theta)
{
double v = sin(theta / 2);
return v * v;
}
static double ConvertDegreesToRadians(double degrees)
{
return degrees * M_PI / 180;
}
/// <summary>
/// 计算2个经纬度之间的距离
/// </summary>
/// <param name="from_lon">起始点经度</param>
/// <param name="from_lat">起始点纬度</param>
/// <param name="to_lon">目标点经度</param>
/// <param name="to_lat">目标点纬度</param>
/// <returns></returns>
static double TwoPointToDistance(double from_lon, double from_lat, double to_lon, double to_lat)
{
// 用 haversine 公式计算球面两点间的距离。
// 经纬度转换成弧度
from_lon = ConvertDegreesToRadians(from_lon);
from_lat = ConvertDegreesToRadians(from_lat);
to_lon = ConvertDegreesToRadians(to_lon);
to_lat = ConvertDegreesToRadians(to_lat);
// 差值
double vLon = std::abs(from_lon - to_lon);
double vLat = std::abs(from_lat - to_lat);
// h is the great circle distance in radians, great circle 就是一个球体上的切面,它的圆心即是球心的一个周长最大的圆。
double h = HaverSin(vLat) + cos(from_lat) * cos(to_lat) * HaverSin(vLon);
auto sh = sqrt(h);
double distance = 2 * (asin(sqrt(h))) * EARTH_RADIUS;
// 将距离转换为米
distance *= 1000;
return distance;
}
int main() {
// 39.94607,116.32793 31.24063,121.42575
std::cout << TwoPointToDistance(39.94607, 116.32793, 31.24063, 121.42575) << " meters" << std::endl;
return 0;
}