2013-07-28 62 views
4

Im對CameraUpdateFactory.newLatLngBounds()的moveCamera和animateCamera的準確性有一些懷疑。我將創建和發送的LatLngBounds對象作爲參數moveCamera/animateCamera(CameraUpdateFactory.newLatLngBounds())進行比較,以地圖 .getProjection()。getVisibleRegion()。onCameraChange()事件中的latLngBounds甚至GoogleMap.CancelableCallback#onFinish ()。 它們不匹配。 有人遇到過這個問題嗎?這是一個錯誤?谷歌地圖moveCamera或animateCamera根據LatLngBounds是不準確的

我的代碼是:

final LatLngBounds boundingBox = MapUtils.getBoundingBox(mCurrLocation.getLatitude(), mCurrLocation.getLongitude(), mCurrRadius); 

try { 
    if (animate) { 
     map.animateCamera(CameraUpdateFactory.newLatLngBounds(boundingBox, 0), 
      new GoogleMap.CancelableCallback() { 
       @Override 
       public void onFinish() { 
        if (!boundingBox.equals(map.getProjection().getVisibleRegion().latLngBounds)) { 
          map.moveCamera(CameraUpdateFactory.newLatLngBounds(boundingBox, 0)); 
         } 
        } 

        @Override 
        public void onCancel() { 
        } 
       }); 
    } else { 
     map.moveCamera(CameraUpdateFactory.newLatLngBounds(boundingBox, 0)); 
    } 
} 

請忽略IM的方式在這裏(等於)比較兩個對象。我還調試代碼和檢查的2個對象,發現它們不匹配 -

moveCamera:

boundingBox的 -

的LatLngBounds {西南=緯度/經度:(32.08455383290544 ,34.773394063736845),東北=緯度/經度:(32.09730731777191,34.788375176773286)}

map.getProjection()getVisibleRegion()的LatLngBounds -

的LatLngBounds。{西南=緯度/經度:(32.084496299473756,34.77339383214712),東北=緯度/經度:(32.09736452396455,34.78837497532368)}

animateCamera:

boundingBox的 -

的LatLngBounds {西南=緯度/經度:(40.70798493778415,-74.01434069136418),東北=緯度/經度:(40.72072004852845,-73.99760391411343)}

map.getProjection()getVisibleRegion()的LatLngBounds - 。

的LatLngBounds {西南=緯度/經度:(40.70798500292429,-74.01539381593466),東北=緯度/經度:(40.72071968970514,-73.99655096232891)}

+0

我知道這是一箇舊的線程,但我有同樣的問題,仍然沒有解決方案可用於此錯誤。我已經在十幾款不同的手機上測試過它,而這隻發生在三星GT-I9500上。 –

回答

0

這看起來像是bug && !bug的組合。

對於一個錯誤的描述,請參閱本:http://code.google.com/p/gmaps-api-issues/issues/detail?id=5353

基本上你將在第五或第六小數位的差異。

另一個問題是,當您將LatLngBounds發送到其中一個函數時,生成的LatLngBounds將是新的,它完全適合屏幕,並且您的原稿將位於其中。

+0

謝謝。我想即時計算邊界框假設地圖是一個正方形。並不是真的。 – AsafK

+0

我以前的回答錯了。我正在計算正確的邊界框。看到我的額外答案。 – AsafK

0

animateCamera和LatLngBounds存在一個錯誤。該方法不能準確地將相機移動到預期的方框。我怎麼知道的?我驗證了通過添加以下代碼:

private LatLngBounds mBoundingBox; 
private boolean mCameraAnimated; 

public void setCurrentLocation(Location currentLocation, String radius, boolean animate) { 
    mCurrLocation = currentLocation; 
    mCurrRadius = MapUtils.getRadiusDecimalValue(radius); 
    mBoundingBox = MapUtils.getBoundingBox(mCurrLocation.getLatitude(), mCurrLocation.getLongitude(), mCurrRadius); 
    mCameraAnimated = animate; 

    if (animate) { 
      mEventMap.animateCamera(CameraUpdateFactory.newLatLngBounds(mBoundingBox, 0)); 
    } else { 
      mEventMap.moveCamera(CameraUpdateFactory.newLatLngBounds(mBoundingBox, 0)); 
    } 
} 

@Override 
public void onCameraChange(CameraPosition cameraPosition) { 
    // This ugly solution was added because there is a bug with camera animate which doesn't move to the correct bounding box. 
    if (mBoundingBox != null && !mBoundingBox.equals(mEventMap.getProjection().getVisibleRegion().latLngBounds)) { 
     LatLngBounds originalBoundingBox = mBoundingBox; 
     mBoundingBox = null; 
     if (mCameraAnimated) { 
      mCameraAnimated = false; 
      mEventMap.moveCamera(CameraUpdateFactory.newLatLngBounds(originalBoundingBox, 0)); 
      return; 
     } 
    } ... 

現在,在附加moveCamera之後,相機正確定位。
新問題是,有時onCameraChange沒有被這個額外的moveCamera觸發,因此我沒有執行我實際的onCameraChange代碼(用'...'標記)。

+0

什麼是'MapUtils',你從哪裏得到它的? –

+0

@IgorGanapolsky它是我自己的工具類。與問題無關。 – AsafK