地球曲率计算距离
越来越多的客户要求我们开发跟踪应用程序和相关计算。
这些计算之一是获得地图上两点之间的距离(包括纬度和经度)。
如果这个计算是在一个城市或小领土内,它实际上是准确的,但是如果我们必须获得非常遥远的国家之间的距离,例如美国和中国之间的距离,计算就很复杂,因为我们必须考虑到地球的曲率。
如果我们使用纯数学,考虑到地球曲率计算距离的公式如下:
[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