智游城

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2624|回复: 9
打印 上一主题 下一主题

计算地球上两点间距离

[复制链接]
跳转到指定楼层
1#
老陈 发表于 2014-7-27 03:30:27 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 老陈 于 2014-7-26 13:32 编辑

已知地球上两点的经纬度,求两点间最短距离。

网上有公式,没有详细的推导过程。求:公式推导的详细过程。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏
2#
 楼主| 老陈 发表于 2014-7-29 07:42:30 | 只看该作者
本帖最后由 老陈 于 2014-7-28 17:44 编辑

+(double)calculateDistanceFromLatitude (double)fromLatitude     //纬度  北纬为正,南纬为负
                      andFromLongitude (double)fromLongitude    //经度  东经为正,西经为负
                       andFromAltitude (double)fromAltitude     //海拔高度 单位:米
                            toLatitude (double)toLatitude
                        andToLongitude (double)toLongitude
                         andToAltitude (double)toAltitude
{

    double tDDegreeToRadian=asin(0.5)/30.0;
    double tDradianLong            = 6378.140;     // 赤道半径
    double tDradianShort           = 6356.755;     // 两极半径

    double tDFromLatitude  = fromLatitude   * tDDegreeToRadian;
    double tDToLatitude    = toLatitude     * tDDegreeToRadian;
    double tDFromLongitude = fromLongitude  * tDDegreeToRadian;
    double tDToLongitude   = toLongitude    * tDDegreeToRadian;
    //  角度转换成弧度
    double tDFromAltitude  = fromAltitude   / 1000.0;
    double tDToAltitude    = toAltitude     / 1000.0;
    //  米转换成公里
    double radian= sin(tDFromLatitude)*sin(tDToLatitude) + cos(tDFromLongitude-tDToLongitude) * cos(tDFromLatitude)*cos(tDToLatitude);
    double tDistance = 6371.004*acos(radian);
    //  用网上公式估算距离
    NSInteger tIStep=tDistance*100;
    // 按约10米为步长计算
    tDistance=0.0;
    double Latitude0=(tDToLatitude-tDFromLatitude)/tIStep;
    double Latitude1=tDFromLatitude;
    double Latitude2=0;
    double Longitude0=(tDToLongitude-tDFromLongitude)/tIStep;
    double Longitude1=tDFromLongitude;
    double Longitude2=0;
    double Altitude0=(tDToAltitude-tDFromAltitude)/tIStep;
    double Altitude1=tDFromAltitude;
    double Altitude2=0.0;
    double mDistance=0.0;

    NSInteger i;
    for(i=0;i<tIStep;i++)
    {
        Latitude2  = Latitude1  + Latitude0;
        Longitude2 = Longitude1 + Longitude0;
        Altitude2  = Altitude1  + Altitude0;

        double z1=sin(Latitude1)*(tDradianShort+Altitude1);
        double x1=cos(Latitude1)*cos(Longitude1)*(tDradianLong+Altitude1);
        double y1=cos(Latitude1)*sin(Longitude1)*(tDradianLong+Altitude1);
        double z2=sin(Latitude2)*(tDradianShort+Altitude1);
        double x2=cos(Latitude2)*cos(Longitude2)*(tDradianLong+Altitude2);
        double y2=cos(Latitude2)*sin(Longitude2)*(tDradianLong+Altitude2);
        //  球面坐标转换成笛卡尔坐标
        double xd=x2-x1;
        double yd=y2-y1;
        double zd=z2-z1;
        double tDLineDistance=sqrt(xd*xd+yd*yd+zd*zd);
        // 两点间直线距离
        double tDRadiusFrom=sqrt(x1*x1+y1*y1+z1*z1);
        double tDRadiusTo=sqrt(x2*x2+y2*y2+z2*z2);
        // 两点到地心距离
        double tDAngle=acos((tDRadiusFrom*tDRadiusFrom+tDRadiusTo*tDRadiusTo-tDLineDistance*tDLineDistance)/(2.0*tDRadiusFrom*tDRadiusTo));
        // 用余玄定理计算角度

        mDistance+=tDAngle*(tDRadiusFrom+tDRadiusTo)/2.0;
        // 计算距离并累加

        Latitude1+=Latitude0;
        Longitude1+=Longitude0;
        Altitude1+=Altitude0;
    }
    return mDistance;
}


3#
leisong 发表于 2014-7-29 10:00:37 | 只看该作者
这...
4#
fastfast 发表于 2014-7-29 17:39:05 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
5#
 楼主| 老陈 发表于 2014-7-29 19:51:36 | 只看该作者
本帖最后由 老陈 于 2014-7-29 12:21 编辑
fastfast 发表于 2014-7-29 03:39
搞出更简单的方法才NB


网上这个简单,公式如下:
   double radian= sin(tDFromLatitude)*sin(tDToLatitude) + cos(tDFromLongitude-tDToLongitude) * cos(tDFromLatitude)*cos(tDToLatitude);
    double tDistance = 6371.004*acos(radian);

这个公式在计算纬度在30-60之间时误差较小,其它地方误差较大,最大误差可达0.3%。
因为这个公式做了个假设:就是地球时标准球体,即各个地方半径都一样。但事实不是这样。
再有这个公式忽略了高度,一个很陡的山顶和山脚的距离,用这个公式会算出可笑的结果。

目前我还没找到即准确又简单的方法。



6#
luckypanda 发表于 2014-7-30 10:49:00 | 只看该作者
你们好无聊。
7#
 楼主| 老陈 发表于 2014-7-30 11:52:55 来自手机 | 只看该作者
luckypanda 发表于 2014-7-29 20:49
你们好无聊。

探讨科学,无止境啊!
8#
luckypanda 发表于 2014-7-30 12:22:08 | 只看该作者
老陈 发表于 2014-7-29 22:52
探讨科学,无止境啊!

科学对我来说太枯燥了。
9#
 楼主| 老陈 发表于 2014-7-30 12:35:19 来自手机 | 只看该作者
luckypanda 发表于 2014-7-29 22:22
科学对我来说太枯燥了。

人类社会的进步,就是因为有很多人探讨科学。
10#
fastfast 发表于 2014-7-30 19:21:36 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|智游城论坛

GMT+8, 2024-12-26 10:02 , Processed in 0.054337 second(s), 7 queries , Redis On.

Powered by Discuz! X3.2

© 2001-2012 Comsenz Inc.

返回顶部