zoukankan      html  css  js  c++  java
  • 地理化的数学基础

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

    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;
    }
  • 相关阅读:
    竞态与死锁
    Java-核心技术-面试整理
    接口(工厂模式&代理模式)
    switch case实现两个数的算术运算
    继承和多态举例
    字符串的逆序输出
    引用传递&值传递
    递归的使用
    构造方法的重载
    给定数组,去掉0元素后将剩下的元素赋给新的数组
  • 原文地址:https://www.cnblogs.com/misspy/p/3996112.html
Copyright © 2011-2022 走看看