/* * Copyright (C) 2010 Brockmann Consult GmbH (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 3 of the License, or (at your option) * any later version. * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, see http://www.gnu.org/licenses/ */ package org.esa.snap.timeseries.export.text; import com.bc.ceres.core.ProgressMonitor; import com.bc.ceres.glevel.MultiLevelImage; import org.esa.snap.core.datamodel.RasterDataNode; import java.awt.Rectangle; import java.awt.image.Raster; import java.awt.image.RenderedImage; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; abstract class CsvExporter { final List<String> header; final List<String> columns; final List<String> rows; private final PrintWriter out; CsvExporter(PrintWriter writer) { this.out = writer; this.header = new ArrayList<String>(); this.columns = new ArrayList<String>(); this.rows = new ArrayList<String>(); } void exportCsv(ProgressMonitor pm) { setUpHeader(); setUpColumns(); setUpRows(pm); StringBuilder builder = new StringBuilder(); String sep = getSeparator(); for (String headerString : header) { builder.append("#").append(headerString).append("\n"); } builder.append("\n"); for (int i = 0; i < columns.size(); i++) { String column = columns.get(i); builder.append(column); if (i < columns.size() - 1) { builder.append(sep); } } builder.append("\n"); try { out.print(builder.toString()); for (String row : rows) { out.print(row); out.print("\n"); } } finally { if (out != null) { out.close(); } } } abstract void setUpHeader(); abstract void setUpColumns(); abstract void setUpRows(ProgressMonitor pm); abstract String getSeparator(); static double getValue(RasterDataNode raster, int pixelX, int pixelY, int currentLevel) { final RenderedImage image = raster.getGeophysicalImage().getImage(currentLevel); final Rectangle pixelRect = new Rectangle(pixelX, pixelY, 1, 1); final Raster data = image.getData(pixelRect); final MultiLevelImage validMaskImage = raster.getValidMaskImage(); Raster validMaskData = null; if (validMaskImage != null) { final RenderedImage validMask = validMaskImage.getImage(currentLevel); validMaskData = validMask.getData(pixelRect); } final double value; if (validMaskData == null || validMaskData.getSample(pixelX, pixelY, 0) > 0) { value = data.getSampleDouble(pixelX, pixelY, 0); } else { value = Double.NaN; } return value; } }