2014-12-11 25 views
7

Sto eseguendo Geotools all'interno di Apache Storm e sto avendo un po 'di tempo con la gestione delle dipendenze geotools. Ogni cosa funziona quando eseguo localmente il cluster storm (Windows 7 laptop), ma quando lo distribuisco al cluster ottengo questa eccezione nei miei log.Geotools non riesce a trovare HSG EPSG DB, genera errore: NoSuchAuthorityCodeException

EDIT: Ecco il Java che uso che chiama questa funzionalità

 GridCoverage2D image = 
new GeoTiffReader(f).read(new GeneralParameterValue[]{policy, gridsize, useJaiRead}); 
     /** 
     * reproject to WGS84 
     */ 
     CoordinateReferenceSystem targetCRS = CRS.decode("EPSG:4326"); 
     GridCoverage2D reprojectedImage = (GridCoverage2D) Operations.DEFAULT.resample(image, targetCRS); 

Ecco il mio ambiente

geotools 11.1 
java 7 
POM is below 
running on windows 7 when in local mode (works perfectly here) 
this problem happens on Ubuntu 12.04.5 LTS (GNU/Linux 3.2.0-63-virtual x86_64) 

here's the exception from the log 


[ERROR] Exception in Bolt org.geotools.data.DataSourceException: GEOTIFF Module Error Report 
No code "EPSG:32637" from authority "EPSG" found for object of type "EngineeringCRS". 
ModelPixelScaleTag: [2.0,2.0,0.0] 
ModelTiePointTag: (1 tie points) 
TP #0: [0.0,0.0,0.0] -> [337668.0,3837288.0,0.0] 
ModelTransformationTag: NOT AVAILABLE 
GeoKey #1: Key = 2049, Value = GCS_WGS_1984 
GeoKey #2: Key = 2054, Value = 9102 
GeoKey #3: Key = 3072, Value = 32637 
GeoKey #4: Key = 1024, Value = 1 
GeoKey #5: Key = 1025, Value = 1 
GeoKey #6: Key = 1026, Value = PCS Name = WGS_1984_UTM_zone_37N 
GeoKey #7: Key = 3076, Value = 9001 
org.opengis.referencing.NoSuchAuthorityCodeException: No code "EPSG:32637" from authority "EPSG" found for object of type "EngineeringCRS". 
     at org.geotools.referencing.factory.epsg.CartesianAuthorityFactory.noSuchAuthorityException(CartesianAuthorityFactory.java:136) 
     at org.geotools.referencing.factory.epsg.CartesianAuthorityFactory.createEngineeringCRS(CartesianAuthorityFactory.java:130) 
     at org.geotools.referencing.factory.epsg.CartesianAuthorityFactory.createCoordinateReferenceSystem(CartesianAuthorityFactory.java:121) 
     at org.geotools.referencing.factory.AuthorityFactoryAdapter.createCoordinateReferenceSystem(AuthorityFactoryAdapter.java:802) 
     at org.geotools.coverage.grid.io.imageio.geotiff.GeoTiffMetadata2CRSAdapter.createProjectedCoordinateReferenceSystem(GeoTiffMetadata2CRSAdapter.java:284) 
     at org.geotools.coverage.grid.io.imageio.geotiff.GeoTiffMetadata2CRSAdapter.createCoordinateSystem(GeoTiffMetadata2CRSAdapter.java:205) 
     at org.geotools.gce.geotiff.GeoTiffReader.getHRInfo(GeoTiffReader.java:299) 
     at org.geotools.gce.geotiff.GeoTiffReader.<init>(GeoTiffReader.java:211) 
     at org.geotools.gce.geotiff.GeoTiffReader.<init>(GeoTiffReader.java:156) 
     at dgi.eii.utils.PixelExtractor.extract(PixelExtractor.java:80) 
     at dgi.eii.storm.bolts.RasterPixelExtractorBolt.execute(RasterPixelExtractorBolt.java:59) 
     at backtype.storm.daemon.executor$fn__5641$tuple_action_fn__5643.invoke(executor.clj:631) 
     at backtype.storm.daemon.executor$mk_task_receiver$fn__5564.invoke(executor.clj:399) 
     at backtype.storm.disruptor$clojure_handler$reify__745.onEvent(disruptor.clj:58) 
     at backtype.storm.utils.DisruptorQueue.consumeBatchToCursor(DisruptorQueue.java:125) 
     at backtype.storm.utils.DisruptorQueue.consumeBatchWhenAvailable(DisruptorQueue.java:99) 
     at backtype.storm.disruptor$consume_batch_when_available.invoke(disruptor.clj:80) 
     at backtype.storm.daemon.executor$fn__5641$fn__5653$fn__5700.invoke(executor.clj:746) 
     at backtype.storm.util$async_loop$fn__457.invoke(util.clj:431) 
     at clojure.lang.AFn.run(AFn.java:24) 
     at java.lang.Thread.run(Thread.java:745) 

Inoltre ottengo lo stesso errore quando incontra un'immagine con EPSQ: 4326

[ERROR] Exception in Bolt org.geotools.data.DataSourceException: GEOTIFF Module Error Report 
No code "EPSG:4326" from authority "EPSG" found for object of type "EngineeringCRS". 
ModelPixelScaleTag: [2.0230196490091333E-5,2.0230196490071028E-5,0.0] 
ModelTiePointTag: (1 tie points) 
TP #0: [0.0,0.0,0.0] -> [36.8167576323252,34.429979601192464,0.0] 
ModelTransformationTag: NOT AVAILABLE 
GeoKey #1: Key = 2048, Value = 4326 
GeoKey #2: Key = 2049, Value = GCS_WGS_1984 
GeoKey #3: Key = 2054, Value = 9102 
GeoKey #4: Key = 1024, Value = 2 
GeoKey #5: Key = 2057, Value = 6378137.0 
GeoKey #6: Key = 1025, Value = 1 
GeoKey #7: Key = 2059, Value = 298.257223563 
org.opengis.referencing.NoSuchAuthorityCodeException: No code "EPSG:4326" from authority "EPSG" found for object of type "EngineeringCRS". 
     at org.geotools.referencing.factory.epsg.CartesianAuthorityFactory.noSuchAuthorityException(CartesianAuthorityFactory.java:136) 
     at org.geotools.referencing.factory.epsg.CartesianAuthorityFactory.createEngineeringCRS(CartesianAuthorityFactory.java:130) 
     at org.geotools.referencing.factory.epsg.CartesianAuthorityFactory.createCoordinateReferenceSystem(CartesianAuthorityFactory.java:121) 
     at org.geotools.referencing.factory.AuthorityFactoryAdapter.createCoordinateReferenceSystem(AuthorityFactoryAdapter.java:802) 
     at org.geotools.coverage.grid.io.imageio.geotiff.GeoTiffMetadata2CRSAdapter.createGeographicCoordinateReferenceSystem(GeoTiffMetadata2CRSAdapter.java:389) 
     at org.geotools.coverage.grid.io.imageio.geotiff.GeoTiffMetadata2CRSAdapter.createCoordinateSystem(GeoTiffMetadata2CRSAdapter.java:208) 
     at org.geotools.gce.geotiff.GeoTiffReader.getHRInfo(GeoTiffReader.java:299) 
     at org.geotools.gce.geotiff.GeoTiffReader.<init>(GeoTiffReader.java:211) 
     at org.geotools.gce.geotiff.GeoTiffReader.<init>(GeoTiffReader.java:156) 
     at dgi.eii.utils.PixelExtractor.extract(PixelExtractor.java:80) 
     at dgi.eii.storm.bolts.RasterPixelExtractorBolt.execute(RasterPixelExtractorBolt.java:59) 
     at backtype.storm.daemon.executor$fn__5641$tuple_action_fn__5643.invoke(executor.clj:631) 
     at backtype.storm.daemon.executor$mk_task_receiver$fn__5564.invoke(executor.clj:399) 
     at backtype.storm.disruptor$clojure_handler$reify__745.onEvent(disruptor.clj:58) 
     at backtype.storm.utils.DisruptorQueue.consumeBatchToCursor(DisruptorQueue.java:125) 
     at backtype.storm.utils.DisruptorQueue.consumeBatchWhenAvailable(DisruptorQueue.java:99) 
     at backtype.storm.disruptor$consume_batch_when_available.invoke(disruptor.clj:80) 
     at backtype.storm.daemon.executor$fn__5641$fn__5653$fn__5700.invoke(executor.clj:746) 
     at backtype.storm.util$async_loop$fn__457.invoke(util.clj:431) 
     at clojure.lang.AFn.run(AFn.java:24) 
     at java.lang.Thread.run(Thread.java:745) 

Ho visto diverse risposte che indicavano che ho bisogno di mettere il gt-epsg-hsql nel mio po m, e ho, ancora non trova quello di cui ha bisogno.

Qui sono i miei GeoTools voci POM

<dependency> 
      <groupId>org.geotools</groupId> 
      <artifactId>gt-swing</artifactId> 
      <version>11.1</version>   
     </dependency> 
     <dependency> 
      <groupId>org.geotools</groupId> 
      <artifactId>gt-opengis</artifactId> 
      <version>11.1</version>   
     </dependency> 
     <dependency> 
      <groupId>org.geotools</groupId> 
      <artifactId>gt-epsg-hsql</artifactId> 
      <version>11.1</version>     
     </dependency> 
     <dependency> 
      <groupId>org.geotools</groupId> 
      <artifactId>gt-geotiff</artifactId> 
      <version>11.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.geotools</groupId> 
      <artifactId>gt-image</artifactId> 
      <version>11.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.geotools</groupId> 
      <artifactId>gt-wms</artifactId> 
      <version>11.1</version> 
     </dependency> 

ecco come lo sto costruendo il super-vaso con plugin di Maven ombra

<build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-shade-plugin</artifactId> 
       <executions> 
        <execution> 
         <phase>package</phase> 
         <goals> 
          <goal>shade</goal> 
         </goals> 
        </execution> 
       </executions> 
       <configuration> 
        <archive> 
         <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile> 
        </archive> 
        <!-- <minimizeJar>true</minimizeJar>--> 
        <shadedArtifactAttached>true</shadedArtifactAttached> 
        <shadedClassifierName>stand-alone</shadedClassifierName> 
        <artifactSet> 
         <excludes>     
          <exclude>org.slf4j:slf4j-api:jar:</exclude> 
          <exclude>org.slf4j:slf4j-simple:jar:1.6.4:jar:</exclude> 
          <exclude>org.slf4j:slf4j-log4j12:jar:</exclude> 
          <exclude>org.slf4j:jcl-over-slf4j:jar:</exclude> 
          <exclude>org.slf4j:slf4j-api:jar:1.7.5:jar:</exclude> 
          <!-- <exclude>org.slf4j*:</exclude>--> 
          <exclude>commons-logging:commons-logging:jar:</exclude> 
          <exclude>commons-logging:commons-logging-api:jar:</exclude> 
         </excludes> 
        </artifactSet> 
        <filters> 
         <filter> 
          <artifact>*:*</artifact> 
          <excludes> 
           <exclude>META-INF/*.SF</exclude> 
           <exclude>META-INF/*.DSA</exclude> 
           <exclude>META-INF/*.RSA</exclude> 
          </excludes> 
         </filter> 
        </filters> 
        <finalName>storm-topos</finalName> 
        <transformers> 
         <transformer 
          implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
          <mainClass>dgi.eii.storm.base.StormTopologyRunner</mainClass> 
         </transformer> 
         <!-- <transformer 
          implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
          <resource>META-INF/spring.handlers</resource> 
         </transformer> 
         <transformer 
          implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
          <resource>META-INF/spring.schemas</resource> 
         </transformer>--> 
        </transformers> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 

EDIT: Così ho capito alcune cose e ci hanno dato un po 'oltre ... ora ricevendo questo errore

[ERROR] Exception in Bolt org.geotools.data.DataSourceException: org.hsqldb.DatabaseURL.parseURL(Ljava/lang/String;ZZ)Lorg/hsqldb/persist/HsqlProperties; 

Questo leggero vantaggio il cemento che ha portato al suddetto nuovo errore era dovuto all'utilizzo dei giusti trasformatori e all'uso del plugin maven jar per iniettare le voci giuste nel file MANIFEST.MF. Ecco la nuova sezione build di mia POM, che potrebbe aiutare qualcuno almeno di superare il consolidamento di file GeoTools' META-INF/servizi e per iniettare le voci giuste per superare la vecchia errore vendorname cannot be null!

<build> 
    <resources> 
     <resource> 
      <directory>${basedir}/src/main/resources</directory> 
      <filtering>false</filtering> 
      <includes> 
       <include>schema.xsd</include> 
      </includes> 
     </resource> 
    </resources> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
       <shadedArtifactAttached>true</shadedArtifactAttached> 
       <shadedClassifierName>stand-alone</shadedClassifierName> 
       <artifactSet> 
        <excludes> 
         <exclude>org.slf4j:slf4j-api:jar:</exclude> 
         <exclude>org.slf4j:slf4j-log4j12:jar:</exclude> 
         <exclude>org.slf4j:jcl-over-slf4j:jar:</exclude> 

         <exclude>commons-logging:commons-logging:jar:</exclude> 
         <exclude>commons-logging:commons-logging-api:jar:</exclude> 
        </excludes> 
       </artifactSet> 
       <filters> 
        <filter> 
         <artifact>*:*</artifact> 
         <excludes> 
          <exclude>META-INF/*.SF</exclude> 
          <exclude>META-INF/*.DSA</exclude> 
          <exclude>META-INF/*.RSA</exclude> 
         </excludes> 
        </filter> 
       </filters> 
       <finalName>insightcloud-storm-topos</finalName> 
       <transformers> 
        <transformer 
         implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
         <mainClass>dgi.eii.storm.base.StormTopologyRunner</mainClass> 
        </transformer> 
        <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> 

        <transformer 
         implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
         <resource>META-INF/spring.handlers</resource> 
        </transformer> 
        <transformer 
         implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
         <resource>META-INF/spring.schemas</resource> 
        </transformer> 
       </transformers> 
      </configuration> 
     </plugin> 

     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <configuration> 
       <archive> 
        <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile> 
       </archive> 
      </configuration> 
     </plugin> 
    </plugins> 

</build> 

risposta

10

GeoTools utilizza Java Infrastruttura di servizio per caricare la classe responsabile delle ricerche EPSG. L'originale gt-epsg-hsql.jar ha voci in /META-INF/services/ che specificano quali interfacce sono implementate dal file jar e che possono essere caricate dinamicamente in fase di runtime.

Quando si costruisce un uber-jar, si combinano più file jar in uno. Molto probabilmente, un altro file jar implementa anche le stesse interfacce (ad esempio gt-referencing.jar) e ha quindi file con lo stesso nome nel suo /META-INF/services/. Quando si inserisce tutto in un file jar, è probabile che tali voci vengano sovrascritte (almeno non sono riuscito a trovare alcun riferimento al fatto che il plugin maven-shade-merg unisca tali file di servizi).

È possibile verificare ciò osservando la directory dei servizi nell'uber-jar creato, in particolare nella voce /META-INF/services/org.opengis.referencing.crs.CRSAuthorityFactory. Sia gt-epsg-hsql.jar sia gt-referencing.jar hanno un tale file (e probabilmente anche altri file jar di GeoTools), e molto probabilmente, solo il contenuto di uno sarà nel tuo uber-jar, con il risultato che tutte le altre classi non verranno trovate/caricate a runtime.

io non sono davvero familiarità con l'esperto-ombra-plugin, ma altre domande sul SO (come [1]) suggeriscono di utilizzare un trasformatore aggiuntivo:

<transformer 
    implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" /> 

[1] Maven shade + resteasy Could find writer for content-type

+0

ti ha dato uno più che almeno mi porta a un nuovo errore, che tecnicamente ha risposto alla mia domanda, ma non ha ancora risolto l'intero problema, se questo thread va più verso HSQL allora I ' Contrassegnare come risposta e pubblicare una nuova domanda. – markg

+0

Pertinente nella mailing list: https://sourceforge.net/p/geotools/mailman/geotools-gt2-users/thread/[email protected]/ – Alin

2

GeoTools utilizza un sistema di plug-in basato sulla fabbrica per fornire più database di riferimento, ma è necessario sceglierne uno. gt-referencing fornisce le interfacce e la fabbrica. Le autorità reali sono nel EPSG plugins (scegliere una sola di prevenire i conflitti):

+2

Grazie gigante, quindi la mia domanda è, come fare Ne scelgo uno? Vedere la mia modifica sopra per il codice che uso – markg

+0

Dipende dal tuo caso d'uso esatto, ma per la maggior parte degli usi generali, hsql dovrebbe andare bene. Assicurati che sia sul classpath quando esegui il programma. –

+0

Ho fatto un ulteriore passo avanti, ottenendo questo [ERRORE] Eccezione in Bolt org.geotools.data.DataSourceException: org.hsqldb.DatabaseURL.parseURL (Ljava/lang/String; ZZ) Lorg/hsqldb/persist/HsqlProperties; – markg

3

Ho anche incontrato questo problema. Invece di sbattere la testa contro il muro, c'è una soluzione alternativa si potrebbe usare, che è quello di creare il CRS da WKT invece di utilizzare decode:

private static final String EPSG4326 = "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]]"; 
    CoordinateReferenceSystem worldCRS = CRS.parseWKT(EPSG4326); 

Un suggerimento è che se si utilizza questo metodo, i CRS risultanti memorizzare prima la longitudine nella WKT seguita dalla latitudine. L'utilizzo di ServicesResourceTransformer fornisce a WKT la latitudine seguita dalla longitudine. Più su questo problema a questo collegamento http://docs.geotools.org/latest/userguide/library/referencing/order.html