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

Я работаю над приложением для 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;
    }       
}    

person bobetko    schedule 17.01.2011    source источник
comment
Честно говоря, я не читал ваш код, но да, я использовал свой собственный алгоритм упрощения маршрута. Мне нужно было нанести около 1379 меток, и я уменьшил их до 65. Если вам интересно, я буду рад объяснить алгоритм, но, поскольку мы не делаем домашнюю работу на этом сайте, я не могу дать вам teh-codez :)   -  person Reno    schedule 17.01.2011
comment
Где-то на этом форуме я читал, что ItemizedOverlay рассчитан на десятки элементов. Если их больше, может потребоваться переключение на Overlay. Я могу это подтвердить. Двум приложениям с более чем 1000 ItemizedOverlays потребовалась минута или около того, чтобы нарисовать. После перехода на Overlay это всегда в пределах 2-4 секунд.   -  person Harald Wilhelm    schedule 17.01.2011
comment
Рино, не могли бы вы объяснить свой алгоритм оптимизации? Карта со всеми этими маркерами просто бесполезна. Он слишком медленный и слишком загроможденный.   -  person bobetko    schedule 19.01.2011


Ответы (3)


Что ж. Оказалось, что я вызываю populate () каждый раз после добавления маркера. Я взял populate () из метода addOverlay () и вызываю его после завершения цикла. Все маркеры теперь отображаются почти мгновенно. Единственная проблема сейчас в том, что карта очень не реагирует при меньшем масштабировании (показывает сразу много маркеров). Я не вижу решения для этого, пока не выясню, как уменьшить количество маркеров на карте, когда карта уменьшена ... думаю, как-то их сгруппировать ... в настоящее время работаю над этим ...

person bobetko    schedule 18.01.2011
comment
разве это уже не упоминалось здесь: stackoverflow .com / questions / 2848189 / ????????? ..... вместо того, чтобы разглагольствовать, вы могли бы попробовать то, что там упоминалось ... в любом случае .... - person Ahsan; 27.10.2011

Есть два способа упростить этот маршрут.

1) Если вы получили заголовок по всем пунктам. Вы можете сохранить допуск по заголовку, скажем, если разница заголовков между point A and B равна 0.5. Просто проведите линию от A до B и игнорируйте точки между ними.

2) Если у вас нет заголовка. Сделайте треугольник, как показано на рис. Если h находится между вашими пределами, пропустите точки между ними и проведите линию от A to B введите описание изображения здесь

Вы также можете использовать некоторые другие алгоритмы упрощения маршрута.


Смотрите также :

Упрощение маршрута - алгоритм Дугласа Пуккера

person Reno    schedule 28.01.2011

У меня такая же проблема при загрузке нескольких маркеров на карту, но я добавил некоторую задержку загрузки маркера и отображения карты. Сначала отобразите карту, а после некоторой задержки загрузите весь маркер. что до некоторой степени будет загружаться быстрее.

person Anand    schedule 17.01.2011