谷歌地图Android API v2在添加大量标记时非常缓慢

32

我正在更新一款现有的Android应用程序,以使用新的Google Maps Android API v2。我想要将大约2500个标记添加到地图上。在旧版本的API中,当有2500个标记时,我发现地图的响应速度非常慢,所以我只能通过添加当前可见区域内的标记来解决这个问题。

我原本希望在新的API下2500个标记会更快,但即使在Nexus 4上它还是很慢,而且我没有看到任何聚类选项。

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

我已经查看了文档中的 VisibleRegion ,但到目前为止还没有找到合适的解决方法。非常感谢任何帮助。

*顺便说一句,即使在iPhone 3gs上,iOS MKMapView(Google地图或苹果地图)上放置2500个标记也非常流畅和响应。我仍然无法理解为什么在Android上即使有最新和最先进的硬件也这么慢。

2个回答

55

好的,经过尝试了几种方法后,我发现如何确定给定点是否在可见区域内,而且很简单:

//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(...));    
}

*请注意,获取Google地图的投影是一项昂贵的操作,因此如果您正在循环遍历一个长列表以创建标记,并像我一样将它们添加到地图中,请在循环之前仅获取一次投影。

更新

我决定撰写一篇博客文章,详细介绍如何显示位于地图可见区域内的标记,并随着它们移出屏幕而隐藏标记。虽然不是完美的解决方案,但如果您正在显示数千个标记并且知道您的用户不需要同时看到所有标记(除非他们缩小到特别小),这是一个相当不错的解决方法。

使用Google Maps Android API V2在屏幕上隐藏和显示标记


有没有办法将此反转,以便能够指示地图上是否有标记,但在当前屏幕/视图/边界之外? - Paul Alexander
1
集成了多个集群管理器,运行得非常顺畅。与所有标记放置相比,这个解决方案会导致集群重新绘制/重新计算一些内容,但在获得巨大性能提升的情况下完全可以接受。感谢@DiscDev。 - DayDayHappy

13

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接