读书人

怎么根据经纬高计算两点之间的距离

发布时间: 2012-09-14 11:53:44 作者: rapoo

如何根据经纬高计算两点之间的距离?
已知两点的经纬度坐标和海拔高求两点之间的距离,怎么计算?有没有比较好的计算公式?

C/C++ code
struct Node {    float longtitude;  // 经度    float latitude;    // 纬度    float altitude;    // 海拔高}

已知node1和node2,如何计算这两点之间的距离?

[解决办法]
假设XY平面是赤道平面,X轴经过0度,则任意一点可以投影出三维空间中的坐标

x = h * cos(la) * cos(lo)
y = h * cos(la) * sin(lo)
z = h * sin(la)

h = 海拔高度 + 地球半径
la = 纬度 (弧度)
lo = 经度 (弧度)

然后计算两点间的距离即可 L = sqrt( pow(x1-x2,2) + pow(y1-y2,2) + pow(z1-z2,2) );
[解决办法]
C/C++ code
#ifndef M_PI#define M_PI       3.14159265358979323846#endif//    坐标系class CEarthPoint{public:    double            m_dEarthR;        //    6371.004    6378.140    6356.755    double            m_dRealR;    double            m_dAngE;        //    纬度-东    double            m_dAngN;        //    经度-北    double            m_x;    double            m_y;    double            m_z;public:    CEarthPoint()    {        m_dEarthR = 6371.004;        m_dRealR = 0.0;    }    virtual ~CEarthPoint()    {    }public:    //    dAngN:    纬度, 北纬正数, 南纬负数    //    dAngE:    经度, 东经正数, 西经负数    BOOL    SetPos(double dAngN, double dAngE)    {        double        dPlanR;        double        dEarthR;        m_dAngE        = dAngE;        m_dAngN        = dAngN;        Revisory(dAngN);        dEarthR = m_dRealR;        dAngE = m_dAngE * M_PI / 180;        dAngN = m_dAngN * M_PI / 180;        m_z = dEarthR * sin(dAngN);        dPlanR = dEarthR * cos(dAngN);        m_x = dPlanR * cos(dAngE);        m_y = dPlanR * sin(dAngE);        return TRUE;    }    BOOL    Revisory(double dAngN)    {        double        dMin, dMax, dDlt;        dAngN = fabs(dAngN);        if(dAngN > 90.0)            assert(0);        dMin = 6356.755;        dMax = 6378.140;        dDlt = (dMax - dMin) * dAngN / 90;        m_dRealR = dMax-dDlt;        return TRUE;    }    BOOL    SetPos(double x, double y, double z)    {        return FALSE;    }    static    double    GetArcDistance(double dDis, double dRealR)    {        double            dRealDis, dAng;        dAng = asin(dDis/2/dRealR);        dAng *= 2;        dRealDis = dRealR * dAng;        return dRealDis;    }    static    double    Distance(CEarthPoint &Pos1, CEarthPoint &Pos2, BOOL bArc = TRUE)    {        double            dDis1, dSum, dRealDis;        double            dRealR;        dSum = 0;        dDis1 = Pos1.m_x - Pos2.m_x;    dSum += dDis1 * dDis1;        dDis1 = Pos1.m_y - Pos2.m_y;    dSum += dDis1 * dDis1;        dDis1 = Pos1.m_z - Pos2.m_z;    dSum += dDis1 * dDis1;        dSum = sqrt(dSum);        if(bArc == FALSE)        {            dRealDis = dSum;            return dRealDis;        }        dRealR = (Pos1.m_dRealR + Pos2.m_dRealR)/2;        dRealDis = GetArcDistance(dSum, dRealR);        return dRealDis;    }};//    http://ditu.google.cn/void CNetMsgDlg::OnBnClickedButton12(){    CEarthPoint        pt1, pt2;    double            dDistance;    pt1.SetPos(24.484258, 118.173838);        //    厦门    pt2.SetPos(22.532537, 113.924446);        //    深圳        dDistance = CEarthPoint::Distance(pt1, pt2);} 

读书人网 >VC/MFC

热点推荐