Java 通过已知点的经纬度,相对角度,距离计算另一点的经纬度

问题背景:自己在使用高德地图时没有发现通过已知点经纬度,角度,距离计算另一点经纬度的方法,所以只好自己实现了。查询之后发现国内的博客基本都是计算两点距离,计算点到线距离的距离等,有几篇也都是C语言形式,这里自己写一下,以作记录。
文章参考文档:
谷歌讨论版关于这个问题的问答
具体函数的网页

具体实现

需求

通过已知点的经纬度,相对角度,距离计算另一点的经纬度

实现逻辑

注意:所有这些形式都是基于球形地球的计算(忽略椭球效应) - 这对于大多数目的而言足够准确 [事实上,地球是非常略微椭圆形的; 使用球形模型时,误差通常高达0.3%
如果需要精确,那么可能这个方法不适用
*

需要参数

  1. 起始点位置经纬度,十进制;double longitude,double latitude
  2. 距离(单位千米);double distance
  3. 角度从正北方开始到目标点的角度;double angle

公式

纬度:φ2 = asin( sin φ1 ⋅ cos δ + cos φ1 ⋅ sin δ ⋅ cos θ )
经度:λ2 = λ1 + atan2( sin θ ⋅ sin δ ⋅ cos φ1, cos δ − sin φ1 ⋅ sin φ2 )
以上公式中的经纬度都需要转换成弧度radian

  1. λ2结果经度
  2. λ1起始经度
  3. φ2结果纬度
  4. φ1结果纬度
  5. θ角度,从北方顺时针方向
  6. R地球半径
  7. δ表示角距离,即d/R
  8. d距离(km)

带入数据,可以得到方法

/** 地球半径 **/
  private static final double R = 6371e3;
  /** 180° **/
  private static final DecimalFormat df = new DecimalFormat("0.000000");

  /**
   * 根据一点的坐标与距离,以及方向,计算另外一点的位置
   * @param angle 角度,从正北顺时针方向开始计算
   * @param startLong 起始点经度
   * @param startLat 起始点纬度
   * @param distance 距离,单位m
   * @return
   */
  public static String[] calLocationByDistanceAndLocationAndDirection(double angle, double startLong,double startLat, double distance){
    String[] result = new String[2];
    //将距离转换成经度的计算公式
    double δ = distance/R;
    // 转换为radian,否则结果会不正确
    angle = Math.toRadians(angle);
    startLong = Math.toRadians(startLong);
    startLat = Math.toRadians(startLat);
    double lat = Math.asin(Math.sin(startLat)*Math.cos(δ)+Math.cos(startLat)*Math.sin(δ)*Math.cos(angle));
    double lon = startLong + Math.atan2(Math.sin(angle)*Math.sin(δ)*Math.cos(startLat),Math.cos(δ)-Math.sin(startLat)*Math.sin(lat));
    // 转为正常的10进制经纬度
    lon = Math.toDegrees(lon);
    lat = Math.toDegrees(lat);
    result[0] = df.format(lon);
    result[1] = df.format(lat);
    return result;
  }

  public static void main(String[] args) {
    String[] result = calLocationByDistanceAndLocationAndDirection(0,119.010212,32.147982, 100);
    String[] result2 = calLocationByDistanceAndLocationAndDirection(90,119.010212,32.147982, 100);
    String[] result3 = calLocationByDistanceAndLocationAndDirection(180,119.010212,32.147982, 100);
    System.out.print(result[0]+",");
    System.out.println(result[1]);
    System.out.print(result2[0]+",");
    System.out.println(result2[1]);
    System.out.print(result3[0]+",");
    System.out.println(result3[1]);
  }

图片示意
这里当然有一些误差,但是因为此项目仅需要大概位置,所以仅需要做到这一步就可以了,如果需要十分精确的话可能需要现在平面坐标系中计算后再转换为经纬度坐标?这里先不做讨论,如果以后需要,再做补充。
如果文中存在错误,希望各位大佬斧正,感谢!

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值