将精确距离添加到 GPS 坐标

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)

Mar*_*cak 6

如果你有一个中心(x,y),你向前移动x axis30 米,然后再移动y axis30 米,那么你与中心的距离将不是30。

\n\n

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

\n\n

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

\n\n

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

\n\n

正如您已经所做的那样:

\n\n
double x = longitude + (180/Math.PI)*(distance/6378137)/cos(lat0);\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者

\n\n
double y = latitude + (180/Math.PI)*(distance/6378137);\n
Run Code Online (Sandbox Code Playgroud)\n\n

但不是两者都...

\n\n
\n\n

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

\n\n

通过知道您要去哪个方向,例如从 50\xc2\xb0 出发x axis

\n\n
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);\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

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

\n\n

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

\n\n

如果你应用毕达哥拉斯

\n\n
double finalDistance = Math.sqrt(Math.pow(x1, 2) + Math.pow(y1, 2)) * 6378137; \n
Run Code Online (Sandbox Code Playgroud)\n\n

你会发现 FinalDistance 是30 meters从你的初始坐标开始的。

\n\n
\n\n

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

\n