package mil.nga.giat.geowave.core.geotime; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Set; import junit.framework.Assert; import mil.nga.giat.geowave.core.geotime.index.dimension.LatitudeDefinition; import mil.nga.giat.geowave.core.geotime.index.dimension.LongitudeDefinition; import mil.nga.giat.geowave.core.index.ByteArrayId; import mil.nga.giat.geowave.core.index.ByteArrayRange; import mil.nga.giat.geowave.core.index.IndexMetaData; import mil.nga.giat.geowave.core.index.MultiDimensionalCoordinateRanges; import mil.nga.giat.geowave.core.index.MultiDimensionalCoordinates; import mil.nga.giat.geowave.core.index.NumericIndexStrategy; import mil.nga.giat.geowave.core.index.dimension.NumericDimensionDefinition; import mil.nga.giat.geowave.core.index.sfc.data.MultiDimensionalNumericData; import mil.nga.giat.geowave.core.store.query.BasicQuery.Constraints; import org.junit.Before; import org.junit.Test; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.Point; import com.vividsolutions.jts.geom.Polygon; public class GeometryUtilsTest { private Point point3D; private Point point2D; @Before public void createGeometry() { final GeometryFactory gf = new GeometryFactory(); point2D = gf.createPoint(new Coordinate( 1, 2)); point3D = gf.createPoint(new Coordinate( 1, 2, 3)); } @Test public void test2DGeometryBinaryConversion() { // convert 2D point to binary representation final byte[] bytes = GeometryUtils.geometryToBinary(point2D); // load the converted 2D geometry final Geometry convGeo = GeometryUtils.geometryFromBinary(bytes); // get the coordinates for each version final Coordinate origCoords = point2D.getCoordinates()[0]; final Coordinate convCoords = convGeo.getCoordinates()[0]; Assert.assertEquals( origCoords.x, convCoords.x); Assert.assertEquals( origCoords.y, convCoords.y); Assert.assertTrue(Double.isNaN(convCoords.getOrdinate(Coordinate.Z))); } @Test public void test3DGeometryBinaryConversion() { // convert 3D point to binary representation final byte[] bytes = GeometryUtils.geometryToBinary(point3D); // load the converted 3D geometry final Geometry convGeo = GeometryUtils.geometryFromBinary(bytes); // get the coordinates for each version final Coordinate origCoords = point3D.getCoordinates()[0]; final Coordinate convCoords = convGeo.getCoordinates()[0]; Assert.assertEquals( origCoords.x, convCoords.x); Assert.assertEquals( origCoords.y, convCoords.y); Assert.assertEquals( origCoords.z, convCoords.z); } @Test public void testConstraintGeneration() { final GeometryFactory gf = new GeometryFactory(); final Geometry multiPolygon = gf.createMultiPolygon(new Polygon[] { gf.createPolygon(new Coordinate[] { new Coordinate( 20.0, 30), new Coordinate( 20, 40), new Coordinate( 10, 40), new Coordinate( 10, 30), new Coordinate( 20, 30) }), gf.createPolygon(new Coordinate[] { new Coordinate( -9, -2), new Coordinate( -9, -1), new Coordinate( -8, -1), new Coordinate( -8, -2), new Coordinate( -9, -2) }) }); final Constraints constraints = GeometryUtils.basicConstraintsFromGeometry(multiPolygon); final List<MultiDimensionalNumericData> results = constraints .getIndexConstraints(new ExampleNumericIndexStrategy()); assertEquals( 2, results.size()); assertTrue(Arrays.equals( new double[] { 10, 30 }, results.get( 0).getMinValuesPerDimension())); assertTrue(Arrays.equals( new double[] { 20, 40 }, results.get( 0).getMaxValuesPerDimension())); assertTrue(Arrays.equals( new double[] { -9, -2 }, results.get( 1).getMinValuesPerDimension())); assertTrue(Arrays.equals( new double[] { -8, -1 }, results.get( 1).getMaxValuesPerDimension())); } public static class ExampleNumericIndexStrategy implements NumericIndexStrategy { @Override public byte[] toBinary() { return null; } @Override public void fromBinary( final byte[] bytes ) {} @Override public List<ByteArrayRange> getQueryRanges( final MultiDimensionalNumericData indexedRange, IndexMetaData... hints ) { return null; } @Override public List<ByteArrayRange> getQueryRanges( final MultiDimensionalNumericData indexedRange, final int maxEstimatedRangeDecomposition, IndexMetaData... hints ) { return null; } @Override public List<ByteArrayId> getInsertionIds( final MultiDimensionalNumericData indexedData ) { return null; } @Override public List<ByteArrayId> getInsertionIds( final MultiDimensionalNumericData indexedData, final int maxEstimatedDuplicateIds ) { return null; } @Override public MultiDimensionalNumericData getRangeForId( final ByteArrayId insertionId ) { return null; } @Override public MultiDimensionalCoordinates getCoordinatesPerDimension( final ByteArrayId insertionId ) { return null; } @Override public NumericDimensionDefinition[] getOrderedDimensionDefinitions() { return new NumericDimensionDefinition[] { new LongitudeDefinition(), new LatitudeDefinition() }; } @Override public String getId() { return "test-gt"; } @Override public double[] getHighestPrecisionIdRangePerDimension() { return null; } @Override public Set<ByteArrayId> getNaturalSplits() { return null; } @Override public int getByteOffsetFromDimensionalIndex() { // TODO Auto-generated method stub return 0; } @Override public List<IndexMetaData> createMetaData() { return Collections.emptyList(); } @Override public MultiDimensionalCoordinateRanges[] getCoordinateRangesPerDimension( MultiDimensionalNumericData dataRange, IndexMetaData... hints ) { // TODO Auto-generated method stub return null; } } }