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

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;






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值