package mil.nga.giat.geowave.analytic.mapreduce.dbscan;
import java.util.Map;
import mil.nga.giat.geowave.analytic.nn.DistanceProfile;
import mil.nga.giat.geowave.analytic.nn.NeighborList;
import mil.nga.giat.geowave.analytic.nn.NeighborListFactory;
import mil.nga.giat.geowave.core.index.ByteArrayId;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.vividsolutions.jts.geom.Geometry;
/**
*
* A cluster represented by a hull.
*
* Intended to run in a single thread. Not Thread Safe.
*
*
* TODO: connectGeometryTool.connect(
*/
public class ClusterUnionList extends
DBScanClusterList implements
Cluster
{
protected static final Logger LOGGER = LoggerFactory.getLogger(ClusterUnionList.class);
public ClusterUnionList(
final ByteArrayId centerId,
final ClusterItem center,
final NeighborListFactory<ClusterItem> factory,
final Map<ByteArrayId, Cluster> index ) {
super(
center.getGeometry(),
(int) center.getCount(),
centerId,
index);
}
protected long addAndFetchCount(
final ByteArrayId id,
final ClusterItem newInstance,
final DistanceProfile<?> distanceProfile ) {
return 0;
}
@Override
public void merge(
final Cluster cluster ) {
super.merge(cluster);
if (cluster != this) {
union(((DBScanClusterList) cluster).clusterGeo);
}
}
public boolean isCompressed() {
return true;
}
protected Geometry compress() {
return clusterGeo;
}
public static class ClusterUnionListFactory implements
NeighborListFactory<ClusterItem>
{
private final Map<ByteArrayId, Cluster> index;
public ClusterUnionListFactory(
final Map<ByteArrayId, Cluster> index ) {
super();
this.index = index;
}
public NeighborList<ClusterItem> buildNeighborList(
final ByteArrayId centerId,
final ClusterItem center ) {
Cluster list = index.get(centerId);
if (list == null) {
list = new ClusterUnionList(
centerId,
center,
this,
index);
}
return list;
}
}
}