• 地理化的数学基础


    涉及:球面三角学,球面正弦余弦

    http://media.openonline.com.cn/media_file/rm/dongshi2006/zhongxuesxztyj/pian2/chap4/n4.htm

    大圆距离  http://zh.wikipedia.org/wiki/%E5%A4%A7%E5%9C%86%E8%B7%9D%E7%A6%BB

    phi_s,lambda_s; phi_f,lambda_f;! 分别代表球面上两点的经纬度,(s代表出发点,f代表前往点),Deltaphi,Deltalambda;! 是两者差的绝对值,那么两点之间的圆心角可由球面余弦定律所给出:

    {color{white}Big|}Deltawidehat{sigma}=arccosig(sinphi_ssinphi_f+cosphi_scosphi_fcosDeltalambdaig).;!

    此两点间的大圆距离 d,即可根据弧长公式得出,

    d = r \, Deltawidehat{sigma}.\,!

    在两点之间的大圆距离相对球体的半径很短时,其圆心角很小,余弦函数接近于1,按照以上的反余弦函数公式会有较大的舍入误差。此时可使用半正矢函数的定义和两角和的余弦函数展开式求出使用半正矢函数计算大圆距离的公式。

    {color{white}frac{igg|}{|}}Deltawidehat{sigma}
=2arcsinleft(sqrt{sin^2left(frac{Deltaphi}{2}
ight)+cos{phi_s}cos{phi_f}sin^2left(frac{Deltalambda}{2}
ight)}
ight).;!

    这就是在航海上运用广泛的半正矢公式,历史上会将距离和半正矢函数值的关系直接制成表格,方便使用[1]

    矢量形式[编辑]

    另一种表达方式是使用出发点和到达点的法矢量与矢量的数量积、向量积和混合积来表达大圆距离[2]

    egin{align}
 & Delta hat{sigma }=	ext{arccos}left( oldsymbol{n}_{es}^{e}cdot oldsymbol{n}_{ef}^{e} 
ight) \
& Delta hat{sigma }=	ext{arcsin}left( left| oldsymbol{n}_{es}^{e}	imes oldsymbol{n}_{ef}^{e} 
ight| 
ight) \
& Delta hat{sigma }=	ext{arctan}left( frac{left| oldsymbol{n}_{es}^{e}	imes oldsymbol{n}_{ef}^{e} 
ight|}{oldsymbol{n}_{es}^{e}cdot oldsymbol{n}_{ef}^{e}} 
ight) \
end{align}\,!

    此处的oldsymbol{n}_{es}^{e}\,! and oldsymbol{n}_{ef}^{e}\,! 分别是起点和终点的n矢量。此处使用的是反正切函数,相对于反余弦函数较为精确,但如果原始数据是以经纬度形式给出,则需要先将经纬度数据转化成n矢量。

    从弦长求大圆距离[编辑]

    链接球面上两点之间的线段就是这两点所在大圆上两点之间的弦,这条弦所对的圆心角可通过几何关系求出,然后再通过弧长公式求出这条弧的弧长,即两点间的大圆距离。[3]

    egin{align}
&Delta{X}=cos(phi_f)cos(lambda_f) - cos(phi_s)cos(lambda_s);\
&Delta{Y}=cos(phi_f)sin(lambda_f) - cos(phi_s)sin(lambda_s);\
&Delta{Z}=sin(phi_f) - sin(phi_s);\
end{align}\,!
    C_h=sqrt{(Delta{X})^2+(Delta{Y})^2+(Delta{Z})^2}

    圆心角等于:

    Deltawidehat{sigma}=2arcsinleft(frac{C_h}{2}
ight).\,!

    大圆距离等于:

    d = r Deltawidehat{sigma}.\,!

    对于近似于球体的立体,比如地球。其形状接近一个表面平坦、赤道稍鼓(6378.137千米)、两极稍扁(6357.52千米)的扁球体。对其半径的估计有多种方法:[4]国际大地测量学与地球物理学联合会定义地球的平均半径为:[5]

    R_1 = frac{2a+b}{3}\,!

    将极半径和赤道半径代入后,求出其平均半径为6,371.009千米(3,958.761英里)[6]。知道地球的平均半径后,将所求两点的经纬度代入公式,即可求出两点间的大圆距离。

    Google maps 代码

    private const double EARTH_RADIUS = 6378.137;
    private static double rad(double d)
    {
       return d * Math.PI / 180.0;
    }
    
    public static double GetDistance(double lat1, double lng1, double lat2, double lng2)
    {
       double radLat1 = rad(lat1);
       double radLat2 = rad(lat2);
       double a = radLat1 - radLat2;
       double b = rad(lng1) - rad(lng2);
       double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a/2),2) + 
        Math.Cos(radLat1)*Math.Cos(radLat2)*Math.Pow(Math.Sin(b/2),2)));
       s = s * EARTH_RADIUS;
       s = Math.Round(s * 10000) / 10000;
       return s;
    }
  • 相关阅读:
    EL表达式遍历方法之一
    django auth认证
    总结五个在办公中使用很爽的软件
    django所遇到问题简单总结
    django 远程数据库mysql migrate失败报error 1045之 解决方案
    深拷贝和浅拷贝之地址改变
    序列表转换成横向菜单
    Pycharm破解
    css里涉及到定位相关的example实例
    记录求职
  • 原文地址:https://www.cnblogs.com/misspy/p/3996112.html
Copyright © 2020-2023  润新知