Marker clustering: allow custom cluster renderer #312

This commit is contained in:
Emux 2017-10-21 19:35:07 +03:00
parent 795359fb44
commit e2a4ad8a97
3 changed files with 39 additions and 9 deletions

View File

@ -21,6 +21,9 @@ import org.oscim.core.GeoPoint;
import org.oscim.layers.marker.ClusterMarkerRenderer; import org.oscim.layers.marker.ClusterMarkerRenderer;
import org.oscim.layers.marker.ItemizedLayer; import org.oscim.layers.marker.ItemizedLayer;
import org.oscim.layers.marker.MarkerItem; import org.oscim.layers.marker.MarkerItem;
import org.oscim.layers.marker.MarkerLayer;
import org.oscim.layers.marker.MarkerRenderer;
import org.oscim.layers.marker.MarkerRendererFactory;
import org.oscim.layers.marker.MarkerSymbol; import org.oscim.layers.marker.MarkerSymbol;
import org.oscim.layers.tile.buildings.BuildingLayer; import org.oscim.layers.tile.buildings.BuildingLayer;
import org.oscim.layers.tile.vector.VectorTileLayer; import org.oscim.layers.tile.vector.VectorTileLayer;
@ -49,16 +52,28 @@ public class ClusterMarkerOverlayActivity extends MarkerOverlayActivity {
mMap.setTheme(VtmThemes.DEFAULT); mMap.setTheme(VtmThemes.DEFAULT);
Bitmap bitmapPoi = drawableToBitmap(getResources().getDrawable(R.drawable.marker_poi)); Bitmap bitmapPoi = drawableToBitmap(getResources().getDrawable(R.drawable.marker_poi));
MarkerSymbol symbol; final MarkerSymbol symbol;
if (BILLBOARDS) if (BILLBOARDS)
symbol = new MarkerSymbol(bitmapPoi, MarkerSymbol.HotspotPlace.BOTTOM_CENTER); symbol = new MarkerSymbol(bitmapPoi, MarkerSymbol.HotspotPlace.BOTTOM_CENTER);
else else
symbol = new MarkerSymbol(bitmapPoi, MarkerSymbol.HotspotPlace.CENTER, false); symbol = new MarkerSymbol(bitmapPoi, MarkerSymbol.HotspotPlace.CENTER, false);
MarkerRendererFactory markerRendererFactory = new MarkerRendererFactory() {
@Override
public MarkerRenderer create(MarkerLayer markerLayer) {
return new ClusterMarkerRenderer(markerLayer, symbol, new ClusterMarkerRenderer.ClusterStyle(Color.WHITE, Color.BLUE)) {
@Override
protected Bitmap getClusterBitmap(int size) {
// Can customize cluster bitmap here
return super.getClusterBitmap(size);
}
};
}
};
mMarkerLayer = new ItemizedLayer<>( mMarkerLayer = new ItemizedLayer<>(
mMap, mMap,
new ArrayList<MarkerItem>(), new ArrayList<MarkerItem>(),
ClusterMarkerRenderer.factory(symbol, new ClusterMarkerRenderer.ClusterStyle(Color.WHITE, Color.BLUE)), markerRendererFactory,
this); this);
mMap.layers().add(mMarkerLayer); mMap.layers().add(mMarkerLayer);

View File

@ -23,6 +23,9 @@ import org.oscim.gdx.GdxMapApp;
import org.oscim.layers.marker.ClusterMarkerRenderer; import org.oscim.layers.marker.ClusterMarkerRenderer;
import org.oscim.layers.marker.ItemizedLayer; import org.oscim.layers.marker.ItemizedLayer;
import org.oscim.layers.marker.MarkerItem; import org.oscim.layers.marker.MarkerItem;
import org.oscim.layers.marker.MarkerLayer;
import org.oscim.layers.marker.MarkerRenderer;
import org.oscim.layers.marker.MarkerRendererFactory;
import org.oscim.layers.marker.MarkerSymbol; import org.oscim.layers.marker.MarkerSymbol;
import org.oscim.layers.tile.buildings.BuildingLayer; import org.oscim.layers.tile.buildings.BuildingLayer;
import org.oscim.layers.tile.vector.VectorTileLayer; import org.oscim.layers.tile.vector.VectorTileLayer;
@ -53,16 +56,28 @@ public class ClusterMarkerLayerTest extends MarkerLayerTest {
mMap.setMapPosition(53.08, 8.83, 1 << 15); mMap.setMapPosition(53.08, 8.83, 1 << 15);
Bitmap bitmapPoi = CanvasAdapter.decodeBitmap(getClass().getResourceAsStream("/res/marker_poi.png")); Bitmap bitmapPoi = CanvasAdapter.decodeBitmap(getClass().getResourceAsStream("/res/marker_poi.png"));
MarkerSymbol symbol; final MarkerSymbol symbol;
if (BILLBOARDS) if (BILLBOARDS)
symbol = new MarkerSymbol(bitmapPoi, MarkerSymbol.HotspotPlace.BOTTOM_CENTER); symbol = new MarkerSymbol(bitmapPoi, MarkerSymbol.HotspotPlace.BOTTOM_CENTER);
else else
symbol = new MarkerSymbol(bitmapPoi, MarkerSymbol.HotspotPlace.CENTER, false); symbol = new MarkerSymbol(bitmapPoi, MarkerSymbol.HotspotPlace.CENTER, false);
MarkerRendererFactory markerRendererFactory = new MarkerRendererFactory() {
@Override
public MarkerRenderer create(MarkerLayer markerLayer) {
return new ClusterMarkerRenderer(markerLayer, symbol, new ClusterMarkerRenderer.ClusterStyle(Color.WHITE, Color.BLUE)) {
@Override
protected Bitmap getClusterBitmap(int size) {
// Can customize cluster bitmap here
return super.getClusterBitmap(size);
}
};
}
};
mMarkerLayer = new ItemizedLayer<>( mMarkerLayer = new ItemizedLayer<>(
mMap, mMap,
new ArrayList<MarkerItem>(), new ArrayList<MarkerItem>(),
ClusterMarkerRenderer.factory(symbol, new ClusterMarkerRenderer.ClusterStyle(Color.WHITE, Color.BLUE)), markerRendererFactory,
this); this);
mMap.layers().add(mMarkerLayer); mMap.layers().add(mMarkerLayer);

View File

@ -40,7 +40,7 @@ public class ClusterMarkerRenderer extends MarkerRenderer {
/** /**
* Max number to display inside a cluster icon * Max number to display inside a cluster icon
*/ */
private static final int CLUSTER_MAXSIZE = 10; protected static final int CLUSTER_MAXSIZE = 10;
/** /**
* default color of number inside the icon. Would be super-cool to cook this into the map theme * default color of number inside the icon. Would be super-cool to cook this into the map theme
@ -55,7 +55,7 @@ public class ClusterMarkerRenderer extends MarkerRenderer {
/** /**
* Map Cluster Icon Size. This is the biggest size for clusters of CLUSTER_MAXSIZE elements. Smaller clusters will be slightly smaller * Map Cluster Icon Size. This is the biggest size for clusters of CLUSTER_MAXSIZE elements. Smaller clusters will be slightly smaller
*/ */
private static final int MAP_MARKER_CLUSTER_SIZE_DP = 64; protected static final int MAP_MARKER_CLUSTER_SIZE_DP = 64;
/** /**
* Clustering grid square size, decrease to cluster more aggresively. Ideally this value is the typical marker size * Clustering grid square size, decrease to cluster more aggresively. Ideally this value is the typical marker size
@ -66,9 +66,9 @@ public class ClusterMarkerRenderer extends MarkerRenderer {
* cached bitmaps database, we will cache cluster bitmaps from 1 to MAX_SIZE * cached bitmaps database, we will cache cluster bitmaps from 1 to MAX_SIZE
* and always use same bitmap for efficiency * and always use same bitmap for efficiency
*/ */
private static Bitmap[] mClusterBitmaps = new Bitmap[CLUSTER_MAXSIZE + 1]; protected static Bitmap[] mClusterBitmaps = new Bitmap[CLUSTER_MAXSIZE + 1];
private int mStyleBackground = CLUSTER_COLORBACK, mStyleForeground = CLUSTER_COLORTEXT; protected int mStyleBackground = CLUSTER_COLORBACK, mStyleForeground = CLUSTER_COLORTEXT;
/** /**
* Discrete scale step, used to trigger reclustering on significant scale change * Discrete scale step, used to trigger reclustering on significant scale change
@ -368,7 +368,7 @@ public class ClusterMarkerRenderer extends MarkerRenderer {
* @param size The cluster size. Can be greater than CLUSTER_MAXSIZE. * @param size The cluster size. Can be greater than CLUSTER_MAXSIZE.
* @return A somewhat cool bitmap to be used as the cluster marker * @return A somewhat cool bitmap to be used as the cluster marker
*/ */
private Bitmap getClusterBitmap(int size) { protected Bitmap getClusterBitmap(int size) {
final String strValue; final String strValue;
if (size >= CLUSTER_MAXSIZE) { if (size >= CLUSTER_MAXSIZE) {