文章参考文档:
谷歌讨论版关于这个问题的问答
具体函数的网页
具体实现
需求
通过已知点的经纬度,相对角度,距离计算另一点的经纬度
实现逻辑
注意:所有这些形式都是基于球形地球的计算(忽略椭球效应) - 这对于大多数目的而言足够准确 [事实上,地球是非常略微椭圆形的; 使用球形模型时,误差通常高达0.3%
如果需要精确,那么可能这个方法不适用*
需要参数
起始点位置经纬度,十进制;double longitude,double latitude
距离(单位千米);double distance
角度从正北方开始到目标点的角度;double angle
公式
纬度:φ2 = asin( sin φ1 ⋅ cos δ + cos φ1 ⋅ sin δ ⋅ cos θ )
经度:λ2 = λ1 + atan2( sin θ ⋅ sin δ ⋅ cos φ1, cos δ − sin φ1 ⋅ sin φ2 )
以上公式中的经纬度都需要转换成弧度radian
λ2结果经度
λ1起始经度
φ2结果纬度
φ1结果纬度
θ角度,从北方顺时针方向
R地球半径
δ表示角距离,即d/R
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]);
}
这里当然有一些误差,但是因为此项目仅需要大概位置,所以仅需要做到这一步就可以了,如果需要十分精确的话可能需要现在平面坐标系中计算后再转换为经纬度坐标?这里先不做讨论,如果以后需要,再做补充。