Hom*_*ker 3 java gis coordinates
我希望能够为某些 GPS 坐标添加精确距离。我有一个经度和一个纬度,我想添加一个距离,比如说 30 米。
我找到了下面的公式,但是当我测试它时,它似乎不太准确,因为所得的经度和纬度距离起始坐标为 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();
}
Run Code Online (Sandbox Code Playgroud)
如果你有一个中心(x,y),你向前移动x axis30 米,然后再移动y axis30 米,那么你与中心的距离将不是30。
这将是Math.sqrt( Math.pow(x, 2) + Math.pow(y, 2) );。
具体来说,距中心(或您的初始坐标)30 米的距离有无数个点。
\n\n如果您只想朝一个方向移动,则只需在任一轴上加/减 30 米即可。
\n\n正如您已经所做的那样:
\n\ndouble x = longitude + (180/Math.PI)*(distance/6378137)/cos(lat0);\nRun Code Online (Sandbox Code Playgroud)\n\n或者
\n\ndouble y = latitude + (180/Math.PI)*(distance/6378137);\nRun Code Online (Sandbox Code Playgroud)\n\n但不是两者都...
\n\n在计算中使用角度仍然会更好,当您在两个轴上移动时,这会变得很方便。
\n\n通过知道您要去哪个方向,例如从 50\xc2\xb0 出发x axis,
double a = Math.toRadians(50); // degrees\n\ndouble x = longitude + (180/Math.PI) * (30 / 6378137)/cos(lat0) * Math.cos(a);\ndouble y = latitude + (180/Math.PI) * (30 / 6378137) * Math.sin(a);\nRun Code Online (Sandbox Code Playgroud)\n\n回到你的问题,如果你想在 和 上移动x axis相同y axis的距离并最终距离中心正好 30 米,那么你的角度将为double a = Math.toRadians(45); (如果你向东北方向移动) *
事实上,您将获得(30 / 6378137) * Math.cos(a)和(30 / 6378137) * Math.sin(a)的结果x1 = y1 = 3.325924707417923e-06。
如果你应用毕达哥拉斯
\n\ndouble finalDistance = Math.sqrt(Math.pow(x1, 2) + Math.pow(y1, 2)) * 6378137; \nRun Code Online (Sandbox Code Playgroud)\n\n你会发现 FinalDistance 是30 meters从你的初始坐标开始的。
*\n正确的计算是Math.toRadians(45 * (2 * n - 1)); | where n = [1, 2, 3, 4]