delphi 地球曲率计算距离  
官方Delphi 学习QQ群: 682628230(三千人)
频道

delphi 地球曲率计算距离


地球曲率计算距离

越来越多的客户要求我们开发跟踪应用程序和相关计算。


这些计算之一是获得地图上两点之间的距离(包括纬度和经度)。


如果这个计算是在一个城市或小领土内,它实际上是准确的,但是如果我们必须获得非常遥远的国家之间的距离,例如美国和中国之间的距离,计算就很复杂,因为我们必须考虑到地球的曲率。


如果我们使用纯数学,考虑到地球曲率计算距离的公式如下:


[Math]

 

Distance = Radio x arcos [ sin(OriginLat) x sin(DestinyLat) + cos(OriginLat) x cos(DestinyLat) x cos(DestinyLon-OriginLon) ]

 

.

如果我们将前面的函数转换为 Delphi,我们将得到以下函数:


Uses   System.Math;

 

...

 

Type

  TPoint = record

    Lat: Double;

    Lng: Double;

  end;

  TPointRad = record

    Lat: Extended;

    Lng: Extended;

  end;

 

...

 

function Distancia(Origin, Detiny: TPoint; Curvature: Boolean = False): Double;

var

  d, s, c: Double;

  OriginRad: TPointRad;

  DestinyRad: TPointRad;

  CurvatureAux: Double;

Const

  R = 6378137; // Medium earth radius in meter

begin

 

  OriginRad.Lat := DegToRad(Origin.Lat);

  OriginRad.Lng := DegToRad(Origin.Lng);

  DestinyRad.Lat := DegToRad(Detiny.Lat);

  DestinyRad.Lng := DegToRad(Detiny.Lng);

  if (OriginRad.Lng = DestinyRad.Lng) AND (OriginRad.Lat = DestinyRad.Lat) then

    d := 0

  else

  begin

    s := sin(OriginRad.Lat) * sin(DestinyRad.Lat);

    c := cos(OriginRad.Lat) * cos(DestinyRad.Lat) * cos(DestinyRad.Lng - OriginRad.Lng);

 

    if Curvature then

      CurvatureAux := Round((s + c) * 100000000) / 100000000

    else

      CurvatureAux := (s + c);

 

    if CurvatureAux <> 1 then

      d := R * arccos(s + c)

    else

      d := 0;

  end;

  Result := d;

end;

的函数的距离(产地,Detiny:TPoint;曲度:布尔=假):双; 我们已经准备好用曲率参数来确定是否考虑了地球的曲率,默认情况下它设置为False,用于短距离。



推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号

执行时间: 0.03744101524353 seconds