zoukankan      html  css  js  c++  java
  • 获取经纬度之间距离的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;
        }
  • 相关阅读:
    课后listview作业
    安卓sql
    activity带数据跳转
    安卓第四周作业
    15周作业
    十三周作业-集合
    十三周上机练习
    12周作业
    linux
    Questions.
  • 原文地址:https://www.cnblogs.com/haolb123/p/14636006.html
Copyright © 2011-2022 走看看