计算两个经纬度之间的实际距离(Haversine公式)----c++

2023-11-27 08:15

本文主要是介绍计算两个经纬度之间的实际距离(Haversine公式)----c++,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

来源:https://www.open-open.com/lib/view/open1430573897802.html

原理亦可参考:https://blog.csdn.net/gaocuisheng/article/details/126060795

#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.42575std::cout << TwoPointToDistance(39.94607, 116.32793, 31.24063, 121.42575) << " meters" << std::endl;return 0;
}

这篇关于计算两个经纬度之间的实际距离(Haversine公式)----c++的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/427354

相关文章

Java对象和JSON字符串之间的转换方法(全网最清晰)

《Java对象和JSON字符串之间的转换方法(全网最清晰)》:本文主要介绍如何在Java中使用Jackson库将对象转换为JSON字符串,并提供了一个简单的工具类示例,该工具类支持基本的转换功能,... 目录前言1. 引入 Jackson 依赖2. 创建 jsON 工具类3. 使用示例转换 Java 对象为

C++一个数组赋值给另一个数组方式

《C++一个数组赋值给另一个数组方式》文章介绍了三种在C++中将一个数组赋值给另一个数组的方法:使用循环逐个元素赋值、使用标准库函数std::copy或std::memcpy以及使用标准库容器,每种方... 目录C++一个数组赋值给另一个数组循环遍历赋值使用标准库中的函数 std::copy 或 std::

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

java父子线程之间实现共享传递数据

《java父子线程之间实现共享传递数据》本文介绍了Java中父子线程间共享传递数据的几种方法,包括ThreadLocal变量、并发集合和内存队列或消息队列,并提醒注意并发安全问题... 目录通过 ThreadLocal 变量共享数据通过并发集合共享数据通过内存队列或消息队列共享数据注意并发安全问题总结在 J

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

Java文件与Base64之间的转化方式

《Java文件与Base64之间的转化方式》这篇文章介绍了如何使用Java将文件(如图片、视频)转换为Base64编码,以及如何将Base64编码转换回文件,通过提供具体的工具类实现,作者希望帮助读者... 目录Java文件与Base64之间的转化1、文件转Base64工具类2、Base64转文件工具类3、