001/* 002 * $Id: EnviInfo.java,v 1.4 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 */ 030package edu.wisc.ssec.mcidasv.data; 031 032import java.io.BufferedReader; 033import java.io.File; 034import java.io.FileReader; 035import java.util.ArrayList; 036import java.util.Hashtable; 037import java.util.List; 038 039public class EnviInfo extends HeaderInfo { 040 041 /** The url */ 042 private String dataFile = ""; 043 private boolean isEnvi = false; 044 045 /** 046 * Ctor for xml encoding 047 */ 048 public EnviInfo() {} 049 050 /** 051 * CTOR 052 * 053 * @param filename The filename 054 */ 055 public EnviInfo(File thisFile) { 056 this(thisFile.getAbsolutePath()); 057 } 058 059 /** 060 * CTOR 061 * 062 * @param filename The filename 063 */ 064 public EnviInfo(String filename) { 065 super(filename); 066 this.dataFile = filename.replace(".hdr", ".img"); 067 } 068 069 /** 070 * Is the file an ENVI header file? 071 */ 072 public boolean isEnviHeader() { 073 parseHeader(); 074 return isEnvi; 075 } 076 077 /** 078 * Can we find a matching ENVI data file? 079 */ 080 public boolean hasEnviData() { 081 File testFile = new File(dataFile); 082 if (testFile.exists()) return true; 083 else return false; 084 } 085 086 /** 087 * Is this a navigation header file? 088 */ 089 public boolean isNavHeader() { 090 parseHeader(); 091 List bandNames = (List)getParameter(BANDNAMES, new ArrayList()); 092 if (bandNames == null) return false; 093 if (bandNames.contains("Latitude") && bandNames.contains("Longitude")) return true; 094 return false; 095 } 096 097 /** 098 * Which band/file is latitude? 099 */ 100 public int getLatBandNum() { 101 parseHeader(); 102 List bandNames = (List)getParameter(BANDNAMES, new ArrayList()); 103 for (int i=0; i<bandNames.size(); i++) { 104 if (bandNames.get(i).equals("Latitude")) return i+1; 105 } 106 return -1; 107 } 108 public String getLatBandFile() { 109 parseHeader(); 110 List bandFiles = (List)getParameter(BANDFILES, new ArrayList()); 111 int bandNum = getLatBandNum(); 112 if (bandNum < 0) return ""; 113 return (String)(bandFiles.get(bandNum-1)); 114 } 115 116 /** 117 * Which band/file is longitude? 118 */ 119 public int getLonBandNum() { 120 parseHeader(); 121 List bandNames = (List)getParameter(BANDNAMES, new ArrayList()); 122 for (int i=0; i<bandNames.size(); i++) { 123 if (bandNames.get(i).equals("Longitude")) return i+1; 124 } 125 return -1; 126 } 127 public String getLonBandFile() { 128 parseHeader(); 129 List bandFiles = (List)getParameter(BANDFILES, new ArrayList()); 130 int bandNum = getLonBandNum(); 131 if (bandNum < 0) return ""; 132 return (String)(bandFiles.get(bandNum-1)); 133 } 134 135 /** 136 * Return a FlatField representing the data 137 */ 138// public FlatField getDataField() { 139// 140// } 141 142 /** 143 * Return a Gridded2DSet representing navigation 144 */ 145// public Gridded2DSet getNavField() { 146// 147// } 148 149 /** 150 * Parse a potential ENVI header file 151 */ 152 protected void parseHeader() { 153 if (haveParsed()) return; 154 if (!doesExist()) { 155 isEnvi = false; 156 return; 157 } 158 159 try { 160 BufferedReader br = new BufferedReader(new FileReader(getFilename())); 161 String line; 162 String parameter = ""; 163 String value = ""; 164 boolean inValue = false; 165 166 List bandNames = new ArrayList(); 167 List bandFiles = new ArrayList(); 168 169 while ((line = br.readLine()) != null) { 170 if (line.trim().equals("ENVI")) { 171 isEnvi = true; 172 continue; 173 } 174 if (!isEnvi) break; 175 176 int indexOfEquals = line.indexOf("="); 177 int indexOfOpen = line.indexOf("{"); 178 int indexOfClose = line.indexOf("}"); 179 if (indexOfEquals >= 0) { 180 parameter = line.substring(0, indexOfEquals).trim(); 181 value = ""; 182 inValue = false; 183 } 184 if (indexOfOpen >= 0) { 185 if (indexOfClose >= 0) { 186 value += line.substring(indexOfOpen+1, indexOfClose).trim(); 187 inValue = false; 188 } 189 else { 190 value += line.substring(indexOfOpen+1).trim(); 191 inValue = true; 192 continue; 193 } 194 } 195 else if (inValue) { 196 if (indexOfClose >= 0) { 197 value += line.substring(0, indexOfClose).trim(); 198 inValue = false; 199 } 200 else { 201 value += line.trim(); 202 continue; 203 } 204 } 205 else { 206 value += line.substring(indexOfEquals+1).trim(); 207 } 208 209 if (parameter.equals("")) continue; 210 211 if (parameter.equals("description")) { 212 setParameter(DESCRIPTION, value); 213 } 214 else if (parameter.equals("samples")) { 215 setParameter(ELEMENTS, Integer.parseInt(value)); 216 } 217 else if (parameter.equals("lines")) { 218 setParameter(LINES, Integer.parseInt(value)); 219 } 220 else if (parameter.equals("header offset")) { 221 setParameter(OFFSET, Integer.parseInt(value)); 222 } 223 else if (parameter.equals("data type")) { 224 setParameter(DATATYPE, Integer.parseInt(value)); 225 } 226 else if (parameter.equals("data ignore value") || 227 parameter.equals("bad value")) { 228 setParameter(MISSINGVALUE, Float.parseFloat(value)); 229 } 230 else if (parameter.equals("interleave")) { 231 setParameter(INTERLEAVE, value.toUpperCase()); 232 } 233 else if (parameter.equals("byte order")) { 234 boolean bigEndian = false; 235 if (value.equals("1")) bigEndian = true; 236 setParameter(BIGENDIAN, bigEndian); 237 } 238 else if (parameter.equals("bands")) { 239 if (bandNames.size() <= 0 && bandFiles.size() <= 0) { 240 int bandCount = Integer.parseInt(value); 241 for (int i=0; i<bandCount; i++) { 242 bandNames.add("Band " + i+1); 243 bandFiles.add(dataFile); 244 } 245 setParameter(BANDNAMES, bandNames); 246 setParameter(BANDFILES, bandFiles); 247 } 248 } 249 else if (parameter.equals("band names")) { 250 bandNames = new ArrayList(); 251 bandFiles = new ArrayList(); 252 String[] bandNamesSplit = value.split(","); 253 for (int i=0; i<bandNamesSplit.length; i++) { 254 bandNames.add(bandNamesSplit[i].trim()); 255 bandFiles.add(dataFile); 256 } 257 setParameter(BANDNAMES, bandNames); 258 setParameter(BANDFILES, bandFiles); 259 } 260 261 } 262 br.close(); 263 } 264 catch (Exception e) { 265 e.printStackTrace(); 266 } 267 268 } 269 270}