地图上有大量标记的问题

时间:2011-01-17 04:47:28

标签: android map markers

我正在开发iPhone上已存在的Android应用程序。

在应用程序中,有一个Map活动(我计算过)大约800个标记,分为四组,由四种不同颜色绘制。每组都可以打开或关闭。有关我在List中的标记的信息。我为每个组创建了一个mapOverlay,然后我将该叠加层附加到地图上。我坚信编码部分我做得很好。但无论如何我会附上我的代码......

问题是,我的Nexus One无法处理所有这些标记的地图。绘制500个标记大约需要15秒。然后当全部绘制时,地图不是很平滑。它有点难以缩放和导航。它可以做到,但经验很糟糕,我想看看是否可以在那里做些什么。我知道如果我避免使用String>双重转换,我可以节省一些时间,但我怀疑这将是重要的。

iPhone似乎没有显示所有这些标记的问题。显示所有这些大约需要1-2秒,并且缩放和平移也不是那么糟糕。减速是显而易见但仍然可以接受。我个人认为绘制所有这些标记并不好,但应用程序是由其他人设计的,我不应该做出任何重大改变。

我不知道该怎么做。似乎我必须提出不同的功能,如果已知可能使用GPS位置,并且只在某个半径范围内绘制标记,或者,如果位置未知,则使用屏幕中心(地图)并在其周围绘制标记。如果我做出这些改动,我必须对我的老板有合理的解释。

如果有人有任何idas我很感激。

代码:

    List<Overlay> mapOverlays = mapView.getOverlays();
    Drawable drawable = this.getResources().getDrawable(R.drawable.pin_blue);
    drawable = this.getResources().getDrawable(R.drawable.pin_blue);
    ArrList = appState.GetSleepArrList();
    ItemizedOverlay itemizedoverlay = new ItemizedOverlay(drawable, this); 
    ...
    ...
       for (int m = 0; m < ArrList.size(); m++) {
            tName = ArrList.get(m).get("name").toString();
            tId = ArrList.get(m).get("id").toString();
            tLat = ArrList.get(m).get("lat").toString();;
            tLng = ArrList.get(m).get("lng").toString();;
            try {
                lat = Double.parseDouble(tLat);
                lng = Double.parseDouble(tLng);
                p1 = new GeoPoint(
                        (int) (lat * 1E6), 
                        (int) (lng * 1E6));
                OverlayItem overlayitem = new OverlayItem(p1, tName, tId);
                itemizedoverlay.addOverlay(overlayitem);
            } catch (NumberFormatException e) {
                Log.d(TAG, "NumberFormatException" + e);    
            }
        }
        mapOverlays.add(itemizedoverlay);
        mapView.postInvalidate();

................................

public class ItemizedOverlay extends ItemizedOverlay<OverlayItem>
{
    private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
    private Context mContext;
    public HelloItemizedOverlay(Drawable defaultMarker, Context context)
    {
        super(boundCenterBottom(defaultMarker));
        mContext = context;
    }

    public void addOverlay(OverlayItem overlay)
    {
        mOverlays.add(overlay);
        populate();
    }
    @Override
    protected OverlayItem createItem(int i)
    {
        return mOverlays.get(i);
    }
    @Override
    public int size()
    {
        return mOverlays.size();
    }
    @Override
    protected boolean onTap(int index)
    {
        final OverlayItem item = mOverlays.get(index);
                    ... EACH MARKER WILL HAVE ONCLICK EVENT THAT WILL PRODUCE CLICABLE 
                    ... BALOON WITH MARKER'S NAME.          
        return true;
    }       
}    

3 个答案:

答案 0 :(得分:3)

好。原来我每次添加标记后都会调用populate()。我从addOverlay()方法中取出了populate(),并在循环结束后调用它。所有标记现在几乎都是即时显示的。现在唯一的问题是,在较低的缩放比例(一次显示大量标记)时,地图非常无响应。我没有看到解决方案,除非我弄清楚当地图缩小时如何减少地图上的标记数量...想要以某种方式对它们进行分组......目前正在研究这个......

答案 1 :(得分:2)

有两种方法可以简化路线。

1)如果你得到了所有积分的标题。你可以保持标题容差,比如point A and B之间的标题差异是0.5只是从A到B画一条线并忽略它们之间的点。

2)如果你没有标题。制作一个三角形,如图所示。如果h位于您的限制之间,请跳过两者之间的点并从A to B画一条线 enter image description here

您还可以使用其他route simplification algorithms


另见:

路线简化 - Douglas Puecker Algorithm

答案 2 :(得分:0)

我在地图上的多个标记加载时遇到了同样的问题,但是我在加载标记和显示map时放了一些延迟。第一个显示地图,经过一些延迟后会加载所有标记。在某种程度上加载速度会更快。