Java 将精确距离添加到GPS坐标
我希望能够为一些GPS坐标添加精确的距离。 我有经度和纬度,我想增加一个距离,比如说30米 我找到了下面的公式,但当我测试它时,它似乎不那么准确,因为得到的long和lat距离起始坐标37米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
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;