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
029 package edu.wisc.ssec.mcidasv.data;
030
031 import java.awt.BorderLayout;
032 import java.awt.Color;
033 import java.awt.geom.Rectangle2D;
034 import java.net.URL;
035 import java.rmi.RemoteException;
036 import java.util.Enumeration;
037 import java.util.HashMap;
038 import java.util.Hashtable;
039
040 import javax.swing.JComponent;
041 import javax.swing.JPanel;
042
043 import ucar.unidata.data.DataCategory;
044 import ucar.unidata.data.DataChoice;
045 import ucar.unidata.data.DataSelection;
046 import ucar.unidata.data.DataSelectionComponent;
047 import ucar.unidata.data.DataSourceImpl;
048 import ucar.unidata.data.DirectDataChoice;
049 import ucar.unidata.data.grid.GridUtil;
050 import ucar.unidata.idv.DisplayConventions;
051 import ucar.unidata.util.ColorTable;
052 import ucar.unidata.util.Range;
053 import ucar.unidata.view.geoloc.MapProjectionDisplay;
054 import ucar.unidata.view.geoloc.MapProjectionDisplayJ3D;
055 import ucar.visad.display.DisplayMaster;
056 import ucar.visad.display.MapLines;
057
058 import visad.BaseColorControl;
059 import visad.CellImpl;
060 import visad.FlatField;
061 import visad.FunctionType;
062 import visad.Gridded2DSet;
063 import visad.RealType;
064 import visad.SampledSet;
065 import visad.ScalarMap;
066 import visad.VisADException;
067 import visad.data.mcidas.BaseMapAdapter;
068 import visad.georef.MapProjection;
069
070 import edu.wisc.ssec.mcidasv.control.LambertAEA;
071 import edu.wisc.ssec.mcidasv.data.hydra.HydraContext;
072 import edu.wisc.ssec.mcidasv.data.hydra.HydraRGBDisplayable;
073 import edu.wisc.ssec.mcidasv.data.hydra.MultiDimensionSubset;
074 import edu.wisc.ssec.mcidasv.data.hydra.MultiSpectralData;
075 import edu.wisc.ssec.mcidasv.data.hydra.SubsetRubberBandBox;
076
077 public class PreviewSelection extends DataSelectionComponent {
078 DataChoice dataChoice;
079 FlatField image;
080 boolean isLL;
081 MapProjection sampleProjection;
082
083 double[] x_coords = new double[2];
084 double[] y_coords = new double[2];
085 boolean hasSubset = false;
086 MapProjectionDisplayJ3D mapProjDsp;
087 DisplayMaster dspMaster;
088
089 DataSourceImpl dataSource;
090
091 DataCategory dataCategory;
092
093 static SampledSet lines_outlsupu = null;
094 static SampledSet lines_outlsupw = null;
095 static SampledSet lines_outlhpol = null;
096
097
098 public PreviewSelection() {
099 super("Region");
100 }
101
102 public PreviewSelection(final DataChoice dataChoice, FlatField image,
103 MapProjection sample) throws VisADException, RemoteException {
104 this(dataChoice, image, sample, null, null);
105 }
106
107 public PreviewSelection(final DataChoice dataChoice, FlatField image,
108 MapProjection sample, Range displayRange, byte[][] colorTable) throws VisADException, RemoteException {
109 super("Region");
110
111 this.dataChoice = dataChoice;
112 this.dataCategory = (DataCategory) dataChoice.getCategories().get(0);
113 this.dataSource = (DataSourceImpl) ((DirectDataChoice)dataChoice).getDataSource();
114 this.image = image;
115 this.sampleProjection = sample;
116 sample = getDataProjection();
117
118 DisplayConventions dspConv = dataSource.getDataContext().getIdv().getDisplayConventions();
119
120 if (this.sampleProjection == null) {
121 this.sampleProjection = sample;
122 }
123
124 isLL = sampleProjection.isLatLonOrder();
125
126 mapProjDsp = new MapProjectionDisplayJ3D(MapProjectionDisplay.MODE_2Din3D);
127 mapProjDsp.enableRubberBanding(false);
128 dspMaster = mapProjDsp;
129 mapProjDsp.setMapProjection(sampleProjection);
130 RealType imageRangeType =
131 (((FunctionType)image.getType()).getFlatRange().getRealComponents())[0];
132 HydraRGBDisplayable imageDsp = new HydraRGBDisplayable("image", imageRangeType, null, true, null);
133 imageDsp.setData(image);
134
135 dspMaster.addDisplayable(imageDsp);
136
137 MapLines mapLines = new MapLines("maplines");
138 URL mapSource =
139 mapProjDsp.getClass().getResource("/auxdata/maps/OUTLSUPU");
140 try {
141 if (lines_outlsupu == null) {
142 BaseMapAdapter mapAdapter = new BaseMapAdapter(mapSource);
143 lines_outlsupu = (SampledSet) mapAdapter.getData();
144 }
145 mapLines.setMapLines(lines_outlsupu);
146 mapLines.setColor(java.awt.Color.cyan);
147 mapProjDsp.addDisplayable(mapLines);
148 } catch (Exception excp) {
149 System.out.println("Can't open map file " + mapSource);
150 System.out.println(excp);
151 }
152
153 mapLines = new MapLines("maplines");
154 mapSource =
155 mapProjDsp.getClass().getResource("/auxdata/maps/OUTLSUPW");
156 try {
157 if (lines_outlsupw == null) {
158 BaseMapAdapter mapAdapter = new BaseMapAdapter(mapSource);
159 lines_outlsupw = (SampledSet) mapAdapter.getData();
160 }
161 mapLines.setMapLines(lines_outlsupw);
162 mapLines.setColor(java.awt.Color.cyan);
163 mapProjDsp.addDisplayable(mapLines);
164 } catch (Exception excp) {
165 System.out.println("Can't open map file " + mapSource);
166 System.out.println(excp);
167 }
168
169 mapLines = new MapLines("maplines");
170 mapSource =
171 mapProjDsp.getClass().getResource("/auxdata/maps/OUTLHPOL");
172 try {
173 if (lines_outlhpol == null) {
174 BaseMapAdapter mapAdapter = new BaseMapAdapter(mapSource);
175 lines_outlhpol = (SampledSet) mapAdapter.getData();
176 }
177 mapLines.setMapLines(lines_outlhpol);
178 mapLines.setColor(java.awt.Color.cyan);
179 mapProjDsp.addDisplayable(mapLines);
180 } catch (Exception excp) {
181 System.out.println("Can't open map file " + mapSource);
182 System.out.println(excp);
183 }
184
185
186
187 Hashtable table = dataChoice.getProperties();
188 Enumeration keys = table.keys();
189 while (keys.hasMoreElements()) {
190 Object key = keys.nextElement();
191 if (key instanceof MultiDimensionSubset) {
192 hasSubset = true;
193 MultiDimensionSubset select = (MultiDimensionSubset) table.get(key);
194 HydraContext hydraContext = HydraContext.getHydraContext(dataSource, dataCategory);
195 // HydraContext hydraContext = HydraContext.getHydraContext();
196 if (hydraContext.getMultiDimensionSubset() == null) {
197 hydraContext.setMultiDimensionSubset(select);
198 }
199 }
200 }
201
202 final SubsetRubberBandBox rbb =
203 new SubsetRubberBandBox(isLL, image, ((MapProjectionDisplay)mapProjDsp).getDisplayCoordinateSystem(), 1);
204 rbb.setColor(Color.green);
205 rbb.addAction(new CellImpl() {
206 boolean init = false;
207 public void doAction()
208 throws VisADException, RemoteException
209 {
210 if (!init) {
211 init = true;
212 return;
213 }
214 Gridded2DSet set = rbb.getBounds();
215 float[] low = set.getLow();
216 float[] hi = set.getHi();
217 x_coords[0] = low[0];
218 x_coords[1] = hi[0];
219
220 y_coords[0] = low[1];
221 y_coords[1] = hi[1];
222
223 if (hasSubset) {
224 HydraContext hydraContext = HydraContext.getHydraContext(dataSource, dataCategory);
225 // HydraContext hydraContext = HydraContext.getHydraContext();
226 MultiDimensionSubset select = hydraContext.getMultiDimensionSubset();
227 HashMap map = select.getSubset();
228
229 double[] coords0 = (double[]) map.get("Track");
230 coords0[0] = y_coords[0];
231 coords0[1] = y_coords[1];
232 coords0[2] = 1;
233 double[] coords1 = (double[]) map.get("XTrack");
234 coords1[0] = x_coords[0];
235 coords1[1] = x_coords[1];
236 coords1[2] = 1;
237
238 hydraContext.setMultiDimensionSubset(new MultiDimensionSubset(map));
239 }
240 }
241 });
242 dspMaster.addDisplayable(rbb);
243
244 ScalarMap colorMap = imageDsp.getColorMap();
245 Range[] range = GridUtil.fieldMinMax(this.image);
246 Range imageRange = range[0];
247 double max;
248 double min;
249 double dMax = imageRange.getMax();
250 double dMin = imageRange.getMin();
251 String name = this.dataChoice.getName();
252
253 float[][] clrTbl = BaseColorControl.initTableGreyWedge(new float[4][256], true);
254
255 if (name.endsWith("BRIT")) {
256 dMin = imageRange.getMin();
257 min = dMax;
258 max = dMin;
259 }
260 else if (imageRangeType.getName().contains("Reflectance")) {
261 min = dMax;
262 max = 0.0;
263 }
264 else if (imageRangeType.getName().equals("BrightnessTemp")) {
265 max = dMax*1.06;
266 min = dMax * 0.74;
267 }
268 else {
269 Range rng = dspConv.getParamRange(name, null);
270 max = dMax;
271 min = dMin;
272 ColorTable ct = dspConv.getParamColorTable(name);
273 clrTbl = ct.getTable();
274 }
275 colorMap.setRange(min, max);
276
277 /*- must to draw first so colorMap has a Control */
278 dspMaster.draw();
279
280 BaseColorControl clrCntrl = (BaseColorControl) colorMap.getControl();
281 clrCntrl.setTable(clrTbl);
282 }
283
284 public MapProjection getDataProjection() {
285 MapProjection mp = null;
286
287 if (image == null) return mp;
288
289 Rectangle2D rect = MultiSpectralData.getLonLatBoundingBox(image);
290 try {
291 mp = new LambertAEA(rect);
292 } catch (Exception e) {
293 System.out.println(" getDataProjection"+e);
294 }
295 return mp;
296 }
297
298 public JComponent doMakeContents() {
299 try {
300 JPanel panel = new JPanel(new BorderLayout());
301 panel.add("Center", dspMaster.getDisplayComponent());
302 return panel;
303 }
304 catch (Exception e) {
305 System.out.println(e);
306 }
307 return null;
308 }
309
310 public void applyToDataSelection(DataSelection dataSelection) {
311 if (hasSubset) {
312 HydraContext hydraContext = HydraContext.getHydraContext(dataSource, dataCategory);
313 // HydraContext hydraContext = HydraContext.getHydraContext();
314 Hashtable table = dataChoice.getProperties();
315 table.put(MultiDimensionSubset.key, hydraContext.getMultiDimensionSubset());
316
317 table = dataSelection.getProperties();
318 table.put(MultiDimensionSubset.key, hydraContext.getMultiDimensionSubset());
319
320 dataChoice.setDataSelection(dataSelection);
321 }
322 }
323 }