41

我目前正在使用 Google maps android API v2 开发应用程序。我的代码如下。假设地图有几个标记并放大以显示所有标记。

LatLngBuilder.Builder builder = LatLngBounds.builder();
for(Marker m : markers){
    builder.include(m.getPosition());
}
LatLngBounds bounds = builder.build();
map.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 10);

此代码工作正常,但我想在缩放级别达到 17.0f 时停止动画;似乎地图 API 没有这种方法来控制缩放级别。有人知道解决这个问题的任何想法吗?

4

17 回答 17

31

Google Maps API的最新更新引入了您需要的功能:

GoogleMap.setMaxZoomPreference()

GoogleMap.setMinZoomPreference()

但是,它仍然不会阻止动画播放。

于 2016-08-02T05:07:45.970 回答
25

我在 Google Maps API 中没有找到任何直接的解决方案。这个问题的一个潜在解决方案是监听OnCameraChange 事件:只要这个事件触发并且缩放级别高于最大缩放级别,就可以调用animateCamera()。结果代码如下:

@Override
public void onCameraChange(CameraPosition position) {
    float maxZoom = 17.0f;
    if (position.zoom > maxZoom)
        map_.animateCamera(CameraUpdateFactory.zoomTo(maxZoom));
}
于 2013-06-18T17:39:11.857 回答
18

来自 Android 文档: https ://developers.google.com/maps/documentation/android-api/views

您可能会发现设置首选的最小和/或最大缩放级别很有用。例如,如果您的应用在兴趣点周围显示定义的区域,或者如果您使用具有一组有限缩放级别的自定义图块叠加,这对于控制用户体验很有用。

private GoogleMap mMap;
// Set a preference for minimum and maximum zoom.
mMap.setMinZoomPreference(6.0f);
mMap.setMaxZoomPreference(14.0f);
于 2016-10-15T16:41:58.963 回答
14

这是 Arvis 解决方案的相应 Java 代码,对我来说效果很好:

private LatLngBounds adjustBoundsForMaxZoomLevel(LatLngBounds bounds) {
  LatLng sw = bounds.southwest;
  LatLng ne = bounds.northeast;
  double deltaLat = Math.abs(sw.latitude - ne.latitude);
  double deltaLon = Math.abs(sw.longitude - ne.longitude);

  final double zoomN = 0.005; // minimum zoom coefficient
  if (deltaLat < zoomN) {
     sw = new LatLng(sw.latitude - (zoomN - deltaLat / 2), sw.longitude);
     ne = new LatLng(ne.latitude + (zoomN - deltaLat / 2), ne.longitude);
     bounds = new LatLngBounds(sw, ne);
  }
  else if (deltaLon < zoomN) {
     sw = new LatLng(sw.latitude, sw.longitude - (zoomN - deltaLon / 2));
     ne = new LatLng(ne.latitude, ne.longitude + (zoomN - deltaLon / 2));
     bounds = new LatLngBounds(sw, ne);
  }

  return bounds;
}
于 2013-10-13T09:47:07.007 回答
6

与 Arvis 解决方案相同,但使用Location[ distanceBetween()]( http://developer.android.com/reference/android/location/Location.html#distanceBetween(double , double, double, double, float[])) 方法计算距离到点之间:

@Override
public void zoomToMarkers(Set<Marker> markers) {

    LatLngBounds.Builder builder = new LatLngBounds.Builder();
    for (Marker marker : markers) {
        builder.include(marker.getPosition());
    }
    LatLngBounds bounds = builder.build();

    // Calculate distance between northeast and southwest
    float[] results = new float[1];
    android.location.Location.distanceBetween(bounds.northeast.latitude, bounds.northeast.longitude,
            bounds.southwest.latitude, bounds.southwest.longitude, results);

    CameraUpdate cu = null;
    if (results[0] < 1000) { // distance is less than 1 km -> set to zoom level 15
        cu = CameraUpdateFactory.newLatLngZoom(bounds.getCenter(), 15);
    } else {
        int padding = 50; // offset from edges of the map in pixels
        cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);
    }
    if (cu != null) {
        mMap.moveCamera(cu);
    }
}
于 2015-10-29T14:33:05.047 回答
3

在为相机设置动画之前,您可以检查边界的 SW 和 NE 点是否不太接近,并在必要时调整边界:

        ...
        LatLngBounds bounds = builder.Build();

        var sw = bounds.Southwest;
        var ne = bounds.Northeast;
        var deltaLat = Math.Abs(sw.Latitude - ne.Latitude);
        var deltaLon = Math.Abs(sw.Longitude - ne.Longitude);

        const double zoomN = 0.005; // set whatever zoom coefficient you need!!!
        if (deltaLat < zoomN) {
            sw.Latitude = sw.Latitude - (zoomN - deltaLat / 2);
            ne.Latitude = ne.Latitude + (zoomN - deltaLat / 2);
            bounds = new LatLngBounds(sw, ne);
        }
        else if (deltaLon < zoomN) {
            sw.Longitude = sw.Longitude - (zoomN - deltaLon / 2);
            ne.Longitude = ne.Longitude + (zoomN - deltaLon / 2);
            bounds = new LatLngBounds(sw, ne);
        }

        map.animateCamera(CameraUpdateFactory.NewLatLngBounds(bounds, 10);

附言。我的示例是用于 Xamarin 的 c#,但您可以轻松地为 java 调整它

于 2013-08-13T10:44:46.387 回答
2

这来自您正在使用的API 参考:include(position)

“包括这一点以建立边界。边界将以最小的方式扩展以包括这一点。更准确地说,它将考虑在东西方向上扩展边界(其中一个可能环绕世界)并选择两者中较小的一个。如果两个方向产生相同大小的 LatLngBounds,这会将其向东扩展。

地图将缩小,直到它可以显示您在 for 循环中添加的所有标记。

如果您只想缩小到 17 并仍然显示标记,请先动画到缩放级别 17,然后获取它的边界,然后添加标记。

@Override
public void onCameraChange(CameraPosition camPos) {

    if (camPos.zoom < 17 && mCurrentLoc != null) {
        // set zoom 17 and disable zoom gestures so map can't be zoomed out
        // all the way
        mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(position,17));
        mMap.getUiSettings().setZoomGesturesEnabled(false);
    }
    if (camPos.zoom >= 17) {
        mMap.getUiSettings().setZoomGesturesEnabled(true);
    }

    LatLngBounds visibleBounds =  mMap.getProjection().getVisibleRegion().latLngBounds;

//add the markers
于 2013-07-31T10:44:26.317 回答
2

我不确定这是否可行,但你可以试试这个

map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);

希望能帮助到你

于 2013-06-18T12:37:03.833 回答
1

@kasimir 的方法在纬度或经度中设置了最小度数,并且感觉有点难以阅读。所以我对其进行了调整,只设置了纬度的最小值,我觉得它更具可读性:

private LatLngBounds adjustBoundsForMinimumLatitudeDegrees(LatLngBounds bounds, double minLatitudeDegrees) {
    LatLng sw = bounds.southwest;
    LatLng ne = bounds.northeast;
    double visibleLatitudeDegrees = Math.abs(sw.latitude - ne.latitude);

    if (visibleLatitudeDegrees < minLatitudeDegrees) {
        LatLng center = bounds.getCenter();
        sw = new LatLng(center.latitude - (minLatitudeDegrees / 2), sw.longitude);
        ne = new LatLng(center.latitude + (minLatitudeDegrees / 2), ne.longitude);
        bounds = new LatLngBounds(sw, ne);
    }

    return bounds;
}
于 2014-10-20T23:01:10.060 回答
1

缩放级别如下:

1f: World
5f: Landmass/continent
10f: City
15f: Streets
20f: Buildings
val setMin = 10f
val setMax = 20f

googleMap.setMaxZoomPreference(setMax)
googleMap.setMinZoomPreference(setMin)
于 2021-04-19T08:18:59.290 回答
0

我最终做的是创建自己的按钮并禁用默认按钮,这样我就可以完全控制。

在布局中放置按钮的内容如下:

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_gravity="bottom"
    android:layout_alignParentRight="true"
    android:layout_alignParentBottom="true">

    <Button
        android:id="@+id/bzoomin"
        android:layout_width="55dp"
        android:layout_height="55dp"
        android:gravity="center"
        android:textSize="28sp"
        android:text="+" />
    <Button
            android:id="@+id/bzoomout"
            android:layout_width="55dp"
            android:layout_height="55dp"
            android:gravity="center"
            android:textSize="23sp"
            android:text="—" />
</LinearLayout>

然后在代码中禁用默认按钮并设置我们的新按钮:

map.getUiSettings().setZoomControlsEnabled(false);

// setup zoom control buttons
Button zoomout = (Button) findViewById(R.id.bzoomout);
zoomout.setOnClickListener(new OnClickListener(){

    @Override
    public void onClick(View v) {
        if(map.getCameraPosition().zoom >= 8.0f){
            // Zoom like normal
            map.animateCamera(CameraUpdateFactory.zoomOut());
        }else{
            // Do whatever you want if user went too far
            Messages.toast_short(MapsActivity.this, "Maximum zoom out level reached");
        }
    }

});

Button zoomin = (Button) findViewById(R.id.bzoomin);
zoomin.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        if (map.getCameraPosition().zoom <= 14.0f) {
            // Zoom like normal
            map.animateCamera(CameraUpdateFactory.zoomIn());
        } else {
            // Do whatever you want if user went too far
            Messages.toast_short(MapsActivity.this, "Maximum zoom in level reached");
        }
    }
});
于 2014-11-19T07:06:40.663 回答
0
map.setMinZoomPreference(floatValue);
于 2017-10-05T12:43:12.993 回答
0

com.google.android.gms:play-services-maps:9.4.0您可以轻松设置最小/最大缩放。使用GoogleMap.setMinZoomPreference()GoogleMap.setMaxZoomPreference()您可以设置首选的最小和/或最大缩放级别。更多请看这里

于 2016-08-03T14:24:33.723 回答
0

我们不能直接限制地图放大功能,但我们可以尝试像这样获得相同的功能。

添加 map.setOnCameraChangeListener

final float maxZoom = 10.0f;

@Override
public void onCameraChange(CameraPosition position) {

    if (position.zoom > maxZoom)
        map.animateCamera(CameraUpdateFactory.zoomTo(maxZoom));
}
于 2016-12-27T14:01:03.213 回答
0

在新的谷歌地图 9.8 上

com.google.android.gms:play-services-maps:9.8.0

这就是我的工作方式

    googleMap.setOnCameraMoveListener(new GoogleMap.OnCameraMoveListener() {
        @Override
        public void onCameraMove() {
            Log.d(App.TAG, "onCameraMove");

            CameraPosition position = googleMap.getCameraPosition();

            float maxZoom = 9.0f;
            if (position.zoom > maxZoom) {

                googleMap.setMinZoomPreference(maxZoom);
            }

            Log.d(App.TAG, "position.zoom = " + position.zoom);

        }
    });
于 2017-03-23T05:27:00.087 回答
-2

您可以通过调用它来获得最大缩放级别,getMaxZoomLevel()然后设置该值:

mGoogleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(fromPosition, getMaxZoomLevel()));
于 2013-06-18T12:46:46.787 回答
-4

该地图有一个名为 maxZoom 的属性。只需在创建地图时将其设置为您的值

于 2013-03-29T09:50:44.827 回答