public boolean initialize(MapSource mapSource) throws IOException, WMSServiceException { if (null == mapSource) { String msg = Logging.getMessage("nullValue.MapSourceIsNull"); Logging.logger().severe(msg); throw new WMSServiceException(msg); } this.mapSource = mapSource; this.params = mapSource.getParameters(); if (null == params) { String msg = Logging.getMessage("nullValue.AVListIsNull"); Logging.logger().severe(msg); throw new WMSServiceException(msg); } if (!params.hasKey(AVKey.FILE_NAME)) { String msg = Logging.getMessage("nullValue.ParamsIsNull"); Logging.logger().severe(msg); throw new WMSServiceException(msg); } this.sourceFile = new File(params.getStringValue(AVKey.FILE_NAME)); if (!this.sourceFile.exists()) { String msg = Logging.getMessage("generic.FileNotFound", this.sourceFile.getAbsolutePath()); Logging.logger().severe(msg); throw new FileNotFoundException(msg); } AVList fileParams = this.params.copy(); try { this.readerFactory = (DataRasterReaderFactory) WorldWind.createConfigurationComponent(AVKey.DATA_RASTER_READER_FACTORY_CLASS_NAME); } catch (Exception e) { this.readerFactory = new BasicDataRasterReaderFactory(); } DataRasterReader reader = this.readerFactory.findReaderFor(this.sourceFile, fileParams, readers); if (reader == null) { String msg = Logging.getMessage("nullValue.ReaderIsNull", this.sourceFile); Logging.logger().severe(msg); throw new WMSServiceException(msg); } reader.readMetadata(this.sourceFile, fileParams); this.params.setValues(fileParams); if (!this.params.hasKey(AVKey.SECTOR)) { String msg = Logging.getMessage("nullValue.SectorIsNull"); Logging.logger().severe(msg); throw new WMSServiceException(msg); } this.BBOX = (Sector) this.params.getValue(AVKey.SECTOR); if (0d == this.BBOX.getDeltaLatDegrees() || 0d == this.BBOX.getDeltaLonDegrees()) { String msg = Logging.getMessage("generic.SectorSizeInvalid"); Logging.logger().severe(msg); throw new WMSServiceException(msg); } int height = 0; if (!this.params.hasKey(AVKey.HEIGHT)) { String msg = Logging.getMessage("generic.InvalidHeight", 0); Logging.logger().severe(msg); throw new WMSServiceException(msg); } else { Object o = this.params.getValue(AVKey.HEIGHT); double d = Double.parseDouble("" + o); height = (int) d; } if (!this.params.hasKey(AVKey.WIDTH)) { String msg = Logging.getMessage("generic.InvalidWidth", 0); Logging.logger().severe(msg); throw new WMSServiceException(msg); } this.isElevation = (this.params.hasKey(AVKey.PIXEL_FORMAT) && AVKey.ELEVATION.equals(this.params.getValue(AVKey.PIXEL_FORMAT))); if (this.params.hasKey(AVKey.MISSING_DATA_SIGNAL)) { try { Object o = this.params.getValue(AVKey.MISSING_DATA_SIGNAL); double d = Double.parseDouble("" + o); this.nodataSignal = (short) d; } catch (Exception e) { this.nodataSignal = (this.isElevation) ? Short.MIN_VALUE : 0; } } else { this.nodataSignal = (this.isElevation) ? Short.MIN_VALUE : 0; } if (this.params.hasKey(AVKey.MISSING_DATA_REPLACEMENT)) { try { Object o = this.params.getValue(AVKey.MISSING_DATA_REPLACEMENT); double d = Double.parseDouble("" + o); this.nodataReplacement = (short) d; } catch (Exception e) { Logging.logger().finest(e.getMessage()); this.nodataReplacement = (this.isElevation) ? Short.MIN_VALUE : 0; } } else { this.nodataReplacement = (this.isElevation) ? Short.MIN_VALUE : 0; } if (this.isElevation) { if (this.params.hasKey(AVKey.ELEVATION_UNIT)) { try { String unit = this.params.getStringValue(AVKey.ELEVATION_UNIT); this.convertFeetToMeters = "feet".equalsIgnoreCase(unit); } catch (Exception e) { Logging.logger().finest(e.getMessage()); } } } // if PIXEL_HEIGHT is specified, we are not overriding it // because UTM images will have different pixel size if (!this.params.hasKey(AVKey.PIXEL_HEIGHT)) { this.pixelHeight = this.BBOX.getDeltaLatDegrees() / (double) height; } else { try { Object o = this.params.getValue(AVKey.PIXEL_HEIGHT); this.pixelHeight = Double.parseDouble("" + o); } catch (Exception e) { Logging.logger().finest(e.getMessage()); } } this.rasters = reader.read(this.sourceFile, this.params); if (null == this.rasters || 0 == this.rasters.length) { String msg = Logging.getMessage("nullValue.RasterIsNull"); Logging.logger().severe(msg); throw new WMSServiceException(msg); } return true; }
protected void importImagery() { try { // Read the data and save it in a temp file. File sourceFile = ExampleUtil.saveResourceToTempFile(IMAGE_PATH, ".tif"); // Create a raster reader to read this type of file. The reader is created from the // currently // configured factory. The factory class is specified in the Configuration, and a different // one can be // specified there. DataRasterReaderFactory readerFactory = (DataRasterReaderFactory) WorldWind.createConfigurationComponent(AVKey.DATA_RASTER_READER_FACTORY_CLASS_NAME); DataRasterReader reader = readerFactory.findReaderFor(sourceFile, null); // Before reading the raster, verify that the file contains imagery. AVList metadata = reader.readMetadata(sourceFile, null); if (metadata == null || !AVKey.IMAGE.equals(metadata.getStringValue(AVKey.PIXEL_FORMAT))) throw new Exception("Not an image file."); // Read the file into the raster. read() returns potentially several rasters if there are // multiple // files, but in this case there is only one so just use the first element of the returned // array. DataRaster[] rasters = reader.read(sourceFile, null); if (rasters == null || rasters.length == 0) throw new Exception("Can't read the image file."); DataRaster raster = rasters[0]; // Determine the sector covered by the image. This information is in the GeoTIFF file or // auxiliary // files associated with the image file. final Sector sector = (Sector) raster.getValue(AVKey.SECTOR); if (sector == null) throw new Exception("No location specified with image."); // Request a sub-raster that contains the whole image. This step is necessary because only // sub-rasters // are reprojected (if necessary); primary rasters are not. int width = raster.getWidth(); int height = raster.getHeight(); // getSubRaster() returns a sub-raster of the size specified by width and height for the // area indicated // by a sector. The width, height and sector need not be the full width, height and sector // of the data, // but we use the full values of those here because we know the full size isn't huge. If it // were huge // it would be best to get only sub-regions as needed or install it as a tiled image layer // rather than // merely import it. DataRaster subRaster = raster.getSubRaster(width, height, sector, null); // Tne primary raster can be disposed now that we have a sub-raster. Disposal won't affect // the // sub-raster. raster.dispose(); // Verify that the sub-raster can create a BufferedImage, then create one. if (!(subRaster instanceof BufferedImageRaster)) throw new Exception("Cannot get BufferedImage."); BufferedImage image = ((BufferedImageRaster) subRaster).getBufferedImage(); // The sub-raster can now be disposed. Disposal won't affect the BufferedImage. subRaster.dispose(); // Create a SurfaceImage to display the image over the specified sector. final SurfaceImage si1 = new SurfaceImage(image, sector); // On the event-dispatch thread, add the imported data as an SurfaceImageLayer. SwingUtilities.invokeLater( new Runnable() { public void run() { // Add the SurfaceImage to a layer. SurfaceImageLayer layer = new SurfaceImageLayer(); layer.setName("Imported Surface Image"); layer.setPickEnabled(false); layer.addRenderable(si1); // Add the layer to the model and update the application's layer panel. insertBeforeCompass(AppFrame.this.getWwd(), layer); AppFrame.this.getLayerPanel().update(AppFrame.this.getWwd()); // Set the view to look at the imported image. ExampleUtil.goTo(getWwd(), sector); } }); } catch (Exception e) { e.printStackTrace(); } }