在Android中将LatLng坐标偏移一定的米数

8
我有一个LatLng对象,我想将它的坐标向东移动500米。我找不到内置的方法来实现这一点。我看过https://gis.stackexchange.com/a/2964,但我的结果太不准确(约15%)无法实际使用。如何进行精确的移位?
注意:我不是在寻找如何移动Google地图相机,我知道如何做到这一点。
我尝试过:
static final double KILOMETERS_PER_DEGREE = 111.111;

static LatLng offsetLongitude(LatLng initialCoords, float horizontalOffsetInMeters){
    double degreeOffset = 1.0 / KILOMETERS_PER_DEGREE * horizontalOffsetInMeters / 1000.0;
    double longitudeOffset = Math.cos(initialCoords.latitude * Math.PI / 180.0) * degreeOffset;
    return new LatLng(initialCoords.latitude, initialCoords.longitude + longitudeOffset);
}

public static LatLngBounds boundsForSpanWidth(LatLng midpoint, float targetSpanWidth){
    LatLng east = offsetLongitude(midpoint, -targetSpanWidth);
    LatLng west = offsetLongitude(midpoint, targetSpanWidth);
    LatLngBounds newBounds = new LatLngBounds(west, east);
    return newBounds;
}

然而,当我使用一个距离极点较远的点(大约 5000 米)调用它时,我得到了两个相隔 6170 米 左右的点。为什么?

2个回答

21
你可以使用Google Maps Android API Utility Library中的computeOffset方法(https://developers.google.com/maps/documentation/android-api/utility/):

public static LatLng computeOffset(LatLng from, double distance, double heading)

返回从指定方向(以顺时针方向的度数表示)移动一定距离后得到的LatLng。

参数:

  • from - 起始点的LatLng。
  • distance - 需要移动的距离,单位为米。
  • heading - 方向,以顺时针方向的度数表示。
在你的情况下(distance参数以米为单位)。
LatLng east = SphericalUtil.computeOffset(midpoint, 500, 90); // Shift 500 meters to the east
LatLng west = SphericalUtil.computeOffset(midpoint, 500, 270); // Shift 500 meters to the west

库已经正常工作了。我不知道为什么我的代码之前不能运行,但是无论如何,问题已经解决了。 - Can Poyrazoğlu

2

从纬度和经度无法精确得出距离偏移量(以米为单位)。这将假设地球是一个完美而光滑的球体,但事实并非如此。

如果您想要减少误差,您应该根据您的纬度调整每度对应的公里数。您提供的答案估计每度111公里,但这取决于您的纬度(特别是在经度方向上)。请参见下表:

Lat    1°Lat≃       1°Lon≃
0°   110.574 km   111.320 km
15°  110.649 km   107.550 km
30°  110.852 km   96.486 km
45°  111.132 km   78.847 km
60°  111.412 km   55.800 km
75°  111.618 km   28.902 km
90°  111.694 km   0.000 km

参考:维基百科 :P

希望这可以帮到您!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接