在 Android 中将 LatLng 偏移一定米数

Offset LatLng by some amount of meters in Android

我有一个 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 米的点[=25= 】 分开。为什么?

无法从纬度和经度获得以米为单位的精确偏移量。这会假设地球是一个完美光滑的球体,这是不正确的。

如果你想减少你的错误你应该根据你的纬度调整每度的公里数。您链接的答案估计每度 111 公里,但这会根据您的纬度(特别是经度方向)而有所不同。见 table:

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

参考:wikipedia :P

希望对您有所帮助!

您可以使用 Google 地图中的 computeOffset 方法 Android API 实用程序库 (https://developers.google.com/maps/documentation/android-api/utility/):

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

Returns the LatLng resulting from moving a distance from an origin in the specified heading (expressed in degrees clockwise from north).

Parameters:

  • from - The LatLng from which to start.
  • distance - The distance to travel.
  • heading - The heading in degrees clockwise from north.

您的情况(距离参数以米为单位):

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