根据经纬度计算距离的公式

private const double EARTH_RADIUS = 6378.137;
private static double rad(double d)
{
return d * Math.PI / 180.0;
}

public static double GetDistance(double lat1, double lng1, double lat2, double lng2)
{
double radLat1 = rad(lat1);
double radLat2 = rad(lat2);
double a = radLat1 - radLat2;
double b = rad(lng1) - rad(lng2);

double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a/2),2) +
Math.Cos(radLat1)*Math.Cos(radLat2)*Math.Pow(Math.Sin(b/2),2)));
s = s * EARTH_RADIUS;
s = Math.Round(s * 10000) / 10000;
return s;
}

方便的改成sql语句

假设计算118.041 36.793与数据库内坐标点的距离

mysql> select 6378137*2*asin(Sqrt(power(sin((36.793-domlat)*pi()/360),2) + Cos(36.793*pi()/180)*Cos(domlat*pi()/180)*power(sin((118.041-domlon)*pi()/360),2))) as distance,domip from dominfo order by distance;

精简一下啊

select 12756274*asin(Sqrt(power(sin((36.793-domlat)*0.008726646),2) + Cos(36.793*0.0174533)*Cos(domlat*0.0174533)*power(sin((118.041-domlon)*0.008726646),2))) as distance,domip from dominfo order by distance;

<think>好的,用户想用Qt实现经纬度计算距离公式,提到了Haversine或Geodesic方法。首先,我需要回忆Haversine公式的具体内容,以及如何在Qt中实现它。根据用户提供的引用,Haversine公式使用半正矢函数来计算球面上两点之间的距离,适用于短距离计算,而Geodesic方法可能更精确,比如使用Vincenty公式或者Qt自带的地理定位库。 首先,我应该先给出Haversine公式的实现步骤。用户可能需要代码示例,所以需要将公式转化为C++代码,并确保使用Qt的数据类型,比如qreal。同时,需要注意单位转换,将经纬度从度转换为弧度,以及地球半径的正确值,根据引用中的信息,通常是6371公里或者6378.138公里,这里可能需要统一。 然后,考虑Qt是否有内置的方法。记得Qt的QGeoCoordinate类有distanceTo函数,这可能是使用更精确的椭球模型,比如WGS84,这属于Geodesic方法的一种。所以用户可能有两种选择:自己实现Haversine或者直接调用Qt的API。 接下来需要检查引用的内容是否正确。用户提供的引用中提到了JavaScript和Python的实现,需要将它们转换为C++/Qt的代码。比如,JavaScript中的Math.sin和C++中的sin函数是一样的,但需要注意Qt是否提供了角度转弧度的函数,或者需要手动转换,比如乘以M_PI/180。 另外,用户可能关心两种方法的区别,比如Haversine是球面模型,而Geodesic考虑地球椭球,更精确。需要解释两者的适用场景,比如短距离用Haversine,长距离或高精度需求用Geodesic。 可能还需要提到误差范围,Haversine在短距离(<100公里)误差较小,而长距离可能有1%的误差。而Qt的distanceTo函数基于椭球模型,精度更高。 然后,组织回答结构,先介绍Haversine的实现步骤和代码示例,再说明Qt自带的方法,最后比较两者的优缺点,帮助用户选择合适的方法。 最后,生成相关问题,比如如何优化计算、处理大量数据,或者坐标转换的问题。确保问题与用户的需求相关,帮助扩展他们的应用场景。</think>### Qt实现经纬度距离计算的两种方法 #### 一、Haversine公式实现 Haversine公式通过球面三角学计算两点间距离,适用于短距离计算(误差<1%)。核心公式为: $$d = 2r \arcsin\left(\sqrt{\sin^2\left(\frac{\Delta lat}{2}\right) + \cos(lat1)\cos(lat2)\sin^2\left(\frac{\Delta lon}{2}\right)}\right)$$ 其中$r$为地球半径(6371公里),$lat$和$lon$需转换为弧度[^1][^4]。 ```cpp #include <QtMath> qreal haversineDistance(qreal lat1, qreal lon1, qreal lat2, qreal lon2) { const qreal R = 6371.0; // 公里单位 qreal dLat = qDegreesToRadians(lat2 - lat1); qreal dLon = qDegreesToRadians(lon2 - lon1); lat1 = qDegreesToRadians(lat1); lat2 = qDegreesToRadians(lat2); qreal a = qSin(dLat/2) * qSin(dLat/2) + qCos(lat1) * qCos(lat2) * qSin(dLon/2) * qSin(dLon/2); qreal c = 2 * qAtan2(qSqrt(a), qSqrt(1-a)); return R * c; } ``` #### 二、Qt内置Geodesic方法 Qt的`QGeoCoordinate`类直接提供高精度距离计算,采用WGS84椭球模型: ```cpp #include <QGeoCoordinate> qreal geodesicDistance(qreal lat1, qreal lon1, qreal lat2, qreal lon2) { QGeoCoordinate coord1(lat1, lon1); QGeoCoordinate coord2(lat2, lon2); return coord1.distanceTo(coord2); // 返回米单位 } ``` #### 三、方法对比 | 特性 | Haversine | Qt Geodesic | |-------------|-------------------------|----------------------| | 数学模型 | 球面近似 | WGS84椭球体 | | 误差范围 | 短距离<1%,长距离>1% | <0.5% | | 计算速度 | 快(5次三角函数) | 较慢(迭代计算) | | 适用场景 | 快速估算、离线计算 | 高精度定位导航 |
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值