小编典典

Android 地图 v2 缩放以显示所有标记

all

我有 10 个标记GoogleMap。我想尽可能放大并保留所有标记?在早期版本中,这可以实现,zoomToSpan()但在 v2
中,我不知道该怎么做。此外,我知道需要可见的圆的半径。


阅读 76

收藏
2022-04-18

共1个答案

小编典典

您应该使用CameraUpdate该类来执行(可能)所有程序化地图移动。

为此,首先计算所有标记的边界,如下所示:

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

然后通过工厂获取一个动作描述对象CameraUpdateFactory::

int padding = 0; // offset from edges of the map in pixels
CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);

最后移动地图:

googleMap.moveCamera(cu);

或者如果你想要一个动画:

googleMap.animateCamera(cu);

就这样 :)

说明 1

几乎所有的移动方法都要求Map对象已经通过了布局过程。addOnGlobalLayoutListener您可以使用构造等待这种情况发生。可以在对此答案和剩余答案的评论中找到详细信息。

说明 2

一条评论指出,仅对一个标记使用此方法会导致地图缩放设置为“奇异”缩放级别(我认为这是给定位置可用的最大缩放级别)。我认为这是意料之中的,因为:

  1. LatLngBounds bounds实例将具有northeast等于 的属性southwest,这意味着它所覆盖的地球面积部分bounds正好为零。(这是合乎逻辑的,因为单个标记没有区域。)
  2. 通过传递boundsCameraUpdateFactory.newLatLngBounds您本质上请求计算这样的缩放级别bounds(具有零区域)将覆盖整个地图视图。
  3. 您实际上可以在一张纸上执行此计算。作为答案的理论缩放级别是+-(正无穷大)。实际上,该Map对象不支持此值,因此它被限制在给定位置允许的更合理的最大级别。

另一种说法:对象如何知道它应该为 单个位置Map选择什么缩放级别?也许最佳值应该是 20(如果它代表一个特定的地址)。或者可能是
11(如果它代表一个城镇)。或者可能是 6(如果它代表一个国家)。API 不是那么聪明,决定权在你。 __

因此,您应该简单地检查是否markers只有一个位置,如果是,请使用以下之一:

  • CameraUpdate cu = CameraUpdateFactory.newLatLng(marker.getPosition())- 转到标记位置,保持当前缩放级别不变。
  • CameraUpdate cu = CameraUpdateFactory.newLatLngZoom(marker.getPosition(), 12F)- 转到标记位置,将缩放级别设置为任意选择的值 12。
2022-04-18