首先思考,已知两个经纬度,需要求出用户输入的定距来确定每一个点的经纬度,应该先确定从两个点的哪一个开始计算,这个自己定。然后需要根据两个点的经纬度来算出线的角度(相对于正北方向),最后进行计算。
既然已经有了思路,那么就一步一步来。
首先算出线的角度。我写了一个方法,可以直接照搬。
/**
* 已知两点经纬度求方位角
*/
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);
}
}
其实很简单,就两个方法,三角函数就不用说了吧,,,初中数学。。。直接也可以照搬使用。需要获取一条线上多个点的话直接循环就可以了。嗯,就这样。