【问题标题】:How to Display thousands of OverlayItems in an Android MapView如何在 Android MapView 中显示数千个 OverlayItem
【发布时间】:2011-09-16 05:10:57
【问题描述】:

我在使用 Android MapView API 时遇到了一些问题。我从要在 MapView 中显示的数据库中获取 OverlayItems。如果我显示 100 个图标,我没有问题,但如果它变得更多——比如一个城市有 500 个项目——它首先看起来非常糟糕,而其次它会减慢很多。不幸的是,我的目标是展示其中的 10000 个。我认为一种解决方案是向 ZoomLevels 注册一个侦听器以使它们出现/消失,但我找不到该功能。其次,我找不到使用地图缩放来缩放我的叠加层的功能。 任何想法都非常欢迎

【问题讨论】:

标签: android sqlite google-maps google-maps-api-3 android-mapview


【解决方案1】:

ItemizedOverlay 绘制方法中有一个非常奇怪的行为。当你说:从 (x,y) 到 (x1,y1) 画线时,draw 方法被调用了大约 20-30-40 次 - 我不知道为什么。画一条线是可以接受的,但是画上千条线、图标等等……就很糟糕了!要解决此问题,您应该创建一个缓存覆盖。这是捕获第一次绘制的叠加层,创建对象,然后阻止将来进行相同绘制的绘制。

一个簇是一个图标后面的十几个图标。例如,如果您在地图上有 1000 个标记,在特定的最小缩放级别下,您无法单独看到每个标记 - 它会变成一堆图标和颜色等等。而不是 100 个非常接近的标记,而是放置一个聚类标记。并在放大时删除该集群并创建另一个集群...这样做直到标记变得足够远并且您可以看到它们被分开。

检查这个:Cluster markers

【讨论】:

  • 感谢您的解释,我现在知道该做什么了。您是否希望在每个不同的可绘制对象上添加带有 defaultMarker 的 ItemizedOverlay,或者如果我将 CachedDrawable 设置为 OverlayItem 的 ImageResource 就可以了吗?
  • 我没有得到这个。你能再解释一下吗,对不起。
  • 例如:如果我创建一个新的ItemizedOverlay,我通常会在其构造函数中传递一个defaultMarker,用于每个OverlayItem。如果我有 10 个 OverlayItem,我可以将它们添加到 ItemizedOverlay。他们都会将 defaultMarker 设为 Drawable。如果我想在一个特殊的 OverlayItem 中有一个不同的图标,我可以在该 OverlayItem 的实例上调用 setMarker(Drawable d)。所以我只有一个 ItemizedOverlay,但是每个 OverlayItem 都有自己的 Marker,它指向一个 cachedDrawable
【解决方案2】:

采取以下方法:

  1. 创建缓存覆盖以防止多次绘制相同的集群;
  2. 画线;
  3. 根据缩放级别和标记距离对标记进行聚类。
  4. 每次在叠加层中绘制时,请确保当前标记位于屏幕的可见部分内。如果不是,请不要画它!

【讨论】:

  • 嗯,谢谢你的回答。但我真的不明白你的答案。什么是缓存的叠加层和集群,如何做到这一点?
【解决方案3】:

我的应用程序中的图标大小和缩放级别也有类似的问题。我最终做的是两组包含标记的叠加层,一组带有“放大”图标,一组带有“缩小”图标。然后只需在某个缩放级别更改叠加层(使用缩放轮询器 - On zoom event for google maps on android

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    相关资源
    最近更新 更多