Google 在 LatLng 边界之间放大地图

Google map zoom in between LatLng Bounds

我在地图上有两个标记,它们应该同时显示。

这是通过 :

实现的
 final LatLngBounds.Builder builder = new LatLngBounds.Builder();
    for (Marker markerTemp : markers) {
        builder.include(markerTemp.getPosition());
    }

这很好用。但是,当标记彼此靠近时,地图会非常缩小。 它是这样发生的: 1-我选择了两个彼此靠近的位置(变焦很好) 2-我选择了两个彼此相距较远的位置(变焦很好) 3- 我选择了两个彼此靠近的位置(缩放保持不变并且标记重叠)。

我检查了很多链接,包括:

(1) (2) bounds google maps

(3) Setting max zoom level in google maps android api v2 (4) Android map v2 zoom to show all the markers

(5) Adjusting google map (api v2) zoom level in android (6) Set a max zoom level on LatLngBounds builder

(7) android Zoom-to-Fit All Markers on Google Map v2

听起来你使用的功能只是在必要时缩小,而不是尽可能地放大。你可以 post 你用来为相机设置动画的部分吗?

如果你只是使用

LatLngBounds bounds = builder.build();
map.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 20));

应该可以。并确保调用它并且不要将其包装在检查边界是否已经可见的检查中。

您可以通过以下函数获取两个位置之间的距离,并据此找到缩放级别。

查找两个位置之间的直接距离的方法

location1.distanceTo(location2);

现在要计算半径,请使用以下内容。 dummy_radius 将是上述值的一半

double circleRad = dummy_radius*1000;//multiply by 1000 to make units in KM

private int getZoomLevel(double radius){
            double scale = radius / 500;
            return ((int) (16 - Math.log(scale) / Math.log(2)));
}

float zoomLevel = getZoomLevel(circleRad);
mGoogleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(LatLon, zoomLevel));

在不使用地图填充的情况下完全解决这个问题。此函数将获取所有 latlng 对象,并将 return 返回 Pair<LatLng, Integer>,其中首先是 pair.first 将居中,pair.second 将是缩放级别。

public Pair<LatLng, Integer> getCenterWithZoomLevel(LatLng... l) {
    float max = 0;

    if (l == null || l.length == 0) {
        return null;
    }
    LatLngBounds.Builder b = new LatLngBounds.Builder();
    for (int count = 0; count < l.length; count++) {
        if (l[count] == null) {
            continue;
        }
        b.include(l[count]);
    }

    LatLng center = b.build().getCenter();

    float distance = 0;
    for (int count = 0; count < l.length; count++) {
        if (l[count] == null) {
            continue;
        }
        distance = distance(center, l[count]);
        if (distance > max) {
            max = distance;
        }
    }

    double scale = max / 1000;
    int zoom = ((int) (16 - Math.log(scale) / Math.log(2)));
    return new Pair<LatLng, Integer>(center, zoom);
}

你可以像下面那样使用它

Pair<LatLng, Integer> pair = getCenterWithZoomLevel(l1,l2,l3..);
mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(pair.first, pair.second));