@Override public CloseableIterator<GeoWaveData<GridCoverage>> toGeoWaveData( final File input, final Collection<ByteArrayId> primaryIndexIds, final String globalVisibility) { final AbstractGridFormat format = GridFormatFinder.findFormat(input); final GridCoverage2DReader reader = format.getReader(input); if (reader == null) { LOGGER.error("Unable to get reader instance, getReader returned null"); return new Wrapper(Collections.emptyIterator()); } try { final GridCoverage2D coverage = reader.read(null); if (coverage != null) { final Map<String, String> metadata = new HashMap<String, String>(); final String coverageName = coverage.getName().toString(); final String[] mdNames = reader.getMetadataNames(coverageName); if ((mdNames != null) && (mdNames.length > 0)) { for (final String mdName : mdNames) { metadata.put(mdName, reader.getMetadataValue(coverageName, mdName)); } } final RasterDataAdapter adapter = new RasterDataAdapter( input.getName(), metadata, coverage, optionProvider.getTileSize(), optionProvider.isBuildPyramid()); final List<GeoWaveData<GridCoverage>> coverages = new ArrayList<GeoWaveData<GridCoverage>>(); coverages.add(new GeoWaveData<GridCoverage>(adapter, primaryIndexIds, coverage)); return new Wrapper(coverages.iterator()) { @Override public void close() throws IOException { reader.dispose(); } }; } else { LOGGER.warn( "Null grid coverage from file '" + input.getAbsolutePath() + "' for discovered geotools format '" + format.getName() + "'"); } } catch (final IOException e) { LOGGER.warn( "Unable to read grid coverage of file '" + input.getAbsolutePath() + "' for discovered geotools format '" + format.getName() + "'", e); } return new Wrapper(Collections.emptyIterator()); }
/** * Adds a raster layer to the setup. * * <p>This method configures a raster layer with the name <code>qName.getLocalPart()</code>. A * coverage store is created (if it doesn't already exist) with the same name. The workspace of * the resulting store and layer is determined by <code>qName.getPrefix()</code>. * * <p>The <tt>filename</tt> parameter defines the raster file to be loaded from the classpath and * copied into the data directory. The <tt>scope</tt> is used as the class from which to load the * file from. * * <p>In the case of adding a zipped archive that contains multiple file the <tt>filename</tt> * paramter should have a ".zip" extension and the <tt>extension</tt> parameter must define the * extension of the main raster file. The parameter is not necessary and may be null if the * <tt>filename</tt> does not refer to a zip file. * * <p>The <tt>props</tt> parameter is used to define custom properties for the layer. See the * {@link LayerProperty} class for supported properties. * * @param qName The name of the raster layer. * @param filename The name of the file containing the raster, to be loaded from the classpath. * @param extension The file extension (without a ".") of the main raster file. This parameter my * be <code>null</code> only if <tt>filename</tt> does not refer to a zip file. * @param props Custom properties to assign to the created raster layer. * @param scope The class from which to load the <tt>filename</tt> resource from. */ public void addRasterLayer( QName qName, String filename, String extension, Map<LayerProperty, Object> props, Class scope, Catalog catalog) throws IOException { String prefix = qName.getPrefix(); String name = qName.getLocalPart(); // setup the data File dir = new File(data, name); dir.mkdirs(); File file = new File(dir, filename); catalog.getResourceLoader().copyFromClassPath(filename, file, scope); String ext = FilenameUtils.getExtension(filename); if ("zip".equalsIgnoreCase(ext)) { // unpack the archive IOUtils.decompress(file, dir); // delete archive file.delete(); if (extension == null) { // zip with no extension, we just the directory as the file file = dir; } else { // files may have been top level, or one directory level deep file = new File(dir, FilenameUtils.getBaseName(filename) + "." + extension); if (!file.exists()) { File file2 = new File(new File(dir, dir.getName()), file.getName()); if (file2.exists()) { file = file2; } } } if (!file.exists()) { throw new FileNotFoundException(file.getPath()); } } // load the format/reader AbstractGridFormat format = (AbstractGridFormat) GridFormatFinder.findFormat(file); if (format == null) { throw new RuntimeException("No format for " + file.getCanonicalPath()); } AbstractGridCoverage2DReader reader = null; try { reader = (AbstractGridCoverage2DReader) format.getReader(file); if (reader == null) { throw new RuntimeException( "No reader for " + file.getCanonicalPath() + " with format " + format.getName()); } // configure workspace if it doesn;t already exist if (catalog.getWorkspaceByName(prefix) == null) { addWorkspace(prefix, qName.getNamespaceURI(), catalog); } // create the store CoverageStoreInfo store = catalog.getCoverageStoreByName(prefix, name); if (store == null) { store = catalog.getFactory().createCoverageStore(); } store.setName(name); store.setWorkspace(catalog.getWorkspaceByName(prefix)); store.setEnabled(true); store.setURL(DataUtilities.fileToURL(file).toString()); store.setType(format.getName()); if (store.getId() == null) { catalog.add(store); } else { catalog.save(store); } // create the coverage CatalogBuilder builder = new CatalogBuilder(catalog); builder.setStore(store); CoverageInfo coverage = null; try { coverage = builder.buildCoverage(reader, null); // coverage read params if (format instanceof ImageMosaicFormat) { // make sure we work in immediate mode coverage .getParameters() .put(AbstractGridFormat.USE_JAI_IMAGEREAD.getName().getCode(), Boolean.FALSE); } } catch (Exception e) { throw new IOException(e); } coverage.setName(name); coverage.setTitle(name); coverage.setDescription(name); coverage.setEnabled(true); CoverageInfo cov = catalog.getCoverageByCoverageStore(store, name); if (cov == null) { catalog.add(coverage); } else { builder.updateCoverage(cov, coverage); catalog.save(cov); coverage = cov; } LayerInfo layer = catalog.getLayerByName(new NameImpl(qName)); if (layer == null) { layer = catalog.getFactory().createLayer(); } layer.setResource(coverage); layer.setDefaultStyle( catalog.getStyleByName(LayerProperty.STYLE.get(props, DEFAULT_RASTER_STYLE))); layer.setType(LayerInfo.Type.RASTER); layer.setEnabled(true); if (layer.getId() == null) { catalog.add(layer); } else { catalog.save(layer); } } finally { if (reader != null) { reader.dispose(); } } }