package com.moral.util;
|
|
import java.text.DecimalFormat;
|
|
public class mapUtils {
|
/**
|
* 获取AB连线与正北方向的角度
|
* @param A A点的经纬度
|
* @param B B点的经纬度
|
* @return AB连线与正北方向的角度(0~360)
|
*/
|
/** 180° **/
|
private static final DecimalFormat df = new DecimalFormat("0.000000");
|
//地球平均半径
|
private static final double EARTH_RADIUS = 6378137;
|
//把经纬度转为度(°)
|
private static double rad(double d){
|
return d * Math.PI / 180.0;
|
}
|
|
public static double getDistance(double lng1, double lat1, double lng2, double lat2){
|
double radLat1 = rad(lat1);
|
double radLat2 = rad(lat2);
|
double a = radLat1 - radLat2;
|
double b = rad(lng1) - rad(lng2);
|
double s = 2 * Math.asin(
|
Math.sqrt(
|
Math.pow(Math.sin(a/2),2)
|
+ Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2)
|
)
|
);
|
s = s * EARTH_RADIUS;
|
s = Math.round(s * 10000) / 10000;
|
return s;
|
}
|
|
|
public static double getAngle(MyLatLng A,MyLatLng B){
|
double dx=(B.m_RadLo-A.m_RadLo)*A.Ed;
|
double dy=(B.m_RadLa-A.m_RadLa)*A.Ec;
|
double angle=0.0;
|
angle=Math.atan(Math.abs(dx/dy))*180./Math.PI;
|
double dLo=B.m_Longitude-A.m_Longitude;
|
double dLa=B.m_Latitude-A.m_Latitude;
|
if(dLo>0&&dLa<=0){
|
angle=(90.-angle)+90;
|
}
|
else if(dLo<=0&&dLa<0){
|
angle=angle+180.;
|
}else if(dLo<0&&dLa>=0){
|
angle= (90.-angle)+270;
|
}
|
return angle;
|
}
|
public static String[] calLocationByDistanceAndLocationAndDirection(double angle, double startLong,double startLat, double distance){
|
String[] result = new String[2];
|
//将距离转换成经度的计算公式
|
double δ = distance/EARTH_RADIUS;
|
// 转换为radian,否则结果会不正确
|
angle = Math.toRadians(angle);
|
startLong = Math.toRadians(startLong);
|
startLat = Math.toRadians(startLat);
|
double lat = Math.asin(Math.sin(startLat)*Math.cos(δ)+Math.cos(startLat)*Math.sin(δ)*Math.cos(angle));
|
double lon = startLong + Math.atan2(Math.sin(angle)*Math.sin(δ)*Math.cos(startLat),Math.cos(δ)-Math.sin(startLat)*Math.sin(lat));
|
// 转为正常的10进制经纬度
|
lon = Math.toDegrees(lon);
|
lat = Math.toDegrees(lat);
|
result[0] = df.format(lon);
|
result[1] = df.format(lat);
|
return result;
|
}
|
|
}
|