#include <math.h>
// 通过经纬度计算两座城市的球面距离,仅国内,东经,北纬
// 输入的经纬度单位为角度
// 返回的距离精确到1km
unsigned int city_instance(double weidu1, double jingdu1, double weidu2, double jingdu2)
{
// 地球半径
const unsigned int R = 6371;
const double Pai = 3.14159;
unsigned int instance = 0;
// 角度转为弧度
double weidu1_hudu = weidu1 * Pai / 180;
double jingdu1_hudu = jingdu1 * Pai / 180;
double weidu2_hudu = weidu2 * Pai / 180;
double jingdu2_hudu = jingdu2 * Pai / 180;
// 经纬度坐标转为笛卡尔坐标
// (weidu1, jingdu1) ---> (R*cos(weidu1)*cos(jingdu1), R*cos(weidu1)*sin(jingdu1), R*sin(weidu1))
// (weidu2, jingdu2) ---> (R*cos(weidu2)*cos(jingdu2), R*cos(weidu2)*sin(jingdu2), R*sin(weidu2))
double x1, y1, z1, x2, y2, z2;
double tmp1 = cos(weidu1_hudu);
double tmp2 = cos(jingdu1_hudu);
x1 = R*cos(weidu1_hudu)*cos(jingdu1_hudu);
y1 = R*cos(weidu1_hudu)*sin(jingdu1_hudu);
z1 = R*sin(weidu1_hudu);
x2 = R*cos(weidu2_hudu)*cos(jingdu2_hudu);
y2 = R*cos(weidu2_hudu)*sin(jingdu2_hudu);
z2 = R*sin(weidu2_hudu);
// 使用向量计算两座城市与地心连线的夹角
// x1,y1,z1,x2,y2,z2
// cos(jiajiao) = (x1*x2 + y1*y2 + z1*z2)/(sqrt(x1*x1 + y1*y1 +z1*z1) * sqrt(x2*x2 + y2*y2 +z2*z2))
double tmp = (x1*x2 + y1*y2 + z1*z2) / (sqrt(x1*x1 + y1*y1 + z1*z1) * sqrt(x2*x2 + y2*y2 + z2*z2));
double hudu = acos(tmp);
// 计算距离
instance = R*hudu;
return instance;
}
通过经纬度计算两座城市的距离
于 2023-03-30 14:15:54 首次发布