private void initGeoCoding(Product product) throws IOException { float pixelX = 0.0f; float pixelY = 0.0f; float easting = -180f; float northing = +90f; float pixelSizeX = 360.0f / sceneWidth; float pixelSizeY = 180.0f / sceneHeight; try { product.setGeoCoding( new CrsGeoCoding( DefaultGeographicCRS.WGS84, sceneWidth, sceneHeight, easting, northing, pixelSizeX, pixelSizeY, pixelX, pixelY)); } catch (FactoryException e) { throw new IOException(e); } catch (TransformException e) { throw new IOException(e); } }
private static Product createProduct() throws Exception { Product product = new Product("p", "t", 32, 256); final TiePointGrid lat = new TiePointGrid("lat", 2, 2, 0f, 0f, 32f, 256f, new float[] {+40f, +40f, -40f, -40f}); final TiePointGrid lon = new TiePointGrid("lon", 2, 2, 0f, 0f, 32f, 256f, new float[] {-80f, +80f, -80f, +80f}); product.addTiePointGrid(lat); product.addTiePointGrid(lon); product.setGeoCoding(new TiePointGeoCoding(lat, lon)); product.setPreferredTileSize(32, 16); product.setStartTime(ProductData.UTC.parse("2003-01-01", "yyyy-MM-dd")); product.setEndTime(ProductData.UTC.parse("2003-01-02", "yyyy-MM-dd")); return product; }
protected void addGeoCoding(Product product) throws IOException { GeoPos ulPos = getUpperLeftPosition(); final Rectangle rect = new Rectangle(product.getSceneRasterWidth(), product.getSceneRasterHeight()); AffineTransform transform = new AffineTransform(); transform.translate(ulPos.getLon(), ulPos.getLat()); transform.scale(PIXEL_SIZE_DEG, -PIXEL_SIZE_DEG); transform.translate(-PIXEL_CENTER, -PIXEL_CENTER); try { product.setGeoCoding(new CrsGeoCoding(DefaultGeographicCRS.WGS84, rect, transform)); } catch (Exception e) { throw new IOException("Cannot create GeoCoding: ", e); } }
private Product createClostProduct(RenderedOp blueAerosolPanCirrusImage) { Product product = new Product( sourceProduct.getName() + "_clost", sourceProduct.getProductType() + " (clost)", sourceProduct.getSceneRasterWidth(), sourceProduct.getSceneRasterHeight()); product.setGeoCoding(sourceProduct.getGeoCoding()); product.setDescription("Product holding Clost Image"); Band band = product.addBand(CLOST_BAND_NAME, ProductData.TYPE_FLOAT32); band.setSourceImage(blueAerosolPanCirrusImage); band.setUnit("dl"); band.setDescription("CLOST Image: aerosol * blue * pan * cirrus "); return product; }
public void addGeocoding(Product product) throws IOException { double pixelX = 0.5; double pixelY = 0.5; double easting; double northing; double pixelSizeX; double pixelSizeY; boolean pixelRegistered = true; if (productReader.getProductType() == SeadasProductReader.ProductType.ANCNRT) { pixelRegistered = false; } if (productReader.getProductType() == SeadasProductReader.ProductType.OISST) { Variable lon = ncFile.findVariable("lon"); Variable lat = ncFile.findVariable("lat"); Array lonData = lon.read(); // TODO: handle the 180 degree shift with the NOAA products - need to modify // SeaDasFileReader:readBandData // Below is a snippet from elsewhere in BEAM that deals with this issue... // SPECIAL CASE: check if we have a global geographic lat/lon with lon from 0..360 instead of // -180..180 // if (isShifted180(lonData)) { // // if this is true, subtract 180 from all longitudes and // // add a global attribute which will be analyzed when setting up the // image(s) // final List<Variable> variables = ncFile.getVariables(); // for (Variable next : variables) { // next.getAttributes().add(new Attribute("LONGITUDE_SHIFTED_180", 1)); // } // for (int i = 0; i < lonData.getSize(); i++) { // final Index ii = lonData.getIndex().set(i); // final double theLon = lonData.getDouble(ii) - 180.0; // lonData.setDouble(ii, theLon); // } // } final Array latData = lat.read(); final int lonSize = lon.getShape(0); final Index i0 = lonData.getIndex().set(0); final Index i1 = lonData.getIndex().set(lonSize - 1); pixelSizeX = (lonData.getDouble(i1) - lonData.getDouble(i0)) / (product.getSceneRasterWidth() - 1); easting = lonData.getDouble(i0); final int latSize = lat.getShape(0); final Index j0 = latData.getIndex().set(0); final Index j1 = latData.getIndex().set(latSize - 1); pixelSizeY = (latData.getDouble(j1) - latData.getDouble(j0)) / (product.getSceneRasterHeight() - 1); // this should be the 'normal' case if (pixelSizeY < 0) { pixelSizeY = -pixelSizeY; northing = latData.getDouble(latData.getIndex().set(0)); } else { northing = latData.getDouble(latData.getIndex().set(latSize - 1)); } northing -= pixelSizeX / 2.0; easting += pixelSizeY / 2.0; try { product.setGeoCoding( new CrsGeoCoding( DefaultGeographicCRS.WGS84, product.getSceneRasterWidth(), product.getSceneRasterHeight(), easting, northing, pixelSizeX, pixelSizeY, pixelX, pixelY)); } catch (FactoryException e) { throw new IllegalStateException(e); } catch (TransformException e) { throw new IllegalStateException(e); } } else { String east = "Easternmost_Longitude"; String west = "Westernmost_Longitude"; String north = "Northernmost_Latitude"; String south = "Southernmost_Latitude"; Attribute latmax = ncFile.findGlobalAttributeIgnoreCase("geospatial_lat_max"); if (latmax != null) { east = "geospatial_lon_max"; west = "geospatial_lon_min"; north = "geospatial_lat_max"; south = "geospatial_lat_min"; } else { latmax = ncFile.findGlobalAttributeIgnoreCase("upper_lat"); if (latmax != null) { east = "right_lon"; west = "left_lon"; north = "upper_lat"; south = "lower_lat"; } } final MetadataElement globalAttributes = product.getMetadataRoot().getElement("Global_Attributes"); easting = (float) globalAttributes.getAttribute(east).getData().getElemDouble(); float westing = (float) globalAttributes.getAttribute(west).getData().getElemDouble(); pixelSizeX = Math.abs(easting - westing) / product.getSceneRasterWidth(); northing = (float) globalAttributes.getAttribute(north).getData().getElemDouble(); float southing = (float) globalAttributes.getAttribute(south).getData().getElemDouble(); if (northing < southing) { mustFlipY = true; northing = (float) globalAttributes.getAttribute(south).getData().getElemDouble(); southing = (float) globalAttributes.getAttribute(north).getData().getElemDouble(); } pixelSizeY = Math.abs(northing - southing) / product.getSceneRasterHeight(); if (pixelRegistered) { northing -= pixelSizeY / 2.0; westing += pixelSizeX / 2.0; } else { pixelX = 0.0; pixelY = 0.0; } try { product.setGeoCoding( new CrsGeoCoding( DefaultGeographicCRS.WGS84, product.getSceneRasterWidth(), product.getSceneRasterHeight(), westing, northing, pixelSizeX, pixelSizeY, pixelX, pixelY)); } catch (FactoryException e) { throw new IllegalStateException(e); } catch (TransformException e) { throw new IllegalStateException(e); } } }
@Override protected Product readProductNodesImpl() throws IOException { final String s = getInput().toString(); final File file0 = new File(s); final File dir = file0.getParentFile(); final S2FilenameInfo fni0 = S2FilenameInfo.create(file0.getName()); if (fni0 == null) { throw new IOException(); } Header metadataHeader = null; final Map<Integer, BandInfo> fileMap = new HashMap<Integer, BandInfo>(); if (dir != null) { File[] files = dir.listFiles( new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.endsWith(Sentinel2ProductReaderPlugIn.JP2_EXT); } }); if (files != null) { for (File file : files) { int bandIndex = fni0.getBand(file.getName()); if (bandIndex >= 0 && bandIndex < WAVEBAND_INFOS.length) { final S2WavebandInfo wavebandInfo = WAVEBAND_INFOS[bandIndex]; BandInfo bandInfo = new BandInfo( file, bandIndex, wavebandInfo, imageLayouts[wavebandInfo.resolution.id]); fileMap.put(bandIndex, bandInfo); } } } File[] metadataFiles = dir.listFiles( new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.startsWith("MTD_") && name.endsWith(".xml"); } }); if (metadataFiles != null && metadataFiles.length > 0) { File metadataFile = metadataFiles[0]; try { metadataHeader = Header.parseHeader(metadataFile); } catch (JDOMException e) { BeamLogManager.getSystemLogger() .warning("Failed to parse metadata file: " + metadataFile); } } else { BeamLogManager.getSystemLogger().warning("No metadata file found"); } } final ArrayList<Integer> bandIndexes = new ArrayList<Integer>(fileMap.keySet()); Collections.sort(bandIndexes); if (bandIndexes.isEmpty()) { throw new IOException("No valid bands found."); } String prodType = "S2_MSI_" + fni0.procLevel; final Product product = new Product( String.format("%s_%s_%s", prodType, fni0.orbitNo, fni0.tileId), prodType, imageLayouts[S2Resolution.R10M.id].width, imageLayouts[S2Resolution.R10M.id].height); try { product.setStartTime(ProductData.UTC.parse(fni0.start, "yyyyMMddHHmmss")); } catch (ParseException e) { // warn } try { product.setEndTime(ProductData.UTC.parse(fni0.stop, "yyyyMMddHHmmss")); } catch (ParseException e) { // warn } if (metadataHeader != null) { SceneDescription sceneDescription = SceneDescription.create(metadataHeader); int tileIndex = sceneDescription.getTileIndex(fni0.tileId); Envelope2D tileEnvelope = sceneDescription.getTileEnvelope(tileIndex); Header.Tile tile = metadataHeader.getTileList().get(tileIndex); try { product.setGeoCoding( new CrsGeoCoding( tileEnvelope.getCoordinateReferenceSystem(), imageLayouts[S2Resolution.R10M.id].width, imageLayouts[S2Resolution.R10M.id].height, tile.tileGeometry10M.upperLeftX, tile.tileGeometry10M.upperLeftY, tile.tileGeometry10M.xDim, -tile.tileGeometry10M.yDim, 0.0, 0.0)); } catch (FactoryException e) { // todo - handle e } catch (TransformException e) { // todo - handle e } } for (Integer bandIndex : bandIndexes) { final BandInfo bandInfo = fileMap.get(bandIndex); final Band band = product.addBand(bandInfo.wavebandInfo.bandName, ProductData.TYPE_UINT16); band.setSpectralWavelength((float) bandInfo.wavebandInfo.centralWavelength); band.setSpectralBandwidth((float) bandInfo.wavebandInfo.bandWidth); band.setSpectralBandIndex(bandIndex); band.setSourceImage(new DefaultMultiLevelImage(new Jp2MultiLevelSource(bandInfo))); } product.setNumResolutionLevels(imageLayouts[0].numResolutions); return product; }