獲取經緯度之間距離的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;
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM