根据经纬度,距离,角度计算另外一个点

以下距离单位KM

 /**
     * @static  getLonLat.
     *
     * @param $lon
     * @param $lat
     * @param $distance
     * @param $angle
     *
     * @return string
     */
    public static function getLonLat1($lon, $lat, $distance, $angle)
    {
        $ea = 6378137;     //   赤道半径
        $eb = 6356725;     //   极半径
        $dx = $distance * 1000 * sin($angle * pi() / 180);
        $dy = $distance * 1000 * cos($angle * pi() / 180);
        $ec = $eb + ($ea - $eb) * (90 - $lat) / 90;
        $ed = $ec * cos($lat * pi() / 180);
        $lon = ($dx / $ed + $lon * pi() / 180) * 180 / pi();
        $lat = ($dy / $ec + $lat * pi() / 180) * 180 / pi();

        return $lon . ' ' . $lat;
    }

    /**
     * @static  getLonLat.
     *
     * @param $lon
     * @param $lat
     * @param $distance
     * @param $angle
     *
     * @return float|int|string
     */
    public static function getLonLat2($lon, $lat, $distance, $angle)
    {
        // latlngA . longitude + (distance * Math . sin(angle * Math . PI / 180)) / (111 * Math . cos(latlngA . latitude * Math . PI / 180)
        // latlngA . latitude + (distance * Math . cos(angle * Math . PI / 180)) / 111
        $lat = $lat + ($distance * cos($angle * pi() / 180)) / 111;
        $lon = $lon + ($distance * sin($angle * pi() / 180)) / (111 * cos($lat * pi() / 180));

        return $lon . ' ' . $lat;
    }

    /**
     * @static  getLonLat.
     *
     * @param $lng
     * @param $lat
     * @param $distance
     * @param $angle
     *
     * @return array
     */
    public static function getLonLat($lng, $lat, $distance, $angle)
    {
        # 地球半径 KM
        $raidus = 6378.137;

        $pi = 3.14;
        $latitude1 = $lat * ($pi / 180);
        $longitude1 = $lng * ($pi / 180);
        $brng = $angle * ($pi / 180);

        $latitude2 = asin(sin($latitude1) * cos($distance / $raidus) + cos($latitude1) * sin($distance / $raidus) * cos($brng));
        $longitude2 = $longitude1 + atan2(sin($brng) * sin($distance / $raidus) * cos($latitude1), cos($distance / $raidus) - sin($latitude1) * sin($latitude2));

        $latitude2 = $latitude2 * (180 / $pi);
        $longitude2 = $longitude2 * (180 / $pi);

        $lat2 = round($latitude2, 6);
        $lng2 = round($longitude2, 6);

        return ['lat' => $lat2, 'lng' => $lng2];
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这个问题需要使用球面三角学的知识来解决。以下是一个简单的 Java 代码示例,用于计算两个已知之间的距离和方位角。 ```java public class LocationUtils { private static final double EARTH_RADIUS = 6371.0; // 地球半径,单位为千米 /** * 根据距离和与正北的角度计算经纬度 * @param lat1 第一个点的纬度 * @param lng1 第一个点的经度 * @param distance 两之间的距离,单位为千米 * @param bearing 与正北的角度,范围为[0,360) * @return 第二个经纬度 */ public static double[] calculateLocation(double lat1, double lng1, double distance, double bearing) { double lat2, lng2; double radLat1 = Math.toRadians(lat1); double radBearing = Math.toRadians(bearing); double radDistance = distance / EARTH_RADIUS; lat2 = Math.asin(Math.sin(radLat1) * Math.cos(radDistance) + Math.cos(radLat1) * Math.sin(radDistance) * Math.cos(radBearing)); lng2 = lng1 + Math.atan2(Math.sin(radBearing) * Math.sin(radDistance) * Math.cos(radLat1), Math.cos(radDistance) - Math.sin(radLat1) * Math.sin(lat2)); return new double[]{Math.toDegrees(lat2), Math.toDegrees(lng2)}; } } ``` 使用示例: ```java double[] location = LocationUtils.calculateLocation(39.9087, 116.3975, 5.0, 90.0); System.out.println("经度:" + location[1] + ",纬度:" + location[0]); ``` 这将输出: ``` 经度:116.44554647807073,纬度:39.908700000000006 ``` 其中,39.9087 和 116.3975 是第一个点的纬度和经度,5.0 是两个之间的距离(单位为千米),90.0 是与正北的角度计算得出的第二个经纬度是 [39.908700000000006, 116.44554647807073]。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值