经常要根据两个经纬度值,求它们之间的距离。
delphi实现代码:
求两个经纬度之间的距离
function Distince(const lon1,lat1,lon2,lat2:double):double;
var
alpha1,alpha2,beta1,beta2:double;
dist : double;
begin
Result := 0.0;
alpha1 := (lon1 / 180) * Pi;
alpha2 := (lon2 / 180) * Pi;
beta1 := (lat1 / 180) * Pi;
beta2 := (lat2 / 180) * Pi;
Result := (2 * ArcSin(Sqrt(Sin((beta1 - beta2) / 2) * Sin((beta1 - beta2) / 2) +
Cos(beta1) * Cos(beta2) * Sin((alpha1 - alpha2) / 2) * Sin((alpha1 - alpha2) / 2)))) * 6371000;
end;
另一种实现方式:
Code
function GetDistance(d_x1, d_y1, d_x2, d_y2: Single): Double;
const
math_pi = 3.1415926535897932384626433832795;
var
mDistance: double;
Lon1,Lon2,Lat1,Lat2,LonDist,LatDist: Double;
A,C,D,E,U: Double;
begin
mDistance := 0;
Lon1 := d_x1 * math_pi / 180.0 ;
Lon2 := d_x2 * math_pi / 180.0 ;
Lat1 := d_y1 * math_pi / 180.0 ;
Lat2 := d_y2 * math_pi / 180.0 ;
//计算经差及纬差
LonDist := Lon1-Lon2 ;
LatDist := Lat1-Lat2 ;
//以FEET为单位,计算两点之间的距离
A := sin( LatDist / 2.0 ) * sin( LatDist / 2.0) + cos(Lat1) * cos( Lat2 ) * sin(LonDist /2.0)*sin(LonDist /2.0);
if sqrt(A) > 1 then
E := 1.0
else
E := sqrt(A);
C := 2 * arctan(E/sqrt(1-E*E));
D := (3963 - 13 * sin((Lat1 + Lat2) / 2)) * C;
mDistance := D * 5280 ;//距离,单位为FEET
//将单位FEET转换为公里
mDistance := mDistance * (3048.0/10000000.0);
U := 10.0*10.0*10.0 ;
mDistance := int(mDistance*U+(5.0/10.0))/U ;
Result := mDistance ;
Result := mDistance * 1000; //转换成米
end;
JavaScript实现方式
function distance(x1,y1,x2,y2) {
var R = 6371; // earth's mean radius in km
var lon1 = x1* Math.PI / 180;
var lat1 = y1 * Math.PI / 180;
var lon2 = x2 * Math.PI / 180;
var lat2 = y2 * Math.PI / 180;
var deltaLat = lat1 - lat2
var deltaLon = lon1 - lon2
var step1 = Math.pow(Math.sin(deltaLat/2), 2) + Math.cos(lat2) * Math.cos(lat1) * Math.pow(Math.sin(deltaLon/2), 2);
var step2 = 2 * Math.atan2(Math.sqrt(step1), Math.sqrt(1 - step1));
alert("两点间距离是:" + step2 * R);
}
SQL Server实现代码 :
-- =============================================
-- Author: wanghongsheng
-- Create date: 2009.11.07
-- Description: 计算两个经纬度之间的直线距离
-- =============================================
alter FUNCTION GetDistance
(
@d_x1 float,
@d_y1 float,
@d_x2 float,
@d_y2 float
)
RETURNS float
AS
BEGIN
declare @mDistance float,@Lon1 float,@Lon2 float,@Lat1 float,@Lat2 float,@LonDist float,@LatDist float
declare @A float ,@C float ,@D float ,@E float ,@U float
set @mDistance = 0
set @Lon1 = @d_x1 * pi() / 180.0
set @Lon2 = @d_x2 * pi() / 180.0
set @Lat1 = @d_y1 * pi() / 180.0
set @Lat2 = @d_y2 * pi() / 180.0
-- 计算经差与纬差
set @LonDist = @Lon1 - @Lon2
set @LatDist = @Lat1 - @Lat2
-- 以FEET为单位,计算两点之间的距离
set @A = sin( @LatDist / 2.0 ) * sin( @LatDist / 2.0) + cos(@Lat1) * cos( @Lat2 ) * sin(@LonDist /2.0)*sin(@LonDist /2.0)
if sqrt(@A) > 1
begin
set @E = 1.0
end
else
set @E = sqrt(@A)
set @C = 2 * atan(@E/sqrt(1-(@E*@E)));
set @D = (3963 - 13 * sin((@Lat1 + @Lat2) / 2)) * @C
set @mDistance = @D * 5280 -- 距离单位为FEET
--将单位FEET转换为公里
set @mDistance = @mDistance * (3048.0/10000000.0)
set @U = 10.0*10.0*10.0
set @mDistance = ceiling(@mDistance*@U+(5.0/10.0))/@U
-- 返回的结果,距离单位是公里
Return (@mDistance)
END
GO