001/* 002 * $Id: FlatFileDataSource.java,v 1.6 2011/03/24 16:06:32 davep Exp $ 003 * 004 * This file is part of McIDAS-V 005 * 006 * Copyright 2007-2011 007 * Space Science and Engineering Center (SSEC) 008 * University of Wisconsin - Madison 009 * 1225 W. Dayton Street, Madison, WI 53706, USA 010 * https://www.ssec.wisc.edu/mcidas 011 * 012 * All Rights Reserved 013 * 014 * McIDAS-V is built on Unidata's IDV and SSEC's VisAD libraries, and 015 * some McIDAS-V source code is based on IDV and VisAD source code. 016 * 017 * McIDAS-V is free software; you can redistribute it and/or modify 018 * it under the terms of the GNU Lesser Public License as published by 019 * the Free Software Foundation; either version 3 of the License, or 020 * (at your option) any later version. 021 * 022 * McIDAS-V is distributed in the hope that it will be useful, 023 * but WITHOUT ANY WARRANTY; without even the implied warranty of 024 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 025 * GNU Lesser Public License for more details. 026 * 027 * You should have received a copy of the GNU Lesser Public License 028 * along with this program. If not, see http://www.gnu.org/licenses. 029 */ 030 031package edu.wisc.ssec.mcidasv.data; 032 033 034import java.awt.Image; 035import java.awt.Toolkit; 036import java.awt.geom.Rectangle2D; 037import java.awt.image.BufferedImage; 038import java.io.BufferedReader; 039import java.io.InputStream; 040import java.io.InputStreamReader; 041import java.rmi.RemoteException; 042import java.util.ArrayList; 043import java.util.HashMap; 044import java.util.Hashtable; 045import java.util.List; 046 047import edu.wisc.ssec.mcidasv.control.LambertAEA; 048 049import ucar.unidata.data.BadDataException; 050import ucar.unidata.data.CompositeDataChoice; 051import ucar.unidata.data.DataCategory; 052import ucar.unidata.data.DataChoice; 053import ucar.unidata.data.DataSelection; 054import ucar.unidata.data.DataSourceDescriptor; 055import ucar.unidata.data.DirectDataChoice; 056import ucar.unidata.data.grid.GridUtil; 057import ucar.unidata.data.imagery.ImageInfo; 058import ucar.unidata.util.IOUtil; 059import ucar.unidata.util.Misc; 060import visad.Data; 061import visad.FlatField; 062import visad.FunctionType; 063import visad.Gridded2DSet; 064import visad.Gridded3DSet; 065import visad.Linear2DSet; 066import visad.RealTupleType; 067import visad.RealType; 068import visad.SampledSet; 069import visad.Unit; 070import visad.VisADException; 071import visad.georef.MapProjection; 072import visad.util.ImageHelper; 073 074 075/** 076 * This is an implementation that will read in a generic data file 077 * and return a single Data choice that is a VisAD Data object. 078 */ 079public class FlatFileDataSource extends ucar.unidata.data.FilesDataSource { 080 081 /** 082 * Parameterless ctor 083 */ 084 public FlatFileDataSource() {} 085 086 087 /** 088 * Just pass through to the base class the ctor arguments. 089 * @param descriptor Describes this data source, has a label etc. 090 * @param filename This is the filename (or url) that 091 * points to the actual data source. 092 * @param properties General properties used in the base class 093 * 094 * idv * @throws VisADException problem getting the data 095 */ 096 public FlatFileDataSource(DataSourceDescriptor descriptor, 097 String filename, Hashtable properties) 098 throws VisADException { 099 super(descriptor, filename, "Image flat file data source", properties); 100 System.out.println("FlatFileDataSource.descriptor: " + descriptor.toString()); 101 System.out.println("FlatFileDataSource.filename: " + filename); 102 System.out.println("FlatFileDataSource.properties: " + properties.toString()); 103 } 104 105 /** 106 * This method is called at initialization time and should create 107 * a set of {@link ucar.unidata.data.DirectDataChoice}-s and add them 108 * into the base class managed list of DataChoice-s with the method 109 * addDataChoice. 110 */ 111 protected void doMakeDataChoices() { 112 String xmlFile = getFilePath(); 113 List bandsDefault = new ArrayList(); 114 bandsDefault.add("Band 1"); 115 String name = getProperty("FLAT.NAME", "Unknown name"); 116 List bandNames = (List)getProperty("FLAT.BANDNAMES", bandsDefault); 117 List bandFiles = (List)getProperty("FLAT.BANDFILES", bandsDefault); 118 119 int lines = getProperty("FLAT.LINES", (int)0); 120 int elements = getProperty("FLAT.ELEMENTS", (int)0); 121 String unit = getProperty("FLAT.UNIT", ""); 122 int stride = getProperty("FLAT.STRIDE", (int)1); 123 124 if (bandNames.size() == bandFiles.size()) { 125 for (int i=0; i<bandNames.size(); i++) { 126 System.out.println(bandNames.get(i) + ": " + bandFiles.get(i)); 127 } 128 } 129 else { 130 System.err.println("bandNames: " + bandNames.toString()); 131 System.err.println("bandFiles: " + bandFiles.toString()); 132 System.err.println("Huh... bandNames (" + bandNames.size() + ") and bandFiles (" + bandFiles.size() + ") should be the same size"); 133 } 134 135 Hashtable imageProps = Misc.newHashtable(DataChoice.PROP_ICON, "/auxdata/ui/icons/Earth16.gif"); 136 137 // Navigation 138 String navType = getProperty("NAV.TYPE", "UNKNOWN"); 139 double ulLat = 0; 140 double ulLon = 0; 141 double lrLat = 0; 142 double lrLon = 0; 143 String latFile = null; 144 String lonFile = null; 145 if (navType == "FILES") { 146 latFile = getProperty("FILE.LAT", ""); 147 lonFile = getProperty("FILE.LON", ""); 148 } 149 else if (navType == "BOUNDS") { 150 ulLat = getProperty("BOUNDS.ULLAT", (double)0); 151 ulLon = getProperty("BOUNDS.ULLON", (double)0); 152 lrLat = getProperty("BOUNDS.LRLAT", (double)0); 153 lrLon = getProperty("BOUNDS.LRLON", (double)0); 154 } 155 else { 156 System.err.println("FlatFileDataSource: Unknown navType: " + navType); 157 } 158 int scale = getProperty("NAV.SCALE", (int)1); 159 boolean eastPositive = getProperty("NAV.EASTPOS", false); 160 161 // Format 162 String formatType = getProperty("FORMAT.TYPE", "UNKNOWN"); 163 if (formatType == "BINARY") { 164 int format = getProperty("BINARY.FORMAT", HeaderInfo.kFormat1ByteUInt); 165 String interleave = getProperty("BINARY.INTERLEAVE", HeaderInfo.kInterleaveSequential); 166 boolean bigEndian = getProperty("BINARY.BIGENDIAN", false); 167 int offset = getProperty("BINARY.OFFSET", 0); 168 169 List categories = DataCategory.parseCategories("IMAGE", false); 170 CompositeDataChoice cdc = new CompositeDataChoice(this, "", name, name, null); 171 for (int i=0; i<bandFiles.size(); i++) { 172 FlatFileReader dataChoiceData = new FlatFileReader((String)bandFiles.get(i), lines, elements); 173 dataChoiceData.setBinaryInfo(format, interleave, bigEndian, offset, i+1, bandFiles.size()); 174 dataChoiceData.setUnit(unit); 175 dataChoiceData.setEastPositive(eastPositive); 176 dataChoiceData.setStride(stride); 177 if (latFile != null && lonFile != null) { 178 dataChoiceData.setNavFiles(latFile, lonFile, scale); 179 } 180 else { 181 dataChoiceData.setNavBounds(ulLat, ulLon, lrLat, lrLon); 182 } 183 String bandName = (String)bandNames.get(i); 184 DirectDataChoice ddc = new DirectDataChoice(this, dataChoiceData, bandName, bandName, categories, imageProps); 185 cdc.addDataChoice(ddc); 186 } 187 addDataChoice(cdc); 188 System.err.println("Still working on binary data..."); 189 } 190 else if (formatType == "ASCII") { 191 String delimiter = getProperty("ASCII.DELIMITER", ""); 192 193 List categories = DataCategory.parseCategories("IMAGE", false); 194 CompositeDataChoice cdc = new CompositeDataChoice(this, "", name, name, null); 195 for (int i=0; i<bandFiles.size(); i++) { 196 FlatFileReader dataChoiceData = new FlatFileReader((String)bandFiles.get(i), lines, elements); 197 dataChoiceData.setAsciiInfo(delimiter, 1); 198 dataChoiceData.setUnit(unit); 199 dataChoiceData.setEastPositive(eastPositive); 200 dataChoiceData.setStride(stride); 201 if (latFile != null && lonFile != null) { 202 dataChoiceData.setNavFiles(latFile, lonFile, scale); 203 } 204 else { 205 dataChoiceData.setNavBounds(ulLat, ulLon, lrLat, lrLon); 206 } 207 String bandName = (String)bandNames.get(i); 208 DirectDataChoice ddc = new DirectDataChoice(this, dataChoiceData, bandName, bandName, categories, imageProps); 209 cdc.addDataChoice(ddc); 210 } 211 addDataChoice(cdc); 212 System.err.println("Still working on ascii data..."); 213 } 214 else if (formatType == "IMAGE") { 215 List categories = DataCategory.parseCategories("RGBIMAGE", false); 216 FlatFileReader dataChoiceData = new FlatFileReader((String)bandFiles.get(0), lines, elements); 217 dataChoiceData.setImageInfo(); 218 dataChoiceData.setUnit(unit); 219 dataChoiceData.setEastPositive(eastPositive); 220 dataChoiceData.setStride(stride); 221 if (latFile != null && lonFile != null) { 222 dataChoiceData.setNavFiles(latFile, lonFile, scale); 223 } 224 else { 225 dataChoiceData.setNavBounds(ulLat, ulLon, lrLat, lrLon); 226 } 227 String bandName = (String)bandNames.get(0); 228 DirectDataChoice ddc = new DirectDataChoice(this, dataChoiceData, bandName, bandName, categories, imageProps); 229 addDataChoice(ddc); 230 } 231 else { 232 System.err.println("FlatFileDataSource: Unknown formatType: " + formatType); 233 } 234 } 235 236 /** 237 * This method should create and return the visad.Data that is 238 * identified by the given {@link ucar.unidata.data.DataChoice}. 239 * 240 * @param dataChoice This is one of the DataChoice-s that was created 241 * in the doMakeDataChoices call above. 242 * @param category The specific {@link ucar.unidata.data.DataCategory} 243 * which the {@link ucar.unidata.idv.DisplayControl} 244 * was instantiated with. Usually can be ignored. 245 * @param dataSelection This may contain a list of times which 246 * subsets the request. 247 * @param requestProperties extra request properties 248 * @return The {@link visad.Data} object represented by the given dataChoice 249 * 250 * @throws RemoteException Java RMI problem 251 * @throws VisADException VisAD problem 252 */ 253 protected Data getDataInner(DataChoice dataChoice, DataCategory category, 254 DataSelection dataSelection, 255 Hashtable requestProperties) 256 throws VisADException, RemoteException { 257 FlatFileReader stuff = (FlatFileReader) dataChoice.getId(); 258 return stuff.getData(); 259 } 260 261} 262