package mil.nga.giat.geowave.analytic; import java.io.IOException; import java.util.UUID; import mil.nga.giat.geowave.analytic.AnalyticFeature.ClusterFeatureAttribute; import org.apache.hadoop.mapreduce.JobContext; import org.opengis.feature.simple.SimpleFeature; import org.slf4j.Logger; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Geometry; public class SimpleFeatureItemWrapperFactory implements AnalyticItemWrapperFactory<SimpleFeature> { @Override public AnalyticItemWrapper<SimpleFeature> create( final SimpleFeature item ) { return new SimpleFeatureAnalyticItemWrapper( item); } @Override public void initialize( final JobContext context, final Class<?> scope, final Logger logger ) throws IOException {} public static class SimpleFeatureAnalyticItemWrapper implements AnalyticItemWrapper<SimpleFeature> { final SimpleFeature item; public SimpleFeatureAnalyticItemWrapper( final SimpleFeature item ) { this.item = item; } @Override public String getID() { return item.getID(); } @Override public SimpleFeature getWrappedItem() { return item; } @Override public long getAssociationCount() { final Long countO = (Long) item.getAttribute(ClusterFeatureAttribute.COUNT.attrName()); return (countO != null) ? countO.longValue() : 0; } @Override public int getIterationID() { return ((Integer) item.getAttribute(ClusterFeatureAttribute.ITERATION.attrName())).intValue(); } @Override public String getGroupID() { return getAttribute( item, ClusterFeatureAttribute.GROUP_ID.attrName()); } @Override public void setGroupID( final String groupID ) { item.setAttribute( ClusterFeatureAttribute.GROUP_ID.attrName(), groupID); } @Override public void resetAssociatonCount() { item.setAttribute( ClusterFeatureAttribute.COUNT.attrName(), 0); } @Override public void incrementAssociationCount( final long increment ) { item.setAttribute( ClusterFeatureAttribute.COUNT.attrName(), getAssociationCount() + increment); } @Override public String toString() { return "SimpleFeatureCentroid [item=" + item.getID() + ", + group=" + getGroupID() + ", + count=" + getAssociationCount() + ", cost=" + getCost() + "]"; } @Override public double getCost() { final Double costO = (Double) item.getAttribute(ClusterFeatureAttribute.WEIGHT.attrName()); return (costO != null) ? costO.doubleValue() : 0.0; } @Override public void setCost( final double cost ) { // GENERIC GEOMETRY HAS A DISTANCE, NOT A COST item.setAttribute( ClusterFeatureAttribute.WEIGHT.attrName(), cost); } @Override public String getName() { return item.getAttribute( ClusterFeatureAttribute.NAME.attrName()).toString(); } @Override public String[] getExtraDimensions() { return new String[0]; } @Override public double[] getDimensionValues() { return new double[0]; } @Override public Geometry getGeometry() { return (Geometry) item.getAttribute(ClusterFeatureAttribute.GEOMETRY.attrName()); } @Override public void setZoomLevel( final int level ) { item.setAttribute( ClusterFeatureAttribute.ZOOM_LEVEL.attrName(), Integer.valueOf(level)); } @Override public int getZoomLevel() { return getIntAttribute( item, ClusterFeatureAttribute.ZOOM_LEVEL.attrName(), 1); } @Override public void setBatchID( final String batchID ) { item.setAttribute( ClusterFeatureAttribute.BATCH_ID.attrName(), batchID); } @Override public String getBatchID() { return item.getAttribute( ClusterFeatureAttribute.BATCH_ID.attrName()).toString(); } } private static String getAttribute( final SimpleFeature feature, final String name ) { final Object att = feature.getAttribute(name); return att == null ? null : att.toString(); } private static int getIntAttribute( final SimpleFeature feature, final String name, final int defaultValue ) { final Object att = feature.getAttribute(name); return att == null ? defaultValue : (att instanceof Number ? ((Number) att).intValue() : Integer.parseInt(att .toString())); } /* * @see * mil.nga.giat.geowave.analytics.tools.CentroidFactory#createNextCentroid * (java.lang.Object, com.vividsolutions.jts.geom.Coordinate, * java.lang.String[], double[]) */ @Override public AnalyticItemWrapper<SimpleFeature> createNextItem( final SimpleFeature feature, final String groupID, final Coordinate coordinate, final String[] extraNames, final double[] extraValues ) { final Geometry geometry = (Geometry) feature.getAttribute(ClusterFeatureAttribute.GEOMETRY.attrName()); return new SimpleFeatureAnalyticItemWrapper( AnalyticFeature.createGeometryFeature( feature.getFeatureType(), feature.getAttribute( ClusterFeatureAttribute.BATCH_ID.attrName()).toString(), UUID.randomUUID().toString(), getAttribute( feature, ClusterFeatureAttribute.NAME.attrName()), groupID, ((Double) feature.getAttribute(ClusterFeatureAttribute.WEIGHT.attrName())).doubleValue(), geometry.getFactory().createPoint( coordinate), extraNames, extraValues, ((Integer) feature.getAttribute(ClusterFeatureAttribute.ZOOM_LEVEL.attrName())).intValue(), ((Integer) feature.getAttribute(ClusterFeatureAttribute.ITERATION.attrName())).intValue() + 1, ((Long) feature.getAttribute(ClusterFeatureAttribute.COUNT.attrName())).longValue())); } }