두 좌표간 거리 측정
/**
* 두 좌표 거리 구하기
* @param latitude1 Start latitude
* @param longitude1 Start longitude
* @param latitude2 End latitude
* @param longitude2 End longitude
* @return Distance(m)
*/
public static double geoDistance(double latitude1, double longitude1, double latitude2, double longitude2) {
DecimalFormat df = new DecimalFormat("#.#####");
if ((latitude1 == latitude2) && (longitude1 == longitude2)) {
return 0;
} else {
double theta = longitude1 - longitude2;
double distance = Math.sin(Math.toRadians(latitude1)) * Math.sin(Math.toRadians(latitude2)) +
Math.cos(Math.toRadians(latitude1)) * Math.cos(Math.toRadians(latitude2)) * Math.cos(Math.toRadians(theta));
distance = Math.acos(distance);
distance = Math.toDegrees(distance);
distance = distance * 60 * 1.1515;
distance = distance * 1.609344;
//distance --> 0보다 클 경우
if (0 < distance) {
distance = Double.valueOf(df.format(distance)); //소숫점 다섯째 자리에서 반올림
// distance --> 0일 경우
} else {
distance = 0;
}
distance = distance * 1000; //km --> m으로 변환
return distance;
}
}
두 좌표의 방위각 측정
/**
* 두 좌표 방위각 구하기
* @param latitude1 Start latitude
* @param longitude1 Start longitude
* @param latitude2 End latitude
* @param longitude2 End longitude
* @return bearing
*/
public static short bearingP1toP2(double latitude1, double longitude1, double latitude2, double longitude2) {
// 현재 위치 : 위도나 경도는 지구 중심을 기반으로 하는 각도이기 때문에 라디안 각도로 변환한다.
double Cur_Lat_radian = latitude1 * (Math.PI / 180);
double Cur_Lon_radian = longitude1 * (Math.PI / 180);
// 목표 위치 : 위도나 경도는 지구 중심을 기반으로 하는 각도이기 때문에 라디안 각도로 변환한다.
double Dest_Lat_radian = latitude2 * (Math.PI / 180);
double Dest_Lon_radian = longitude2 * (Math.PI / 180);
// radian distance
double radian_distance = 0;
radian_distance = Math.acos(Math.sin(Cur_Lat_radian) * Math.sin(Dest_Lat_radian)
+ Math.cos(Cur_Lat_radian) * Math.cos(Dest_Lat_radian) * Math.cos(Cur_Lon_radian - Dest_Lon_radian));
// 목적지 이동 방향을 구한다.(현재 좌표에서 다음 좌표로 이동하기 위해서는 방향을 설정해야 한다. 라디안값이다.
double radian_bearing = Math.acos((Math.sin(Dest_Lat_radian) - Math.sin(Cur_Lat_radian)
* Math.cos(radian_distance)) / (Math.cos(Cur_Lat_radian) * Math.sin(radian_distance)));// acos의 인수로 주어지는 x는 360분법의 각도가 아닌 radian(호도)값이다.
double true_bearing = 0;
if (Math.sin(Dest_Lon_radian - Cur_Lon_radian) < 0) {
true_bearing = radian_bearing * (180 / Math.PI);
true_bearing = 360 - true_bearing;
} else {
true_bearing = radian_bearing * (180 / Math.PI);
}
return (short) true_bearing;
}
특정 좌표에서 방위각 + 거리의 좌표 값 획득
/**
* 특정 좌표에서 방위각, 거리를 가지고 원하는 좌표 값 획득
* @param latitude latitude
* @param longitude longitude
* @param direction_degree direction
* @param length_degree length
* @return double[2] location = {longitude, latitude}
*/
public static double[] geoMove(double latitude, double longitude, double direction_degree, double length_degree) {
double[] location = new double[2];
double x = longitude + length_degree * Math.cos(direction_degree * Math.PI / 180);
double y = latitude + length_degree * Math.sin(direction_degree * Math.PI / 180);
location[0] = x;
location[1] = y;
return location;
}
'...' 카테고리의 다른 글
맥북 초기화 오류 작업을 완료할 수 없습니다.(pkdownloaderror 오류 8.) (0) | 2020.06.06 |
---|---|
소스트리(SourceTree) fatal: Authentication failed for 에러 대처법 (0) | 2020.05.23 |
Tailwindcss Setup (0) | 2020.04.07 |
Nodejs Tutorial 노드js 시작하기 (0) | 2020.04.03 |