diff --git a/library/src/com/google/maps/android/clustering/Cluster.java b/library/src/com/google/maps/android/clustering/Cluster.java index 60bd9b4d6..a26546ffb 100644 --- a/library/src/com/google/maps/android/clustering/Cluster.java +++ b/library/src/com/google/maps/android/clustering/Cluster.java @@ -13,4 +13,6 @@ public interface Cluster { Collection getItems(); int getSize(); + + boolean isOneLocation(); } \ No newline at end of file diff --git a/library/src/com/google/maps/android/clustering/algo/NonHierarchicalDistanceBasedAlgorithm.java b/library/src/com/google/maps/android/clustering/algo/NonHierarchicalDistanceBasedAlgorithm.java index fce3c5488..0174d1f0a 100644 --- a/library/src/com/google/maps/android/clustering/algo/NonHierarchicalDistanceBasedAlgorithm.java +++ b/library/src/com/google/maps/android/clustering/algo/NonHierarchicalDistanceBasedAlgorithm.java @@ -184,5 +184,10 @@ public Set getItems() { public int getSize() { return 1; } + + @Override + public boolean isOneLocation() { + return false; + } } } diff --git a/library/src/com/google/maps/android/clustering/algo/StaticCluster.java b/library/src/com/google/maps/android/clustering/algo/StaticCluster.java index 265ce95da..6b176fb1b 100644 --- a/library/src/com/google/maps/android/clustering/algo/StaticCluster.java +++ b/library/src/com/google/maps/android/clustering/algo/StaticCluster.java @@ -41,6 +41,31 @@ public Collection getItems() { public int getSize() { return mItems.size(); } + + private static boolean isEqual(double d0, double d1) { + final double epsilon = 0.0000001; + return Math.abs(d0 - d1) < epsilon; + } + + private static boolean isEqualPosition(LatLng position0, LatLng position1) { + return isEqual(position0.latitude, position1.latitude) && + isEqual(position0.longitude, position1.longitude); + } + + @Override + public boolean isOneLocation() { + LatLng position = null; + for (T item : mItems) { + if (position == null || isEqualPosition(item.getPosition(), position)) { + position = item.getPosition(); + } else { + position = null; + break; + } + } + + return position != null; + } @Override public String toString() { diff --git a/library/src/com/google/maps/android/clustering/view/DefaultClusterRenderer.java b/library/src/com/google/maps/android/clustering/view/DefaultClusterRenderer.java index c0d9c555f..7509d50fd 100644 --- a/library/src/com/google/maps/android/clustering/view/DefaultClusterRenderer.java +++ b/library/src/com/google/maps/android/clustering/view/DefaultClusterRenderer.java @@ -84,7 +84,7 @@ public class DefaultClusterRenderer implements ClusterRen /** * If cluster size is less than this size, display individual markers. */ - private static final int MIN_CLUSTER_SIZE = 4; + private int mMinClusterSize = 4; /** * The currently displayed set of clusters. @@ -213,7 +213,15 @@ protected int getBucket(Cluster cluster) { return BUCKETS[BUCKETS.length - 1]; } - /** + public int getMinClusterSize() { + return mMinClusterSize; + } + + public void setMinClusterSize(int minClusterSize) { + mMinClusterSize = minClusterSize; + } + + /** * ViewModifier ensures only one re-rendering of the view occurs at a time, and schedules * re-rendering, which is performed by the RenderTask. */ @@ -275,8 +283,8 @@ public void queue(Set> clusters) { /** * Determine whether the cluster should be rendered as individual markers or a cluster. */ - protected boolean shouldRenderAsCluster(Cluster cluster) { - return cluster.getSize() > MIN_CLUSTER_SIZE; + protected boolean shouldRenderAsCluster(Cluster cluster) { + return cluster.getSize() > mMinClusterSize; } /**