如何根据经纬高计算两点之间的距离?

aluesnow 2012-07-21 01:07:17
已知两点的经纬度坐标和海拔高求两点之间的距离,怎么计算?有没有比较好的计算公式?

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

已知node1和node2,如何计算这两点之间的距离?
...全文
3063 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Yofoo 2012-07-25
  • 打赏
  • 举报
回复

#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);

}


海拔差 dh
海拔可以另外做修正, d = sqrt(d*d + dh*dh)
kimiwa1 2012-07-25
  • 打赏
  • 举报
回复
#2楼得到(x,y,z)之后可以算出弦长,知道地球半径求出圆心角,再求弧长就完了

@#1楼再想想,椭圆积分有解析解么,是中学知识么...
YYMMNNLL 2012-07-24
  • 打赏
  • 举报
回复
找到地球的半径,将以上两点与与地球的球心连接起来计算圆心角,结合海拔高度利用弧长公式
要是两点距离很大,那就先计算两点与球心所在的大圆(地球的直径),比较与直径的大小,记着始终在一个大圆进行中处理
chs040701 2012-07-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

http://wenku.baidu.com/view/b39fabd484254b35eefd3492.html

经纬度跨度大时应该考虑地球曲率的影响
[/Quote]
劳驾看仔细#3写的方程…… 他是把两点丢到空间里面计算……
当然你说要考虑4维时空的话……劳驾请个物理系的高材生
  • 打赏
  • 举报
回复
http://wenku.baidu.com/view/b39fabd484254b35eefd3492.html

经纬度跨度大时应该考虑地球曲率的影响
aluesnow 2012-07-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
假设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) + p……
[/Quote]

这个经纬度差比较小的时候应该是比较正确的,但是到经纬跨度比较大的时候还能得到正确的结果吗?
长尾巴的悟空 2012-07-21
  • 打赏
  • 举报
回复
你们是数学系的吧!!!
zgl7903 2012-07-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
引用 2 楼 的回复:
假设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……

这个经纬度差比较小的时候应该是比较正确的,但是到经纬跨度比较大的时候还能得到正确的结果吗?
[/Quote]

难道经纬度跨度大了就不遵循方程了?

按北纬0~90度 南纬-0~-90度 东经0~180度 西经-0~-180度 反过来也可以,主要就是区分出东西南北

自己得清楚坐标系是个什么样子,点在坐标系的什么位置
zgl7903 2012-07-21
  • 打赏
  • 举报
回复
假设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) );
西山小月 2012-07-21
  • 打赏
  • 举报
回复
画个图,计算一下就行了,中学数学的知识就够了。把地球看成是椭球体。

如果是在GIS中,能把经纬度转换为投影XY坐标,直接就能算出来了。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧