2012-09-12 42 views
11

我想在用戶改變方向時旋轉地圖視圖,例如,如果用戶需要左轉和右轉,它應該相應地旋轉。我是基於當前位置的旋轉地圖視圖被正確地旋轉,但它是jittering.Here是我用於旋轉如何在地圖視圖中順利地旋轉地圖視圖android

public void onGPSUpdate(Location location) 
{ 
    boolean check=isBetterLocation(location, tempLoc); 
    tempLoc=location; 

    if(check){ 
     showLocation(location); 

    } 

} 
isBetterLocation method is copied from google docs for better location. 

private void showLocation(Location loc){ 
    mRotateView.rotate(-loc.getBearing());    
    } 

予登記的時間間隔0和最小距離的10頻繁updates.Here一個位置更新的代碼我的問題是地圖視圖被引起的顫動總是,任何人都可以告訴我如何像其他應用程序一樣順利地旋轉地圖視圖,如糯地圖。感謝...

+0

你需要澄清一下,如果問題是你從gps跳來跳去的方位。或者實際旋轉到Konrad正在談論的新軸承。 – Ifor

+0

@lfor是的,你糾正了我所得到的方向是跳來跳去。你對此有任何想法。 – dharan

+0

我知道你越快走得越好。你需要對你得到的值進行某種過濾。 – Ifor

回答

4

ar e您是否試圖以平滑的方式旋轉地圖,例如一次一度地旋轉地圖,或者只是在位置更新時將地圖從度A轉到度B?

喜歡的東西

while (oldAngle != newAngle) 
{ 
mapView.rotate(newAngle); 
// this is where you would decied to add or subtract; 
newAngle ++ or -- ; 
} 

不知道這是否會工作完全作爲循環將運行真的很快所以也許做到這一點作爲的AsyncTask,並在那裏加入暫停來模擬轉動平穩。

Double angle = Math.atan2((userstartPoint.getX() - userendPoint.getX()), userstartPoint.getY() - userendPoint.getY()); 
      angle = Math.toDegrees(angle); 
      map.setRotationAngle(angle); 

所以基本上我得到的起點(新址),然後結束點(原來的位置),並做它Math.atan2,你可以看到。然後將其轉換爲一定程度並將其設置爲我的地圖旋轉。 現在它沒有做一個平穩的旋轉,但我不需要。在這裏你可以設置你自己的步進平穩旋轉。除非谷歌地圖已經有一個。

+0

我必須旋轉它,如果用戶改變他的旅行方向,例如,如果他需要左轉它應該向左旋轉。 – dharan

+0

你可以嘗試做的是獲取舊的map.angle,然後獲取新的標題,並通過循環運行,該循環每次減去或添加到新的標題1度,然後將每次設置爲地圖。迴轉。 –

+0

@Konard謝謝你的想法,我試過這個,但是它不能正常工作,因爲如果我們試圖根據標題進行旋轉,如果用戶設備指向不同的標題,那麼它的旋轉不準確。 – dharan

2

由於位置的方位值不是非常精確,並且往往略有跳動,所以應該使用軸承的過濾器。例如,將最後5個方位值保留在數組中,並使用這些值的平均值作爲方位旋轉地圖。或者使用SensorEvent docs中說明的過濾器 - 它更易於使用,並且可以更好地調整。

這將平滑地圖resp的旋轉。保持它更穩定。

編輯:

一個版本的低通濾波器:

public static float exponentialSmoothing(float input, float output, float alpha) { 
    output = output + alpha * (input - output); 
    return output; 
} 

使用它像這樣:

final static float ALPHA = 0.33; // values between 0 and 1 
float bearing; 

// on location/bearing changed: 

bearing = exponentialSmoothing(bearing, newBearing, ALPHA); 

bearing將要使用的值實際旋轉地圖,newBearing將是您從每個事件中獲得的方位,並且您可以使用ALPHA通過加權多少舊的和新的軸承被考慮在結果中,旋轉有多快或多慢地轉動到一個新的方向。一個較小的價值會使舊價值更高,高價值會使新價值更高。

我希望能更好地工作。

+0

感謝您的想法,我嘗試了平均軸承,但旋轉不正確,我也檢查平均值是否大於或等於360,並且我將其設置爲360。 – dharan

+0

是的,這裏有一些微妙之處,因爲方位在北方和北方跳轉。 0/360度 - 嘗試執行低通濾波器,將其添加到我的答案中。 – Ridcully

1

要更改地圖的方位,請使用Camera類。您可以使用新軸承定義一個新的CameraPosition,並告訴相機如果您想平穩移動,可以使用GoogleMap.moveCameraGoogleMap.animateCamera移動。

0

我已經在我的應用程序中實現了這一點。我主要做的是,我把我的路徑的最後和倒數第二個經緯度,並通過使用

public static float getRotationAngle(LatLng secondLastLatLng, LatLng lastLatLng) 
{ 
    double x1 = secondLastLatLng.latitude; 
    double y1 = secondLastLatLng.longitude; 
    double x2 = lastLatLng.latitude; 
    double y2 = lastLatLng.longitude; 

    float xDiff = (float) (x2 - x1); 
    float yDiff = (float) (y2 - y1); 

    return (float) (Math.atan2(yDiff, xDiff) * 180.0/Math.PI); 

} 

設置這個角度軸承攝像機位置計算軸承。

注意:有時(很少)它會將地圖旋轉到相反的方向。我正在尋找它,但如果有人有理由做答覆。