package com.esri.hadoop.hive; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import org.apache.hadoop.hive.ql.exec.UDFArgumentException; import org.apache.hadoop.hive.serde2.io.DoubleWritable; import org.apache.hadoop.io.BytesWritable; import org.apache.hadoop.io.IntWritable; import org.junit.Test; import com.esri.core.geometry.Geometry; import com.esri.core.geometry.GeometryEngine; import com.esri.core.geometry.Point; import com.esri.core.geometry.Polygon; import com.esri.core.geometry.Polyline; import com.esri.core.geometry.SpatialReference; import com.esri.core.geometry.ogc.OGCGeometry; public class TestStGeomFromShape { private final static double Epsilon = 0.0001; @Test public void testGeomFromPointShapeWithoutSpatialReference() throws UDFArgumentException { Point point = createFirstLocation(); byte[] esriShape = GeometryEngine.geometryToEsriShape(point); assertNotNull("The shape must not be null!", esriShape); BytesWritable shapeAsWritable = new BytesWritable(esriShape); assertNotNull("The shape writable must not be null!", shapeAsWritable); ST_GeomFromShape fromShape = new ST_GeomFromShape(); BytesWritable geometryAsWritable = fromShape.evaluate(shapeAsWritable); assertNotNull("The geometry writable must not be null!", geometryAsWritable); final int wkid = 0; validatePoint(point, wkid, geometryAsWritable); } @Test public void testGeomFromPointShape() throws UDFArgumentException { Point point = createFirstLocation(); byte[] esriShape = GeometryEngine.geometryToEsriShape(point); assertNotNull("The shape must not be null!", esriShape); BytesWritable shapeAsWritable = new BytesWritable(esriShape); assertNotNull("The shape writable must not be null!", shapeAsWritable); final int wkid = 4326; ST_GeomFromShape fromShape = new ST_GeomFromShape(); BytesWritable geometryAsWritable = fromShape.evaluate(shapeAsWritable, wkid); assertNotNull("The geometry writable must not be null!", geometryAsWritable); validatePoint(point, wkid, geometryAsWritable); } @Test public void testGeomFromLineShape() throws UDFArgumentException { Polyline line = createLine(); byte[] esriShape = GeometryEngine.geometryToEsriShape(line); assertNotNull("The shape must not be null!", esriShape); BytesWritable shapeAsWritable = new BytesWritable(esriShape); assertNotNull("The shape writable must not be null!", shapeAsWritable); final int wkid = 4326; ST_GeomFromShape fromShape = new ST_GeomFromShape(); BytesWritable geometryAsWritable = fromShape.evaluate(shapeAsWritable, wkid); assertNotNull("The geometry writable must not be null!", geometryAsWritable); OGCGeometry ogcGeometry = GeometryUtils.geometryFromEsriShape(geometryAsWritable); assertNotNull("The OGC geometry must not be null!", ogcGeometry); Geometry esriGeometry = ogcGeometry.getEsriGeometry(); assertNotNull("The Esri geometry must not be null!", esriGeometry); assertTrue("The geometries are different!", GeometryEngine.equals(line, esriGeometry, SpatialReference.create(wkid))); } @Test public void testGeomFromPolylineShape() throws UDFArgumentException { Polyline line = createPolyline(); byte[] esriShape = GeometryEngine.geometryToEsriShape(line); assertNotNull("The shape must not be null!", esriShape); BytesWritable shapeAsWritable = new BytesWritable(esriShape); assertNotNull("The shape writable must not be null!", shapeAsWritable); final int wkid = 4326; ST_GeomFromShape fromShape = new ST_GeomFromShape(); BytesWritable geometryAsWritable = fromShape.evaluate(shapeAsWritable, wkid); assertNotNull("The geometry writable must not be null!", geometryAsWritable); OGCGeometry ogcGeometry = GeometryUtils.geometryFromEsriShape(geometryAsWritable); assertNotNull("The OGC geometry must not be null!", ogcGeometry); Geometry esriGeometry = ogcGeometry.getEsriGeometry(); assertNotNull("The Esri geometry must not be null!", esriGeometry); assertTrue("The geometries are different!", GeometryEngine.equals(line, esriGeometry, SpatialReference.create(wkid))); } @Test public void testGeomFromPolygonShape() throws UDFArgumentException { Polygon polygon = createPolygon(); byte[] esriShape = GeometryEngine.geometryToEsriShape(polygon); assertNotNull("The shape must not be null!", esriShape); BytesWritable shapeAsWritable = new BytesWritable(esriShape); assertNotNull("The shape writable must not be null!", shapeAsWritable); final int wkid = 4326; ST_GeomFromShape fromShape = new ST_GeomFromShape(); BytesWritable geometryAsWritable = fromShape.evaluate(shapeAsWritable, wkid); assertNotNull("The geometry writable must not be null!", geometryAsWritable); OGCGeometry ogcGeometry = GeometryUtils.geometryFromEsriShape(geometryAsWritable); assertNotNull("The OGC geometry must not be null!", ogcGeometry); Geometry esriGeometry = ogcGeometry.getEsriGeometry(); assertNotNull("The Esri geometry must not be null!", esriGeometry); assertTrue("The geometries are different!", GeometryEngine.equals(polygon, esriGeometry, SpatialReference.create(wkid))); } private static Point createFirstLocation() { final double longitude = 12.224; final double latitude = 51.829; return new Point(longitude, latitude); } private static Point createSecondLocation() { final double longitude = 12.39807; final double latitude = 51.34933; return new Point(longitude, latitude); } private static Point createThirdLocation() { final double longitude = 6.9823; final double latitude = 50.7657; return new Point(longitude, latitude); } private static Point createFourthLocation() { final double longitude = 7.102594; final double latitude = 50.73733; return new Point(longitude, latitude); } private static Polyline createLine() { Polyline line = new Polyline(); line.startPath(createFirstLocation()); line.lineTo(createSecondLocation()); return line; } private static Polyline createPolyline() { Polyline line = new Polyline(); line.startPath(createFirstLocation()); line.lineTo(createSecondLocation()); line.lineTo(createThirdLocation()); line.lineTo(createFourthLocation()); return line; } private static Polygon createPolygon() { Polygon polygon = new Polygon(); polygon.startPath(createFirstLocation()); polygon.lineTo(createSecondLocation()); polygon.lineTo(createThirdLocation()); polygon.lineTo(createFourthLocation()); polygon.closeAllPaths(); return polygon; } /** * Validates the geometry writable. * * @param point * the represented point location. * @param wkid * the represented spatial reference ID. * @param geometryAsWritable * the geometry represented as {@link BytesWritable}. */ private static void validatePoint(Point point, int wkid, BytesWritable geometryAsWritable) { ST_X getX = new ST_X(); DoubleWritable xAsWritable = getX.evaluate(geometryAsWritable); assertNotNull("The x writable must not be null!", xAsWritable); ST_Y getY = new ST_Y(); DoubleWritable yAsWritable = getY.evaluate(geometryAsWritable); assertNotNull("The y writable must not be null!", yAsWritable); assertEquals("Longitude is different!", point.getX(), xAsWritable.get(), Epsilon); assertEquals("Latitude is different!", point.getY(), yAsWritable.get(), Epsilon); ST_SRID getWkid = new ST_SRID(); IntWritable wkidAsWritable = getWkid.evaluate(geometryAsWritable); assertNotNull("The wkid writable must not be null!", wkidAsWritable); assertEquals("The wkid is different!", wkid, wkidAsWritable.get()); } }