import java.text.DecimalFormat;
public class DistanceCalculator {
// 地球半径(单位:千米)
private static final double R = 6371.0;
// 计算地球球面距离方法
public static void calculateSphericalDistance(double lng1, double lat1, double lng2, double lat2) {
// 将经度和纬度转换为弧度表示
double lng1Rad = Math.toRadians(lng1);
double lat1Rad = Math.toRadians(lat1);
double lng2Rad = Math.toRadians(lng2);
double lat2Rad = Math.toRadians(lat2);
// 使用Haversine公式计算球面距离
double deltaLng = lng2Rad - lng1Rad;
double deltaLat = lat2Rad - lat1Rad;
double a = Math.sin(deltaLat/2) * Math.sin(deltaLat/2) +
Math.cos(lat1Rad) * Math.cos(lat2Rad) *
Math.sin(deltaLng/2) * Math.sin(deltaLng/2);
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
double distance = R * c;
// 判断距离大小并进行单位转换
String unit;
if(distance >= 1.0) { // 距离大于等于1千米时使用千米为单位
unit = "千米";
} else {
distance = distance * 1000; // 转换为米
unit = "米";
}
// 保留两位小数并进行四舍五入
DecimalFormat decimalFormat = new DecimalFormat("#.00");
String formattedDistance = decimalFormat.format(distance);
// 打印距离
System.out.println("球面距离:" + formattedDistance + " " + unit);
}
public static double convertToDecimalDegrees(String coord) {
// 判断方向(E/W 或 N/S)
char directionChar = coord.charAt(coord.length() - 1);
boolean isPositive = (directionChar == 'E' || directionChar == 'N');
// 分割度分秒
String[] parts = coord.split("[°'']+");
// 提取度、分、秒的数值
double degrees = Double.parseDouble(parts[0]);
double minutes = Double.parseDouble(parts[1]);
double seconds = Double.parseDouble(parts[2]);
// 计算十进制度
double decimalDegrees = degrees + minutes / 60 + seconds / 3600;
// 根据方向确定正负号
if (!isPositive) {
decimalDegrees *= -1;
}
return decimalDegrees;
}
}
评论