使用OSMdroid </overlayitem>优化数百个ItemizedOverlay <overlayitem>

时间:2014-06-25 11:33:27

标签: android performance android-mapview osmdroid

我使用OSMdroid来显示离线地图。我试图将ItemizedOverlay叠加到我的mapview上。而且我能够做到这一点。但问题是我需要覆盖超过一百个项目。我从网络获取数据。

由于项目数量太多,mapview无法处理太多数据,并且会降低应用程序的速度,并且ANR会在大多数情况下弹出。为了避免这种情况,我使用仅与可见屏幕相关的点来检查点是否在可见屏幕中,是的在某种程度上起作用。但计算复杂性太大,因为我使用单个循环来计算可能需要O(n2)

@Override
    public void draw(Canvas canvas,MapView mapview,boolean shadow) {
        try {

             for(int i=0;i<mItemList.size();i++) {
                    GeoPoint currGeo = mItemList.get(i).getPoint();
                    Point newPoint = new Point();
                    final Rect viewportRect = new Rect();
                    mapview.getProjection().toPixels(currGeo, newPoint);
                    viewportRect.set(mapview.getProjection().getScreenRect());
                    if(viewportRect.contains(newPoint.x, newPoint.y)){
                        super.draw(canvas, mapview, shadow);
                    }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

如何优化此片段,或者我可以优化的其他方法是mapview的平移滚动缩放?

2 个答案:

答案 0 :(得分:1)

  

&#34;我可以在附近或附近地区写Overlayitems吗?   图标头上的数字为3,10或缩小时的某些内容?什么时候   用户放大他可以看到所有他分割的图标。你能帮我吗?   缩小时对附近物品进行分组?&#34;

=&GT;你描述的似乎是标记聚类。当视图中有很多标记时,这是一个很好的解决方案。

OSMBonusPack提供Marker Clustering系统。

答案 1 :(得分:0)

你可以“缓存”toPixels()中计算成本昂贵的部分。当您在Item上设置位置时,您也应该致电:

mProjectedPoint = mapview.getProjection().toProjectedPixels(latitude, longitude, null);

并将该值存储在Item中供以后使用。如果您想获得Item的像素位置,可以致电

Point finalPoint = mapview.getProjection().toPixelsFromProjected(mProjectedPoint, null);

toPixelsFromProjected来电比每次调用toPixels要快得多。

然而,您还有另一个选项 - 您可以获取地图的边界框(位于纬度/经度坐标中),然后检查项目的位置是否在边界框中。

请注意,所有这些解决方案仅确定项目的中心点是否在屏幕中。您项目的实际可绘制部分(例如,如果它是一个图标)大于单个点。