添加大量标记时,Google Maps Android API v2 非常慢

Posted

技术标签:

【中文标题】添加大量标记时,Google Maps Android API v2 非常慢【英文标题】:Google Maps Android API v2 very slow when adding lots of Markers 【发布时间】:2012-11-22 16:17:24 【问题描述】:

我正在更新现有的 android 应用以使用新的 Google Maps Android API v2。我有大约 2500 个标记要添加到地图中。在旧版本的 API 中,当有 2500 个标记时,我发现地图的响应速度非常糟糕,因此我不得不通过仅添加地图当前可见区域中的标记来解决这个问题。

我希望使用新 API 可以更快地处理 2500 个标记,但它仍然很糟糕,即使在 Nexus 4 上也是如此,而且我没有看到任何类型的集群选项。

所以我的问题是:如何确定某个纬度/经度点是否包含在地图的可见区域内?

我在文档中查看了VisibleRegion,但到目前为止我还没有运气。非常感谢任何帮助。

*旁注:即使使用 iPhone 3gs,ios MKMapView(谷歌地图或苹果地图)上的 2500 个标记也非常流畅且响应迅速。即使使用最新最好的硬件,我仍然无法理解为什么它在 Android 上这么慢。

【问题讨论】:

【参考方案1】:

好吧,在尝试了更多的事情之后,我想出了如何确定给定点是否在可见区域中,这很简单:

//Note: this.mMap is an instance of GoogleMap

LatLngBounds bounds = this.mMap.getProjection().getVisibleRegion().latLngBounds;

LatLng markerPoint = new LatLng(item.getLatitude(), item.getLongitude());

if(bounds.contains(markerPoint))

    this.mMap.addMarker(new MarkerOptions(...));    

*请注意,获取 GoogleMap 的投影是一项昂贵的操作,因此,如果您要遍历一长串项目以创建标记并将它们添加到地图中,就像我一样,只需在循环之前抓取一次投影.

更新

我决定写一篇博文,详细介绍如何显示地图可见区域中的标记并在标记移出屏幕时隐藏它们。这不是一个完美的解决方案,但如果您要显示数千个标记并且知道您的用户不需要同时查看所有标记(除非他们缩小),那么这是一个很好的解决方法。

Hiding and Showing on screen Markers with Google Maps Android API V2

【讨论】:

为了能够指示地图上是否有标记但在当前屏幕/视图/边界之外,是否有任何方法可以反转这一点? 与多个集群管理器集成,就像一个魅力。当与所有放置的标记进行比较时,此解决方案将导致集群重新绘制/重新计算一点,但在给定巨大的性能增益时它完全可以。谢谢@DiscDev【参考方案2】:

对于 Android 上的集群解决方案,您可能需要尝试 Android 地图扩展: https://github.com/mg6maciej/android-maps-extensions

【讨论】:

这看起来很不错,我迫不及待想试试。 @MaciejGórski 这是一个很酷的库。我只是希望它有一些支持文档来描述它。 @KhaledAlanezi 我也希望如此。由于这是开源的,任何人都可以通过创建一些文档来做出贡献(例如 GitHub 上的 wiki)。对我来说,最好的文档是演示应用程序。 @MonicaLabbao 感谢您告诉我。我已经更新了指向 GitHub 的链接。

以上是关于添加大量标记时,Google Maps Android API v2 非常慢的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 react-google-maps 通过单击在地图上添加标记?

标记聚类 - 融合表层 - Google Maps v3

用户如何通过点击 google maps android 添加标记?

google maps 单击标记点作为地图中心

使用 jQuery mobile、google maps API v3 将 infoWindow 添加到地图标记

Google Maps API v3 - 单击标记时如何“提醒”标记ID [重复]