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); } } }