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