Java 根据经纬坐标,计算距离 并排序(正排,倒排)

计算:

import java.text.DecimalFormat;

public class DistanceUtil {

    private static double EARTH_RADIUS = 6378.137;

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

    /**
     * 通过经纬度获取距离(单位:)
     *
     * @param 经度1
     * @param 纬度1
     * @param 经度2
     * @param 纬度2
     * @return 距离
     */
    public static String 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;
        //s = s * 1000;如果需要返回单位为米

        DecimalFormat df = new DecimalFormat("0.00");//格式化,区小数后两位
        String distance = df.format(s);

        return distance;
    }

}

排序:

List> list = userAddressDao.getByItemId(itemId);
        for(HashMap map : list){
            //计算距离
            String addLon = (String)map.get("longitude");    //场地 精度
            String addLat = (String)map.get("latitude");      //场地 维度
            String distance = DistanceUtil.getDistance(userLat, userLon, addLat, addLon);
            map.put("distance",distance);

            //是否包含了已加入的场地id 返回true和false
            Integer addressId = (Integer)map.get("addressId");
            boolean result = Arrays.asList(addressIdArray).contains(addressId);
            map.put("isIn",result);
        }

        //按照距离排序(由远到近)
        Collections.sort(list, new Comparator>(){
            public int compare(Map o1, Map o2) {
                String distance1 =(String)o1.get("distance");  //name1是从你list里面拿出来的第一个name
                String distance2= (String)o2.get("distance");  //name2是从你list里面拿出来的第二个name
                return distance2.compareTo(distance1);
            }
        });
        //倒叙list排序
        Collections.reverse(list);

排序是我方法内的代码,只要注意使用方法collenctions.sort()方法就好了,此方法排序后为从远到近的排序。

collentions.reverse(list)方法 是将list已有的排序顺序反转

你可能感兴趣的:(工具)