Talk is cheap, show me the code.
import lombok.extern.slf4j.Slf4j;
/**
* 根據經緯度,計算2點之間的直線距離。
* 距離較近的場景,可以使用,誤差較小。
* 距離較遠的場景,要考慮具體的業務場景。
* 因爲這個只是計算直線距離,和實際的路線不同,所以要結合場景,看是否適用
*/
@Slf4j
public class CalCulateDistanceUtils {
/**
* 地球半徑(這裏取的是平均半徑)
*/
private static final double EARTH_RADIUS = 6.371229 * 1e6;
/**
* @param lng1 地點A的經度
* @param lat1 地點A的緯度
* @param lng2 地點B的經度
* @param lat2 地點B的緯度
* @return 返參 double 單位千米(km)
*/
public static double calculateDistance(double lng1, double lat1, double lng2, double lat2) {
double x = (lng2 - lng1) * Math.PI * EARTH_RADIUS * Math.cos(((lat1 + lat2) / 2) * Math.PI / 180) / 180;
double y = (lat1 - lat2) * Math.PI * EARTH_RADIUS / 180;
// 默認是米,除以1000,返回千米
return Math.hypot(x, y) / 1000;
}
public static void main(String[] args) {
// 信陽的經度
Double lng1 = 114.097708;
// 信陽的緯度
Double lat1 = 32.167521;
// 佳木斯的經度
Double lng2 = 130.324123;
// 佳木斯的緯度
Double lat2 = 46.812022;
// 運行後,控制檯打印:佳木斯到信陽的距離:2142.6376176855483千米
log.info("佳木斯到信陽的距離:{}千米", calculateDistance(lng1, lat1, lng2, lat2));
}
}