经纬度,距离,方位角相关计算(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
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Java中进行经纬度距离方位角相关计算需要使用一些数学公式和算法。以下是一些实现这些计算的方法: 1. 经纬度的表示 在Java中,经纬度通常使用double类型表示。经度的取值范围为-180到180,西经为负数,东经为正数;纬度的取值范围为-90到90,北纬为正数,南纬为负数。 2. 距离计算 计算两个经纬度之间的距离需要使用地球的半径和经纬度之间的差值。有多种算法可用于计算距离,其中最常用的是Haversine公式。 Haversine公式是一种基于球面三角学的公式,用于计算两点之间的最短距离,即所谓的大圆距离。 以下是一个用Haversine公式计算两个经纬度之间距离的示例代码: ``` public static double distance(double lat1, double lon1, double lat2, double lon2) { double R = 6371; // 地球半径,单位为千米 double dLat = Math.toRadians(lat2 - lat1); double dLon = Math.toRadians(lon2 - lon1); double a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * Math.sin(dLon/2) * Math.sin(dLon/2); double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); double distance = R * c; return distance; } ``` 3. 方位角计算 方位角是从一个点到另一个点的方向角度。通常使用正北方向(0度)为基准,以顺时针方向测量。 我们可以使用公式计算两个点之间的方位角。 以下是一个使用公式计算两点之间方位角的示例代码: ``` public static double bearing(double lat1, double lon1, double lat2, double lon2) { double dLon = Math.toRadians(lon2 - lon1); double y = Math.sin(dLon) * Math.cos(Math.toRadians(lat2)); double x = Math.cos(Math.toRadians(lat1)) * Math.sin(Math.toRadians(lat2)) - Math.sin(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * Math.cos(dLon); double bearing = Math.toDegrees(Math.atan2(y, x)); return (bearing + 360) % 360; } ``` 总而言之,Java中进行经纬度距离方位角相关计算需要使用一些数学公式和算法,但使用这些方法可以准确地计算两个点之间的距离方位角

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值