использование нескольких рисунков на карте

У меня очень ограниченный опыт работы с Mapview, Overlay и ItemizedOverlay. Я видел несколько простых примеров кода, в которых используется один drawable для оверлеев и itemizedOverlays, но я не уверен, как выполнить эти требования: мне нужно более одного drawable в моем представлении карты (пример: значок звезды для центра карты и некоторые другой значок для других элементов наложения), но я хочу, чтобы один из них был неактивным (звездочка). Должен ли я использовать как Overlay, так и ItemizedOverlay для достижения этой цели?

Кроме того, моя следующая проблема связана с представлением: если у меня есть 500 элементов для отображения на карте, как можно отобразить эту информацию на практике? Опять же, у меня мало опыта разработки и использования картографических приложений.


person jpdunn    schedule 02.12.2011    source источник
comment
Плохая идея отображать на карте сразу 500 объектов, так как производительность будет очень плохой. Попробуйте отфильтровать и отобразить только некоторые из них.   -  person skynet    schedule 04.12.2011
comment
это хороший вопрос. особенно если вы начнете рассматривать возможность кластеризации ваших точек на определенных уровнях масштабирования. если вам нужно показать много точек при более высоких уровнях масштабирования, вы можете рассмотреть возможность объединения ваших наложений в один и соответственно расширять кластеры по мере увеличения масштаба.   -  person topwik    schedule 28.11.2012


Ответы (1)


Столкнулся с такой же ситуацией пару недель назад.

Вы должны использовать один ItemizedOverlay для каждого отдельного рисунка, а затем добавить элементы overlayItem в ItemizedOverlay.

Самый удобный способ — расширить ItemizedOverlay, чтобы вы могли определить маркер и поведение щелчка для каждого стиля, который вам нужен.

Что касается второй части, из соображений производительности вам не следует заполнять карту всеми 500 элементами одновременно. Я использовал систему, которая динамически добавляет на карту маркеры, принадлежащие отображаемой области карты.

Вот фрагмент моего ItemizedOverlay, который может быть полезен для обоих ваших вопросов:

    private class MarkerItemized_Overlay extends ItemizedOverlay<OverlayItem> {



        private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
    Context mContext;

    public MarkerItemizedOverlay(Drawable marker, Context context) {
        super(boundCenterBottom(marker));
        mContext = context;
    }

    public void addOverlay(OverlayItem overlay) {
        if (!mOverlays.contains(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(final int index) {
        OverlayItem item = mOverlays.get(index);

        AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
        dialog.setTitle(item.getTitle());
        dialog.setMessage(item.getSnippet());
        dialog.setNegativeButton("Annuler",
                new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton){}
        });
        dialog.setPositiveButton("Naviguer",
                new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton){ showDirections(mOverlays.get(index).getPoint()); }
        });
        dialog.setInverseBackgroundForced(true);
        dialog.show();
        return true;
    }
    public boolean contains(Store store) {
        return mOverlays.contains(store);
    }

    @Override
    public boolean onTouchEvent(MotionEvent e, MapView mapView) {

        if (e.getAction() == MotionEvent.ACTION_UP) {
            GeoPoint newCenter = mapView.getMapCenter();
            int minLat, maxLat, minLng, maxLng;
            minLat = mapCenter.getLatitudeE6() - mapView.getLatitudeSpan()/2;
            maxLat = mapCenter.getLatitudeE6() + mapView.getLatitudeSpan()/2;
            minLng = mapCenter.getLongitudeE6() - mapView.getLongitudeSpan()/2;
            maxLng = mapCenter.getLongitudeE6() + mapView.getLongitudeSpan()/2;
            if (newCenter.getLatitudeE6() > maxLat ||
                    newCenter.getLatitudeE6() < minLat ||
                    newCenter.getLongitudeE6() > maxLng ||
                    newCenter.getLongitudeE6() < minLng)
            {
                mapCenter = mapView.getMapCenter();
                Location mapCenterLoc = new Location(providerName);
                mapCenterLoc.setLatitude(newCenter.getLatitudeE6()/1E6);
                mapCenterLoc.setLongitude(newCenter.getLongitudeE6()/1E6);
                Store[] newClosestStores = storeDB.getClosestStores(mapCenterLoc);

                for (int i = 0; i < newClosestStores.length; i++) 
                    if (! itemizedOverlay.contains(newClosestStores[i])) 
                        setMarker(newClosestStores[i]);
            }
        }
        return super.onTouchEvent(e, mapView);
    }
}
person Ramseys    schedule 02.12.2011