oracle的经纬度计算不准,计算经纬度两点之间距离的差多少米

先计算沿纬度距离,在计算沿经度距离,具体如下:

求出纬度差,将差换算成距离,1度=60海里=60*1852米

求出经度差,将其换算成距离,1度=60海里*cos纬度=60海里*1852米*cos纬度

对沿纬度距离和沿经度距离进行平方求和再开方,可以得到两点间的距离。

同纬度不同经度 (赤道除外)

h X 111 X COSD=G (h=两地经度差 D=当地的地理纬度 G=实际距离)

跨纬度的需要构造个三角

比如说AB两点不同经纬度(A经B纬)

那就先算出与A点共线的那条纬度B'的距离,在算A到B'的距离,在用勾股定理就可以得出

简单的说可用以下通用公式:

地球上任两点间距离公式:

地球上任两点,其经度分别为A1、A2(E正,W负),纬度分别为B1、B2(N正,S负)。

令A0=(A1-A2)÷2,B0=(BI-B2)÷2

f=√sinB0×sinB0+cosB1×cosB2×sinA0×sinA0

1、两点间空间直线距离=2fR

2、两点间最小球面距离=arcsinf÷90°×∏R(角度)

3、两点间最小球面距离=arcsinf×2R(弧度)

说明:E、W、N、S=东西南北;R=地球半径;√=根号;∏=圆周率。

代入公式自己算吧

create or replace function

xp_2pointdistance

(

x1 float, --

起始点x

x2 float, --

起始点y

y1 float, --

终点x

y2 float --

终点y

)

return float

is

Result float;

pPI float := 0.0;

pPIval float := 0.0;

earth_radius float := 6378.137;

radlat1 float := 0.0;

radlat2 float := 0.0;

a float := 0.0;

b float := 0.0;

s float := 0.0;

begin

-- cos(-1) =

0.54030230586814

-- 弧度cos1 =

0.54030230586814

--

角度cos1°=0.999847695

pPI := acos(-1); pPIval := pPI/180.0;

radlat1 := y1*pPIval;

radlat2 := y2*pPIval;

a := radlat1 -

radlat2; --两点间的纬度弧度差

b := x1*pPIval - x2*pPIval;

--两点间的经度弧度差

--

ASIN(number) Number 角度的正弦值,必须介于

-1 到 1 之间。

--

若要用度表示反正弦值,请将结果再乘以 181/PI( ) 或用 DEGREES

函数表示

--地球上任两点间距离公式:

--地球上任两点,其经度分别为A1、A2(E正,W负),纬度分别为B1、B2(N正,S负)。

--令A0=(A1-A2)÷2,B0=(BI-B2)÷2

--f=√sinB0×sinB0+cosB1×cosB2×sinA0×sinA0

--则

--1、两点间空间直线距离=2fR

--2、两点间最小球面距离=arcsinf÷90°×∏R(角度)

--3、两点间最小球面距离=arcsinf×2R(弧度)

--说明:E、W、N、S=东西南北;R=地球半径;√=根号;∏=圆周率。

--代入公式自己算吧

s :=

2*asin(sqrt(power(sin(a/2),2) +

cos(radlat1)*cos(radlat2)*power(sin(b/2),2))) ;

s := s * earth_radius;

--Round 函数   返回按指定位数进行四舍五入的数值。

--Round(expression, numdecimalplaces)

--参数

--  Expression   必选项。数值表达式 被四舍五入。

-- Numdecimalplaces   可选项。数字表明小数点右边有多少位进行四舍五入。

--如果小数位数是负数,则round()返回的结果在小数点左端包含指定个零.如果省略,则 Round 函数返回整数

s := round(s *

10000)/10000; result := s*1000;

return

result;

exception

when others then

raise_application_error(sqlcode,sqlerrm);

return 0.0 ;

end xp_2pointdistance;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值