In our current project, we use the maven configuration to manage dependencies and run unit tests. At some point in the development, one of our tests stopped working (we donβt know exactly where exactly, therefore we donβt know what exactly has changed). A specific error is the conversion from Cartesian coordinates to geographical coordinates using geotets (9 and 9.1). The juicy part is that the same test works fine in an eclipse. We pretty much worked on the problem analysis and created a minimal example showing the behavior that we see where we are (reasonably) sure that this is not a problem with the classpath.
Example
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example.geotest</groupId> <artifactId>geotest</artifactId> <name>geotest</name> <version>1.0.0</version> <description></description> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <geotools.version>9.1</geotools.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.geotools</groupId> <artifactId>gt-main</artifactId> <version>${geotools.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.0</version> <configuration> <source>1.7</source> <target>1.7</target> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <archive> <manifest> <mainClass>com.example.geotest.Geotest</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </plugin> </plugins> </build> <repositories> <repository> <id>maven2-repository.dev.java.net</id> <name>Java.net repository</name> <url>http://download.java.net/maven/2</url> </repository> <repository> <id>osgeo</id> <name>Open Source Geospatial Foundation Repository</name> <url>http://download.osgeo.org/webdav/geotools/</url> </repository> </repositories> </project>
Tester.java
package com.example.geotest; import java.awt.geom.Point2D; import java.util.Collections; import java.util.Map; import org.geotools.referencing.CRS; import org.geotools.referencing.ReferencingFactoryFinder; import org.geotools.referencing.crs.DefaultGeographicCRS; import org.geotools.referencing.cs.DefaultCartesianCS; import org.geotools.referencing.factory.ReferencingFactoryContainer; import org.geotools.referencing.operation.DefaultConversion; import org.geotools.referencing.operation.DefiningConversion; import org.junit.Test; import org.opengis.parameter.ParameterValueGroup; import org.opengis.referencing.crs.CRSFactory; import org.opengis.referencing.crs.GeographicCRS; import org.opengis.referencing.crs.ProjectedCRS; import org.opengis.referencing.cs.CartesianCS; import org.opengis.referencing.operation.Conversion; import org.opengis.referencing.operation.MathTransform; import org.opengis.referencing.operation.MathTransformFactory; import org.opengis.referencing.operation.TransformException; public class Tester { @Test public void testtesttest() throws Exception {
If we call "mvn test" on this, we get the following exception:
Tests in error: testtesttest(com.example.geotest.Tester): org.geotools.referencing.operation.projection.ProjectionException: The transform result may be 9.478,277 meters away from the expected position. Are you sure that the input coordinates are inside this map projection area of validity? The point is located 43Β°20.6'E away from the central meridian and 5Β°19.1'N away from the latitude of origin. The projection is "Transverse_Mercator".
If we run the JUnit test from eclipse, this works fine. Any ideas why this is happening or how we can avoid it?
As a side note: the following three lines are a workaround for legacy factory.createProjectedCRS methods (properties, geoCRS, null, parameters, cartCS) if anyone has a better solution would be my guest :)
CRSFactory crsFactory = factories.getCRSFactory(); DefiningConversion conv = new DefiningConversion("test", parameters); projCRS = crsFactory.createProjectedCRS(properties, geoCRS, conv, cartCS);
source share