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; } }