NASAWorldWind / WorldWindServerKit

The NASA WorldWind Server Kit (WWSK) is an open source Java project that assembles GeoServer for easy distribution and implementation.
93 stars 54 forks source link

Support ImageMosaic from GeoPackages #97

Closed emxsys closed 6 years ago

emxsys commented 7 years ago

The GeoServer web administration interface responded with the following error message when I attempted to create a ImageMosaic data store from a folder containing 25 GeoPackages:

Could not list layers for this store, an error occurred retrieving them: Failed to create reader from file:///data/test_data/i3/gpkg and hints null

Following are the log entries for this error:

ERROR 4: `/data/test_data/i3/gpkg/36N118W.gpkg' not recognised as a supported file format.

27 Aug 04:31:03 ERROR [imagemosaic.Utils] - 
java.lang.NullPointerException
    at org.geotools.coverage.grid.io.AbstractGridCoverage2DReader.getImageLayout(AbstractGridCoverage2DReader.java:1206)
    at org.geotools.gce.imagemosaic.ImageMosaicConfigHandler.updateConfiguration(ImageMosaicConfigHandler.java:1327)
    at org.geotools.gce.imagemosaic.ImageMosaicWalker.handleFile(ImageMosaicWalker.java:245)
    at org.geotools.gce.imagemosaic.ImageMosaicDirectoryWalker$MosaicDirectoryWalker.handleFile(ImageMosaicDirectoryWalker.java:98)
    at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:367)
    at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:335)
    at org.geotools.gce.imagemosaic.ImageMosaicDirectoryWalker$MosaicDirectoryWalker.<init>(ImageMosaicDirectoryWalker.java:114)
    at org.geotools.gce.imagemosaic.ImageMosaicDirectoryWalker.run(ImageMosaicDirectoryWalker.java:197)
    at org.geotools.gce.imagemosaic.Utils.createMosaic(Utils.java:451)
    at org.geotools.gce.imagemosaic.Utils.checkSource(Utils.java:1313)
    at org.geotools.gce.imagemosaic.ImageMosaicReader.initReaderFromURL(ImageMosaicReader.java:532)
    at org.geotools.gce.imagemosaic.ImageMosaicReader.<init>(ImageMosaicReader.java:479)
    at org.geotools.gce.imagemosaic.ImageMosaicFormat.getReader(ImageMosaicFormat.java:502)
    at org.geotools.gce.imagemosaic.ImageMosaicFormat.getReader(ImageMosaicFormat.java:97)
    at org.geoserver.catalog.ResourcePool.getGridCoverageReader(ResourcePool.java:1511)
    at org.geoserver.catalog.ResourcePool.getGridCoverageReader(ResourcePool.java:1441)
    at org.geoserver.catalog.impl.CoverageStoreInfoImpl.getGridCoverageReader(CoverageStoreInfoImpl.java:59)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.geoserver.catalog.impl.ModificationProxy.invoke(ModificationProxy.java:147)
    at com.sun.proxy.$Proxy8.getGridCoverageReader(Unknown Source)
    at ....
.
.
.
Caused by: java.io.IOException: Failed to create reader from file:///data/test_data/i3/gpkg and hints null
    at org.geoserver.catalog.ResourcePool.getGridCoverageReader(ResourcePool.java:1513)
    at org.geoserver.catalog.ResourcePool.getGridCoverageReader(ResourcePool.java:1441)
    at org.geoserver.catalog.impl.CoverageStoreInfoImpl.getGridCoverageReader(CoverageStoreInfoImpl.java:59)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.geoserver.catalog.impl.ModificationProxy.invoke(ModificationProxy.java:147)
    at com.sun.proxy.$Proxy8.getGridCoverageReader(Unknown Source)
    at org.geoserver.web.data.layer.NewLayerPageProvider.getItemsInternal(NewLayerPageProvider.java:95)
    ... 124 more
emxsys commented 7 years ago

Problem

The genesis of this error is the GeoPackageReader(an AbstractGridCoverage2DReader) is not providing an ImageLayoutfor the individual coverages nor is it setting the ImageLayoutfor the reader as a whole.

Proposed Solution

In order for the the GeoPackage to participate in an ImageMosaic, we'll need to set the ImageLayoutfor the reader to the ImageLayoutprovided by the first coverage in the GeoPackage.

emxsys commented 7 years ago

Problem

In order for a GeoPackageReaderto participate an Image Mosaic, the granules must provide ImageReaderSPIs. When the GeoPackage ImageMosaic is rendered in the LayerPreview, the ImageReaderSPIs are null, and the the resulting map image is blank.

Proposed Solution

Implement a GeoPackageImageReaderand GeoPackageImageReaderSPI. Set the RasterLayerRequest.readType to DIRECT_READ.

emxsys commented 6 years ago

Solution

Implemented a GeoPackageImageReader and GeoPackageImageReaderSPI.

See pull request "Add support for GeoPackage ImageMosaic" #158