将地球看做一个标准球体,计算点到线段的距离。
计算两点间的球面距离
/**
*
* a点经度,a点纬度,b点经度,b点纬度
*
*/
public static double calcP2P(double alon, double alat, double blon, double blat) {
double R = 6378.137;// 地球半径(千米)
// 判断点是在北半球还是南半球,本程序中输入的数据若为负则表示在南边球
double distance = 0.0D;
double _alat = (alat) * (Math.PI / 180); // 弧度
double _alon = (alon) * (Math.PI / 180);
double _blat = (blat) * (Math.PI / 180);
double _blon = (blon) * (Math.PI / 180);
double c = Math.sin(_alat) * Math.sin(_blat) + Math.cos(_alat) * Math.cos(_blat) * Math.cos(_alon - _blon); // Java中三角函数角度以弧度制表示
if (c > 1) {
c = 1;
}
distance = Math.acos(c) * R; // 弧长公式:弧长 = 弧度 * 半径
if (distance <= 0.01) { // GPS误差
distance = 0.0D;
}
return distance;
}
计算点到线段的距离
/**
*
* x,y--点的经度和纬度
* x1,y1--线段某个端点的经度和纬度
* x2,y2--线段另外一个端点的经度和纬度
*
*/
public static double calcP2L(double x, double y, double x1, double y1, double x2, double y2) {
double d1 = (x2 - x1) * (x - x1) + (y2 - y1) * (y - y1);
if (d1 < 0) {
return calcP2P(x, y, x1, y1);
}
double d2 = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1);
if (d1 >= d2) {
return calcP2P(x, y, x2, y2);
}
double r = d1 / d2;
double px = x1 + (x2 - x1) * r;
double py = y1 + (y2 - y1) * r;
return calcP2P(x, y, px, py);
}