谷歌地图V2:缩放以适应所有标记

18

我想将地图缩放级别设置为适合所有标记的大小。我已经使用了许多人提到的以下方法,但它对我不起作用。它显示了另一个点。

if (positions.size() > 0) {

    final LatLngBounds.Builder builder = new LatLngBounds.Builder();
    for (Marker m : positions) {
        builder.include(m.getPosition());
    }
    builder.include(positions.get(i).getPosition());
}

try {
    googleMap.setOnCameraChangeListener(new OnCameraChangeListener() {

        @Override
        public void onCameraChange(CameraPosition arg0) {

            googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(
                    builder.build(), UserDataManager.getInstance().getWidth(), 
                    UserDataManager.getInstance().getWidth(),0));
            googleMap.setOnCameraChangeListener(null);

        }
    });

} catch (IllegalStateException e) {
    // TODO: handle exception
    final View mapView = getSupportFragmentManager()
            .findFragmentById(R.id.map).getView();
    if (mapView.getViewTreeObserver().isAlive()) {
        mapView.getViewTreeObserver().addOnGlobalLayoutListener(
            new OnGlobalLayoutListener() {

                // We check which build version we are using.
                @Override
                public void onGlobalLayout() {
                    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
                        mapView.getViewTreeObserver()
                                .removeGlobalOnLayoutListener(
                                        this);
                    } else {
                        mapView.getViewTreeObserver()
                                .removeOnGlobalLayoutListener(
                                        this);
                    }

                    googleMap.setOnCameraChangeListener(new OnCameraChangeListener() {

                        @Override
                        public void onCameraChange(CameraPosition arg0) {

                            googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(
                                    builder.build(), 
                                    UserDataManager.getInstance().getWidth(), 
                                    UserDataManager.getInstance().getWidth(),0));
                            googleMap.setOnCameraChangeListener(null);

                        }
                    });

                }
            });
        }
    }
}

感谢您处理 IllegalStateException :) - Nammen8
4个回答

54

试着使用这个

//Calculate the markers to get their position
LatLngBounds.Builder b = new LatLngBounds.Builder();
for (Marker m : markers) {
    b.include(m.getPosition());
}
LatLngBounds bounds = b.build();
//Change the padding as per needed
CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, 25,25,5);
mMap.animateCamera(cu);

请查看我创建的谷歌地图V2库,其中包含这个功能,只需使用即可。

Marker m1,m2, m3, m4 .... ;

mapHelper.zoomToFitMarkers(m1,m2, m3, m4 ....);

编辑:

获取当前位置

LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
//You can use GPS_PROVIDER also
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, new LocationListener() {

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onProviderEnabled(String provider) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onProviderDisabled(String provider) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onLocationChanged(Location location) {
            // TODO Auto-generated method stub
            currentLatitude = location.getLatitude();
            currentLongitude = location.getLongitude();
            //Add your marker here and zoom to fit it
            //mapHelper.zoomToFitMarkers(m1,m2, m3, m4,mapHelper.addMarker(currentLatitude,currentLongitude,"Current Location"););
        }
    });

2
使用这段代码时,我遇到了一个错误,提示“地图的大小不应为0”……有什么想法吗? - An-droid
1
@Yume117:使用newLatLngBounds(bounds, 25,25,5); 其中的25,25是宽度和高度,您可以自定义宽度和高度。 - Girish Nair
这对我有用。是否有办法在此处包括当前位置?我想在地图视图中显示我的当前位置(斯里兰卡)和所有标记(在澳大利亚)。 - TharakaNirmana
@TharakaNirmana:zoom()方法是在CameraPosition类中负责缩放的。所以,如果想进一步缩放,请更改我设置为12的项目中的zoomLevel变量。 - Girish Nair
5
使用以下代码获取屏幕宽度:int width = getResources().getDisplayMetrics().widthPixels; 然后使用 newLatLngBounds(bounds, width, width, 25); 将屏幕宽度作为正方形/矩形的边长。根据文档,我发现在我的情况下,25的填充值比较合适。 - Rahul Sainani
显示剩余9条评论

4
mMap.moveCamera(CameraUpdateFactory.newLatLngBounds(builder.build(), 15));

尝试一下这个方法,对我来说有效。希望对大家也有效。 - Teraiya Mayur

2

这是一个Kotlin的解决方案

var listOfMarker = ArrayList<Marker>() // populate this elsewhere
val b = LatLngBounds.Builder()
for (m in listOfMarker) {
        b.include(m.position)
}
val bounds = b.build()
//Change the padding as per needed
val paddingFromEdgeAsPX = 100
var cu = CameraUpdateFactory.newLatLngBounds(bounds,paddingFromEdgeAsPX)
mMap.animateCamera(cu)

2

经过多次搜索,我找到了最合适的答案:

//LatLngBound will cover all your marker on Google Maps
LatLngBounds.Builder builder = new LatLngBounds.Builder();
for (int i = 0; i < latLng.size(); i++) {
                        LatLng customMarkerLocation = new LatLng(latLng.get(i).getLat(), latLng.get(i).getLng());
                        mMap.addMarker(new MarkerOptions().position(customMarkerLocation).
                                icon(BitmapDescriptorFactory.fromBitmap(
                                        createCustomMarker(getActivity(), R.drawable.ic_pepsi, "Manish")))).setTitle("iPragmatech Solutions Pvt Lmt");

                        builder.include(customMarkerLocation); //include Point to be covered

                    }

                    LatLngBounds bounds = builder.build();
                    int width = getResources().getDisplayMetrics().widthPixels;
                    int height = getResources().getDisplayMetrics().heightPixels;
                    int padding = (int) (width * 0.15); // offset from edges of the map 15% of screen

                    // to animate camera with some padding and bound -cover- all markers
                    CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, width, height, padding);
                    mMap.animateCamera(cu);

参考资料: 在Google地图标记中添加自定义图像,缩放以保持所有标记在视图中


把屏幕大小放大是个好主意 :) - Vahit Keskin

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