java实现任意两个坐标系转换

这里需要两个坐标系的对应两个点

首先是实体类:


@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class Point {

    private double x;
    private double y;
    private double z;

}

计算工具类:

@Component
@NoArgsConstructor
@Slf4j
public class transUtil {

    /**
     * 获取两点连线与y轴夹角
     *
     * @param p1 点1
     * @param p2 点2
     * @return 与y轴夹角(角度)
     */
    public  double getAngle(Point p1, Point p2) {
        double angle = Math.atan2(p2.getX() - p1.getX(), p2.getY() - p1.getY());
        return angle * (180 / Math.PI);
    }

    /**
     * 获取缩放比例
     *
     * @param p1 源点1
     * @param b1 目标点1
     * @param p2 源点2
     * @param b2 目标点2
     * @return 缩放比例
     */
    public double getScale(Point p1, Point b1, Point p2, Point b2) {
        return getLength(b1, b2) / getLength(p1, p2);
    }

    /**
     * 获取两点之间连线的长度
     *
     * @param p1 点1
     * @param p2 点2
     * @return 长度
     */
    public static double getLength(Point p1, Point p2) {
        return Math.sqrt(Math.pow(p2.getX() - p1.getX(), 2) + Math.pow(p2.getY() - p1.getY(), 2));
    }

    /**
     * X方向偏移距离参数
     *
     * @param p1       源点1
     * @param b1       目标点1
     * @param rotation 旋转角度
     * @param scale    缩放比例
     * @return X方向偏移
     */
    public double getXTranslation(Point p1, Point b1, double rotation, double scale) {
        return (b1.getX() - scale * (p1.getX() * Math.cos(rotation) - p1.getY() * Math.sin(rotation)));
    }

    /**
     * Y方向偏移距离参数
     *
     * @param p1       源点1
     * @param b1       目标点1
     * @param rotation 旋转角度
     * @param scale    缩放比例
     * @return Y方向偏移
     */
    public double getYTranslation(Point p1, Point b1, double rotation, double scale) {
        return (b1.getY() - scale * (p1.getX() * Math.sin(rotation) + p1.getY() * Math.cos(rotation)));
    }

    /**
     * 转换操作
     *
     * @param gp       源点
     * @param rotation 旋转角度
     * @param scale    缩放比例
     * @param dx       X方向偏移
     * @param dy       Y方向偏移
     * @return 目标点
     */
    public Point transformBoePoint(Point gp, double rotation, double scale, double dx, double dy) {
        double A = scale * Math.cos(rotation);
        double B = scale * Math.sin(rotation);
        return new Point(retain6(A * gp.getX() - B * gp.getY() + dx), retain6(B * gp.getX() + A * gp.getY() + dy), 0.0);
    }



    /**
     * 保留小数点后六位
     *
     * @param num
     * @return
     */
    public static double retain6(double num) {
        String result = String.format("%.6f", num);
        return Double.valueOf(result);
    }

}

这里用到了lombok的相关,可以去除自行写相关方法

使用:四个点分别是 

Point1 Point2(原坐标系两个点) newPoint1 newPoint2(新坐标系对应的两个点) 分别对应Point1 -> newPoint1  Point2 -> newPoint2 

//初始化4点
double rotation = Math.toRadians(Math.abs(transUtil .getAngle(Point1 , Point2 ) - transUtil .getAngle(newPoint1 , newPoint2 )));
//获取到转化后的坐标
double scale = transUtil .getScale(newPoint1 , Point1 , newPoint2 , Point2 );
double tx = transUtil .getXTranslation(newPoint1 , Point1 , rotation, scale);
double ty = transUtil .getYTranslation(newPoint1 , Point1 , rotation, scale);
//需要转换的坐标 x,y,z
Point transPoint = new Point(o.getX(), o.getZ(), 0.0);
Point resultPoint = coordinateUtil.transformBoePoint(new Point(o.getX(), o.getZ(), 0.0), rotation, scale, tx, ty);

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
要将BD09坐标系转换为2000坐标系,我们可以借助百度地图提供的Java API来完成这个任务。 首先,我们需要通过百度地图API获取到BD09坐标系下的经纬度数据。假设我们已经获取到了BD09的经度为lng和纬度为lat。 接下来,我们可以使用百度地图API提供的CoordinateConverter类来进行坐标转换。以下是详细的代码实现: ``` // 导入百度地图API的相关类 import com.baidu.mapapi.model.LatLng; import com.baidu.mapapi.utils.CoordinateConverter; public class CoordinateConversion { public static void main(String[] args) { // 假设我们已经获取到了BD09坐标系下的经度和纬度 double lng = 116.404; double lat = 39.915; // 将BD09坐标系下的经纬度转换为百度墨卡托坐标系下的经纬度 LatLng sourceLatLng = new LatLng(lat, lng); CoordinateConverter converter = new CoordinateConverter(); converter.from(CoordinateConverter.CoordType.COMMON); converter.coord(sourceLatLng); LatLng targetLatLng = converter.convert(); // 将墨卡托坐标系下的经纬度转换为2000坐标系下的经纬度 LatLng source2000LatLng = LatLngConverter.gcj02ToWGS84(targetLatLng); // 打印输出转换完成后的2000坐标系下的经纬度 System.out.println("转换后的2000坐标系下的经度:" + source2000LatLng.longitude); System.out.println("转换后的2000坐标系下的纬度:" + source2000LatLng.latitude); } } ``` 在这段代码中,我们首先创建了一个LatLng对象sourceLatLng,该对象表示BD09坐标系下的经纬度。然后,我们创建了一个CoordinateConverter对象converter,并且将其坐标类型设置为COMMON(表示BD09坐标系)。接着,我们通过调用converter.coord(sourceLatLng)方法来设置要进行转换的坐标。之后,我们调用converter.convert()方法来进行坐标转换,从而得到百度墨卡托坐标系下的经纬度targetLatLng。最后,我们使用LatLngConverter类的gcj02ToWGS84方法将墨卡托坐标系下的经纬度转换为2000坐标系下的经纬度source2000LatLng。 至此,我们完成了将BD09坐标系转换为2000坐标系的过程。你可以根据自己的实际需求进行相关的逻辑修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值