Android Open Source - smartnavi Marker Clusterer






From Project

Back to project page smartnavi.

License

The source code is released under:

Apache License

If you think the Android project smartnavi listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package org.osmdroid.bonuspack.clustering;
/* w  w w  . j  a va 2  s . c o m*/
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Point;
import android.view.MotionEvent;

import org.osmdroid.bonuspack.overlays.Marker;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.Overlay;

import java.util.ArrayList;

/**
 * An overlay allowing to perform markers clustering.
 * Usage: put your markers inside with add(Marker), and add the MarkerClusterer to the map overlays.
 * Depending on the zoom level, markers will be displayed separately, or grouped as a single Marker. <br/>
 * <p/>
 * This abstract class provides the framework. Sub-classes have to implement the clustering algorithm,
 * and the rendering of a cluster.
 *
 * @author M.Kergall
 */
public abstract class MarkerClusterer extends Overlay {

    /**
     * impossible value for zoom level, to force clustering
     */
    protected static final int FORCE_CLUSTERING = -1;

    protected ArrayList<Marker> mItems = new ArrayList<Marker>();
    protected Point mPoint = new Point();
    protected ArrayList<StaticCluster> mClusters = new ArrayList<StaticCluster>();
    ;
    protected int mLastZoomLevel;
    protected Bitmap mClusterIcon;

    // abstract methods:

    public MarkerClusterer(Context ctx) {
        super(ctx);
        mLastZoomLevel = FORCE_CLUSTERING;
    }

    /**
     * clustering algorithm
     */
    public abstract ArrayList<StaticCluster> clusterer(MapView mapView);

    /**
     * Build the marker for a cluster.
     */
    public abstract Marker buildClusterMarker(StaticCluster cluster, MapView mapView);

    /**
     * build clusters markers to be used at next draw
     */
    public abstract void renderer(ArrayList<StaticCluster> clusters, Canvas canvas, MapView mapView);

    /**
     * Set the cluster icon to be drawn when a cluster contains more than 1 marker.
     * If not set, default will be the default osmdroid marker icon (which is really inappropriate as a cluster icon).
     */
    public void setIcon(Bitmap icon) {
        mClusterIcon = icon;
    }

    /**
     * Add the Marker.
     * Important: Markers added in a MarkerClusterer should not be added in the map overlays.
     */
    public void add(Marker marker) {
        mItems.add(marker);
    }

    /**
     * Force a rebuild of clusters at next draw, even without a zooming action.
     * Should be done when you changed the content of a MarkerClusterer.
     */
    public void invalidate() {
        mLastZoomLevel = FORCE_CLUSTERING;
    }

    /**
     * @return the Marker at id (starting at 0)
     */
    public Marker getItem(int id) {
        return mItems.get(id);
    }

    /**
     * @return the list of Markers.
     */
    public ArrayList<Marker> getItems() {
        return mItems;
    }

    @Override
    protected void draw(Canvas canvas, MapView mapView, boolean shadow) {
        //if zoom has changed and mapView is now stable, rebuild clusters:
        int zoomLevel = mapView.getZoomLevel();
        if (zoomLevel != mLastZoomLevel && !mapView.isAnimating()) {
            mClusters = clusterer(mapView);
            renderer(mClusters, canvas, mapView);
            mLastZoomLevel = zoomLevel;
        }

    /*
        final Projection pj = mapView.getProjection();
    Drawable dd = new BitmapDrawable(mClusterIcon);
    dd.setBounds(-15, -15, 15, 15);
    */

        for (StaticCluster cluster : mClusters) {
            cluster.getMarker().draw(canvas, mapView, shadow);

      /*
            if (cluster.getSize()>1){
        GeoPoint p1 = cluster.getPosition();
        GeoPoint p2 = new GeoPoint(p1.getLatitude()+gridSizeY, p1.getLongitude()-gridSizeX);
        Point p2Pixels= pj.toMapPixels(p2, null);
        drawAt(canvas, dd, p2Pixels.x, p2Pixels.y, false, 0.0f);
      }
      */
        }
    }

    @Override
    public boolean onSingleTapConfirmed(final MotionEvent event, final MapView mapView) {
        for (StaticCluster cluster : mClusters) {
            if (cluster.getMarker().onSingleTapConfirmed(event, mapView))
                return true;
        }
        return false;
    }

    @Override
    public boolean onLongPress(final MotionEvent event, final MapView mapView) {
        for (StaticCluster cluster : mClusters) {
            if (cluster.getMarker().onLongPress(event, mapView))
                return true;
        }
        return false;
    }

    @Override
    public boolean onTouchEvent(final MotionEvent event, final MapView mapView) {
        for (StaticCluster cluster : mClusters) {
            if (cluster.getMarker().onTouchEvent(event, mapView))
                return true;
        }
        return false;
    }
}




Java Source Code List

com.ilm.sandwich.BackgroundService.java
com.ilm.sandwich.BuildConfig.java
com.ilm.sandwich.Config.java
com.ilm.sandwich.GoogleMapActivity.java
com.ilm.sandwich.Info.java
com.ilm.sandwich.MySupportMapFragment.java
com.ilm.sandwich.OsmMapActivity.java
com.ilm.sandwich.Settings.java
com.ilm.sandwich.StartChooser.java
com.ilm.sandwich.TouchableWrapper.java
com.ilm.sandwich.tools.Core.java
com.ilm.sandwich.tools.HttpRequests.java
com.ilm.sandwich.tools.Locationer.java
com.ilm.sandwich.tools.MapDownload.java
com.ilm.sandwich.tools.MyItemizedOverlay.java
com.ilm.sandwich.tools.PlacesAutoComplete.java
com.ilm.sandwich.tools.PlacesTextSearch.java
com.ilm.sandwich.tools.Statistics.java
com.ilm.sandwich.tools.SuggestionsAdapter.java
org.osmdroid.bonuspack.BuildConfig.java
org.osmdroid.bonuspack.BuildConfig.java
org.osmdroid.bonuspack.cachemanager.CacheManager.java
org.osmdroid.bonuspack.clustering.GridMarkerClusterer.java
org.osmdroid.bonuspack.clustering.MarkerClusterer.java
org.osmdroid.bonuspack.clustering.StaticCluster.java
org.osmdroid.bonuspack.kml.ColorStyle.java
org.osmdroid.bonuspack.kml.IconStyle.java
org.osmdroid.bonuspack.kml.KmlDocument.java
org.osmdroid.bonuspack.kml.KmlFeature.java
org.osmdroid.bonuspack.kml.KmlFolder.java
org.osmdroid.bonuspack.kml.KmlGeometry.java
org.osmdroid.bonuspack.kml.KmlGroundOverlay.java
org.osmdroid.bonuspack.kml.KmlLineString.java
org.osmdroid.bonuspack.kml.KmlMultiGeometry.java
org.osmdroid.bonuspack.kml.KmlPlacemark.java
org.osmdroid.bonuspack.kml.KmlPoint.java
org.osmdroid.bonuspack.kml.KmlPolygon.java
org.osmdroid.bonuspack.kml.LineStyle.java
org.osmdroid.bonuspack.kml.Style.java
org.osmdroid.bonuspack.location.FlickrPOIProvider.java
org.osmdroid.bonuspack.location.GeoNamesPOIProvider.java
org.osmdroid.bonuspack.location.GeocoderGisgraphy.java
org.osmdroid.bonuspack.location.GeocoderNominatimOld.java
org.osmdroid.bonuspack.location.GeocoderNominatim.java
org.osmdroid.bonuspack.location.NominatimPOIProvider.java
org.osmdroid.bonuspack.location.POI.java
org.osmdroid.bonuspack.location.PicasaPOIProvider.java
org.osmdroid.bonuspack.mapsforge.GenericMapView.java
org.osmdroid.bonuspack.mapsforge.MapsForgeTileModuleProvider.java
org.osmdroid.bonuspack.mapsforge.MapsForgeTileProvider.java
org.osmdroid.bonuspack.mapsforge.MapsForgeTileSource.java
org.osmdroid.bonuspack.overlays.DefaultInfoWindow.java
org.osmdroid.bonuspack.overlays.ExtendedOverlayItem.java
org.osmdroid.bonuspack.overlays.FolderOverlay.java
org.osmdroid.bonuspack.overlays.GroundOverlay.java
org.osmdroid.bonuspack.overlays.InfoWindow.java
org.osmdroid.bonuspack.overlays.ItemizedOverlayWithBubble.java
org.osmdroid.bonuspack.overlays.MapEventsOverlay.java
org.osmdroid.bonuspack.overlays.MapEventsReceiver.java
org.osmdroid.bonuspack.overlays.MarkerInfoWindow.java
org.osmdroid.bonuspack.overlays.Marker.java
org.osmdroid.bonuspack.overlays.Polygon.java
org.osmdroid.bonuspack.overlays.Polyline.java
org.osmdroid.bonuspack.routing.GoogleRoadManager.java
org.osmdroid.bonuspack.routing.MapQuestRoadManager.java
org.osmdroid.bonuspack.routing.OSRMRoadManager.java
org.osmdroid.bonuspack.routing.RoadLeg.java
org.osmdroid.bonuspack.routing.RoadManager.java
org.osmdroid.bonuspack.routing.RoadNode.java
org.osmdroid.bonuspack.routing.Road.java
org.osmdroid.bonuspack.utils.BonusPackHelper.java
org.osmdroid.bonuspack.utils.DouglasPeuckerReducer.java
org.osmdroid.bonuspack.utils.HttpConnection.java
org.osmdroid.bonuspack.utils.PolylineEncoder.java
org.osmdroid.bonuspack.utils.WebImageCache.java