Dock-MultiCtrl/admin/src/main/java/com/multictrl/common/utils/Spatial4jUtils.java

59 lines
2.0 KiB
Java

package com.multictrl.common.utils;
import org.locationtech.spatial4j.context.SpatialContext;
import org.locationtech.spatial4j.distance.DistanceUtils;
import org.locationtech.spatial4j.shape.Point;
import org.locationtech.spatial4j.shape.impl.PointImpl;
/**
* 地理空间工具
*
* @author Sdy
* @since 1.0.0 2026/5/6
*/
public class Spatial4jUtils {
// 使用 WGS84 坐标系(地球经纬度)
private static final SpatialContext ctx = SpatialContext.GEO;
/**
* 计算两个经纬度点之间的球面距离(单位:米)
*
* @param lat1 第一个点纬度
* @param lon1 第一个点经度
* @param lat2 第二个点纬度
* @param lon2 第二个点经度
* @return 距离,单位:米
*/
public static double distance(double lat1, double lon1, double lat2, double lon2) {
Point p1 = new PointImpl(lon1, lat1, ctx);
Point p2 = new PointImpl(lon2, lat2, ctx);
return distance(p1, p2);
}
/**
* 如果你已经有 Point 对象,可以直接传入计算
*/
public static double distance(Point p1, Point p2) {
// 计算两点之间的角度
double distanceRad = ctx.getDistCalc().distance(p1, p2);
// 使用地球平均半径(公里)转为米(弧度*半径)
return DistanceUtils.degrees2Dist(distanceRad, DistanceUtils.EARTH_MEAN_RADIUS_KM * 1000);
}
public static double distance(String lat1Str, String lon1Str, String lat2Str, String lon2Str) {
try {
double lat1 = Double.parseDouble(lat1Str);
double lon1 = Double.parseDouble(lon1Str);
double lat2 = Double.parseDouble(lat2Str);
double lon2 = Double.parseDouble(lon2Str);
return distance(lat1, lon1, lat2, lon2);
} catch (NumberFormatException e) {
System.err.println("Invalid input: " + e.getMessage());
return 0; // 或抛出异常 throw new IllegalArgumentException("Invalid coordinate format", e);
}
}
}