2014-12-11 4 views
7

Ich führe Geotools innerhalb von Apache Storm, und eine Menge Zeit mit Geotools Abhängigkeitsverwaltung. Alles funktioniert, wenn ich den Sturmcluster lokal (Windows 7 Laptop) ausführe, aber wenn ich ihn im Cluster anlege, erhalte ich diese Ausnahme in meinen Protokollen.Geotools kann HSQL EPSG DB nicht finden, wirft Fehler: NoSuchAuthorityCodeException

EDIT: Hier ist die Java ich, dass diese Funktionalität

 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); 

Hier ruft meine Umgebung

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) 

ich auch den gleichen Fehler, wenn ein Bild mit EPSQ Begegnung: 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) 

Ich habe mehrere Antworten gesehen, die darauf hinwiesen, dass ich die gt-epsg-hsql in meinen po setzen muss m, und ich habe immer noch nicht gefunden, was es braucht.

Hier sind meine GeoTools POM Einträge

<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> 

hier ist, wie ich den Aufbau der uber-jar mit Maven Schatten Plugin

<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: Also ich ein paar Dinge herausgefunden und bekam ein wenig weiter ... jetzt bekomme ich diesen Fehler

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

Dieser kleine Vorteil Zement, der zu dem obigen neuen Fehler führte, war auf die Verwendung der richtigen Transformatoren zurückzuführen, und das maven jar-Plugin zu verwenden, um die richtigen Einträge in die MANIFEST.MF-Datei zu injizieren. Hier ist der neue Build-Abschnitt meines POM, die jemand zumindest überwinden, um die Konsolidierung der GeoTools' META-INF/services-Dateien helfen können und die richtigen Einträge zu injizieren, um die alten vendorname cannot be null! Fehler zu überwinden

<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> 

Antwort

10

Geotools verwendet Java Service-Infrastruktur zum Laden der für EPSG-Lookups zuständigen Klasse. Das Original gt-epsg-hsql.jar hat Einträge in /META-INF/services/, die angeben, welche Schnittstellen von der JAR-Datei implementiert werden und welche zur Laufzeit dynamisch geladen werden können.

Beim Erstellen eines Uber-Jar kombinieren Sie mehrere JAR-Dateien zu einem. Wahrscheinlich implementiert eine andere JAR-Datei die gleichen Schnittstellen (zum Beispiel gt-referencing.jar) und hat somit Dateien mit den gleichen Namen in seiner /META-INF/services/. Wenn Sie alles in eine JAR-Datei schreiben, werden diese Einträge höchstwahrscheinlich überschrieben (zumindest konnte ich keinen Hinweis finden, dass das maven-shade-plugin solche Dienste-Dateien zusammenführt).

Sie können dies überprüfen, indem Sie das Dienstverzeichnis im erstellten Uber-Jar betrachten, insbesondere unter dem Eintrag /META-INF/services/org.opengis.referencing.crs.CRSAuthorityFactory. Sowohl gt-epsg-hsql.jar als auch gt-referencing.jar haben eine solche Datei (und wahrscheinlich auch andere JAR-Dateien von GeoTools), und höchstwahrscheinlich wird nur der Inhalt von einem in Ihrem Uber-Jar sein, was dazu führt, dass alle anderen Klassen nicht gefunden/geladen werden Laufzeit.

Ich bin nicht wirklich vertraut mit der Maven-Schatten-Plugin, aber auch andere Fragen auf SO (wie [1]) legen nahe, einen zusätzlichen Wandler zu verwenden:

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

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

+0

gab Ihnen ein Plus für mindestens führt mich zu einem neuen Fehler, der technisch beantwortet meine Frage, aber löste das gesamte Problem noch nicht, wenn dieser Thread mehr in Richtung HSQL driftet dann ' Ich markiere als beantwortet und poste eine neue Frage. – markg

+0

Relevant in der Mailingliste: https://sourceforge.net/p/geotools/mailman/geotools-gt2-users/thread/[email protected]/ – Alin

2

GeoTools verwendet ein Factory-basiertes Plugin-System, um mehrere referenzierende Datenbanken zur Verfügung zu stellen, aber Sie müssen eine davon auswählen. gt-referencing stellt die Schnittstellen und die Fabrik zur Verfügung. Die tatsächlichen Behörden sind in der EPSG plugins (wählen Sie nur einen Konflikt zu verhindern):

+2

Danke iant, also meine Frage ist, wie Ich wähle eins? Sehen Sie meine Bearbeitung oben für den Code, den ich verwende – markg

+0

Es hängt von Ihrem genauen Anwendungsfall ab, aber für die meisten allgemeinen Verwendungen sollte hsql in Ordnung sein. Stellen Sie nur sicher, dass es auf dem Klassenpfad ist, wenn Sie das Programm ausführen. –

+0

Ich habe einen Schritt weiter, jetzt bekommen diese [ERROR] Ausnahme in Bolt org.geotools.data.DataSourceException: org.hsqldb.DatabaseURL.parseURL (Ljava/lang/String; ZZ) Lorg/hsqldb/persist/HsqlProperties; – markg

3

Ich lief auch auf dieses Problem. Statt den Kopf gegen die Wand schlagen, gibt es eine Abhilfe Sie nutzen könnten, die das CRS von WKT zu erstellen, ist stattdessen decode der Verwendung:

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); 

Ein Tipp, dass, wenn Sie diese Methode verwenden, wird die resultierende CRS Speichern Sie den Längengrad zuerst in der WKT gefolgt von der geografischen Breite. Die Verwendung des ServicesResourceTransformers gibt WKT mit einem Breitengrad gefolgt von einem Längengrad. Mehr zu diesem Thema unter diesem Link http://docs.geotools.org/latest/userguide/library/referencing/order.html

Verwandte Themen