谷歌地图根据LatLngBounds移动相机或动画相机不准确。

4
我对于moveCamera和animateCamera以及CameraUpdateFactory.newLatLngBounds()的准确性有一些疑惑。我正在比较我创建并作为参数传递给moveCamera/animateCamera(CameraUpdateFactory.newLatLngBounds())的一个LatLngBounds对象,与onCameraChange()事件或GoogleMap.CancelableCallback#onFinish()中的map.getProjection().getVisibleRegion().latLngBounds。它们不匹配。是否有人遇到了这个问题?这是一个bug吗?
我的代码如下:
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));
    }
}

请忽略我在这里比较两个对象的方式(equals)。我也调试了代码并检查了两个对象,发现它们不匹配。
moveCamera:
- boundingBox: - LatLngBounds{southwest=lat/lng: (32.08455383290544,34.773394063736845), northeast=lat/lng: (32.09730731777191,34.788375176773286)} - map.getProjection().getVisibleRegion().latLngBounds: - LatLngBounds{southwest=lat/lng: (32.084496299473756,34.77339383214712), northeast=lat/lng: (32.09736452396455,34.78837497532368)}
animateCamera:
- boundingBox: - LatLngBounds{southwest=lat/lng: (40.70798493778415,-74.01434069136418), northeast=lat/lng: (40.72072004852845,-73.99760391411343)} - map.getProjection().getVisibleRegion().latLngBounds: - LatLngBounds{southwest=lat/lng: (40.70798500292429,-74.01539381593466), northeast=lat/lng: (40.72071968970514,-73.99655096232891)}

我知道这是一个旧帖子,但我有同样的问题,而且仍然没有解决这个错误的方法。我已经在十几个不同的手机上测试过了,只有三星GT-I9500会出现这种情况。 - Iman Akbari
2个回答

0

animateCamera和LatLngBounds存在一个bug。该方法不能将相机准确地移动到预期的框中。我如何知道?我通过添加以下代码进行了验证:

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之后,相机位置正确。
新问题是,有时候这个额外的moveCamera不会触发onCameraChange,因此我没有执行我的实际onCameraChange代码(用“...”标记)。


MapUtils是什么,你从哪里得到它的? - IgorGanapolsky
@IgorGanapolsky 这是我的自用工具类,与问题无关。 - AsafK

0

这似乎是bug && !bug的组合。

有关错误描述,请参见:http://code.google.com/p/gmaps-api-issues/issues/detail?id=5353

基本上,您将在第5或第6小数位处有所不同。

另一个问题是,当您将LatLngBounds发送到其中一个函数时,生成的LatLngBounds将是新的,恰好适合屏幕,而您的原始LatLngBounds将在其中。


谢谢。我猜我正在计算边界框,假设地图是一个正方形。但实际上它并不是。 - AsafK
我之前的回答是错误的。我现在正确地计算了边界框。请查看我的附加回答。 - AsafK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接