From 755b5f406fb8cd07051405bb1127ce72fb7192cf Mon Sep 17 00:00:00 2001 From: Oleksandr Melnykov Date: Tue, 12 Dec 2017 10:11:58 +0100 Subject: [PATCH 01/22] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index a6601fc..cbab2c2 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Google Maps Clustering for Android +[ ![Download](https://api.bintray.com/packages/sharewire/maven/google-maps-clustering/images/download.svg) ](https://bintray.com/sharewire/maven/google-maps-clustering/_latestVersion) + A fast marker clustering library for Google Maps Android API. ![Demo](art/demo.gif) From 84e6c46e63e028968306bc63cf9ef12203429283 Mon Sep 17 00:00:00 2001 From: Oleksandr Melnykov Date: Tue, 12 Dec 2017 10:21:26 +0100 Subject: [PATCH 02/22] Update README.md --- README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/README.md b/README.md index cbab2c2..55bf89f 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,20 @@ A fast marker clustering library for Google Maps Android API. ## Motivation Why not use [Google Maps Android API Utility Library](https://github.com/googlemaps/android-maps-utils)? Because it's very slow for large amounts of markers. +## Installation +1. Make sure you have JCenter in your repository list: +```groovy +repositories { + jcenter() +} +``` +2. Add a dependency to your build.gradle: +```groovy +dependencies { + compile 'net.sharewire:google-maps-clustering:0.1.0-beta' +} +``` + ## Integration 1. Implement `ClusterItem` to represent a marker on the map. The cluster item returns the position of the marker and an optional title or snippet: From 5aaa123b86875d4b0fb222bf57c2b98466ab8787 Mon Sep 17 00:00:00 2001 From: Oleksandr Melnykov Date: Tue, 12 Dec 2017 10:43:56 +0100 Subject: [PATCH 03/22] Make the constructor of SquareTextView public. --- .../java/net/sharewire/googlemapsclustering/SquareTextView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/src/main/java/net/sharewire/googlemapsclustering/SquareTextView.java b/library/src/main/java/net/sharewire/googlemapsclustering/SquareTextView.java index 33007ae..a27e68e 100644 --- a/library/src/main/java/net/sharewire/googlemapsclustering/SquareTextView.java +++ b/library/src/main/java/net/sharewire/googlemapsclustering/SquareTextView.java @@ -6,7 +6,7 @@ class SquareTextView extends TextView { - SquareTextView(Context context, AttributeSet attrs) { + public SquareTextView(Context context, AttributeSet attrs) { super(context, attrs); } From 6d0012bd5ac5c78b28027e805774d148cbdbc356 Mon Sep 17 00:00:00 2001 From: Oleksandr Melnykov Date: Tue, 12 Dec 2017 10:46:10 +0100 Subject: [PATCH 04/22] Update the gradle plugin to 3.0.1. Update the support library to 27.0.2. --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 5b53c09..db99f20 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.0.0' + classpath 'com.android.tools.build:gradle:3.0.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -36,6 +36,6 @@ ext { compileSdkVersion = 27 buildToolsVersion = '26.0.2' - supportVersion = '27.0.1' + supportVersion = '27.0.2' playServicesVersion = '11.6.0' } From c0ba2b8fe8b3aa543f2aaa1254e6e7501a706f77 Mon Sep 17 00:00:00 2001 From: Oleksandr Melnykov Date: Tue, 12 Dec 2017 10:46:35 +0100 Subject: [PATCH 05/22] Release the version 0.1.1-beta. --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index db99f20..37e7a3e 100644 --- a/build.gradle +++ b/build.gradle @@ -29,7 +29,7 @@ task clean(type: Delete) { ext { versionCode = 1 - versionName = '0.1.0-beta' + versionName = '0.1.1-beta' minSdkVersion = 16 targetSdkVersion = 27 From 1181270da894d6bda6fb002a1f4e28811609b965 Mon Sep 17 00:00:00 2001 From: Oleksandr Melnykov Date: Tue, 12 Dec 2017 11:04:53 +0100 Subject: [PATCH 06/22] Update Google Play services to 11.6.2. --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 37e7a3e..4e11c4c 100644 --- a/build.gradle +++ b/build.gradle @@ -37,5 +37,5 @@ ext { buildToolsVersion = '26.0.2' supportVersion = '27.0.2' - playServicesVersion = '11.6.0' + playServicesVersion = '11.6.2' } From 887d12e3874e792d13adf76655a06623485bcb7b Mon Sep 17 00:00:00 2001 From: Oleksandr Melnykov Date: Tue, 12 Dec 2017 11:05:12 +0100 Subject: [PATCH 07/22] Release the version 0.1.2-beta. --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 4e11c4c..0cb7eaf 100644 --- a/build.gradle +++ b/build.gradle @@ -29,7 +29,7 @@ task clean(type: Delete) { ext { versionCode = 1 - versionName = '0.1.1-beta' + versionName = '0.1.2-beta' minSdkVersion = 16 targetSdkVersion = 27 From 7967a411e52237f32ce7b43419a64f214c4f1414 Mon Sep 17 00:00:00 2001 From: Oleksandr Melnykov Date: Tue, 12 Dec 2017 11:06:38 +0100 Subject: [PATCH 08/22] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 55bf89f..e549ca7 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ repositories { 2. Add a dependency to your build.gradle: ```groovy dependencies { - compile 'net.sharewire:google-maps-clustering:0.1.0-beta' + compile 'net.sharewire:google-maps-clustering:0.1.2-beta' } ``` From e738d68201d2c9189db61bf8320293aff2049b0b Mon Sep 17 00:00:00 2001 From: Oleksandr Melnykov Date: Tue, 12 Dec 2017 11:33:39 +0100 Subject: [PATCH 09/22] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e549ca7..7a9e88c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Google Maps Clustering for Android -[ ![Download](https://api.bintray.com/packages/sharewire/maven/google-maps-clustering/images/download.svg) ](https://bintray.com/sharewire/maven/google-maps-clustering/_latestVersion) +[ ![Download](https://api.bintray.com/packages/sharewire/maven/google-maps-clustering/images/download.svg) ](https://bintray.com/sharewire/maven/google-maps-clustering/_latestVersion) [![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-Google%20Maps%20Clustering%20for%20Android-blue.svg?style=flat)](https://android-arsenal.com/details/1/6552) A fast marker clustering library for Google Maps Android API. From 31fad8f4308f4c05e7d97c4d4257a0102b39939d Mon Sep 17 00:00:00 2001 From: Oleksandr Melnykov Date: Tue, 12 Dec 2017 14:16:15 +0100 Subject: [PATCH 10/22] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7a9e88c..61a8601 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ A fast marker clustering library for Google Maps Android API. ![Demo](art/demo.gif) ## Motivation -Why not use [Google Maps Android API Utility Library](https://github.com/googlemaps/android-maps-utils)? Because it's very slow for large amounts of markers. +Why not use [Google Maps Android API Utility Library](https://github.com/googlemaps/android-maps-utils)? Because it's very slow for large amounts of markers, which causes skipping frames and ANRs. But this library can easily handle thousands of markers (the video above demonstrates the sample application with 20 000 markers running on Nexus 5). ## Installation 1. Make sure you have JCenter in your repository list: From 961d0f5b694f95a3d08d0aa038780740070badf9 Mon Sep 17 00:00:00 2001 From: Oleksandr Melnykov Date: Tue, 12 Dec 2017 14:21:20 +0100 Subject: [PATCH 11/22] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 61a8601..3e7d5eb 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ A fast marker clustering library for Google Maps Android API. ![Demo](art/demo.gif) ## Motivation -Why not use [Google Maps Android API Utility Library](https://github.com/googlemaps/android-maps-utils)? Because it's very slow for large amounts of markers, which causes skipping frames and ANRs. But this library can easily handle thousands of markers (the video above demonstrates the sample application with 20 000 markers running on Nexus 5). +Why not use [Google Maps Android API Utility Library](https://github.com/googlemaps/android-maps-utils)? Because it's very slow for large amounts of markers, which causes skipping frames and ANRs (see [Issue #29](https://github.com/googlemaps/android-maps-utils/issues/29), [Issue #82](https://github.com/googlemaps/android-maps-utils/issues/82)). But this library can easily handle thousands of markers (the video above demonstrates the sample application with 20 000 markers running on Nexus 5). ## Installation 1. Make sure you have JCenter in your repository list: From d5ddd4758e467cca8ba7eb0aff33a79174f5fe36 Mon Sep 17 00:00:00 2001 From: Oleksandr Melnykov Date: Thu, 14 Dec 2017 21:51:34 +0100 Subject: [PATCH 12/22] Add missing JavaDoc. --- .../googlemapsclustering/Cluster.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/library/src/main/java/net/sharewire/googlemapsclustering/Cluster.java b/library/src/main/java/net/sharewire/googlemapsclustering/Cluster.java index 0462c9a..cd9e36f 100644 --- a/library/src/main/java/net/sharewire/googlemapsclustering/Cluster.java +++ b/library/src/main/java/net/sharewire/googlemapsclustering/Cluster.java @@ -4,6 +4,9 @@ import java.util.List; +/** + * An object representing a cluster of items (markers) on the map. + */ public class Cluster { private final double latitude; @@ -25,14 +28,29 @@ public class Cluster { this.east = east; } + /** + * The latitude of the cluster. + * + * @return the latitude of the cluster + */ public double getLatitude() { return latitude; } + /** + * The longitude of the cluster. + * + * @return the longitude of the cluster + */ public double getLongitude() { return longitude; } + /** + * The items contained in the cluster. + * + * @return the items contained in the cluster + */ @NonNull public List getItems() { return items; From a7deba5585285aba47e9c0e14ab4b90255b1ae57 Mon Sep 17 00:00:00 2001 From: Oleksandr Melnykov Date: Thu, 21 Dec 2017 10:43:19 +0100 Subject: [PATCH 13/22] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3e7d5eb..68537e1 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Google Maps Clustering for Android -[ ![Download](https://api.bintray.com/packages/sharewire/maven/google-maps-clustering/images/download.svg) ](https://bintray.com/sharewire/maven/google-maps-clustering/_latestVersion) [![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-Google%20Maps%20Clustering%20for%20Android-blue.svg?style=flat)](https://android-arsenal.com/details/1/6552) +[ ![Download](https://api.bintray.com/packages/sharewire/maven/google-maps-clustering/images/download.svg) ](https://bintray.com/sharewire/maven/google-maps-clustering/_latestVersion) [![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-Google%20Maps%20Clustering%20for%20Android-blue.svg?style=flat)](https://android-arsenal.com/details/1/6552) A fast marker clustering library for Google Maps Android API. From bf74b471ab815c4f03d0a38294965294d3d08bfb Mon Sep 17 00:00:00 2001 From: Oleksandr Melnykov Date: Tue, 19 Dec 2017 14:08:04 +0100 Subject: [PATCH 14/22] Make the map fragment retain its instance. --- .../sharewire/googlemapsclustering/sample/MapsActivity.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sample/src/main/java/com/sharewire/googlemapsclustering/sample/MapsActivity.java b/sample/src/main/java/com/sharewire/googlemapsclustering/sample/MapsActivity.java index 0dc7348..aa1acb8 100644 --- a/sample/src/main/java/com/sharewire/googlemapsclustering/sample/MapsActivity.java +++ b/sample/src/main/java/com/sharewire/googlemapsclustering/sample/MapsActivity.java @@ -29,7 +29,9 @@ public class MapsActivity extends FragmentActivity implements OnMapReadyCallback protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_maps); - setupMapFragment(); + if (savedInstanceState == null) { + setupMapFragment(); + } } @Override @@ -68,6 +70,7 @@ public boolean onClusterItemClick(@NonNull SampleClusterItem clusterItem) { private void setupMapFragment() { SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map); + mapFragment.setRetainInstance(true); mapFragment.getMapAsync(this); } } From c5652fd871d0b8d358fb9b7a8ef9f58c55d283c1 Mon Sep 17 00:00:00 2001 From: Oleksandr Melnykov Date: Thu, 21 Dec 2017 10:53:30 +0100 Subject: [PATCH 15/22] Animate the appearance of markers. --- .../net/sharewire/googlemapsclustering/ClusterRenderer.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/library/src/main/java/net/sharewire/googlemapsclustering/ClusterRenderer.java b/library/src/main/java/net/sharewire/googlemapsclustering/ClusterRenderer.java index 0a446d0..b7876d3 100644 --- a/library/src/main/java/net/sharewire/googlemapsclustering/ClusterRenderer.java +++ b/library/src/main/java/net/sharewire/googlemapsclustering/ClusterRenderer.java @@ -134,7 +134,9 @@ void render(@NonNull List> clusters) { .icon(markerIcon) .title(markerTitle) .snippet(markerSnippet) + .alpha(0.0F) .zIndex(FOREGROUND_MARKER_Z_INDEX)); + animateMarkerAppearance(markerToAdd); } markerToAdd.setTag(clusterToAdd); @@ -204,6 +206,10 @@ public void onAnimationEnd(Animator animation) { objectAnimator.start(); } + private void animateMarkerAppearance(@NonNull Marker marker) { + ObjectAnimator.ofFloat(marker, "alpha", 1.0F).start(); + } + private static class LatLngTypeEvaluator implements TypeEvaluator { @Override From 4666843341f605d49d292d1f0a8337a1bc34660e Mon Sep 17 00:00:00 2001 From: Oleksandr Melnykov Date: Thu, 21 Dec 2017 11:24:40 +0100 Subject: [PATCH 16/22] Delete the unused icon. --- .../res/drawable-xhdpi/ic_new_map_marker.png | Bin 14917 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 sample/src/main/res/drawable-xhdpi/ic_new_map_marker.png diff --git a/sample/src/main/res/drawable-xhdpi/ic_new_map_marker.png b/sample/src/main/res/drawable-xhdpi/ic_new_map_marker.png deleted file mode 100644 index 9046f6db7b72d79439ea6a08d19fa2af09475c1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14917 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 Date: Tue, 30 Jan 2018 17:53:56 +0100 Subject: [PATCH 17/22] ClusterManager; added minClusterSize as option --- .../googlemapsclustering/ClusterManager.java | 42 +++++++++++++------ .../googlemapsclustering/Preconditions.java | 6 +++ 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/library/src/main/java/net/sharewire/googlemapsclustering/ClusterManager.java b/library/src/main/java/net/sharewire/googlemapsclustering/ClusterManager.java index 26a2878..0035fa3 100644 --- a/library/src/main/java/net/sharewire/googlemapsclustering/ClusterManager.java +++ b/library/src/main/java/net/sharewire/googlemapsclustering/ClusterManager.java @@ -9,10 +9,12 @@ import com.google.android.gms.maps.model.LatLngBounds; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.concurrent.Executor; import java.util.concurrent.Executors; +import static net.sharewire.googlemapsclustering.Preconditions.checkArgument; import static net.sharewire.googlemapsclustering.Preconditions.checkNotNull; /** @@ -25,6 +27,7 @@ public class ClusterManager implements GoogleMap.OnCameraIdleListener { private static final int QUAD_TREE_BUCKET_CAPACITY = 4; + private static final int DEFAULT_MIN_CLUSTER_SIZE = 1; private final GoogleMap mGoogleMap; @@ -38,6 +41,8 @@ public class ClusterManager implements GoogleMap.OnCamera private AsyncTask mClusterTask; + private int mMinClusterSize = DEFAULT_MIN_CLUSTER_SIZE; + /** * Defines signatures for methods that are called when a cluster or a cluster item is clicked. * @@ -109,6 +114,14 @@ public void setItems(@NonNull List clusterItems) { buildQuadTree(clusterItems); } + /** + * Sets the minimum cluster-size. Clusters with less will be broken-up into single-item clusters + */ + public void setMinClusterSize(int minClusterSize) { + checkArgument(minClusterSize > 0); + mMinClusterSize = minClusterSize; + } + @Override public void onCameraIdle() { cluster(); @@ -162,19 +175,24 @@ private List> getClusters(@NonNull LatLngBounds latLngBounds, float z List points = mQuadTree.queryRange(north, west, south, east); if (points.size() > 0) { - double totalLatitude = 0; - double totalLongitude = 0; - - for (QuadTreePoint point : points) { - totalLatitude += point.getLatitude(); - totalLongitude += point.getLongitude(); + if (points.size() >= mMinClusterSize) { + double totalLatitude = 0; + double totalLongitude = 0; + + for (T point : points) { + totalLatitude += point.getLatitude(); + totalLongitude += point.getLongitude(); + } + + double latitude = totalLatitude / points.size(); + double longitude = totalLongitude / points.size(); + + clusters.add(new Cluster<>(latitude, longitude, points, north, west, south, east)); + } else { + for (T point : points) { + clusters.add(new Cluster<>(point.getLatitude(), point.getLongitude(), Collections.singletonList(point), north, west, south, east)); + } } - - double latitude = totalLatitude / points.size(); - double longitude = totalLongitude / points.size(); - - clusters.add(new Cluster<>(latitude, longitude, points, - north, west, south, east)); } } } diff --git a/library/src/main/java/net/sharewire/googlemapsclustering/Preconditions.java b/library/src/main/java/net/sharewire/googlemapsclustering/Preconditions.java index 9a928b6..3234e05 100644 --- a/library/src/main/java/net/sharewire/googlemapsclustering/Preconditions.java +++ b/library/src/main/java/net/sharewire/googlemapsclustering/Preconditions.java @@ -11,6 +11,12 @@ static T checkNotNull(@Nullable T reference) { return reference; } + static void checkArgument(boolean expression) { + if (!expression) { + throw new IllegalArgumentException(); + } + } + private Preconditions() { } } \ No newline at end of file From 706ceafca2175a717cae3c77f0930545c8ca27dc Mon Sep 17 00:00:00 2001 From: Oleksandr Melnykov Date: Sat, 3 Feb 2018 13:04:19 +0100 Subject: [PATCH 18/22] Update JavaDoc and code formatting. --- .../sharewire/googlemapsclustering/ClusterManager.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/library/src/main/java/net/sharewire/googlemapsclustering/ClusterManager.java b/library/src/main/java/net/sharewire/googlemapsclustering/ClusterManager.java index 0035fa3..83492a5 100644 --- a/library/src/main/java/net/sharewire/googlemapsclustering/ClusterManager.java +++ b/library/src/main/java/net/sharewire/googlemapsclustering/ClusterManager.java @@ -115,7 +115,8 @@ public void setItems(@NonNull List clusterItems) { } /** - * Sets the minimum cluster-size. Clusters with less will be broken-up into single-item clusters + * Sets the minimum size of a cluster. If the cluster size + * is less than this value, display individual markers. */ public void setMinClusterSize(int minClusterSize) { checkArgument(minClusterSize > 0); @@ -187,10 +188,12 @@ private List> getClusters(@NonNull LatLngBounds latLngBounds, float z double latitude = totalLatitude / points.size(); double longitude = totalLongitude / points.size(); - clusters.add(new Cluster<>(latitude, longitude, points, north, west, south, east)); + clusters.add(new Cluster<>(latitude, longitude, + points, north, west, south, east)); } else { for (T point : points) { - clusters.add(new Cluster<>(point.getLatitude(), point.getLongitude(), Collections.singletonList(point), north, west, south, east)); + clusters.add(new Cluster<>(point.getLatitude(), point.getLongitude(), + Collections.singletonList(point), north, west, south, east)); } } } From 46e83348c3ef5df2cede2823d5cc465846ec2c9b Mon Sep 17 00:00:00 2001 From: Oleksandr Melnykov Date: Wed, 7 Feb 2018 19:23:00 +0100 Subject: [PATCH 19/22] Update Google Play Services to 11.8.0. --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 0cb7eaf..cc48f5e 100644 --- a/build.gradle +++ b/build.gradle @@ -37,5 +37,5 @@ ext { buildToolsVersion = '26.0.2' supportVersion = '27.0.2' - playServicesVersion = '11.6.2' + playServicesVersion = '11.8.0' } From 91975a0c094760bab0b0fd93738d2eac57fc99d6 Mon Sep 17 00:00:00 2001 From: Oleksandr Melnykov Date: Wed, 7 Feb 2018 19:28:51 +0100 Subject: [PATCH 20/22] Release the version 0.1.3. --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index cc48f5e..cc33bf2 100644 --- a/build.gradle +++ b/build.gradle @@ -29,7 +29,7 @@ task clean(type: Delete) { ext { versionCode = 1 - versionName = '0.1.2-beta' + versionName = '0.1.3' minSdkVersion = 16 targetSdkVersion = 27 From 22eddb3aa7d8571e4692d66582a55a76625ec063 Mon Sep 17 00:00:00 2001 From: Oleksandr Melnykov Date: Thu, 15 Feb 2018 20:24:52 +0100 Subject: [PATCH 21/22] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 68537e1..41e117a 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ repositories { 2. Add a dependency to your build.gradle: ```groovy dependencies { - compile 'net.sharewire:google-maps-clustering:0.1.2-beta' + compile 'net.sharewire:google-maps-clustering:0.1.3' } ``` From 64d274daa934cd89deb567495e27a6f73242df21 Mon Sep 17 00:00:00 2001 From: makovkastar Date: Tue, 6 Mar 2018 16:04:24 +0100 Subject: [PATCH 22/22] Fix clusters not being shown near +180/-180 degrees longitude. --- .../googlemapsclustering/ClusterManager.java | 63 ++++++++++++------- 1 file changed, 41 insertions(+), 22 deletions(-) diff --git a/library/src/main/java/net/sharewire/googlemapsclustering/ClusterManager.java b/library/src/main/java/net/sharewire/googlemapsclustering/ClusterManager.java index 83492a5..b42bcae 100644 --- a/library/src/main/java/net/sharewire/googlemapsclustering/ClusterManager.java +++ b/library/src/main/java/net/sharewire/googlemapsclustering/ClusterManager.java @@ -160,6 +160,25 @@ private List> getClusters(@NonNull LatLngBounds latLngBounds, float z double stepLatitude = 180.0 / tileCount; double stepLongitude = 360.0 / tileCount; + if (startLongitude > endLongitude) { // Longitude +180°/-180° overlap. + // [start longitude; 180] + getClustersInsideBounds(clusters, startLatitude, endLatitude, + startLongitude, 180.0, stepLatitude, stepLongitude); + // [-180; end longitude] + getClustersInsideBounds(clusters, startLatitude, endLatitude, + -180.0, endLongitude, stepLatitude, stepLongitude); + } else { + getClustersInsideBounds(clusters, startLatitude, endLatitude, + startLongitude, endLongitude, stepLatitude, stepLongitude); + } + + return clusters; + } + + private void getClustersInsideBounds(@NonNull List> clusters, + double startLatitude, double endLatitude, + double startLongitude, double endLongitude, + double stepLatitude, double stepLongitude) { long startX = (long) ((startLongitude + 180.0) / stepLongitude); long startY = (long) ((90.0 - startLatitude) / stepLatitude); @@ -175,32 +194,32 @@ private List> getClusters(@NonNull LatLngBounds latLngBounds, float z List points = mQuadTree.queryRange(north, west, south, east); - if (points.size() > 0) { - if (points.size() >= mMinClusterSize) { - double totalLatitude = 0; - double totalLongitude = 0; - - for (T point : points) { - totalLatitude += point.getLatitude(); - totalLongitude += point.getLongitude(); - } - - double latitude = totalLatitude / points.size(); - double longitude = totalLongitude / points.size(); - - clusters.add(new Cluster<>(latitude, longitude, - points, north, west, south, east)); - } else { - for (T point : points) { - clusters.add(new Cluster<>(point.getLatitude(), point.getLongitude(), - Collections.singletonList(point), north, west, south, east)); - } + if (points.isEmpty()) { + continue; + } + + if (points.size() >= mMinClusterSize) { + double totalLatitude = 0; + double totalLongitude = 0; + + for (T point : points) { + totalLatitude += point.getLatitude(); + totalLongitude += point.getLongitude(); + } + + double latitude = totalLatitude / points.size(); + double longitude = totalLongitude / points.size(); + + clusters.add(new Cluster<>(latitude, longitude, + points, north, west, south, east)); + } else { + for (T point : points) { + clusters.add(new Cluster<>(point.getLatitude(), point.getLongitude(), + Collections.singletonList(point), north, west, south, east)); } } } } - - return clusters; } private class QuadTreeTask extends AsyncTask {