Trato de vectorizar una imagen utilizando java es decir, con GeoTools JAI.
El código es mínima y funciona muy bien en IntelliJ
InputStream stringAsStream = new ByteArrayInputStream(inputAsciiGrid.getBytes(StandardCharsets.UTF_8));
SimpleFeatureIterator vectorizedFeatures = extractor.execute(input, 0, true, null,
null, classificationRanges, null).features();
Mi problema es cuando la ejecución de esta vía como el Maven:
mvn clean package && \
java -jar target/quickstart-1.0.jar
falla con excepción de
RangeLookup: No OperationDescriptor is registered in the current operation registry under this name
código de ejemplo se puede encontrar en https://github.com/geoHeil/jts-vectorize
Nota, el frasco contiene la clase, pero no el OperationDescriptors
de los META-INF/registry.jai
archivos.
jar -tf target/quickstart-1.0.jar| grep RangeLookupProcess
org/geotools/process/raster/RangeLookupProcess.class
editar
He intentado seguir java.lang.ClassNotFoundException: it.geosolutions.jaiext.range.Range y añadí
<dependency>
<groupId>it.geosolutions.jaiext.utilities</groupId>
<artifactId>jt-utilities</artifactId>
<version>1.1.8</version>
</dependency>
<dependency>
<groupId>it.geosolutions.jaiext.iterators</groupId>
<artifactId>jt-iterators</artifactId>
<version>1.1.8</version>
</dependency>
Esto cambia la excepción de:
Exception in thread "main" java.lang.NoClassDefFoundError: it/geosolutions/jaiext/utilities/ImageLayout2
at FooJava.getAsciiGridFromstring(FooJava.java:49)
at FooJava.main(FooJava.java:35)
Caused by: java.lang.ClassNotFoundException: it.geosolutions.jaiext.utilities.ImageLayout2
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 2 more
make: *** [run-java] Error 1
a pesar de que una vez más la clase está ahí:
geoheil@geoheilsMacBook ~/Downloads/vectorize/jts-vectorize [20:36:45]
> $ jar -tf target/quickstart-1.0.jar| grep ImageLayout2 [±master ●●]
org/jaitools/imageutils/ImageLayout2.class
esto parece ser un conflicto de versiones. Cuando revertir y la adición de las versiones también enumerados en ( https://github.com/geotools/geotools/blob/18.4/pom.xml#L97 ):
<properties>
<geotools.version>18.4</geotools.version>
<jaiext.version>1.0.16</jaiext.version>
</properties>
<dependencies>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-main</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-arcgrid</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-process-raster</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>it.geosolutions.jaiext.utilities</groupId>
<artifactId>jt-utilities</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>it.geosolutions.jaiext.rlookup</groupId>
<artifactId>jt-rlookup</artifactId>
<version>${jaiext.version}</version>
</dependency>
</dependencies>
El error es de nuevo la inicial.
edición 2
Registrar manualmente el descriptor de la operación que falta:
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/javax.media.jai.registryFile.jai</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/registryFile.jaiext</resource>
</transformer>
y la adición de los dos archivos (ver arriba) con los nombres de los contenidos:
# --- JAI ext manual re-registration ---
descriptor it.geosolutions.jaiext.rlookup.RangeLookupDescriptor
me da una nueva excepción:
java.lang.RuntimeException: - Unable to render RenderedOp for this operation.
at javax.media.jai.RenderedOp.createInstance(RenderedOp.java:827)
at javax.media.jai.RenderedOp.createRendering(RenderedOp.java:867)
at javax.media.jai.RenderedOp.getRendering(RenderedOp.java:888)
at javax.media.jai.RenderedOp$1.getPropertyNames(RenderedOp.java:1791)
at javax.media.jai.PropertyEnvironment.mapDefaults(PropertyEnvironment.java:270)
at javax.media.jai.PropertyEnvironment.getPropertyNames(PropertyEnvironment.java:125)
at javax.media.jai.WritablePropertySourceImpl.addProperties(WritablePropertySourceImpl.java:298)
at javax.media.jai.RenderedOp.createPropertySource(RenderedOp.java:1817)
at javax.media.jai.RenderedOp.getPropertyNames(RenderedOp.java:1851)
at javax.media.jai.PropertySourceImpl.<init>(PropertySourceImpl.java:143)
at org.geotools.coverage.AbstractCoverage.<init>(AbstractCoverage.java:139)
at org.geotools.coverage.grid.AbstractGridCoverage.<init>(AbstractGridCoverage.java:102)
at org.geotools.coverage.grid.GridCoverage2D.<init>(GridCoverage2D.java:186)
at org.geotools.coverage.grid.GridCoverageFactory.create(GridCoverageFactory.java:589)
at org.geotools.process.raster.RangeLookupProcess.execute(RangeLookupProcess.java:208)
at org.geotools.process.raster.RangeLookupProcess.execute(RangeLookupProcess.java:234)
at org.geotools.process.raster.PolygonExtractionProcess.execute(PolygonExtractionProcess.java:167)
at FooJava.getWktForDbRangeFromRaster(FooJava.java:57)
at FooJava.main(FooJava.java:36)
Sin embargo, esto no es necesariamente para ser considerado como un progreso, es decir, ahora incluso IntelliJ no se puede iniciar. Falla con: ExceptionInInitializerError
debido a excepción de puntero nulo
Creo que la configuración de los descriptores se leen desde registryFile.jai
el archivo. (*)
Cuando se crea frasco con dependencias, registryFile.jai archivo se sobrescribe con el contenido del último frasco. La fusión de contenidos registryFile.jai con la siguiente configuración añadido al complemento sombra corrige este problema. (Esto se añade a la fuente de github que ya ha proporcionado)
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/registryFile.jai</resource>
</transformer>
(No es necesario crear registryFile.jai en sus proyectos de recursos de carpetas / META-INF.)
(*) He intentado añadir la configuración de diferentes archivo llamado y no encontrar el descriptor. Incluso con tratar OperationRegistry.updateFromStream (es); comando no funcionó.