GeoUtils.java
1.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package com.bsth.util;
import com.bsth.entity.Point;
/**
* Created by panzhao on 2016/12/23.
*/
public class GeoUtils {
private final static double EARTH_RADIUS = 6378137;
public static double getDistance(Point p1, Point p2) {
double lng1 = getLoop(p1.getLon(), -180, 180), lat1 = getRange(
p1.getLat(), -74, 74);
double lng2 = getLoop(p2.getLon(), -180, 180), lat2 = getRange(
p2.getLat(), -74, 74);
double x1, x2, y1, y2;
x1 = degreeToRad(lng1);
y1 = degreeToRad(lat1);
x2 = degreeToRad(lng2);
y2 = degreeToRad(lat2);
return EARTH_RADIUS
* Math.acos((Math.sin(y1) * Math.sin(y2) + Math.cos(y1)
* Math.cos(y2) * Math.cos(x2 - x1)));
}
private static double getLoop(double v, double a, double b) {
while (v > b) {
v -= b - a;
}
while (v < a) {
v += b - a;
}
return v;
}
private static double getRange(double v, double a, double b) {
v = Math.min(Math.max(v, a), b);
return v;
}
private static double degreeToRad(double degree) {
return Math.PI * degree / 180;
}
/**
* 计算点 到 线的距离
* @param line
* @param p
* @return
*/
public static double getDistanceFromLine(Point s, Point e, Point p){
double d1 = getDistance(s, p);
double d2 = getDistance(p, e);
double d3 = getDistance(s, e);
double distance = 0;
double alpha = Math.acos((d1*d1 + d3*d3 - d2*d2)/(2*d1*d3));
double beta = Math.acos((d2*d2 + d3*d3 - d1*d1)/(2*d2*d3));
if(alpha>Math.PI/2) {
distance = d1;
}
else if(beta > Math.PI/2) {
distance = d2;
}
else {
distance = Math.sin(alpha) * d1;
}
return distance;
}
}