java 地图工具类,计算两坐标之间的距离km

java 地图工具类,计算两坐标之间的距离km


import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;


public class DistanceUtil {

    public final static double AVERAGE_RADIUS_OF_EARTH_KM = 6371.393;

    public final static String MAX_LON ="maxLon";
    public final static String MIN_LON ="minLon";
    public final static String MAX_LAT="maxLat";
    public final static String MIN_LAT ="minLat";

    /**
     * 计算两坐标之间的距离 km
     * @param userLat
     * @param userLng
     * @param venueLat
     * @param venueLng
     * @return
     */
    public static double calculateDistanceInKilometer(double userLat, double userLng,double venueLat, double venueLng) {
        double latDistance = Math.toRadians(userLat - venueLat);
        double lngDistance = Math.toRadians(userLng - venueLng);
        double a = Math.sin(latDistance / 2) * Math.sin(latDistance / 2)
                + Math.cos(Math.toRadians(userLat)) * Math.cos(Math.toRadians(venueLat))
                * Math.sin(lngDistance / 2) * Math.sin(lngDistance / 2);
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
        BigDecimal bd = BigDecimal.valueOf(AVERAGE_RADIUS_OF_EARTH_KM * c);
        return bd.setScale(3,BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 获取 距离坐标 一定距离的 范围 坐标极值 [不是很精确]
     * @param lon
     * @param lat
     * @param distance km
     * @return
     */
    public static Map<String,Double> getRange(double lon,double lat,double distance){
        double dlng = 2 * Math.asin(Math.sin(distance / (2 * AVERAGE_RADIUS_OF_EARTH_KM)) / Math.cos(lat * (Math.PI/180)));
        dlng = degrees(dlng);
        double dlat = distance / AVERAGE_RADIUS_OF_EARTH_KM;
        dlat = degrees(dlat);
        Map<String,Double> map = new HashMap<>(6);
        map.put(MAX_LON, lon + dlng);
        map.put(MIN_LON, lon - dlng);
        map.put(MAX_LAT, lat + dlat);
        map.put(MIN_LAT, lat - dlat);
        return  map;
    }

    private static double degrees(double d) {
        return d * (180 / Math.PI);
    }


    public static void main(String[] args) {

        Map<String,Double> map = getRange(121.438853,31.221332,10);
        System.out.println(map.toString());

        double km = calculateDistanceInKilometer(31.221332,121.438853,31.221332,121.438853);
        System.out.println(km);
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值