您的位置:首页 > 数据库 > Oracle

得到2个经纬度之间距离的Java和Oracle实现方法

2014-06-13 17:03 441 查看
Java的实现方法:[b](得到这2点的距离,得出的距离是米!)[/b]

public class MapDAOImpl implements IMapDAO {

private static final double EARTH_RADIUS = 6378137;

public double countDistance(String lng1, String lat1, String lng2,

String lat2) throws DAOException {

double radLng1 = rad(Double.parseDouble(lng1));

double radLat1 = rad(Double.parseDouble(lat1));

double radLng2 = rad(Double.parseDouble(lng2));

double radLat2 = rad(Double.parseDouble(lat2));

if (radLat1 < 0)

radLat1 = Math.PI / 2 + Math.abs(radLat1);// south

if (radLat1 > 0)

radLat1 = Math.PI / 2 - Math.abs(radLat1);// north

if (radLng1 < 0)

radLng1 = Math.PI * 2 - Math.abs(radLng1);// west

if (radLat2 < 0)

radLat2 = Math.PI / 2 + Math.abs(radLat2);// south

if (radLat2 > 0)

radLat2 = Math.PI / 2 - Math.abs(radLat2);// north

if (radLng2 < 0)

radLng2 = Math.PI * 2 - Math.abs(radLng2);// west

double x1 = EARTH_RADIUS * Math.cos(radLng1) * Math.sin(radLat1);

double y1 = EARTH_RADIUS * Math.sin(radLng1) * Math.sin(radLat1);

double z1 = EARTH_RADIUS * Math.cos(radLat1);

double x2 = EARTH_RADIUS * Math.cos(radLng2) * Math.sin(radLat2);

double y2 = EARTH_RADIUS * Math.sin(radLng2) * Math.sin(radLat2);

double z2 = EARTH_RADIUS * Math.cos(radLat2);

double d = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)

+ (z1 - z2) * (z1 - z2));

// 余弦定理求夹角

double theta = Math.acos((EARTH_RADIUS * EARTH_RADIUS + EARTH_RADIUS

* EARTH_RADIUS - d * d)

/ (2 * EARTH_RADIUS * EARTH_RADIUS));

double dist = theta * EARTH_RADIUS;

return dist;

}

private static double rad(double d) {

return d * Math.PI / 180.0;

}

public static void main(String[] args) {

MapDAOImpl dao = new MapDAOImpl();

try {

System.out.println(dao.countDistance("120.115072", "30.29644", "120.116464", "30.296498"));

} catch (DAOException e) {

e.printStackTrace();

}

}

}

Oracle的实现方法:(得到这2点的距离,得出的距离是千米!)

写2个函数:

1.获得弧度的函数。

Sql代码

CREATE OR REPLACE FUNCTION RAD(d number) RETURN NUMBER

is

PI number :=3.141592625;

begin

return d* PI/180.0;

end ;

select RAD(360) from dual;

2.根据经纬度计算距离。

Sql代码

CREATE OR REPLACE FUNCTION GetDistance(lat1 number,

lng1 number,

lat2 number,

lng2 number) RETURN NUMBER is

earth_padius number := 6378.137;

radLat1 number := rad(lat1);

radLat2 number := rad(lat2);

a number := radLat1 - radLat2;

b number := rad(lng1) - rad(lng2);

s number := 0;

begin

s := 2 *

Asin(Sqrt(power(sin(a / 2), 2) +

cos(radLat1) * cos(radLat2) * power(sin(b / 2), 2)));

s := s * earth_padius;

s := Round(s * 10000) / 10000;

return s;

end;

select GetDistance('121.506656','31.245087','121.508883','31.243481') from dual;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: