59 lines
2.0 KiB
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);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|