在Java中自适应缩放Google地图?(根据Android屏幕分辨率)

8

我有两个GeoPoints,想在地图上用标记显示它们。

如何获得最佳缩放级别以便MapController聚焦两点中心,并将它们显示在地图上。

整个过程应该在不同屏幕分辨率下正常工作。

2个回答

9
你可以使用MapView的MapController来实现此功能。通过MapView.getController()获取MapController,然后可以尝试使用MapController.zoomToSpan()设置正确的缩放级别。我也倾向于使用ItemizedOverlay的getLatSpanE6()和getLonSpanE6()使这更简单。一个例子:
MapView map = (MapView) findViewById(R.id.Map);
MapController mc = map.getController();
mc.zoomToSpan(overlay.getLatSpanE6(), overlay.getLonSpanE6());

请注意他们的警告:
由于缩放只能实现离散级别,并且地图的纵横比可能与给定的纵横比不匹配,因此拟合的质量可能会有所不同。我们唯一保证的是,在缩放后,新的纬度或经度中至少有一个将与相应的参数相差不超过2倍。
编辑:为了还原正确的缩放位置,您必须使用MapController.setCenter()。

2
在这种情况下,地图会缩放到一个随机位置,对吗? - poeschlorn
1
使用这种方法,两个点始终可见。但是,两个点之间距离越远,该方法的精度就越低。 - Dave.B
@poeschlorn:没错,你还需要使用setCenter(),抱歉。 - Dan Lew
非常感谢 :) 它运行良好! 现在我只需要加入我的标记,但这应该不难 ;) 再次感谢! - poeschlorn
不幸的是,上述表达式并不总是按预期执行。现在已经过去一年多了,是否有解决方法? - Ahmed Faisal

0

这就是应该的做法:

private void loadMarkerPositions() {


    for (Stores store : storeList) {
        latlong1 = new LatLng(store.getLatitude(), store.getLongtitude());
        array.add(latlong1);
    }

     List<LatLng> points = array; 

     final LatLngBounds.Builder bc = new LatLngBounds.Builder();

        for (LatLng item : points) {
            bc.include(item);
        }

    googleMap.setOnCameraChangeListener(new OnCameraChangeListener() {

        @Override
        public void onCameraChange(CameraPosition arg0) {
            // Move camera.
            googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bc.build(), 30));
            // Remove listener to prevent position reset on camera move.
            googleMap.setOnCameraChangeListener(null);
        }
    });

}

参考:使用CameraUpdateFactory.newLatLngBounds的moveCamera导致崩溃

还有另一种简单的方法,您可以使用此项目来完成所有与地图相关的活动:

https://github.com/girishnair12345/Google-Maps-V2-library


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