java根据两个经纬度计算距离和方向角
时间: 2023-07-23 12:18:33 浏览: 82
计算距离可以使用 Haversine 公式,计算方向角可以使用 Vincenty 公式。下面是 Java 代码示例:
```java
import java.lang.Math;
public class LocationUtils {
/**
* 计算两个经纬度之间的距离(单位:米)
* @param lat1 第一个点的纬度
* @param lon1 第一个点的经度
* @param lat2 第二个点的纬度
* @param lon2 第二个点的经度
* @return 两个经纬度之间的距离(单位:米)
*/
public static double getDistance(double lat1, double lon1, double lat2, double lon2) {
double R = 6371000; // 地球半径(米)
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));
return R * c;
}
/**
* 计算从第一个点到第二个点的方向角(单位:度)
* @param lat1 第一个点的纬度
* @param lon1 第一个点的经度
* @param lat2 第二个点的纬度
* @param lon2 第二个点的经度
* @return 从第一个点到第二个点的方向角(单位:度)
*/
public static double getAzimuth(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 azimuth = Math.toDegrees(Math.atan2(y, x));
return azimuth >= 0 ? azimuth : azimuth + 360; // 范围:0~360度
}
}
```
使用示例:
```java
double distance = LocationUtils.getDistance(39.9042, 116.4074, 31.2304, 121.4737);
double azimuth = LocationUtils.getAzimuth(39.9042, 116.4074, 31.2304, 121.4737);
System.out.println("距离:" + distance + " 米");
System.out.println("方向角:" + azimuth + " 度");
```
其中,纬度和经度的单位都是度。