通过经纬度计算两座城市的距离

该代码段使用经纬度坐标,通过将角度转换为弧度,再转化为笛卡尔坐标,然后利用向量方法计算地球上两点间的球面距离。返回的结果精确到1公里。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值