已知A,B点,和C点,让C点在AB线段上移动

public static LatLong getBreakPoint_unit(LatLong wgsLatLng_first, LatLong wgsLatLng_last, LatLong break_point, double distance) {
    double A_lat = wgsLatLng_first.getLatitude();//获取A点纬度
    double A_lng = wgsLatLng_first.getLongitude();//获取A点经度
    double B_lat = wgsLatLng_last.getLatitude();//获取B点纬度
    double B_lng = wgsLatLng_last.getLongitude();//获取B点经度
    double C_lat = break_point.getLatitude();//获取C点纬度
    double C_lng = break_point.getLongitude();//获取C点经度

    double yA = MercatorProjection.latitudeToY(A_lat);//将A点纬度转化为平面坐标yA
    double xA = MercatorProjection.longitudeToX(A_lng);//将A点经度转化为平面坐标xA

    double yB = MercatorProjection.latitudeToY(B_lat);//将B点纬度转化为平面坐标yB
    double xB = MercatorProjection.longitudeToX(B_lng);//将B点经度转化为平面坐标xB
    double yC = MercatorProjection.latitudeToY(C_lat);//将C点纬度转化为平面坐标yC
    double xC = MercatorProjection.longitudeToX(C_lng);//将C点经度转化为平面坐标xC
    ArrayList<LatLong> latLongs = new ArrayList<>();
    latLongs.add(wgsLatLng_first);
    latLongs.add(wgsLatLng_last);
    double dis = IMapUtils.calculateLineDistance(wgsLatLng_first, wgsLatLng_last);//求出AB点的距离
    double breakpoint_distance = MercatorProjection.getMercatorDistance(latLongs, dis);//将距离米换算成平面距离
    double v = distance * (breakpoint_distance / dis);//求出单位距离

    Vector2D breakpoint_vector = new Vector2D(xB - xA, yB - yA);//求出AB向量
    Vector2D normalize = breakpoint_vector.normalize();//unit vector,求出AB单位向量
    Vector2D vector2D = normalize.multiply(1).multiply(v);//获取沿着AB平移的向量
    Vector2D c_point_vector = new Vector2D(xC, yC);//获取OC向量
    Vector2D destination_vector = c_point_vector.add(vector2D);//获取平移后的OC'向量
    double longitude = MercatorProjection.xToLongitude(destination_vector.x);//求出C'的经度
    double latitude = MercatorProjection.yToLatitude(destination_vector.y);//求出C'的纬度
    LatLong latLong = new LatLong(latitude, longitude);
    double dis_1 = IMapUtils.calculateLineDistance(wgsLatLng_first, latLong);
    double dis_2 = IMapUtils.calculateLineDistance(latLong, wgsLatLng_last);
    if (dis_1>dis||dis_2>dis){
        return null;//判断是否超出边界
    }
    return latLong;
}
发布了17 篇原创文章 · 获赞 3 · 访问量 5365

猜你喜欢

转载自blog.csdn.net/qq_29342787/article/details/103066627