use of org.locationtech.geowave.core.geotime.store.dimension.TimeField in project geowave by locationtech.
the class SpatialDimensionalityTypeProvider method createIndexFromOptions.
public static Index createIndexFromOptions(final SpatialOptions options) {
NumericDimensionDefinition[] dimensions;
boolean isDefaultCRS;
String crsCode = null;
NumericDimensionField<?>[] fields = null;
NumericDimensionField<?>[] fields_temporal = null;
final Integer geometryPrecision = options.getGeometryPrecision();
if ((options.crs == null) || options.crs.isEmpty() || options.crs.equalsIgnoreCase(GeometryUtils.DEFAULT_CRS_STR)) {
dimensions = SPATIAL_DIMENSIONS;
fields = getSpatialFields(geometryPrecision);
isDefaultCRS = true;
crsCode = "EPSG:4326";
} else {
final CoordinateReferenceSystem crs = GeometryUtils.decodeCRS(options.crs);
final CoordinateSystem cs = crs.getCoordinateSystem();
isDefaultCRS = false;
crsCode = options.crs;
dimensions = new NumericDimensionDefinition[cs.getDimension()];
if (options.storeTime) {
fields_temporal = new NumericDimensionField[dimensions.length + 1];
for (int d = 0; d < dimensions.length; d++) {
final CoordinateSystemAxis csa = cs.getAxis(d);
if (!isUnbounded(csa)) {
dimensions[d] = new CustomCRSBoundedSpatialDimension((byte) d, csa.getMinimumValue(), csa.getMaximumValue());
fields_temporal[d] = new CustomCRSSpatialField((CustomCRSBoundedSpatialDimension) dimensions[d], geometryPrecision, crs);
} else {
dimensions[d] = new CustomCRSUnboundedSpatialDimension(DEFAULT_UNBOUNDED_CRS_INTERVAL, (byte) d);
fields_temporal[d] = new CustomCRSSpatialField((CustomCRSUnboundedSpatialDimension) dimensions[d], geometryPrecision, crs);
}
}
fields_temporal[dimensions.length] = new TimeField(Unit.YEAR);
} else {
fields = new NumericDimensionField[dimensions.length];
for (int d = 0; d < dimensions.length; d++) {
final CoordinateSystemAxis csa = cs.getAxis(d);
if (!isUnbounded(csa)) {
if (d == 0) {
dimensions[d] = new CustomCRSBoundedSpatialDimensionX(csa.getMinimumValue(), csa.getMaximumValue());
fields[d] = new CustomCRSSpatialField((CustomCRSBoundedSpatialDimensionX) dimensions[d], geometryPrecision, crs);
}
if (d == 1) {
dimensions[d] = new CustomCRSBoundedSpatialDimensionY(csa.getMinimumValue(), csa.getMaximumValue());
fields[d] = new CustomCRSSpatialField((CustomCRSBoundedSpatialDimensionY) dimensions[d], geometryPrecision, crs);
}
} else {
if (d == 0) {
dimensions[d] = new CustomCRSUnboundedSpatialDimensionX(DEFAULT_UNBOUNDED_CRS_INTERVAL, (byte) d);
fields[d] = new CustomCRSSpatialField((CustomCRSUnboundedSpatialDimensionX) dimensions[d], geometryPrecision, crs);
}
if (d == 1) {
dimensions[d] = new CustomCRSUnboundedSpatialDimensionY(DEFAULT_UNBOUNDED_CRS_INTERVAL, (byte) d);
fields[d] = new CustomCRSSpatialField((CustomCRSUnboundedSpatialDimensionY) dimensions[d], geometryPrecision, crs);
}
}
}
}
}
BasicIndexModel indexModel = null;
if (isDefaultCRS) {
indexModel = new BasicIndexModel(options.storeTime ? getSpatialTemporalFields(geometryPrecision) : getSpatialFields(geometryPrecision));
} else {
indexModel = new CustomCrsIndexModel(options.storeTime ? fields_temporal : fields, crsCode);
}
return new CustomNameIndex(XZHierarchicalIndexFactory.createFullIncrementalTieredStrategy(dimensions, new int[] { // flexible enough to handle n-dimensions
LONGITUDE_BITS, LATITUDE_BITS }, SFCType.HILBERT), indexModel, // TODO append CRS code to ID if its overridden
isDefaultCRS ? (options.storeTime ? DEFAULT_SPATIAL_ID + "_TIME" : DEFAULT_SPATIAL_ID) : (options.storeTime ? DEFAULT_SPATIAL_ID + "_TIME" : DEFAULT_SPATIAL_ID) + "_" + crsCode.substring(crsCode.indexOf(":") + 1));
}
use of org.locationtech.geowave.core.geotime.store.dimension.TimeField in project geowave by locationtech.
the class GeoWaveGTDataStore method getPreferredIndices.
public Index[] getPreferredIndices(final GeotoolsFeatureDataAdapter adapter) {
final List<Index> currentSelectionsList = new ArrayList<>(2);
final List<String> indexNames = SimpleFeaturePrimaryIndexConfiguration.getIndexNames(adapter.getFeatureType());
final boolean canUseTime = adapter.hasTemporalConstraints();
/**
* Requires the indices to EXIST prior to set up of the adapter. Otherwise, only Geospatial is
* chosen and the index Names are ignored.
*/
CoordinateReferenceSystem selectedCRS = null;
try (CloseableIterator<Index> indices = indexStore.getIndices()) {
while (indices.hasNext()) {
final Index index = indices.next();
final CoordinateReferenceSystem indexCRS = GeometryUtils.getIndexCrs(index);
if ((selectedCRS != null) && !selectedCRS.equals(indexCRS)) {
continue;
}
if (!indexNames.isEmpty()) {
// Only used selected preferred indices
if (indexNames.contains(index.getName())) {
selectedCRS = indexCRS;
currentSelectionsList.add(index);
}
}
final NumericDimensionField<?>[] dims = index.getIndexModel().getDimensions();
boolean hasLat = false;
boolean hasLong = false;
boolean hasTime = false;
for (final NumericDimensionField<?> dim : dims) {
hasLat |= SpatialIndexUtils.isLatitudeDimension(dim);
hasLong |= SpatialIndexUtils.isLongitudeDimension(dim);
hasTime |= dim instanceof TimeField;
}
if (hasLat && hasLong) {
// constraints)
if (!hasTime || canUseTime) {
selectedCRS = indexCRS;
currentSelectionsList.add(index);
}
}
}
}
if (currentSelectionsList.isEmpty()) {
currentSelectionsList.add(SpatialDimensionalityTypeProvider.createIndexFromOptions(new SpatialOptions()));
}
return currentSelectionsList.toArray(new Index[currentSelectionsList.size()]);
}
use of org.locationtech.geowave.core.geotime.store.dimension.TimeField in project geowave by locationtech.
the class TemporalDimensionalityTypeProvider method createIndexFromOptions.
public static Index createIndexFromOptions(final TemporalOptions options) {
if (!options.noTimeRanges) {
final NumericDimensionDefinition[] dimensions = TEMPORAL_DIMENSIONS;
final NumericDimensionField<?>[] fields = TEMPORAL_FIELDS;
dimensions[dimensions.length - 1] = new TimeDefinition(options.periodicity);
fields[dimensions.length - 1] = new TimeField(options.periodicity);
final BasicIndexModel indexModel = new BasicIndexModel(fields);
final String combinedArrayID = DEFAULT_TEMPORAL_ID_STR + "_" + options.periodicity;
return new CustomNameIndex(XZHierarchicalIndexFactory.createFullIncrementalTieredStrategy(dimensions, new int[] { 63 }, SFCType.HILBERT, options.maxDuplicates), indexModel, combinedArrayID);
}
final BasicIndexModel indexModel = new BasicIndexModel(new NumericDimensionField[] { new BasicNumericDimensionField<>(TimeField.DEFAULT_FIELD_ID, Long.class) });
return new CustomNameIndex(new SimpleTimeIndexStrategy(), indexModel, DEFAULT_TEMPORAL_ID_STR);
}
use of org.locationtech.geowave.core.geotime.store.dimension.TimeField in project geowave by locationtech.
the class SpatialTemporalQueryTest method createData.
private CommonIndexedPersistenceEncoding createData(final Date start, final Date end, final Coordinate[] coordinates) {
final GeometryFactory factory = new GeometryFactory();
final PersistentDataset<Object> commonData = new MultiFieldPersistentDataset<>();
commonData.addValue(SpatialField.DEFAULT_GEOMETRY_FIELD_NAME, factory.createLineString(coordinates));
commonData.addValue(new TimeField(Unit.YEAR).getFieldName(), Interval.of(Instant.ofEpochMilli(start.getTime()), Instant.ofEpochMilli(end.getTime())));
return new CommonIndexedPersistenceEncoding((short) 1, StringUtils.stringToBinary("1"), StringUtils.stringToBinary("1"), StringUtils.stringToBinary("1"), 1, commonData, new MultiFieldPersistentDataset<byte[]>());
}
use of org.locationtech.geowave.core.geotime.store.dimension.TimeField in project geowave by locationtech.
the class SpatialTemporalDimensionalityTypeProvider method createIndexFromOptions.
public static Index createIndexFromOptions(final SpatialTemporalOptions options) {
NumericDimensionDefinition[] dimensions;
NumericDimensionField<?>[] fields = null;
CoordinateReferenceSystem crs = null;
boolean isDefaultCRS;
String crsCode = null;
final Integer geometryPrecision = options.getGeometryPrecision();
if ((options.crs == null) || options.crs.isEmpty() || options.crs.equalsIgnoreCase(GeometryUtils.DEFAULT_CRS_STR)) {
dimensions = SPATIAL_TEMPORAL_DIMENSIONS;
fields = getSpatialTemporalFields(geometryPrecision);
isDefaultCRS = true;
crsCode = "EPSG:4326";
} else {
crs = GeometryUtils.decodeCRS(options.crs);
final CoordinateSystem cs = crs.getCoordinateSystem();
isDefaultCRS = false;
crsCode = options.crs;
dimensions = new NumericDimensionDefinition[cs.getDimension() + 1];
fields = new NumericDimensionField[dimensions.length];
for (int d = 0; d < (dimensions.length - 1); d++) {
final CoordinateSystemAxis csa = cs.getAxis(d);
if (!isUnbounded(csa)) {
if (d == 0) {
dimensions[d] = new CustomCRSBoundedSpatialDimensionX(csa.getMinimumValue(), csa.getMaximumValue());
fields[d] = new CustomCRSSpatialField((CustomCRSBoundedSpatialDimensionX) dimensions[d], geometryPrecision, crs);
}
if (d == 1) {
dimensions[d] = new CustomCRSBoundedSpatialDimensionY(csa.getMinimumValue(), csa.getMaximumValue());
fields[d] = new CustomCRSSpatialField((CustomCRSBoundedSpatialDimensionY) dimensions[d], geometryPrecision, crs);
}
} else {
if (d == 0) {
dimensions[d] = new CustomCRSUnboundedSpatialDimensionX(DEFAULT_UNBOUNDED_CRS_INTERVAL, (byte) d);
fields[d] = new CustomCRSSpatialField((CustomCRSUnboundedSpatialDimensionX) dimensions[d], geometryPrecision, crs);
}
if (d == 1) {
dimensions[d] = new CustomCRSUnboundedSpatialDimensionY(DEFAULT_UNBOUNDED_CRS_INTERVAL, (byte) d);
fields[d] = new CustomCRSSpatialField((CustomCRSUnboundedSpatialDimensionY) dimensions[d], geometryPrecision, crs);
}
}
}
dimensions[dimensions.length - 1] = new TimeDefinition(options.periodicity);
fields[dimensions.length - 1] = new TimeField(options.periodicity);
}
BasicIndexModel indexModel = null;
if (isDefaultCRS) {
indexModel = new BasicIndexModel(fields);
} else {
indexModel = new CustomCrsIndexModel(fields, crsCode);
}
String combinedArrayID;
if (isDefaultCRS) {
combinedArrayID = DEFAULT_SPATIAL_TEMPORAL_ID_STR + "_" + options.bias + "_" + options.periodicity;
} else {
combinedArrayID = DEFAULT_SPATIAL_TEMPORAL_ID_STR + "_" + (crsCode.substring(crsCode.indexOf(":") + 1)) + "_" + options.bias + "_" + options.periodicity;
}
final String combinedId = combinedArrayID;
return new CustomNameIndex(XZHierarchicalIndexFactory.createFullIncrementalTieredStrategy(dimensions, new int[] { options.bias.getSpatialPrecision(), options.bias.getSpatialPrecision(), options.bias.getTemporalPrecision() }, SFCType.HILBERT, options.maxDuplicates), indexModel, combinedId);
}
Aggregations