Java的实现方法:(得到这2点的距离,得出的距离是米!)
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;