polígono vectorize usando JTS con búsqueda gama

Georg sanador:

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 OperationDescriptorsde los META-INF/registry.jaiarchivos.

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: ExceptionInInitializerErrordebido a excepción de puntero nulo

miskender:

Creo que la configuración de los descriptores se leen desde registryFile.jaiel 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ó.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=192040&siteId=1
Recomendado
Clasificación