Java 将精确距离添加到GPS坐标

Java 将精确距离添加到GPS坐标,java,coordinates,gis,Java,Coordinates,Gis,我希望能够为一些GPS坐标添加精确的距离。 我有经度和纬度,我想增加一个距离,比如说30米 我找到了下面的公式,但当我测试它时,它似乎不那么准确,因为得到的long和lat距离起始坐标37米 public static Coordinates addDistanceToCoordinates(String lat, String lon, double distance) { Double latitude = Double.valueOf(lat); Double lo

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

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

    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();
}

你的代码往北加30米,向东加30米,东北加42.4米

计算是假设地球是一个球体而不是一个椭球体,但这基本上是可以的,可以产生最大0.2%的差异。它使用最大的地球直径(赤道-赤道)而不是一些平均值,这将导致大多数时间点过于接近起点,但agian,taht可能会给出0.2%的误差

该计算假定lat/lon栅格为矩形,只要距离较短且远离北极或南极,该栅格就可以

所以,所有这些都不能解释你报告的20%的错误。这个问题一定超出了你给我们看的代码范围

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


或者,告诉您37米的工具不正确或与数据不兼容…

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

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

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

如果你只想朝一个方向移动,那么你可以简单地在你的任一轴上加/减30米

正如你已经做的那样:

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

但不是两者都有


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

通过了解您要朝向的方向,例如距离
x轴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轴和
y轴上移动相同的距离并最终离中心正好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; 
您将发现最终位置距离初始坐标
30米


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

你说的“增加距离”是什么意思?你可以在任何方向加30米,得到不同的坐标。你能更具体一点吗?非常感谢你详尽的回答。我不仅工作,而且现在也能做到:)35;吉斯努布
double finalDistance = Math.sqrt(Math.pow(x1, 2) + Math.pow(y1, 2)) * 6378137;