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

如何根据经纬高计算两点之间的距离?
已知两点的经纬度坐标和海拔高求两点之间的距离,怎么计算?有没有比较好的计算公式?
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);

}