7

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

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

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

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;
    }       
}    
4

3 回答 3

3

好。事实证明,每次添加标记后我都会调用 populate() 。我从 addOverlay() 方法中取出 populate() 并在循环完成后调用它。所有标记现在几乎立即显示。现在唯一的问题是地图在较低缩放时非常无响应(一次显示很多标记)。我看不到解决方案,除非我弄清楚如何在缩小地图时减少地图上的标记数量......考虑以某种方式对它们进行分组......目前正在处理这个......

于 2011-01-18T23:22:31.083 回答
2

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

1)如果你得到了所有点的标题。您可以保持航向公差,例如,如果航向之间的差异point A and B0.5从 A 到 B 画一条线并忽略之间的点。

2)如果你没有标题。做一个三角形,如图所示。如果 h 在您的限制之间,请跳过其间的点并从A to B 在此处输入图像描述

您还可以使用其他一些路由简化算法


也可以看看 :

路线简化 - Douglas Puecker 算法

于 2011-01-28T07:34:57.873 回答
0

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

于 2011-01-17T05:41:41.210 回答