J'essaye d'écrire une extension OSMOSIS qui utilise GeoTools et lit une image GeoTiff.Module JAI ImageRead se perdre
J'ai écrit un exemple de travail minimum de ce qu'il fait:
package that.is.my.test;
import java.io.File;
import java.io.IOException;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.gce.geotiff.GeoTiffReader;
import org.geotools.geometry.Envelope2D;
import org.opengis.coverage.grid.GridEnvelope;
public class ExampleClass {
public static void main(String[] args) {
new ExampleClass();
}
public ExampleClass() {
try {
File file = new File("<GEOTIFFFILE>");
GeoTiffReader reader = new GeoTiffReader(file);
GridCoverage2D coverage = (GridCoverage2D) reader.read(null);
GridEnvelope gridBounds = coverage.getGridGeometry().getGridRange();
System.out.println("grid bounds: " + gridBounds);
Envelope2D worldBounds = coverage.getEnvelope2D();
System.out.println("world bounds: " + worldBounds);
int numBands = coverage.getNumSampleDimensions();
System.out.println("num bands: " + numBands);
System.out.println("Goodbye.");
} catch (IllegalArgumentException | IOException e) {
e.printStackTrace();
}
}
}
Note: Ceci est une classe d'exemple minimal, mais le code dans le plugin OSMOSE ne fait rien d'autre encore.
Je peux exécuter cette classe exemple à partir de NetBeans, et cela fonctionne très bien. Je peux l'emballer dans un pot runnable, et cela fonctionne aussi bien.
Le plugin OSMOSIS ne peut pas être exécuté à partir de NetBeans, car il doit être compilé dans un fichier jar puis être appelé par OSMOSIS lui-même. Mais quand je fais cela, la ligne commençant par GridCoverage2D
me donne un IllegalArgumentException
avec le message ImageRead: No OperationDescriptor is registered in the current operation registry under this name.
. Lorsque je laisse les deux classes imprimer une liste complète de registre JAI, je peux voir que dans le cas d'OSMOSIS, ImageRead
, ImageWrite
et quelques autres sont tout simplement manquants.
Je ne peux tout simplement pas comprendre comment cela peut arriver! Quand je regarde dans les pots, le fichier META-INF\services\javax.imageio.spi.ImageReaderSpi
existe dans les deux, avec exactement le même contenu.
Ceci est mon pom.xml du plug-in, la classe exemple a les mêmes dépendances et prises en pension et de construire des directives:
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>hello.OSMOSIS</groupId>
<artifactId>my-osmosis-plugin</artifactId>
<version>1.0-SNAPSHOT${jarWarning}</version>
<packaging>jar</packaging>
<name>OSMOSIS TEST plugin</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<osmosisScope>provided</osmosisScope> <!-- configure this by using the profiles, this is fallback only. -->
<geotools.version>12-RC1</geotools.version>
</properties>
<!-- We define two different profiles:
debugWithNetbeans includes all the OSMOSIS jars into the plugin,
so that we can test-run the plugin with Netbeans (or anything else).
Note: This does not work yet...
pluginProductions doesn't include the OSMOSIS sources, because later on
the plugin will be called BY osmosis and will not need the jars anymore.
DO NOT FORGET to set this correctly :-) -->
<profiles>
<profile>
<id>debugWithNetbeans</id>
<properties>
<osmosisScope>compile</osmosisScope>
<jarWarning>-DEBUG-BUILD</jarWarning>
</properties>
</profile>
<profile>
<id>pluginProduction</id>
<properties>
<osmosisScope>provided</osmosisScope>
<jarWarning></jarWarning>
</properties>
</profile>
</profiles>
<repositories>
<repository>
<id>osgeo</id>
<name>Open Source Geospatial Foundation Repository</name>
<url>http://download.osgeo.org/webdav/geotools/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.openstreetmap.osmosis</groupId>
<artifactId>osmosis-core</artifactId>
<version>0.43-RELEASE</version>
<scope>${osmosisScope}</scope>
</dependency>
<dependency>
<groupId>org.openstreetmap.osmosis</groupId>
<artifactId>osmosis-xml</artifactId>
<version>0.43.1</version>
<scope>${osmosisScope}</scope>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-geotiff</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-epsg-hsql</artifactId>
<version>${geotools.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.3.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestEntries>
<Main-Class>hello.OSMOSIS.DoNothingBecauseImAPluginOnly</Main-Class>
<Implementation-Vendor>Blapfi</Implementation-Vendor>
<Implementation-Vendor-Id>huiuiui</Implementation-Vendor-Id>
<Implementation-Version>bapfi</Implementation-Version>
</manifestEntries>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Peut-être que quelqu'un peut me donner une idée sur ce que je fais mal? Serait très bien. :-)