001 /*
002 * This file is part of McIDAS-V
003 *
004 * Copyright 2007-2013
005 * Space Science and Engineering Center (SSEC)
006 * University of Wisconsin - Madison
007 * 1225 W. Dayton Street, Madison, WI 53706, USA
008 * https://www.ssec.wisc.edu/mcidas
009 *
010 * All Rights Reserved
011 *
012 * McIDAS-V is built on Unidata's IDV and SSEC's VisAD libraries, and
013 * some McIDAS-V source code is based on IDV and VisAD source code.
014 *
015 * McIDAS-V is free software; you can redistribute it and/or modify
016 * it under the terms of the GNU Lesser Public License as published by
017 * the Free Software Foundation; either version 3 of the License, or
018 * (at your option) any later version.
019 *
020 * McIDAS-V is distributed in the hope that it will be useful,
021 * but WITHOUT ANY WARRANTY; without even the implied warranty of
022 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
023 * GNU Lesser Public License for more details.
024 *
025 * You should have received a copy of the GNU Lesser Public License
026 * along with this program. If not, see http://www.gnu.org/licenses.
027 */
028 package edu.wisc.ssec.mcidasv.data;
029
030 import java.io.BufferedReader;
031 import java.io.File;
032 import java.io.FileReader;
033 import java.util.ArrayList;
034 import java.util.Hashtable;
035 import java.util.List;
036
037 public class EnviInfo extends HeaderInfo {
038
039 /** The url */
040 private String dataFile = "";
041 private boolean isEnvi = false;
042
043 /**
044 * Ctor for xml encoding
045 */
046 public EnviInfo() {}
047
048 /**
049 * CTOR
050 *
051 * @param filename The filename
052 */
053 public EnviInfo(File thisFile) {
054 this(thisFile.getAbsolutePath());
055 }
056
057 /**
058 * CTOR
059 *
060 * @param filename The filename
061 */
062 public EnviInfo(String filename) {
063 super(filename);
064 this.dataFile = filename.replace(".hdr", ".img");
065 }
066
067 /**
068 * Is the file an ENVI header file?
069 */
070 public boolean isEnviHeader() {
071 parseHeader();
072 return isEnvi;
073 }
074
075 /**
076 * Can we find a matching ENVI data file?
077 */
078 public boolean hasEnviData() {
079 File testFile = new File(dataFile);
080 if (testFile.exists()) return true;
081 else return false;
082 }
083
084 /**
085 * Is this a navigation header file?
086 */
087 public boolean isNavHeader() {
088 parseHeader();
089 List bandNames = (List)getParameter(BANDNAMES, new ArrayList());
090 if (bandNames == null) return false;
091 if (bandNames.contains("Latitude") && bandNames.contains("Longitude")) return true;
092 return false;
093 }
094
095 /**
096 * Which band/file is latitude?
097 */
098 public int getLatBandNum() {
099 parseHeader();
100 List bandNames = (List)getParameter(BANDNAMES, new ArrayList());
101 for (int i=0; i<bandNames.size(); i++) {
102 if (bandNames.get(i).equals("Latitude")) return i+1;
103 }
104 return -1;
105 }
106 public String getLatBandFile() {
107 parseHeader();
108 List bandFiles = (List)getParameter(BANDFILES, new ArrayList());
109 int bandNum = getLatBandNum();
110 if (bandNum < 0) return "";
111 return (String)(bandFiles.get(bandNum-1));
112 }
113
114 /**
115 * Which band/file is longitude?
116 */
117 public int getLonBandNum() {
118 parseHeader();
119 List bandNames = (List)getParameter(BANDNAMES, new ArrayList());
120 for (int i=0; i<bandNames.size(); i++) {
121 if (bandNames.get(i).equals("Longitude")) return i+1;
122 }
123 return -1;
124 }
125 public String getLonBandFile() {
126 parseHeader();
127 List bandFiles = (List)getParameter(BANDFILES, new ArrayList());
128 int bandNum = getLonBandNum();
129 if (bandNum < 0) return "";
130 return (String)(bandFiles.get(bandNum-1));
131 }
132
133 /**
134 * Return a FlatField representing the data
135 */
136 // public FlatField getDataField() {
137 //
138 // }
139
140 /**
141 * Return a Gridded2DSet representing navigation
142 */
143 // public Gridded2DSet getNavField() {
144 //
145 // }
146
147 /**
148 * Parse a potential ENVI header file
149 */
150 protected void parseHeader() {
151 if (haveParsed()) return;
152 if (!doesExist()) {
153 isEnvi = false;
154 return;
155 }
156
157 try {
158 BufferedReader br = new BufferedReader(new FileReader(getFilename()));
159 String line;
160 String parameter = "";
161 String value = "";
162 boolean inValue = false;
163
164 List bandNames = new ArrayList();
165 List bandFiles = new ArrayList();
166
167 while ((line = br.readLine()) != null) {
168 if (line.trim().equals("ENVI")) {
169 isEnvi = true;
170 continue;
171 }
172 if (!isEnvi) break;
173
174 int indexOfEquals = line.indexOf("=");
175 int indexOfOpen = line.indexOf("{");
176 int indexOfClose = line.indexOf("}");
177 if (indexOfEquals >= 0) {
178 parameter = line.substring(0, indexOfEquals).trim();
179 value = "";
180 inValue = false;
181 }
182 if (indexOfOpen >= 0) {
183 if (indexOfClose >= 0) {
184 value += line.substring(indexOfOpen+1, indexOfClose).trim();
185 inValue = false;
186 }
187 else {
188 value += line.substring(indexOfOpen+1).trim();
189 inValue = true;
190 continue;
191 }
192 }
193 else if (inValue) {
194 if (indexOfClose >= 0) {
195 value += line.substring(0, indexOfClose).trim();
196 inValue = false;
197 }
198 else {
199 value += line.trim();
200 continue;
201 }
202 }
203 else {
204 value += line.substring(indexOfEquals+1).trim();
205 }
206
207 if (parameter.equals("")) continue;
208
209 if (parameter.equals("description")) {
210 setParameter(DESCRIPTION, value);
211 }
212 else if (parameter.equals("samples")) {
213 setParameter(ELEMENTS, Integer.parseInt(value));
214 }
215 else if (parameter.equals("lines")) {
216 setParameter(LINES, Integer.parseInt(value));
217 }
218 else if (parameter.equals("header offset")) {
219 setParameter(OFFSET, Integer.parseInt(value));
220 }
221 else if (parameter.equals("data type")) {
222 setParameter(DATATYPE, Integer.parseInt(value));
223 }
224 else if (parameter.equals("data ignore value") ||
225 parameter.equals("bad value")) {
226 setParameter(MISSINGVALUE, Float.parseFloat(value));
227 }
228 else if (parameter.equals("interleave")) {
229 setParameter(INTERLEAVE, value.toUpperCase());
230 }
231 else if (parameter.equals("byte order")) {
232 boolean bigEndian = false;
233 if (value.equals("1")) bigEndian = true;
234 setParameter(BIGENDIAN, bigEndian);
235 }
236 else if (parameter.equals("bands")) {
237 if (bandNames.size() <= 0 && bandFiles.size() <= 0) {
238 int bandCount = Integer.parseInt(value);
239 for (int i=0; i<bandCount; i++) {
240 bandNames.add("Band " + i+1);
241 bandFiles.add(dataFile);
242 }
243 setParameter(BANDNAMES, bandNames);
244 setParameter(BANDFILES, bandFiles);
245 }
246 }
247 else if (parameter.equals("band names")) {
248 bandNames = new ArrayList();
249 bandFiles = new ArrayList();
250 String[] bandNamesSplit = value.split(",");
251 for (int i=0; i<bandNamesSplit.length; i++) {
252 bandNames.add(bandNamesSplit[i].trim());
253 bandFiles.add(dataFile);
254 }
255 setParameter(BANDNAMES, bandNames);
256 setParameter(BANDFILES, bandFiles);
257 }
258
259 }
260 br.close();
261 }
262 catch (Exception e) {
263 e.printStackTrace();
264 }
265
266 }
267
268 }