【问题标题】:Add exact distance to GPS coordinates将精确距离添加到 GPS 坐标
【发布时间】:2017-11-30 10:33:29
【问题描述】:

我希望能够为某些 GPS 坐标添加精确距离。 我有一个经度和一个纬度,我想添加一个距离,比如说 30 米。

我找到了下面的公式,但是当我测试它时,它似乎并不那么准确,因为得到的 long 和 lat 距离开始坐标 37m。

public static Coordinates addDistanceToCoordinates(String lat, String lon, double distance) {
    Double latitude = Double.valueOf(lat);
    Double longitude = Double.valueOf(lon);

    double lat0 = cos(Math.PI / 180.0 * latitude);

    double x = longitude + (180/Math.PI)*(distance/6378137)/cos(lat0);
    double y = latitude + (180/Math.PI)*(distance/6378137);

    return Coordinates.builder().lon(x).lat(y).build();
}

【问题讨论】:

  • “增加距离”是什么意思?您可以在任何方向添加 30m 并获得不同的坐标。你能说得具体点吗?

标签: java coordinates gis


【解决方案1】:

如果您有一个中心 (x,y),并且您在 x axis 上移动 30 米,在 y axis 上再移动 30 米,那么您与中心的距离不会是 30。

它将是Math.sqrt( Math.pow(x, 2) + Math.pow(y, 2) );

具体来说,距离中心(或您的初始坐标)30 米的点有无限个。

如果您想只向一个方向移动,那么您只需在任一轴上加/减 30 米即可。

正如你已经做过的那样:

double x = longitude + (180/Math.PI)*(distance/6378137)/cos(lat0);

double y = latitude + (180/Math.PI)*(distance/6378137);

但不是两者都...


在计算中使用角度仍然会更好,当您在两个轴上移动时会很方便。

通过了解您的前进方向,例如与x axis 成 50°,

double a = Math.toRadians(50);  // degrees

double x = longitude + (180/Math.PI) * (30 / 6378137)/cos(lat0) * Math.cos(a);
double y = latitude + (180/Math.PI) * (30 / 6378137) * Math.sin(a);

回到你的问题,如果你想在x axisy axis 上移动相同的距离并最终离开中心正好 30 米,那么你的角度将是double a = Math.toRadians(45); (如果你前往东北) *

事实上,您将获得(30 / 6378137) * Math.cos(a)(30 / 6378137) * Math.sin(a) 的结果x1 = y1 = 3.325924707417923e-06

如果你然后应用毕达哥拉斯

double finalDistance = Math.sqrt(Math.pow(x1, 2) + Math.pow(y1, 2)) * 6378137; 

你会发现 finalDistance 从你的初始坐标是30 meters


* 正确的计算应该是Math.toRadians(45 * (2 * n - 1)); | where n = [1, 2, 3, 4]

【讨论】:

  • 非常感谢您的详尽回答。我不仅工作,而且现在也得到了 :) #gisnoob
【解决方案2】:

您的代码向北增加 30 米,向东增加 30 米,结果是向东北增加 42.4 米。

计算假设地球是一个球体而不是一个椭球体,但这基本上没问题,可以产生最大值。 0.2%。它使用最大的地球直径(赤道 - 赤道)而不是某个平均值,这会导致点在大多数情况下都离起点太近,但通常会产生 0.2% 的误差。

计算假设纬度/经度网格是矩形的,只要距离很短并且远离北极或南极,就可以了。

因此,所有这些都不能解释您报告的 20% 错误。问题必须在您向我们展示的代码之外。

剩下的最可疑的方面是字符串转换。纬度/经度值至少需要 5 位小数才能获得 1 米的分辨率。

或者,可能告诉您有关 37 米的工具不正确或与数据不兼容...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多