安卓(JAVA)已知两点经纬度,求出一条线上定距(比如隔20米或30一个点)的经纬度。

首先思考,已知两个经纬度,需要求出用户输入的定距来确定每一个点的经纬度,应该先确定从两个点的哪一个开始计算,这个自己定。然后需要根据两个点的经纬度来算出线的角度(相对于正北方向),最后进行计算。

既然已经有了思路,那么就一步一步来。

首先算出线的角度。我写了一个方法,可以直接照搬。

 /**
     * 已知两点经纬度求方位角
     */
    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);
    }
}

其实很简单,就两个方法,三角函数就不用说了吧,,,初中数学。。。直接也可以照搬使用。需要获取一条线上多个点的话直接循环就可以了。嗯,就这样。

猜你喜欢

转载自blog.csdn.net/haojiagou/article/details/82115917