Java 将双字符x、y点转换为纬度&;经度?

Java 将双字符x、y点转换为纬度&;经度?,java,gps,coordinates,trilateration,Java,Gps,Coordinates,Trilateration,您好,我目前正在尝试使用距离从2个经度/纬度点(双向迭代)计算一个经度/纬度点&我目前已经这样做了: double EARTH_RADIUS = 6378137.0; double longitude1 = 4.062787; double latitude1 = 49.243828; double x1 = EARTH_RADIUS * (Math.cos(Math.toRadians(latitude1)) * Math.cos(Math.toRadians

您好,我目前正在尝试使用距离从2个经度/纬度点(双向迭代)计算一个经度/纬度点&我目前已经这样做了:

    double EARTH_RADIUS = 6378137.0;

    double longitude1 = 4.062787;
    double latitude1 = 49.243828;
    double x1 = EARTH_RADIUS * (Math.cos(Math.toRadians(latitude1)) * Math.cos(Math.toRadians(longitude1)));
    double y1 = EARTH_RADIUS *(Math.cos(Math.toRadians(latitude1)) * Math.sin(Math.toRadians(longitude1)));

    double longitude2 = 4.062023;
    double latitude2 = 49.243851;
    double x2 = EARTH_RADIUS * (Math.cos(Math.toRadians(latitude2)) * Math.cos(Math.toRadians(longitude2)));
    double y2 = EARTH_RADIUS *(Math.cos(Math.toRadians(latitude2)) * Math.sin(Math.toRadians(longitude2)));

    System.out.println(x1 + " " + y1);
    System.out.println(x2 + " " + y2);

    double[][] positions = new double[][] { { x1, y1 }, { x2, y2 } };
    double[] distances = new double[] { 10.0, 10.0};

    NonLinearLeastSquaresSolver solver = new NonLinearLeastSquaresSolver(new TrilaterationFunction(positions, distances), new LevenbergMarquardtOptimizer());
    Optimum optimum = solver.solve();

    double[] centroid = optimum.getPoint().toArray();
    System.out.println(Arrays.toString(centroid));
private static final double EARTH_RADIUS = 6371; 

private static final int X = 0;
private static final int Y = 1;
private static final int Z = 2;

public static double[] triangulation(double lat0, double lon0, double r0, double lat1, double lon1, double r1) {
    double[] p1 = latlon2cartesian(lat0, lon0);
    double[] p2 = latlon2cartesian(lat1, lon1);

    double[][] positions = new double[][] { { p1[X], p1[Y], p1[Z] }, { p2[X], p2[Y], p2[Z] } };
    double[] distances = new double[] { r0, r1};

    NonLinearLeastSquaresSolver solver = new NonLinearLeastSquaresSolver(new TrilaterationFunction(positions, distances), new LevenbergMarquardtOptimizer());
    Optimum optimum = solver.solve();

    double[] centroid = optimum.getPoint().toArray();
    System.out.println(Arrays.toString(p1));
    System.out.println(Arrays.toString(p2));
    System.out.println(Arrays.toString(centroid));
    return cartesian2latlon(centroid[X], centroid[Y], centroid[Z]);
}

private static double[] latlon2cartesian(double lat, double lon) {
    lat = Math.toRadians(lat);
    lon = Math.toRadians(lon);
    return new double[] { Math.cos(lon) * Math.cos(lat) * EARTH_RADIUS, Math.sin(lon) * Math.cos(lat) * EARTH_RADIUS, Math.sin(lat) * EARTH_RADIUS };
}

private static double[] cartesian2latlon(double x, double y, double z) {
    return new double[] { Math.toDegrees(Math.asin(z / EARTH_RADIUS)), Math.toDegrees(Math.atan2(y, x)) };
}
我用这个库来测量我的点

将经度和纬度点转换为笛卡尔平面图&使用库获取其上的点,提供以下输出:

[INFO] GCLOUD: 4153447.729890433 295011.4801210027
[INFO] GCLOUD: 4153449.72871882 294955.95932889543
[INFO] GCLOUD: [4153448.7293046266, 294983.7197249491]
所以现在我试图把这个点转换成经纬度点,放在谷歌地图上,但我不知道怎么做&如果已经有一个Java库用于双向迭代的话

编辑:

所以我做到了:

    double EARTH_RADIUS = 6378137.0;

    double longitude1 = 4.062787;
    double latitude1 = 49.243828;
    double x1 = EARTH_RADIUS * (Math.cos(Math.toRadians(latitude1)) * Math.cos(Math.toRadians(longitude1)));
    double y1 = EARTH_RADIUS *(Math.cos(Math.toRadians(latitude1)) * Math.sin(Math.toRadians(longitude1)));

    double longitude2 = 4.062023;
    double latitude2 = 49.243851;
    double x2 = EARTH_RADIUS * (Math.cos(Math.toRadians(latitude2)) * Math.cos(Math.toRadians(longitude2)));
    double y2 = EARTH_RADIUS *(Math.cos(Math.toRadians(latitude2)) * Math.sin(Math.toRadians(longitude2)));

    System.out.println(x1 + " " + y1);
    System.out.println(x2 + " " + y2);

    double[][] positions = new double[][] { { x1, y1 }, { x2, y2 } };
    double[] distances = new double[] { 10.0, 10.0};

    NonLinearLeastSquaresSolver solver = new NonLinearLeastSquaresSolver(new TrilaterationFunction(positions, distances), new LevenbergMarquardtOptimizer());
    Optimum optimum = solver.solve();

    double[] centroid = optimum.getPoint().toArray();
    System.out.println(Arrays.toString(centroid));
private static final double EARTH_RADIUS = 6371; 

private static final int X = 0;
private static final int Y = 1;
private static final int Z = 2;

public static double[] triangulation(double lat0, double lon0, double r0, double lat1, double lon1, double r1) {
    double[] p1 = latlon2cartesian(lat0, lon0);
    double[] p2 = latlon2cartesian(lat1, lon1);

    double[][] positions = new double[][] { { p1[X], p1[Y], p1[Z] }, { p2[X], p2[Y], p2[Z] } };
    double[] distances = new double[] { r0, r1};

    NonLinearLeastSquaresSolver solver = new NonLinearLeastSquaresSolver(new TrilaterationFunction(positions, distances), new LevenbergMarquardtOptimizer());
    Optimum optimum = solver.solve();

    double[] centroid = optimum.getPoint().toArray();
    System.out.println(Arrays.toString(p1));
    System.out.println(Arrays.toString(p2));
    System.out.println(Arrays.toString(centroid));
    return cartesian2latlon(centroid[X], centroid[Y], centroid[Z]);
}

private static double[] latlon2cartesian(double lat, double lon) {
    lat = Math.toRadians(lat);
    lon = Math.toRadians(lon);
    return new double[] { Math.cos(lon) * Math.cos(lat) * EARTH_RADIUS, Math.sin(lon) * Math.cos(lat) * EARTH_RADIUS, Math.sin(lat) * EARTH_RADIUS };
}

private static double[] cartesian2latlon(double x, double y, double z) {
    return new double[] { Math.toDegrees(Math.asin(z / EARTH_RADIUS)), Math.toDegrees(Math.atan2(y, x)) };
}
但我无法通过以下方式获得正确的值:

System.out.println(Arrays.toString(Bilateration.triangulation(49.243828, 4.062787, 5.0, 49.243851, 4.062023, 6.5)));
我得到:

[49.2453096100026, 3.9213007384886387]

接近(2公里远),但点应该在49.24385234064716,4.062335368930235左右。

您不是已经长到笛卡尔坐标+lat了吗?如果是这样的话,你就不能扭转这个过程吗?是的,但我不知道怎么做。此外,我想知道是否有一个库可以直接执行此操作?使用函数进行后期编辑。您是否尝试使用
latlon2cartesian()
返回的坐标调用
cartesian2latlon()
,以检查两种方法的结果,而不进行质心计算?还要注意,在
latlon2cartesian()
中,您正在调用
Math.toRadians()
,但不要在
cartesian2latlon()
中调用
Math.toDegrees()
,因此您得到的结果仍然是弧度。您的
cartesian2latlon()
似乎是错误的。使用
Math.toDegrees()
将值转换回度数,并查看daphshez在此处的答案:(投票最多的那一个)您不是已经长+纬度到笛卡尔坐标了吗?如果是这样的话,你就不能扭转这个过程吗?是的,但我不知道怎么做。此外,我想知道是否有一个库可以直接执行此操作?使用函数进行后期编辑。您是否尝试使用
latlon2cartesian()
返回的坐标调用
cartesian2latlon()
,以检查两种方法的结果,而不进行质心计算?还要注意,在
latlon2cartesian()
中,您正在调用
Math.toRadians()
,但不要在
cartesian2latlon()
中调用
Math.toDegrees()
,因此您得到的结果仍然是弧度。您的
cartesian2latlon()
似乎是错误的。使用
Math.toDegrees()
将值转换回度数,并在此处查看daphshez的答案:(投票最多的一个)