经纬度,距离,方位角相关计算(Java实现)

问题:已知地点1、地点3的经纬度和地点2相对于地点1的方位角和距离,求地点2相对于地点3的方位角和距离。

要解决这个问题,可以分为两步实现:

1.根据一点的经纬度, 到另外一点的距离, 方位角, 计算另外一点的经纬度。

2.求坐标1相对于坐标2的方位角度和距离

解法:

根据一点的经纬度, 到另外一点的距离, 方位角, 计算另外一点的经纬度。

在这个公式中,lat1和lon1是起始点的纬度和经度(以度为单位),distance是两点间的距离(以千米为单位),bearing是方位角(以度为单位),lat2和lon2是终点的纬度和经度(以弧度为单位),返回前使用Math.toDegree()函数转化为以度为单位。

/**
     * 根据一点的经纬度, 到另外一点的距离, 方位角, 计算另外一点的经纬度
     * @param lon1   经度 以度为单位
     * @param lat1   纬度 以度为单位
     * @param bearing 方位角(以度为单位)
     * @param distance   移动距离 千米
     * @return	返回double数组 double[经度, 纬度]
     */
    public static double[] LongLatOffset(double lon1, double lat1, double bearing, double distance) {
//
        //  方位角 角度转换到弧度
        lon1 = Math.toRadians(lon1);
        lat1 = Math.toRadians(lat1);
        bearing = Math.toRadians(bearing);
        double lat2 = Math.asin(Math.sin(lat1) * Math.cos(distance / arc) +
                Math.cos(lat1) * Math.sin(distance / arc) * Math.cos(bearing));

        double lon2 = lon1 + Math.atan2(Math.sin(bearing) * Math.sin(distance / arc) * Math.cos(lat1),
                Math.cos(distance / arc) - Math.sin(lat1) * Math.sin(lat2));

        return new double[]{Math.toDegrees(lon2), Math.toDegrees(lat2)};
    }

求坐标1相对于坐标2的方位角度和距离

在这个公式中,lat1和lon1是坐标1的纬度和经度(以弧度为单位),lat2和lon2是坐标2的纬度和经度(以弧度为单位),bearing是坐标1相对于坐标2的方位角(以弧度为单位)。
方位角的范围是0°到360°,0°表示正北方向,90°表示正东方向,180°表示正南方向,270°表示正西方向。

     /**
     * 求坐标2相对于坐标1的方位角度和距离
     * 单位:度
     * @param lon1
     * @param lat1
     * @param lon2
     * @param lat2
     * @return	返回 double数组[方位角,距离],方位角单位: 度 距离单位: 千米
     */
    public static double[] bearingDistOffset(double lon1, double lat1, double lon2, double lat2) {
        lon1 = Math.toRadians(lon1);
        lat1 = Math.toRadians(lat1);
        lon2 = Math.toRadians(lon2);
        lat2 = Math.toRadians(lat2);
        // 是坐标1的纬度和经度(以弧度为单位)
        double bearing = Math.atan2(Math.sin(lon2 - lon1) * Math.cos(lat2),
                Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(lon2 - lon1));
        bearing = Math.toDegrees(bearing);
//        log.info("计算后方位角:{}°", bearing);
        double distance = arc * Math.acos(Math.sin(lat1) * Math.sin(lat2) +
                Math.cos(lat1) * Math.cos(lat2) *
                        Math.cos(lon2 - lon1));
//        log.info("计算后距离:{}km", distance);
        distance = distance;
        return new double[]{bearing, distance};
    }

注: 地球半径arc取6371.393,单位是千米

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值