Android map v2 缩放以显示所有标记

标签 android google-maps google-maps-api-2 google-maps-android-api-2

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

最佳答案

您应该使用CameraUpdate 类来执行(可能)所有编程式 map 移动。

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

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);

最后移动 map :

googleMap.moveCamera(cu);

或者如果你想要动画:

googleMap.animateCamera(cu);

就这些了:)

澄清1

几乎所有移动方法都需要Map对象通过布局过程。您可以使用 addOnGlobalLayoutListener 构造等待这一切发生。详细信息可以在该答案和其余答案的评论中找到。您还可以找到complete code for setting map extent using addOnGlobalLayoutListener here .

澄清2

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

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

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

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

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

关于Android map v2 缩放以显示所有标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36524868/

相关文章:

android - 升级到 Pie(9.0) 后,React native Android 构建卡住了

java - Android "Google Translation"以编程方式弹出

java - 创建持久连接

android - 在 google maps api 中,这个地址是什么意思

java - 无法从 sqlite 表获取值

google-maps - 指定在谷歌地图中采取的确切路线

javascript - 谷歌地图聚类器

ios - 如何将 GMSMapMarker View 置于坐标中心

javascript - Chrome 因 JavaScript 崩溃?

javascript - 如何将我的谷歌地图应用程序转换为谷歌地球应用程序?