5

我有一個LatLng對象,我想將它的座標向東移動500米。我無法找到一個內置的方法。我看過https://gis.stackexchange.com/a/2964,但是我的結果實際上太不準確(約15%)。我怎樣才能做出米的精確轉變?在Android中偏移LatLng一定數量的米

注:我是不是尋找轉移谷歌地圖相機,我知道該怎麼做。

我已經試過:

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米分開。爲什麼?

回答

9

您可以使用從谷歌地圖Android的API實用程序庫中的computeOffset方法(https://developers.google.com/maps/documentation/android-api/utility/):

公共靜態經緯度computeOffset

返回(從雙距離,機車重聯的LatLng)從指定標題中的原點移動一段距離(從北方順時針以度數表示)導致的LatLng。

參數:

  • 從 - 位置的經緯度從哪個開始。
  • 距離 - 旅行距離。
  • 標題 - 從北向順時針方向的標題。

在你的情況(距離參數以米爲單位):

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 
+0

圖書館工作。我想知道爲什麼我的代碼不工作,但無論如何,問題解決了。 –

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 

編號:wikipedia :P

我希望這有助於!