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<HashMap<String,Object>> list = userAddressDao.getByItemId(itemId);
        for(HashMap<String,Object> 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<Map<String, Object>>(){
            public int compare(Map<String, Object> o1, Map<String, Object> 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已有的排序顺序反转

以下是C#中计算经纬坐标距离的方法: ```csharp public static class MapHelper { private const double EARTH_RADIUS = 6378.137;//地球半径 private static double rad(double d) { return d * Math.PI / 180.0; } /// <summary> /// 根据经纬度计算两点之间的距离(单位:米) /// </summary> /// <param name="lat1">第一点的纬度</param> /// <param name="lng1">第一点的经度</param> /// <param name="lat2">第二点的纬度</param> /// <param name="lng2">第二点的经度</param> /// <returns>返回距离(单位千米或米)</returns> public static double 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 * 10000) / 10000; return s; } /// <summary> /// 根据经纬度计算两点之间的距离(单位:米) /// </summary> /// <param name="point1">第一点的经纬度,格式:纬度,经度</param> /// <param name="point2">第二点的经纬度,格式:纬度,经度</param> /// <returns>返回距离(单位千米或米)</returns> public static double GetPointDistance(string point1, string point2) { string[] arr1 = point1.Split(','); string[] arr2 = point2.Split(','); double lat1 = Convert.ToDouble(arr1[0]); double lng1 = Convert.ToDouble(arr1[1]); double lat2 = Convert.ToDouble(arr2[0]); double lng2 = Convert.ToDouble(arr2[1]); return GetDistance(lat1, lng1, lat2, lng2); } } ``` 以上代码中,`GetDistance`方法和`GetPointDistance`方法都可以用来计算两个经纬度坐标之间的距离,其中`GetDistance`方法需要传入四个参数,分别是第一点的纬度、经度和第二点的纬度、经度,而`GetPointDistance`方法需要传入两个参数,分别是第一点和第二点的经纬度,格式为“纬度,经度”。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值