package com.xiaopeng.itinerary.utils.map;
|
|
public class FastDistanceCalculator {
|
private static final double R = 6371.0; // 地球半径(千米)
|
private static final double DEG_TO_RAD = Math.PI / 180.0;
|
|
/**
|
* 快速近似算法 - 性能极高,误差<0.5%
|
* 适合需要大量计算的场景(如KNN、聚类)
|
* 米
|
*/
|
public static double distanceFast(double lat1, double lon1,
|
double lat2, double lon2) {
|
try {
|
double x = (lon2 - lon1) * DEG_TO_RAD * Math.cos((lat1 + lat2) * 0.5 * DEG_TO_RAD);
|
double y = (lat2 - lat1) * DEG_TO_RAD;
|
return R * Math.sqrt(x * x + y * y)*1000;
|
}catch (Exception e){
|
e.printStackTrace();
|
}
|
return 0;
|
|
}
|
|
/**
|
* 快速近似算法 - 误差<0.5%
|
* 适合需要大量计算的场景(如KNN、聚类)
|
* 千米
|
*/
|
public static double distanceFastKm(double lat1, double lon1,
|
double lat2, double lon2) {
|
double x = (lon2 - lon1) * DEG_TO_RAD * Math.cos((lat1 + lat2) * 0.5 * DEG_TO_RAD);
|
double y = (lat2 - lat1) * DEG_TO_RAD;
|
return R * Math.sqrt(x * x + y * y);
|
}
|
|
/**
|
* 平面近似 - 极高性能,适用于小范围(城市内)
|
*/
|
public static double distanceFlatApprox(double lat1, double lon1,
|
double lat2, double lon2) {
|
// 每度纬度约111km,每度经度随纬度变化
|
double kmPerDegreeLat = 111.0;
|
double kmPerDegreeLon = 111.0 * Math.cos((lat1 + lat2) * 0.5 * DEG_TO_RAD);
|
|
double dLat = lat2 - lat1;
|
double dLon = lon2 - lon1;
|
|
return Math.sqrt(Math.pow(dLat * kmPerDegreeLat, 2) +
|
Math.pow(dLon * kmPerDegreeLon, 2));
|
}
|
}
|