首先思考,已知两个经纬度,需要求出用户输入的定距来确定每一个点的经纬度,应该先确定从两个点的哪一个开始计算,这个自己定。然后需要根据两个点的经纬度来算出线的角度(相对于正北方向),最后进行计算。
既然已经有了思路,那么就一步一步来。
首先算出线的角度。我写了一个方法,可以直接照搬。
/** * 已知两点经纬度求方位角 */ public static double getAngle(double lon1, double lat1, double lon2, double lat2) { double fLat = Math.PI * (lat1) / 180.0; double fLng = Math.PI * (lon1) / 180.0; double tLat = Math.PI * (lat2) / 180.0; double tLng = Math.PI * (lon2) / 180.0; double degree = (Math.atan2(Math.sin(tLng - fLng) * Math.cos(tLat), Math.cos(fLat) * Math.sin(tLat) - Math.sin(fLat) * Math.cos(tLat) * Math.cos(tLng - fLng))) * 180.0 / Math.PI; if (degree >= 0) { return degree; } else { return 360 + degree; } }
注意,lon1,lon2是经度,lat1,lat2是纬度。但是百度地图的LatLon(经纬度)new 的时候应该先放纬度,再放经度。
求出角度之后我写了一个工具类,已知一个点的经纬度,还有方向,还有相对于正北方向的角度,还有用户输入的距离,就可以算出我们所需要的经纬度。工具类代码:
public class AngleUtil { /** * 求B点经纬度 * @param A 已知点的经纬度, * @param distance AB两地的距离 单位km * @param angle AB连线与正北方向的夹角(0~360) * @return B点的经纬度 */ private final static double Rc=6378137; private final static double Rj=6356725; private double m_RadLo,m_RadLa; private double Ec; private double Ed; public AngleUtil(double longitude,double latitude){ m_RadLo=longitude*Math.PI/180.; m_RadLa=latitude*Math.PI/180.; Ec=Rj+(Rc-Rj)*(90.- latitude)/90.; Ed=Ec*Math.cos(m_RadLa); } public static LatLng getMyLatLng(AngleUtil A, double distance, double angle){ double dx = distance*Math.sin(Math.toRadians(angle)); double dy= distance*Math.cos(Math.toRadians(angle)); double bjd=(dx/A.Ed+A.m_RadLo)*180./Math.PI; double bwd=(dy/A.Ec+A.m_RadLa)*180./Math.PI; return new LatLng(bwd,bjd); } }