Marker clustering: allow custom cluster renderer #312
This commit is contained in:
parent
795359fb44
commit
e2a4ad8a97
@ -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);
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user