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