CREATE OR REPLACE FUNCTION rad ( d NUMBER ) return NUMBER IS pi NUMBER := 3.141592625; BEGIN return d * pi / 180.0; END;
CREATE OR REPLACE FUNCTION get_distance ( jd1 NUMBER, wd1 NUMBER, jd2 NUMBER, wd2 NUMBER ) return NUMBER IS earth_padius NUMBER := 6378.137;--地球赤道半径(千米),地球平均半径=6371.004 千米 radjd1 NUMBER := rad ( jd1 ); radjd2 NUMBER := rad ( jd2 ); a NUMBER := radjd1 - radjd2; b NUMBER := rad ( wd1 ) - rad ( wd2 ); s NUMBER := 0; BEGIN s := 2 * Asin( Sqrt( power( sin( a / 2 ), 2 ) + cos( radjd1 ) * cos( radjd2 ) * power( sin( b / 2 ), 2 ))); s := s * earth_padius; s := Round( s * 10000 ) / 10000; return s; END;
select get_distance(116.4211883545,39.8548469543,116.4211730957,39.8548660278) from dual;
注意:该函数计算出来的距离单位为:千米