在Android中偏移LatLng一定量的米

时间:2015-04-06 19:45:49

标签: java android coordinates latitude-longitude coordinate-transformation

我有一个LatLng物体,我想把它的坐标移到东边500米处。我找不到内置的方法。我见过https://gis.stackexchange.com/a/2964,但实际上我的结果太不准确(约15%)。如何以米为单位精确移动?

注意:我正在寻找转移谷歌地图相机,我知道如何做到这一点。

我试过了:

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 个答案:

答案 0 :(得分:11)

您可以使用Google Maps Android API工具库(https://developers.google.com/maps/documentation/android-api/utility/)中的computeOffset方法:

  

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

     

返回从指定标题中的原点移动距离得到的LatLng(以北方向顺时针方向表示)。

     

参数:

     
      
  • from - 从中​​开始的LatLng。
  •   
  • 距离 - 旅行距离。
  •   
  • heading - 从北方顺时针方向的航向。
  •   

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

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

答案 1 :(得分:2)

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

如果您想减少您的错误,您应该根据您的自由度调整每度数的公里数。您链接的答案估计每度111km,但这取决于您的纬度(特别是在经度方向)。见表:

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

我希望这有帮助!