package com.sage.dss.util;
import java.math.BigDecimal;
/**
* 提取自 AMapUtils(版本 com.amap.api:map2d:2.9.1)。
* 修改了参数,解除对高德 API 的依赖。
*/
public class MapUtil {
/**
* 此方法与高德API distance方法算法一致
* 计算两点间的距离,单位:米
*/
public static BigDecimal calculateLineDistance(double x1, double y1, double x2, double y2) {
double lon1 = (Math.PI / 180) * x1;
double lon2 = (Math.PI / 180) * x2;
double lat1 = (Math.PI / 180) * y1;
double lat2 = (Math.PI / 180) * y2;
if (lon2 == lon1) {
return new BigDecimal(0);
}
// 地球半径
double R = 6378;
// 两点间距离 km,如果想要米的话,结果*1000就可以了
double d = Math.acos(Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos(lon2 - lon1)) * R;
return new BigDecimal(d);
}
double PointToSegDist(double x, double y, double x1, double y1, double x2, double y2){
double cross = (x2 - x1) * (x - x1) + (y2 - y1) * (y - y1);
if (cross <= 0){
return calculateLineDistance(x, y, x1, y1).doubleValue();
}
double d2 = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1);
if (cross >= d2){
return calculateLineDistance(x, y, x2, y2).doubleValue();
}
BigDecimal l1 = calculateLineDistance(x, y, x1, y1);
BigDecimal l2 = calculateLineDistance(x, y, x2, y2);
BigDecimal l12 = calculateLineDistance(x1, y1, x2, y2);
BigDecimal l = l1.add(l2).add(l12).divide(new BigDecimal(2), 6); // 半周长
double s = Math.sqrt(l.multiply(l.subtract(l12).multiply(l.subtract(l1).multiply(l.subtract(l2)))).doubleValue());
return new BigDecimal(s).multiply(new BigDecimal(2)).divide(l12, 6).doubleValue();
}
}