C++实现由两点经纬度计算距离
时间: 2023-08-31 15:12:51 浏览: 209
在C++中,可以使用Haversine公式来计算两点之间的距离。Haversine公式是一种用于计算球面上两点之间距离的公式,适用于球形地球模型以及近似球形地球模型。以下是一个实现该公式的示例代码:
```cpp
#include <cmath>
double distance(double lat1, double lon1, double lat2, double lon2)
{
const double earthRadiusKm = 6371.0;
double dLat = (lat2 - lat1) * M_PI / 180.0;
double dLon = (lon2 - lon1) * M_PI / 180.0;
lat1 = lat1 * M_PI / 180.0;
lat2 = lat2 * M_PI / 180.0;
double a = pow(sin(dLat / 2), 2) +
pow(sin(dLon / 2), 2) * cos(lat1) * cos(lat2);
double c = 2 * atan2(sqrt(a), sqrt(1 - a));
return earthRadiusKm * c;
}
```
其中,`lat1`和`lon1`表示第一个点的经纬度,`lat2`和`lon2`表示第二个点的经纬度,函数返回值表示两点之间的距离(单位:千米)。
相关问题
C++大地计算,由两点经纬度计算距离方位
使用C++可以通过以下公式计算两点之间的距离和方位:
1. 将经度和纬度转换为弧度:
```
double deg2rad(double deg) {
return (deg * PI / 180);
}
double lat1_rad = deg2rad(lat1);
double lon1_rad = deg2rad(lon1);
double lat2_rad = deg2rad(lat2);
double lon2_rad = deg2rad(lon2);
```
其中,PI为圆周率,需要定义。
2. 计算两点之间的距离:
```
double dlon = lon2_rad - lon1_rad;
double dlat = lat2_rad - lat1_rad;
double a = pow(sin(dlat / 2), 2) + cos(lat1_rad) * cos(lat2_rad) * pow(sin(dlon / 2), 2);
double c = 2 * atan2(sqrt(a), sqrt(1 - a));
double distance = R * c;
```
其中,R为地球半径,需要定义。
3. 计算两点之间的方位:
```
double y = sin(dlon) * cos(lat2_rad);
double x = cos(lat1_rad) * sin(lat2_rad) - sin(lat1_rad) * cos(lat2_rad) * cos(dlon);
double angle = atan2(y, x);
double bearing = fmod((angle * 180 / PI + 360), 360);
```
其中,bearing为方位角,需要定义。
完整代码如下:
```c++
#include <iostream>
#include <cmath>
#define PI 3.14159265358979323846
#define R 6371 // 地球半径,单位为千米
double deg2rad(double deg) {
return (deg * PI / 180);
}
int main() {
double lat1, lon1, lat2, lon2;
std::cout << "请输入第一个点的纬度和经度(以度为单位,用逗号隔开):" << std::endl;
std::cin >> lat1 >> lon1;
std::cout << "请输入第二个点的纬度和经度(以度为单位,用逗号隔开):" << std::endl;
std::cin >> lat2 >> lon2;
double lat1_rad = deg2rad(lat1);
double lon1_rad = deg2rad(lon1);
double lat2_rad = deg2rad(lat2);
double lon2_rad = deg2rad(lon2);
double dlon = lon2_rad - lon1_rad;
double dlat = lat2_rad - lat1_rad;
double a = pow(sin(dlat / 2), 2) + cos(lat1_rad) * cos(lat2_rad) * pow(sin(dlon / 2), 2);
double c = 2 * atan2(sqrt(a), sqrt(1 - a));
double distance = R * c;
double y = sin(dlon) * cos(lat2_rad);
double x = cos(lat1_rad) * sin(lat2_rad) - sin(lat1_rad) * cos(lat2_rad) * cos(dlon);
double angle = atan2(y, x);
double bearing = fmod((angle * 180 / PI + 360), 360);
std::cout << "两点之间的距离为:" << distance << "千米" << std::endl;
std::cout << "两点之间的方位为:" << bearing << "度" << std::endl;
return 0;
}
```
c++ 根据两点的经纬度计算距离(米为单位)
在 C++ 中,我们可以使用 Haversine 公式来计算地球上两点之间的大圆距离(球面距离),通常用于经度和纬度坐标。Haversine 公式考虑了地球是个椭球体而非完美的球形。以下是基本步骤:
1. 将经纬度转换为弧度制,因为 Haversine 公式需要弧度作为输入。
2. 计算半球直径(即地球平均半径,比如大约 6371 千米转换为米)。
3. 应用公式,包括两个点的纬度差、经度差以及三角函数。
以下是一个简单的 C++ 函数示例,用于计算两点之间的距离:
```cpp
#include <cmath>
using namespace std;
const double PI = 3.141592653589793238;
const double EARTH_RADIUS_KM = 6371; // 地球平均半径(千米)
double toRadians(double degrees) {
return degrees * PI / 180.0;
}
double calculateDistance(double lat1, double lon1, double lat2, double lon2) {
double dLat = toRadians(lat2 - lat1);
double dLon = toRadians(lon2 - lon1);
double a = sin(dLat / 2) * sin(dLat / 2) +
cos(toRadians(lat1)) * cos(toRadians(lat2)) *
sin(dLon / 2) * sin(dLon / 2);
double c = 2 * atan2(sqrt(a), sqrt(1 - a));
double distance = EARTH_RADIUS_KM * c; // 距离以千米为单位
return distance * 1000; // 转换为米
}
```
阅读全文