101 lines
3.7 KiB
Java
101 lines
3.7 KiB
Java
package com.google.maps.android.clustering.algo;
|
|
|
|
import androidx.collection.LongSparseArray;
|
|
import com.google.maps.android.clustering.Cluster;
|
|
import com.google.maps.android.clustering.ClusterItem;
|
|
import com.google.maps.android.projection.Point;
|
|
import com.google.maps.android.projection.SphericalMercatorProjection;
|
|
import java.util.Collection;
|
|
import java.util.Collections;
|
|
import java.util.HashSet;
|
|
import java.util.Set;
|
|
|
|
/* JADX INFO: loaded from: classes2.dex */
|
|
public class GridBasedAlgorithm<T extends ClusterItem> extends AbstractAlgorithm<T> {
|
|
private static final int DEFAULT_GRID_SIZE = 100;
|
|
private int mGridSize = 100;
|
|
private final Set<T> mItems = Collections.synchronizedSet(new HashSet());
|
|
|
|
@Override // com.google.maps.android.clustering.algo.Algorithm
|
|
public boolean addItem(T t) {
|
|
return this.mItems.add(t);
|
|
}
|
|
|
|
@Override // com.google.maps.android.clustering.algo.Algorithm
|
|
public boolean addItems(Collection<T> collection) {
|
|
return this.mItems.addAll(collection);
|
|
}
|
|
|
|
@Override // com.google.maps.android.clustering.algo.Algorithm
|
|
public void clearItems() {
|
|
this.mItems.clear();
|
|
}
|
|
|
|
@Override // com.google.maps.android.clustering.algo.Algorithm
|
|
public boolean removeItem(T t) {
|
|
return this.mItems.remove(t);
|
|
}
|
|
|
|
@Override // com.google.maps.android.clustering.algo.Algorithm
|
|
public boolean removeItems(Collection<T> collection) {
|
|
return this.mItems.removeAll(collection);
|
|
}
|
|
|
|
@Override // com.google.maps.android.clustering.algo.Algorithm
|
|
public boolean updateItem(T t) {
|
|
boolean zRemoveItem;
|
|
synchronized (this.mItems) {
|
|
zRemoveItem = removeItem(t);
|
|
if (zRemoveItem) {
|
|
zRemoveItem = addItem(t);
|
|
}
|
|
}
|
|
return zRemoveItem;
|
|
}
|
|
|
|
@Override // com.google.maps.android.clustering.algo.Algorithm
|
|
public void setMaxDistanceBetweenClusteredItems(int i) {
|
|
this.mGridSize = i;
|
|
}
|
|
|
|
@Override // com.google.maps.android.clustering.algo.Algorithm
|
|
public int getMaxDistanceBetweenClusteredItems() {
|
|
return this.mGridSize;
|
|
}
|
|
|
|
@Override // com.google.maps.android.clustering.algo.Algorithm
|
|
public Set<? extends Cluster<T>> getClusters(float f) {
|
|
long j;
|
|
long jCeil = (long) Math.ceil((Math.pow(2.0d, f) * 256.0d) / ((double) this.mGridSize));
|
|
SphericalMercatorProjection sphericalMercatorProjection = new SphericalMercatorProjection(jCeil);
|
|
HashSet hashSet = new HashSet();
|
|
LongSparseArray longSparseArray = new LongSparseArray();
|
|
synchronized (this.mItems) {
|
|
for (T t : this.mItems) {
|
|
Point point = sphericalMercatorProjection.toPoint(t.getPosition());
|
|
long coord = getCoord(jCeil, point.x, point.y);
|
|
StaticCluster staticCluster = (StaticCluster) longSparseArray.get(coord);
|
|
if (staticCluster == null) {
|
|
j = jCeil;
|
|
staticCluster = new StaticCluster(sphericalMercatorProjection.toLatLng(new com.google.maps.android.geometry.Point(Math.floor(point.x) + 0.5d, Math.floor(point.y) + 0.5d)));
|
|
longSparseArray.put(coord, staticCluster);
|
|
hashSet.add(staticCluster);
|
|
} else {
|
|
j = jCeil;
|
|
}
|
|
staticCluster.add(t);
|
|
jCeil = j;
|
|
}
|
|
}
|
|
return hashSet;
|
|
}
|
|
|
|
@Override // com.google.maps.android.clustering.algo.Algorithm
|
|
public Collection<T> getItems() {
|
|
return this.mItems;
|
|
}
|
|
|
|
private static long getCoord(long j, double d, double d2) {
|
|
return (long) ((j * Math.floor(d)) + Math.floor(d2));
|
|
}
|
|
} |