package eu.esdihumboldt.cst.functions.geometric.test.reprojectgeometry;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.xml.namespace.QName;
import org.geotools.geometry.jts.JTS;
import org.geotools.referencing.CRS;
import org.junit.Test;
import org.opengis.referencing.operation.MathTransform;
import com.vividsolutions.jts.geom.Geometry;
import eu.esdihumboldt.cst.ConceptualSchemaTransformer;
import eu.esdihumboldt.cst.test.AbstractTransformationTest;
import eu.esdihumboldt.cst.test.TransformationExample;
import eu.esdihumboldt.hale.common.align.service.FunctionService;
import eu.esdihumboldt.hale.common.align.service.TransformationFunctionService;
import eu.esdihumboldt.hale.common.align.service.impl.AlignmentFunctionService;
import eu.esdihumboldt.hale.common.align.service.impl.AlignmentTransformationFunctionService;
import eu.esdihumboldt.hale.common.align.transformation.service.impl.DefaultInstanceSink;
import eu.esdihumboldt.hale.common.core.io.impl.NullProgressIndicator;
import eu.esdihumboldt.hale.common.core.service.ServiceManager;
import eu.esdihumboldt.hale.common.core.service.ServiceProvider;
import eu.esdihumboldt.hale.common.instance.geometry.DefaultGeometryProperty;
import eu.esdihumboldt.hale.common.instance.model.Instance;
import eu.esdihumboldt.hale.common.instance.model.InstanceCollection;
import eu.esdihumboldt.hale.common.instance.model.impl.DefaultGroup;
import eu.esdihumboldt.hale.common.instance.model.impl.DefaultInstance;
/**
* Tests for the <code>ReprojectGeometry</code> transformation function.
*/
public class ReprojectGeometryTest extends AbstractTransformationTest {
@Override
protected List<Instance> transformData(TransformationExample example) throws Exception {
ConceptualSchemaTransformer transformer = new ConceptualSchemaTransformer();
DefaultInstanceSink sink = new DefaultInstanceSink();
final Map<Class<?>, Object> customServices = new HashMap<>();
customServices.put(FunctionService.class,
new AlignmentFunctionService(example.getAlignment()));
customServices.put(TransformationFunctionService.class,
new AlignmentTransformationFunctionService(example.getAlignment()));
final ServiceProvider serviceProvider = new ServiceProvider() {
private final ServiceProvider projectScope = new ServiceManager(
ServiceManager.SCOPE_PROJECT);
@SuppressWarnings("unchecked")
@Override
public <T> T getService(Class<T> serviceInterface) {
if (customServices.containsKey(serviceInterface)) {
return (T) customServices.get(serviceInterface);
}
// FIXME global scope not supported yet
return projectScope.getService(serviceInterface);
}
};
transformer.transform(example.getAlignment(), example.getSourceInstances(), sink,
serviceProvider, new NullProgressIndicator());
return sink.getInstances();
}
@SuppressWarnings("javadoc")
@Test
public void testReproject() throws Exception {
TestData tr = new TestData(TestDataConfiguration.REPROJECT);
List<Instance> result = transformData(tr);
assertTrue(result.size() > 0);
Geometry aspectedGeometry = null;
InstanceCollection sourceInstances = tr.getSourceInstances();
Iterator<Instance> sit = sourceInstances.iterator();
if (sit.hasNext()) {
Instance i = sit.next();
DefaultInstance di = (DefaultInstance) (i
.getProperty(new QName("eu:esdihumboldt:hale:test", "geometry"))[0]);
DefaultGroup dg = (DefaultGroup) (di
.getProperty(new QName("http://www.opengis.net/gml/_Geometry", "choice"))[0]);
DefaultInstance dig = (DefaultInstance) (dg
.getProperty(new QName("http://www.opengis.net/gml", "Point"))[0]);
DefaultGeometryProperty<?> value = (DefaultGeometryProperty<?>) dig.getValue();
DefaultGeometryProperty<?> geom = value;
MathTransform transform = CRS.findMathTransform(geom.getCRSDefinition().getCRS(),
CRS.decode("EPSG:4326"), false);
aspectedGeometry = JTS.transform(geom.getGeometry(), transform);
}
assertNotNull(aspectedGeometry);
Instance resultInstance = result.get(0);
DefaultGeometryProperty<?> geom = (DefaultGeometryProperty<?>) ((DefaultInstance) resultInstance
.getProperty(new QName("eu:esdihumboldt:hale:test", "geometry"))[0]).getValue();
String code = CRS.lookupIdentifier(geom.getCRSDefinition().getCRS(), true);
assertEquals("EPSG:4326", code);
assertEquals(aspectedGeometry.getCoordinate().x, geom.getGeometry().getCoordinate().x, 0);
assertEquals(aspectedGeometry.getCoordinate().y, geom.getGeometry().getCoordinate().y, 0);
}
}