获取经纬度之间距离的Java工具类

获取经纬度之间距离的Java工具类

public class GeoUtil { 
   
    /**
     * 根据经纬度和距离返回一个矩形范围
     * 
     * @param lng
     *            经度
     * @param lat
     *            纬度
     * @param distance
     *            距离(单位为米)
     * @return [lng1,lat1, lng2,lat2] 矩形的左下角(lng1,lat1)和右上角(lng2,lat2)
     */ 
    public static double[] getRectangle(double lng, double lat, long distance) { 
        float delta = 111000; 
        if (lng != 0 && lat != 0) { 
            double lng1 = lng - distance 
                    / Math.abs(Math.cos(Math.toRadians(lat)) * delta); 
            double lng2 = lng + distance 
                    / Math.abs(Math.cos(Math.toRadians(lat)) * delta); 
            double lat1 = lat - (distance / delta); 
            double lat2 = lat + (distance / delta); 
            return new double[] { lng1, lat1, lng2, lat2 }; 
        } else { 
            // TODO ZHCH 等于0时的计算公式 
            double lng1 = lng - distance / delta; 
            double lng2 = lng + distance / delta; 
            double lat1 = lat - (distance / delta); 
            double lat2 = lat + (distance / delta); 
            return new double[] { lng1, lat1, lng2, lat2 }; 
        } 
    } 
   
    /**
     * 得到两点间的距离 米
     * 
     * @param lat1 第一点纬度
     * @param lng1 第一点经度
     * @param lat2 第二点纬度
     * @param lng2 第二点经度
     * @return
     */ 
    public static double getDistanceOfMeter(double lat1, double lng1, 
            double lat2, double lng2) { 
        double radLat1 = rad(lat1); 
        double radLat2 = rad(lat2); 
        double a = radLat1 - radLat2; 
        double b = rad(lng1) - rad(lng2); 
        double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) 
                + Math.cos(radLat1) * Math.cos(radLat2) 
                * Math.pow(Math.sin(b / 2), 2))); 
        s = s * EARTH_RADIUS; 
        s = Math.round(s * 10000) / 10; 
        return s; 
    } 
       
    private static double rad(double d) { 
        return d * Math.PI / 180.0; 
    } 
   
    /**
     * 地球半径:6378.137KM
     */ 
    private static double EARTH_RADIUS = 6378.137; 
   
}
//测试两经纬度之间距离
    @Test
    public void distanceTest(){

        BigDecimal bigDecimal = getDistance(39.97501016,116.32238388,39.97509599,116.32542014);
        System.out.println("两点距离:" + bigDecimal.doubleValue()  + "米");

    }



    private static double EARTH_RADIUS = 6378137;

    private static double rad(double d) {
        return d * Math.PI / 180.0;
    }

    /**
     * 计算两经纬度点之间的距离(单位:米)
     * @param lat1  纬度
     * @param lng1  经度
     * @param lat2
     * @param lng2
     * @return
     */
    public static BigDecimal getDistance(double lat1, double lng1, double lat2,double lng2) {
        double radLat1 = rad(lat1);
        double radLat2 = rad(lat2);
        double a = radLat1 - radLat2;
        double b = rad(lng1) - rad(lng2);
        double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2)
                + Math.cos(radLat1) * Math.cos(radLat2)
                * Math.pow(Math.sin(b / 2), 2)));
        s = s * EARTH_RADIUS;
        s = Math.round(s * 10000d) / 10000d;
        BigDecimal bd = new BigDecimal(s);
        bd = bd.setScale(10, BigDecimal.ROUND_HALF_UP);    //保留小数点后两位
        return bd;
    }
posted @ 2022-08-05 09:03  我命由我不由天—hao  阅读(421)  评论(0编辑  收藏  举报