我使用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的平移滚动缩放?
答案 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
要快得多。
然而,您还有另一个选项 - 您可以获取地图的边界框(位于纬度/经度坐标中),然后检查项目的位置是否在边界框中。
请注意,所有这些解决方案仅确定项目的中心点是否在屏幕中。您项目的实际可绘制部分(例如,如果它是一个图标)大于单个点。