这里写自定义目录标题
两种根据经纬度计算转向角的方法 Java 工具类
本Java工具类提供了两种根据经纬度计算转向角的方法,其中第二种方法经测试是可以的。
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class AngleUtil {
private static final int EARTH_RADIUS_IN_KILOMETERS = 6371;
public static double getAngle(double lat1, double lon1, double lat2, double lon2){
// return calculateAngle1(lon1, lat1, lon2, lat2);
return calculateAngle2(lat1, lon1, lat2, lon2);
}
/**
* 获取两点之间的角度,用于:历史回放
* 2023-11-21 10:22:56
* @param x1 第一个点经度
* @param y1 第一个点纬度
* @param x2 第二个点经度
* @param y2 第二个点纬度
* @return
*/
private static double calculateAngle1(double x1, double y1, double x2, double y2) {
if (x1 ==0 || x2==0 || y1==0||y2==0){
// 初始化数据不做角度计算
return 0;
}
double x = Math.abs(x1 - x2);
double y = Math.abs(y1 - y2);
double z = Math.sqrt(x * x + y * y);
double angle = Math.round((Math.asin(y / z) / Math.PI * 180));
if (Double.isNaN(angle)) {
return 0;
} else {
if (angle == 0) {
if (x2 - x1 > 0) {
angle = 90; //目标方向横轴正向
} else {
angle = -90; //目标方向横轴反向
}
} else if (angle == 90) {
if (y2 - y1 > 0) {
angle = 0; //目标方向纵轴正向
} else {
angle = 180; //目标方向纵轴反向
}
} else {
if (x2 - x1 > 0 && y2 - y1 > 0) {
angle = 90 - angle; //目标方向第一象限
} else if (x2 - x1 < 0 && y2 - y1 < 0) {
angle = -90 - angle; //目标方向第三象限
} else if (x2 - x1 > 0 && y2 - y1 < 0) {
angle = 90 + angle; //目标方向第四象限
} else if (x2 - x1 < 0 && y2 - y1 > 0) {
angle = angle - 90; //目标方向第二象限
}
}
}
angle = Math.PI / 180 * angle;
return angle;
}
private static double calculateAngle2(double lat1, double lon1, double lat2, double lon2) {
if (lat1 ==0 || lon1==0 || lat2==0||lon2==0){
// 初始化数据不做角度计算
return 0;
}
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));
// Distance in kilometers
double distance = EARTH_RADIUS_IN_KILOMETERS * c;
// Bearing in degrees
double bearing = Math.toDegrees(Math.atan2(
Math.sin(dLon) * Math.cos(Math.toRadians(lat2)),
Math.cos(Math.toRadians(lat1)) * Math.sin(Math.toRadians(lat2)) -
Math.sin(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * Math.cos(dLon)));
// Normalize bearing to 0-360 degrees
bearing = (bearing + 360) % 360;
return bearing;
}
}