package mil.nga.giat.geowave.analytic.clustering; import java.io.IOException; import java.util.LinkedList; import java.util.List; import org.geotools.feature.type.BasicFeatureTypes; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.vividsolutions.jts.geom.Polygon; import mil.nga.giat.geowave.adapter.vector.FeatureDataAdapter; import mil.nga.giat.geowave.analytic.AnalyticFeature; import mil.nga.giat.geowave.analytic.PropertyManagement; import mil.nga.giat.geowave.analytic.extract.DimensionExtractor; import mil.nga.giat.geowave.analytic.param.CentroidParameters; import mil.nga.giat.geowave.analytic.param.CommonParameters; import mil.nga.giat.geowave.analytic.param.StoreParameters; import mil.nga.giat.geowave.analytic.store.PersistableStore; import mil.nga.giat.geowave.core.geotime.ingest.SpatialDimensionalityTypeProvider; import mil.nga.giat.geowave.core.geotime.store.query.SpatialQuery; import mil.nga.giat.geowave.core.index.ByteArrayId; import mil.nga.giat.geowave.core.index.ByteArrayRange; import mil.nga.giat.geowave.core.store.adapter.AdapterStore; import mil.nga.giat.geowave.core.store.adapter.DataAdapter; import mil.nga.giat.geowave.core.store.index.Index; import mil.nga.giat.geowave.core.store.index.IndexStore; import mil.nga.giat.geowave.core.store.index.PrimaryIndex; import mil.nga.giat.geowave.core.store.util.DataStoreUtils; public class ClusteringUtils { public static final String CLUSTERING_CRS = "EPSG:4326"; final static Logger LOGGER = LoggerFactory.getLogger(ClusteringUtils.class); private static DataAdapter<?> createAdapter( final String sampleDataTypeId, final String sampleDataNamespaceURI, final AdapterStore adapterStore, final String[] dimensionNames ) { final FeatureDataAdapter adapter = AnalyticFeature.createGeometryFeatureAdapter( sampleDataTypeId, dimensionNames, sampleDataNamespaceURI, CLUSTERING_CRS); final ByteArrayId dbId = new ByteArrayId( sampleDataTypeId); if (!adapterStore.adapterExists(dbId)) { adapterStore.addAdapter(adapter); return adapter; } else { return adapterStore.getAdapter(dbId); } } public static DataAdapter[] getAdapters( final PropertyManagement propertyManagement ) throws IOException { PersistableStore store = (PersistableStore) StoreParameters.StoreParam.INPUT_STORE.getHelper().getValue( propertyManagement); final AdapterStore adapterStore = store.getDataStoreOptions().createAdapterStore(); final mil.nga.giat.geowave.core.store.CloseableIterator<DataAdapter<?>> it = adapterStore.getAdapters(); final List<DataAdapter> adapters = new LinkedList<DataAdapter>(); while (it.hasNext()) { adapters.add(it.next()); } it.close(); final DataAdapter[] result = new DataAdapter[adapters.size()]; adapters.toArray(result); return result; } public static PrimaryIndex[] getIndices( final PropertyManagement propertyManagement ) { PersistableStore store = (PersistableStore) StoreParameters.StoreParam.INPUT_STORE.getHelper().getValue( propertyManagement); final IndexStore indexStore = store.getDataStoreOptions().createIndexStore(); final mil.nga.giat.geowave.core.store.CloseableIterator<Index<?, ?>> it = indexStore.getIndices(); final List<PrimaryIndex> indices = new LinkedList<PrimaryIndex>(); while (it.hasNext()) { indices.add((PrimaryIndex) it.next()); } try { it.close(); } catch (final IOException e) { LOGGER.warn("Unable to close iterator" + e); } final PrimaryIndex[] result = new PrimaryIndex[indices.size()]; indices.toArray(result); return result; } /* * Method takes in a polygon and generates the corresponding ranges in a * GeoWave spatial index */ protected static List<ByteArrayRange> getGeoWaveRangesForQuery( final Polygon polygon ) { final PrimaryIndex index = new SpatialDimensionalityTypeProvider().createPrimaryIndex(); final List<ByteArrayRange> ranges = DataStoreUtils.constraintsToByteArrayRanges( new SpatialQuery( polygon).getIndexConstraints(index.getIndexStrategy()), index.getIndexStrategy(), -1); return ranges; } public static PrimaryIndex createIndex( final PropertyManagement propertyManagement ) { PersistableStore store = (PersistableStore) StoreParameters.StoreParam.INPUT_STORE.getHelper().getValue( propertyManagement); final IndexStore indexStore = store.getDataStoreOptions().createIndexStore(); return (PrimaryIndex) indexStore.getIndex(new ByteArrayId( propertyManagement.getPropertyAsString(CentroidParameters.Centroid.INDEX_ID))); } public static DataAdapter<?> createAdapter( final PropertyManagement propertyManagement ) throws ClassNotFoundException, InstantiationException, IllegalAccessException { final Class<DimensionExtractor> dimensionExtractorClass = propertyManagement.getPropertyAsClass( CommonParameters.Common.DIMENSION_EXTRACT_CLASS, DimensionExtractor.class); return ClusteringUtils.createAdapter( propertyManagement.getPropertyAsString(CentroidParameters.Centroid.DATA_TYPE_ID), propertyManagement.getPropertyAsString( CentroidParameters.Centroid.DATA_NAMESPACE_URI, BasicFeatureTypes.DEFAULT_NAMESPACE), ((PersistableStore) StoreParameters.StoreParam.INPUT_STORE.getHelper().getValue( propertyManagement)).getDataStoreOptions().createAdapterStore(), dimensionExtractorClass.newInstance().getDimensionNames()); } }