Проблема с большим количеством маркеров на карте

Я работаю над приложением для Android, которое уже существует на iPhone.

В приложении есть действие «Карта», в котором (я насчитал) около 800 маркеров в четырех группах, отмеченных значком «Возможность рисования» четырьмя разными цветами . Каждую группу можно включить или выключить. Информация о маркерах у меня внутри List. Я создаю mapOverlay для каждой группы, затем прикрепляю это наложение к карте. Я твердо верю, что кодирование я сделал правильно. Но я все равно прикреплю свой код ...

Дело в том, что мой Nexus One может ' • обрабатывать карту со всеми этими маркерами. Чтобы нарисовать 500 маркеров, требуется около 15 секунд. Потом, когда все нарисовано, карта не совсем гладкая. Сложно масштабировать и перемещаться. Это можно сделать, но опыт плохой, и я хотел бы посмотреть, можно ли там что-то сделать. Я знаю, что если я избегу преобразования String> Double, я смогу сэкономить время, но я сомневаюсь, что это будет значительным.

У iPhone, похоже, нет проблем с отображением всех этих маркеров. Чтобы показать их все, требуется примерно 1-2 секунды, а масштабирование и панорамирование - это не так уж и плохо. Замедление заметно, но все же приемлемо. Я лично считаю, что рисовать все эти маркеры бесполезно, но приложение разработано кем-то другим, и я не должен вносить какие-либо радикальные изменения.

Я не уверен, что здесь делать. Вроде придётся придумать другой функционал, возможно, использовать местоположение GPS, если оно известно, и рисовать только маркеры в пределах некоторого радиуса, или, если местоположение неизвестно, использовать центр экрана (карту) и рисовать маркеры вокруг него. У меня должно быть разумное объяснение моим начальникам на случай, если я внесу эти изменения.

Я ценю, если у кого-нибудь есть какие-нибудь иды.

И код:

    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;
    }       
}    
6
задан bobetko 17 January 2011 в 04:54
поделиться