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.hydra; 030 031 import java.awt.BorderLayout; 032 import java.awt.Color; 033 import java.awt.FlowLayout; 034 import java.awt.event.ActionEvent; 035 import java.awt.event.ActionListener; 036 import java.io.File; 037 import java.net.URL; 038 import java.rmi.RemoteException; 039 import java.util.Enumeration; 040 import java.util.HashMap; 041 import java.util.Hashtable; 042 import java.util.List; 043 044 import javax.swing.JComponent; 045 import javax.swing.JLabel; 046 import javax.swing.JPanel; 047 import javax.swing.JTextField; 048 049 import visad.CellImpl; 050 import visad.Data; 051 import visad.FlatField; 052 import visad.Gridded2DSet; 053 import visad.GriddedSet; 054 import visad.RealTupleType; 055 import visad.RealType; 056 import visad.SampledSet; 057 import visad.UnionSet; 058 import visad.VisADException; 059 import visad.data.mcidas.BaseMapAdapter; 060 import visad.georef.MapProjection; 061 062 import ucar.unidata.data.DataCategory; 063 import ucar.unidata.data.DataChoice; 064 import ucar.unidata.data.DataSelection; 065 import ucar.unidata.data.DataSelectionComponent; 066 import ucar.unidata.data.DataSourceDescriptor; 067 import ucar.unidata.data.DirectDataChoice; 068 import ucar.unidata.data.GeoLocationInfo; 069 import ucar.unidata.data.GeoSelection; 070 import ucar.unidata.geoloc.projection.LatLonProjection; 071 import ucar.unidata.util.Misc; 072 import ucar.unidata.view.geoloc.MapProjectionDisplay; 073 import ucar.unidata.view.geoloc.MapProjectionDisplayJ3D; 074 import ucar.visad.ProjectionCoordinateSystem; 075 import ucar.visad.display.DisplayMaster; 076 import ucar.visad.display.LineDrawing; 077 import ucar.visad.display.MapLines; 078 import ucar.visad.display.RubberBandBox; 079 080 import edu.wisc.ssec.mcidasv.data.HydraDataSource; 081 import edu.wisc.ssec.mcidasv.data.PreviewSelection; 082 083 /** 084 * A data source for Multi Dimension Data 085 */ 086 087 public class MultiDimensionDataSource extends HydraDataSource { 088 089 /** Sources file */ 090 protected String filename; 091 092 protected MultiDimensionReader reader; 093 094 protected MultiDimensionAdapter[] adapters = null; 095 protected HashMap[] defaultSubsets = null; 096 private HashMap<String, MultiDimensionAdapter> adapterMap = new HashMap<String, MultiDimensionAdapter>(); 097 protected Hashtable[] propsArray = null; 098 protected List[] categoriesArray = null; 099 100 101 protected SpectrumAdapter spectrumAdapter; 102 103 private static final String DATA_DESCRIPTION = "Multi Dimension Data"; 104 105 private HashMap defaultSubset; 106 public TrackAdapter track_adapter; 107 private MultiSpectralData multiSpectData; 108 109 private List categories; 110 private boolean hasImagePreview = false; 111 private boolean hasTrackPreview = false; 112 113 /** 114 * Zero-argument constructor for construction via unpersistence. 115 */ 116 public MultiDimensionDataSource() {} 117 118 /** 119 * Construct a new HYDRA hdf data source. 120 * @param descriptor descriptor for this <code>DataSource</code> 121 * @param fileName name of the hdf file to read 122 * @param properties hashtable of properties 123 * 124 * @throws VisADException problem creating data 125 */ 126 public MultiDimensionDataSource(DataSourceDescriptor descriptor, 127 String fileName, Hashtable properties) 128 throws VisADException { 129 this(descriptor, Misc.newList(fileName), properties); 130 } 131 132 /** 133 * Construct a new HYDRA hdf data source. 134 * @param descriptor descriptor for this <code>DataSource</code> 135 * @param sources List of filenames 136 * @param properties hashtable of properties 137 * 138 * @throws VisADException problem creating data 139 */ 140 public MultiDimensionDataSource(DataSourceDescriptor descriptor, 141 List newSources, Hashtable properties) 142 throws VisADException { 143 super(descriptor, newSources, DATA_DESCRIPTION, properties); 144 145 this.filename = (String)sources.get(0); 146 147 try { 148 setup(); 149 } 150 catch (Exception e) { 151 e.printStackTrace(); 152 throw new VisADException(); 153 } 154 } 155 156 public void setup() throws Exception { 157 158 try { 159 if (filename.contains("MYD02SSH")) { // get file union 160 String other = (String) sources.get(1); 161 if (filename.endsWith("nav.hdf")) { 162 String tmp = filename; 163 filename = other; 164 other = tmp; 165 } 166 reader = NetCDFFile.makeUnion(filename, other); 167 } 168 else { 169 reader = new NetCDFFile(filename); 170 } 171 } 172 catch (Exception e) { 173 e.printStackTrace(); 174 System.out.println("cannot create NetCDF reader for file: "+filename); 175 } 176 177 adapters = new MultiDimensionAdapter[2]; 178 defaultSubsets = new HashMap[2]; 179 Hashtable<String, String[]> properties = new Hashtable<String, String[]>(); 180 181 String name = (new File(filename)).getName(); 182 183 if ( name.startsWith("MOD04") || name.startsWith("MYD04")) { 184 HashMap table = SwathAdapter.getEmptyMetadataTable(); 185 table.put("array_name", "mod04/Data_Fields/Optical_Depth_Land_And_Ocean"); 186 table.put("lon_array_name", "mod04/Geolocation_Fields/Longitude"); 187 table.put("lat_array_name", "mod04/Geolocation_Fields/Latitude"); 188 table.put("XTrack", "Cell_Across_Swath"); 189 table.put("Track", "Cell_Along_Swath"); 190 table.put("geo_Track", "Cell_Along_Swath"); 191 table.put("geo_XTrack", "Cell_Across_Swath"); 192 table.put("scale_name", "scale_factor"); 193 table.put("offset_name", "add_offset"); 194 table.put("fill_value_name", "_FillValue"); 195 table.put("range_name", "Optical_Depth_Land_And_Ocean"); 196 adapters[0] = new SwathAdapter(reader, table); 197 categories = DataCategory.parseCategories("2D grid;GRID-2D;"); 198 defaultSubset = adapters[0].getDefaultSubset(); 199 defaultSubsets[0] = defaultSubset; 200 } 201 else if ( name.startsWith("MOD06") || name.startsWith("MYD06")) { 202 hasImagePreview = true; 203 String path = "mod06/Data_Fields/"; 204 String[] arrayNames = new String[] {"Cloud_Optical_Thickness", "Cloud_Effective_Radius", "Cloud_Water_Path"}; 205 String[] arrayNames_5km = new String[] {"Cloud_Top_Pressure", "Cloud_Top_Temperature", "Cloud_Fraction"}; 206 207 adapters = new MultiDimensionAdapter[arrayNames.length+arrayNames_5km.length]; 208 defaultSubsets = new HashMap[arrayNames.length+arrayNames_5km.length]; 209 categoriesArray = new List[adapters.length]; 210 211 212 for (int k=0; k<arrayNames.length; k++) { 213 HashMap table = SwathAdapter.getEmptyMetadataTable(); 214 table.put("array_name", path.concat(arrayNames[k])); 215 table.put("lon_array_name", "mod06/Geolocation_Fields/Longitude"); 216 table.put("lat_array_name", "mod06/Geolocation_Fields/Latitude"); 217 table.put("XTrack", "Cell_Across_Swath_1km"); 218 table.put("Track", "Cell_Along_Swath_1km"); 219 table.put("geo_Track", "Cell_Along_Swath_5km"); 220 table.put("geo_XTrack", "Cell_Across_Swath_5km"); 221 table.put("scale_name", "scale_factor"); 222 table.put("offset_name", "add_offset"); 223 table.put("fill_value_name", "_FillValue"); 224 table.put("range_name", arrayNames[k]); 225 226 table.put(SwathAdapter.geo_track_offset_name, Double.toString(2.0)); 227 table.put(SwathAdapter.geo_xtrack_offset_name, Double.toString(2.0)); 228 table.put(SwathAdapter.geo_track_skip_name, Double.toString(5.0)); 229 table.put(SwathAdapter.geo_xtrack_skip_name, Double.toString(5.0148148148)); 230 231 SwathAdapter swathAdapter = new SwathAdapter(reader, table); 232 swathAdapter.setDefaultStride(10); 233 defaultSubset = swathAdapter.getDefaultSubset(); 234 adapters[k] = swathAdapter; 235 defaultSubsets[k] = defaultSubset; 236 categoriesArray[k] = DataCategory.parseCategories("1km swath;GRID-2D;"); 237 } 238 239 for (int k=0; k<arrayNames_5km.length; k++) { 240 HashMap table = SwathAdapter.getEmptyMetadataTable(); 241 table.put("array_name", path.concat(arrayNames_5km[k])); 242 table.put("lon_array_name", "mod06/Geolocation_Fields/Longitude"); 243 table.put("lat_array_name", "mod06/Geolocation_Fields/Latitude"); 244 table.put("XTrack", "Cell_Across_Swath_5km"); 245 table.put("Track", "Cell_Along_Swath_5km"); 246 table.put("geo_Track", "Cell_Along_Swath_5km"); 247 table.put("geo_XTrack", "Cell_Across_Swath_5km"); 248 table.put("scale_name", "scale_factor"); 249 table.put("offset_name", "add_offset"); 250 table.put("fill_value_name", "_FillValue"); 251 table.put("range_name", arrayNames_5km[k]); 252 253 SwathAdapter swathAdapter = new SwathAdapter(reader, table); 254 defaultSubset = swathAdapter.getDefaultSubset(); 255 adapters[arrayNames.length+k] = swathAdapter; 256 defaultSubsets[arrayNames.length+k] = defaultSubset; 257 categoriesArray[arrayNames.length+k] = DataCategory.parseCategories("5km swath;GRID-2D;"); 258 } 259 } 260 else if (name.startsWith("a1") && name.contains("mod06")) { 261 hasImagePreview = true; 262 String[] arrayNames = new String[] {"Cloud_Optical_Thickness", "Cloud_Effective_Radius", "Cloud_Water_Path"}; 263 String[] arrayNames_5km = new String[] {"Cloud_Top_Pressure", "Cloud_Top_Temperature", "Cloud_Fraction"}; 264 265 adapters = new MultiDimensionAdapter[arrayNames.length+arrayNames_5km.length]; 266 defaultSubsets = new HashMap[arrayNames.length+arrayNames_5km.length]; 267 categoriesArray = new List[adapters.length]; 268 269 270 for (int k=0; k<arrayNames.length; k++) { 271 HashMap table = SwathAdapter.getEmptyMetadataTable(); 272 table.put("array_name", arrayNames[k]); 273 table.put("lon_array_name", "Longitude"); 274 table.put("lat_array_name", "Latitude"); 275 table.put("array_dimension_names", new String[] {"Cell_Along_Swath_1km", "Cell_Across_Swath_1km"}); 276 table.put("lon_array_dimension_names", new String[] {"Cell_Along_Swath_1km", "Cell_Across_Swath_1km"}); 277 table.put("lat_array_dimension_names", new String[] {"Cell_Along_Swath_1km", "Cell_Across_Swath_1km"}); 278 table.put("XTrack", "Cell_Across_Swath_1km"); 279 table.put("Track", "Cell_Along_Swath_1km"); 280 table.put("geo_Track", "Cell_Along_Swath_5km"); 281 table.put("geo_XTrack", "Cell_Across_Swath_5km"); 282 table.put("scale_name", "scale_factor"); 283 table.put("offset_name", "add_offset"); 284 table.put("fill_value_name", "_FillValue"); 285 table.put("range_name", arrayNames[k]); 286 287 table.put(SwathAdapter.geo_track_offset_name, Double.toString(2.0)); 288 table.put(SwathAdapter.geo_xtrack_offset_name, Double.toString(2.0)); 289 table.put(SwathAdapter.geo_track_skip_name, Double.toString(5.0)); 290 table.put(SwathAdapter.geo_xtrack_skip_name, Double.toString(5.0148148148)); 291 292 SwathAdapter swathAdapter = new SwathAdapter(reader, table); 293 swathAdapter.setDefaultStride(10); 294 defaultSubset = swathAdapter.getDefaultSubset(); 295 adapters[k] = swathAdapter; 296 defaultSubsets[k] = defaultSubset; 297 categoriesArray[k] = DataCategory.parseCategories("1km swath;GRID-2D;"); 298 } 299 300 for (int k=0; k<arrayNames_5km.length; k++) { 301 HashMap table = SwathAdapter.getEmptyMetadataTable(); 302 table.put("array_name", arrayNames_5km[k]); 303 table.put("lon_array_name", "Longitude"); 304 table.put("lat_array_name", "Latitude"); 305 table.put("array_dimension_names", new String[] {"Cell_Along_Swath_5km", "Cell_Across_Swath_5km"}); 306 table.put("lon_array_dimension_names", new String[] {"Cell_Along_Swath_5km", "Cell_Across_Swath_5km"}); 307 table.put("lat_array_dimension_names", new String[] {"Cell_Along_Swath_5km", "Cell_Across_Swath_5km"}); 308 table.put("XTrack", "Cell_Across_Swath_5km"); 309 table.put("Track", "Cell_Along_Swath_5km"); 310 table.put("geo_Track", "Cell_Along_Swath_5km"); 311 table.put("geo_XTrack", "Cell_Across_Swath_5km"); 312 table.put("scale_name", "scale_factor"); 313 table.put("offset_name", "add_offset"); 314 table.put("fill_value_name", "_FillValue"); 315 table.put("range_name", arrayNames_5km[k]); 316 317 SwathAdapter swathAdapter = new SwathAdapter(reader, table); 318 defaultSubset = swathAdapter.getDefaultSubset(); 319 adapters[arrayNames.length+k] = swathAdapter; 320 defaultSubsets[arrayNames.length+k] = defaultSubset; 321 categoriesArray[arrayNames.length+k] = DataCategory.parseCategories("5km swath;GRID-2D;"); 322 } 323 } 324 else if (name.startsWith("CAL_LID_L1")) { 325 String[] arrayNames = null; 326 adapters = new MultiDimensionAdapter[4]; 327 defaultSubsets = new HashMap[4]; 328 propsArray = new Hashtable[4]; 329 330 331 HashMap table = ProfileAlongTrack.getEmptyMetadataTable(); 332 table.put(ProfileAlongTrack.array_name, "Total_Attenuated_Backscatter_532"); 333 table.put(ProfileAlongTrack.ancillary_file_name, "/edu/wisc/ssec/mcidasv/data/hydra/resources/calipso/altitude"); 334 table.put(ProfileAlongTrack.trackDim_name, "dim0"); 335 table.put(ProfileAlongTrack.vertDim_name, "dim1"); 336 table.put(ProfileAlongTrack.profileTime_name, "Profile_Time"); 337 table.put(ProfileAlongTrack.longitude_name, "Longitude"); 338 table.put(ProfileAlongTrack.latitude_name, "Latitude"); 339 table.put("array_dimension_names", new String[] {"dim0", "dim1"}); 340 ProfileAlongTrack adapter = new Calipso2D(reader, table); 341 ProfileAlongTrack3D adapter3D = new ProfileAlongTrack3D(adapter); 342 HashMap subset = adapter.getDefaultSubset(); 343 adapters[0] = adapter3D; 344 defaultSubset = subset; 345 defaultSubsets[0] = defaultSubset; 346 DataCategory.createCategory("ProfileAlongTrack"); 347 categories = DataCategory.parseCategories("ProfileAlongTrack;ProfileAlongTrack;"); 348 349 properties.put("medianFilter", new String[] {Double.toString(8), Double.toString(16)}); 350 properties.put("setBelowSfcMissing", new String[] {"true"}); 351 propsArray[0] = properties; 352 353 354 ArrayAdapter[] adapter_s = new ArrayAdapter[3]; 355 table = ProfileAlongTrack.getEmptyMetadataTable(); 356 table.put(ProfileAlongTrack.array_name, "Latitude"); 357 table.put(ProfileAlongTrack.trackDim_name, "dim0"); 358 table.put(ProfileAlongTrack.vertDim_name, "dim1"); 359 table.put("array_dimension_names", new String[] {"dim0", "dim1"}); 360 adapter_s[0] = new ArrayAdapter(reader, table); 361 362 table = ProfileAlongTrack.getEmptyMetadataTable(); 363 table.put(ProfileAlongTrack.array_name, "Surface_Elevation"); 364 table.put(ProfileAlongTrack.trackDim_name, "dim0"); 365 table.put(ProfileAlongTrack.vertDim_name, "dim1"); 366 table.put("array_dimension_names", new String[] {"dim0", "dim1"}); 367 adapter_s[1] = new ArrayAdapter(reader, table); 368 369 table = ProfileAlongTrack.getEmptyMetadataTable(); 370 table.put(ProfileAlongTrack.array_name, "Longitude"); 371 table.put(ProfileAlongTrack.trackDim_name, "dim0"); 372 table.put(ProfileAlongTrack.vertDim_name, "dim1"); 373 table.put("array_dimension_names", new String[] {"dim0", "dim1"}); 374 adapter_s[2] = new ArrayAdapter(reader, table); 375 376 TrackDomain track_domain = new TrackDomain(adapter_s[2], adapter_s[0], adapter_s[1]); 377 track_adapter = new TrackAdapter(track_domain, adapter_s[1]); 378 379 table = ProfileAlongTrack.getEmptyMetadataTable(); 380 table.put(ProfileAlongTrack.array_name, "Tropopause_Height"); 381 table.put(ProfileAlongTrack.trackDim_name, "dim0"); 382 table.put(ProfileAlongTrack.vertDim_name, "dim1"); 383 table.put("array_dimension_names", new String[] {"dim0", "dim1"}); 384 ArrayAdapter trop_height = new ArrayAdapter(reader, table); 385 track_domain = new TrackDomain(adapter_s[2], adapter_s[0], trop_height); 386 adapters[1] = new TrackAdapter(track_domain, trop_height); 387 defaultSubsets[1] = adapters[1].getDefaultSubset(); 388 389 adapters[2] = new TrackAdapter(new TrackDomain(adapter_s[2], adapter_s[0], adapter_s[1]), adapter_s[1]); 390 ((TrackAdapter)adapters[2]).setName("Track3D"); 391 defaultSubsets[2] = adapters[2].getDefaultSubset(); 392 393 adapters[3] = new TrackAdapter(new TrackDomain(adapter_s[2], adapter_s[0]), adapter_s[1]); 394 ((TrackAdapter)adapters[3]).setName("Track2D"); 395 defaultSubsets[3] = adapters[3].getDefaultSubset(); 396 397 398 hasTrackPreview = true; 399 } 400 else if (name.startsWith("CAL_LID_L2")) { 401 adapters = new MultiDimensionAdapter[4]; 402 defaultSubsets = new HashMap[4]; 403 propsArray = new Hashtable[4]; 404 405 ArrayAdapter[] adapter_s = new ArrayAdapter[3]; 406 407 HashMap table = ProfileAlongTrack.getEmptyMetadataTable(); 408 table.put(ProfileAlongTrack.array_name, "Longitude"); 409 table.put(ProfileAlongTrack.trackDim_name, "dim0"); 410 table.put(ProfileAlongTrack.vertDim_name, "dim1"); 411 adapter_s[0] = new ArrayAdapter(reader, table); 412 413 table = ProfileAlongTrack.getEmptyMetadataTable(); 414 table.put(ProfileAlongTrack.array_name, "Latitude"); 415 table.put(ProfileAlongTrack.trackDim_name, "dim0"); 416 table.put(ProfileAlongTrack.vertDim_name, "dim1"); 417 adapter_s[1] = new ArrayAdapter(reader, table); 418 419 table = ProfileAlongTrack.getEmptyMetadataTable(); 420 table.put(ProfileAlongTrack.array_name, "DEM_Surface_Elevation"); 421 table.put(ProfileAlongTrack.trackDim_name, "dim0"); 422 table.put(ProfileAlongTrack.vertDim_name, "dim1"); 423 adapter_s[2] = new ArrayAdapter(reader, table); 424 425 TrackDomain track_domain = new TrackDomain(adapter_s[0], adapter_s[1], adapter_s[2]); 426 track_adapter = new TrackAdapter(track_domain, adapter_s[2]); 427 adapters[1] = track_adapter; 428 defaultSubsets[1] = track_adapter.getDefaultSubset(); 429 430 table = ProfileAlongTrack.getEmptyMetadataTable(); 431 table.put(ProfileAlongTrack.array_name, "Layer_Top_Altitude"); 432 table.put(ProfileAlongTrack.trackDim_name, "dim0"); 433 table.put(ProfileAlongTrack.vertDim_name, "dim1"); 434 ArrayAdapter layer_top_altitude = new ArrayAdapter(reader, table); 435 RangeProcessor rngProcessor = 436 new RangeProcessor(1.0f, 0.0f, -Float.MAX_VALUE, Float.MAX_VALUE, -9999.0f); 437 layer_top_altitude.setRangeProcessor(rngProcessor); 438 439 track_domain = new TrackDomain(adapter_s[0], adapter_s[1], layer_top_altitude); 440 adapters[0] = new TrackAdapter(track_domain, layer_top_altitude); 441 defaultSubsets[0] = adapters[0].getDefaultSubset(); 442 443 /** another layer, how to show all? 444 adapters[2] = new TrackAdapter(track_domain, layer_top_altitude); 445 ((TrackAdapter)adapters[2]).setListIndex(1); 446 defaultSubsets[2] = adapters[2].getDefaultSubset(); 447 */ 448 449 adapters[2] = new TrackAdapter(new TrackDomain(adapter_s[0], adapter_s[1]), adapter_s[2]); 450 ((TrackAdapter)adapters[2]).setName("Track2D"); 451 defaultSubsets[2] = adapters[2].getDefaultSubset(); 452 453 adapters[3] = new TrackAdapter(new TrackDomain(adapter_s[0], adapter_s[1], adapter_s[2]), adapter_s[2]); 454 ((TrackAdapter)adapters[3]).setName("Track3D"); 455 defaultSubsets[3] = adapters[3].getDefaultSubset(); 456 457 DataCategory.createCategory("ProfileAlongTrack"); 458 categories = DataCategory.parseCategories("ProfileAlongTrack;ProfileAlongTrack;"); 459 460 hasTrackPreview = true; 461 } 462 else if (name.indexOf("2B-GEOPROF") > 0) { 463 adapters = new MultiDimensionAdapter[2]; 464 defaultSubsets = new HashMap[2]; 465 propsArray = new Hashtable[2]; 466 467 HashMap table = ProfileAlongTrack.getEmptyMetadataTable(); 468 table.put(ProfileAlongTrack.array_name, "2B-GEOPROF/Data_Fields/Radar_Reflectivity"); 469 table.put(ProfileAlongTrack.range_name, "2B-GEOPROF_RadarReflectivity"); 470 table.put(ProfileAlongTrack.scale_name, "factor"); 471 table.put(ProfileAlongTrack.offset_name, "offset"); 472 table.put(ProfileAlongTrack.fill_value_name, "_FillValue"); 473 table.put(ProfileAlongTrack.valid_range, "valid_range"); 474 table.put(ProfileAlongTrack.ancillary_file_name, "/edu/wisc/ssec/mcidasv/data/hydra/resources/cloudsat/altitude"); 475 table.put(ProfileAlongTrack.trackDim_name, "nray"); 476 table.put(ProfileAlongTrack.vertDim_name, "nbin"); 477 table.put(ProfileAlongTrack.profileTime_name, "2B-GEOPROF/Geolocation_Fields/Profile_Time"); 478 table.put(ProfileAlongTrack.longitude_name, "2B-GEOPROF/Geolocation_Fields/Longitude"); 479 table.put(ProfileAlongTrack.latitude_name, "2B-GEOPROF/Geolocation_Fields/Latitude"); 480 table.put(ProfileAlongTrack.product_name, "2B-GEOPROF"); 481 ProfileAlongTrack adapter = new CloudSat2D(reader, table); 482 ProfileAlongTrack3D adapter3D = new ProfileAlongTrack3D(adapter); 483 HashMap subset = adapter.getDefaultSubset(); 484 adapters[0] = adapter3D; 485 defaultSubset = subset; 486 defaultSubsets[0] = defaultSubset; 487 DataCategory.createCategory("ProfileAlongTrack"); 488 categories = DataCategory.parseCategories("ProfileAlongTrack;ProfileAlongTrack;"); 489 490 ArrayAdapter[] adapter_s = new ArrayAdapter[3]; 491 table = ProfileAlongTrack.getEmptyMetadataTable(); 492 table.put(ProfileAlongTrack.array_name, "2B-GEOPROF/Geolocation_Fields/Latitude"); 493 table.put(ProfileAlongTrack.range_name, "Latitude"); 494 table.put(ProfileAlongTrack.trackDim_name, "nray"); 495 adapter_s[0] = new ArrayAdapter(reader, table); 496 497 table = ProfileAlongTrack.getEmptyMetadataTable(); 498 table.put(ProfileAlongTrack.array_name, "2B-GEOPROF/Geolocation_Fields/DEM_elevation"); 499 table.put(ProfileAlongTrack.range_name, "DEM_elevation"); 500 table.put(ProfileAlongTrack.trackDim_name, "nray"); 501 adapter_s[1] = new ArrayAdapter(reader, table); 502 503 table = ProfileAlongTrack.getEmptyMetadataTable(); 504 table.put(ProfileAlongTrack.array_name, "2B-GEOPROF/Geolocation_Fields/Longitude"); 505 table.put(ProfileAlongTrack.range_name, "Longitude"); 506 table.put(ProfileAlongTrack.trackDim_name, "nray"); 507 adapter_s[2] = new ArrayAdapter(reader, table); 508 509 TrackDomain track_domain = new TrackDomain(adapter_s[2], adapter_s[0], adapter_s[1]); 510 track_adapter = new TrackAdapter(track_domain, adapter_s[1]); 511 512 /* 513 adapters[2] = new TrackAdapter(new TrackDomain(adapter_s[2], adapter_s[0], adapter_s[1]), adapter_s[1]); 514 ((TrackAdapter)adapters[2]).setName("Track3D"); 515 defaultSubsets[2] = adapters[2].getDefaultSubset(); 516 */ 517 518 adapters[1] = new TrackAdapter(new TrackDomain(adapter_s[2], adapter_s[0]), adapter_s[1]); 519 ((TrackAdapter)adapters[1]).setName("Track2D"); 520 defaultSubsets[1] = adapters[1].getDefaultSubset(); 521 522 523 properties.put("medianFilter", new String[] {Double.toString(6), Double.toString(14)}); 524 properties.put("setBelowSfcMissing", new String[] {"true"}); 525 hasTrackPreview = true; 526 } 527 else if ( name.startsWith("MHSx_xxx_1B") && name.endsWith("h5")) { 528 HashMap table = SwathAdapter.getEmptyMetadataTable(); 529 table.put("array_name", "U-MARF/EPS/MHSx_xxx_1B/DATA/Channel1"); 530 table.put("lon_array_name", "U-MARF/EPS/IASI_xxx_1C/DATA/IMAGE_LON_ARRAY"); 531 table.put("lat_array_name", "U-MARF/EPS/IASI_xxx_1C/DATA/IMAGE_LAT_ARRAY"); 532 table.put("XTrack", "dim1"); 533 table.put("Track", "dim0"); 534 table.put("geo_XTrack", "dim1"); 535 table.put("geo_Track", "dim0"); 536 table.put("product_name", "MHSx_xxx_1B"); 537 SwathAdapter swathAdapter = new SwathAdapter(reader, table); 538 adapters[0] = swathAdapter; 539 HashMap subset = swathAdapter.getDefaultSubset(); 540 defaultSubset = subset; 541 defaultSubsets[0] = defaultSubset; 542 categories = DataCategory.parseCategories("2D grid;GRID-2D;"); 543 } 544 else if ( name.startsWith("MYD02SSH") ) { 545 String[] arrayNames = null; 546 547 if (name.endsWith("level2.hdf")) { 548 arrayNames = new String[] {"cld_press_acha", "cld_temp_acha", "cld_height_acha", "cloud_type", 549 "cloud_albedo_0_65um_nom", "cloud_transmission_0_65um_nom", "cloud_fraction"}; 550 } 551 else if (name.endsWith("obs.hdf")) { 552 arrayNames = new String[] {"refl_0_65um_nom", "refl_0_86um_nom", "refl_3_75um_nom", "refl_1_60um_nom", "refl_1_38um_nom", 553 "temp_3_75um_nom", "temp_11_0um_nom", "temp_12_0um_nom", "temp_6_7um_nom", 554 "temp_8_5um_nom", "temp_13_3um_nom"}; 555 } 556 557 adapters = new MultiDimensionAdapter[arrayNames.length]; 558 defaultSubsets = new HashMap[arrayNames.length]; 559 propsArray = new Hashtable[arrayNames.length]; 560 561 for (int k=0; k<arrayNames.length; k++) { 562 HashMap swthTable = SwathAdapter.getEmptyMetadataTable(); 563 swthTable.put("array_name", arrayNames[k]); 564 swthTable.put("lon_array_name", "pixel_longitude"); 565 swthTable.put("lat_array_name", "pixel_latitude"); 566 swthTable.put("XTrack", "pixel_elements_along_scan_direction"); 567 swthTable.put("Track", "scan_lines_along_track_direction"); 568 swthTable.put("geo_Track", "scan_lines_along_track_direction"); 569 swthTable.put("geo_XTrack", "pixel_elements_along_scan_direction"); 570 swthTable.put("scale_name", "SCALE_FACTOR"); 571 swthTable.put("offset_name", "ADD_OFFSET"); 572 swthTable.put("fill_value_name", "_FILLVALUE"); 573 swthTable.put("geo_scale_name", "SCALE_FACTOR"); 574 swthTable.put("geo_offset_name", "ADD_OFFSET"); 575 swthTable.put("geo_fillValue_name", "_FILLVALUE"); 576 swthTable.put("range_name", arrayNames[k]); 577 swthTable.put("unpack", "unpack"); 578 579 SwathAdapter swathAdapter0 = new SwathAdapter(reader, swthTable); 580 HashMap subset = swathAdapter0.getDefaultSubset(); 581 defaultSubset = subset; 582 adapters[k] = swathAdapter0; 583 defaultSubsets[k] = defaultSubset; 584 } 585 categories = DataCategory.parseCategories("2D grid;GRID-2D;"); 586 hasImagePreview = true; 587 } 588 else if (name.contains("AWG_OZONE") ) { 589 String[] arrayNames = new String[] {"ColumnOzone"}; 590 591 adapters = new MultiDimensionAdapter[arrayNames.length]; 592 defaultSubsets = new HashMap[arrayNames.length]; 593 propsArray = new Hashtable[arrayNames.length]; 594 595 for (int k=0; k<arrayNames.length; k++) { 596 HashMap swthTable = SwathAdapter.getEmptyMetadataTable(); 597 swthTable.put("array_name", arrayNames[k]); 598 swthTable.put("lon_array_name", "Longitude"); 599 swthTable.put("lat_array_name", "Latitude"); 600 swthTable.put("XTrack", "Columns"); 601 swthTable.put("Track", "Rows"); 602 swthTable.put("fill_value_name", "_FillValue"); 603 swthTable.put("geo_Track", "Rows"); 604 swthTable.put("geo_XTrack", "Columns"); 605 swthTable.put("geo_fillValue_name", "_FillValue"); 606 swthTable.put("range_name", arrayNames[k]); 607 608 SwathAdapter swathAdapter0 = new SwathAdapter(reader, swthTable); 609 swathAdapter0.setDefaultStride(5); 610 HashMap subset = swathAdapter0.getDefaultSubset(); 611 defaultSubset = subset; 612 adapters[k] = swathAdapter0; 613 defaultSubsets[k] = defaultSubset; 614 } 615 616 categories = DataCategory.parseCategories("2D grid;GRID-2D;"); 617 hasImagePreview = true; 618 } 619 else if (name.contains("AWG_CLOUD_MASK") ) { 620 String[] arrayNames = new String[] {"CloudMask"}; 621 622 adapters = new MultiDimensionAdapter[arrayNames.length]; 623 defaultSubsets = new HashMap[arrayNames.length]; 624 propsArray = new Hashtable[arrayNames.length]; 625 626 for (int k=0; k<arrayNames.length; k++) { 627 HashMap swthTable = SwathAdapter.getEmptyMetadataTable(); 628 swthTable.put("array_name", arrayNames[k]); 629 swthTable.put("lon_array_name", "Longitude"); 630 swthTable.put("lat_array_name", "Latitude"); 631 swthTable.put("XTrack", "Columns"); 632 swthTable.put("Track", "Rows"); 633 swthTable.put("fill_value_name", "_FillValue"); 634 swthTable.put("geo_Track", "Rows"); 635 swthTable.put("geo_XTrack", "Columns"); 636 swthTable.put("geo_fillValue_name", "_FillValue"); 637 swthTable.put("range_name", arrayNames[k]); 638 639 SwathAdapter swathAdapter0 = new SwathAdapter(reader, swthTable); 640 swathAdapter0.setDefaultStride(5); 641 HashMap subset = swathAdapter0.getDefaultSubset(); 642 defaultSubset = subset; 643 adapters[k] = swathAdapter0; 644 defaultSubsets[k] = defaultSubset; 645 } 646 647 categories = DataCategory.parseCategories("2D grid;GRID-2D;"); 648 hasImagePreview = true; 649 } 650 else if (name.contains("AWG_CLOUD_HEIGHT")) { 651 String[] arrayNames = new String[] {"CldTopTemp", "CldTopPres", "CldTopHght"}; 652 653 adapters = new MultiDimensionAdapter[arrayNames.length]; 654 defaultSubsets = new HashMap[arrayNames.length]; 655 propsArray = new Hashtable[arrayNames.length]; 656 657 for (int k=0; k<arrayNames.length; k++) { 658 HashMap swthTable = SwathAdapter.getEmptyMetadataTable(); 659 swthTable.put("array_name", arrayNames[k]); 660 swthTable.put("lon_array_name", "Longitude"); 661 swthTable.put("lat_array_name", "Latitude"); 662 swthTable.put("XTrack", "Columns"); 663 swthTable.put("Track", "Rows"); 664 swthTable.put("scale_name", "scale_factor"); 665 swthTable.put("offset_name", "add_offset"); 666 swthTable.put("fill_value_name", "_FillValue"); 667 swthTable.put("geo_Track", "Rows"); 668 swthTable.put("geo_XTrack", "Columns"); 669 swthTable.put("geo_scale_name", "scale_factor"); 670 swthTable.put("geo_offset_name", "add_offset"); 671 swthTable.put("geo_fillValue_name", "_FillValue"); 672 swthTable.put("range_name", arrayNames[k]); 673 swthTable.put("unpack", "unpack"); 674 675 SwathAdapter swathAdapter0 = new SwathAdapter(reader, swthTable); 676 swathAdapter0.setDefaultStride(5); 677 HashMap subset = swathAdapter0.getDefaultSubset(); 678 defaultSubset = subset; 679 adapters[k] = swathAdapter0; 680 defaultSubsets[k] = defaultSubset; 681 } 682 categories = DataCategory.parseCategories("2D grid;GRID-2D;"); 683 hasImagePreview = true; 684 } 685 else if (name.startsWith("geocatL2") && name.endsWith("ci.hdf")) { 686 String[] arrayNames = new String[] {"box_average_11um_ctc", "box_average_11um_ctc_scaled", "conv_init", "cloud_type"}; 687 688 adapters = new MultiDimensionAdapter[arrayNames.length]; 689 defaultSubsets = new HashMap[arrayNames.length]; 690 propsArray = new Hashtable[arrayNames.length]; 691 692 for (int k=0; k<arrayNames.length; k++) { 693 HashMap swthTable = SwathAdapter.getEmptyMetadataTable(); 694 swthTable.put("array_name", arrayNames[k]); 695 swthTable.put("lon_array_name", "lon"); 696 swthTable.put("lat_array_name", "lat"); 697 swthTable.put("XTrack", "Elements"); 698 swthTable.put("Track", "Lines"); 699 swthTable.put("geo_Track", "Lines"); 700 swthTable.put("geo_XTrack", "Elements"); 701 swthTable.put("range_name", arrayNames[k]); 702 703 SwathAdapter swathAdapter0 = new SwathAdapter(reader, swthTable); 704 swathAdapter0.setDefaultStride(1); 705 HashMap subset = swathAdapter0.getDefaultSubset(); 706 defaultSubset = subset; 707 adapters[k] = swathAdapter0; 708 defaultSubsets[k] = defaultSubset; 709 } 710 categories = DataCategory.parseCategories("2D grid;GRID-2D;"); 711 hasImagePreview = true; 712 } 713 else { 714 String[] arrayNames = new String[] {"baseline_cmask_seviri_cloud_mask", "baseline_ctype_seviri_cloud_type", 715 "baseline_ctype_seviri_cloud_phase", "baseline_cld_hght_seviri_cloud_top_pressure", 716 "baseline_cld_hght_seviri_cloud_top_height"}; 717 718 adapters = new MultiDimensionAdapter[arrayNames.length]; 719 defaultSubsets = new HashMap[arrayNames.length]; 720 propsArray = new Hashtable[arrayNames.length]; 721 722 for (int k=0; k<arrayNames.length; k++) { 723 HashMap swthTable = SwathAdapter.getEmptyMetadataTable(); 724 swthTable.put("array_name", arrayNames[k]); 725 swthTable.put("lon_array_name", "pixel_longitude"); 726 swthTable.put("lat_array_name", "pixel_latitude"); 727 swthTable.put("XTrack", "elements"); 728 swthTable.put("Track", "lines"); 729 swthTable.put("scale_name", "scale_factor"); 730 swthTable.put("offset_name", "add_offset"); 731 swthTable.put("fill_value_name", "_FillValue"); 732 swthTable.put("geo_Track", "lines"); 733 swthTable.put("geo_XTrack", "elements"); 734 swthTable.put("geo_scale_name", "scale_factor"); 735 swthTable.put("geo_offset_name", "add_offset"); 736 swthTable.put("geo_fillValue_name", "_FillValue"); 737 swthTable.put("range_name", arrayNames[k]); 738 swthTable.put("unpack", "unpack"); 739 740 SwathAdapter swathAdapter0 = new SwathAdapter(reader, swthTable); 741 swathAdapter0.setDefaultStride(2); 742 HashMap subset = swathAdapter0.getDefaultSubset(); 743 defaultSubset = subset; 744 adapters[k] = swathAdapter0; 745 defaultSubsets[k] = defaultSubset; 746 } 747 categories = DataCategory.parseCategories("2D grid;GRID-2D;"); 748 hasImagePreview = true; 749 } 750 751 setProperties(properties); 752 } 753 754 public void initAfterUnpersistence() { 755 try { 756 setup(); 757 } 758 catch (Exception e) { 759 } 760 } 761 762 /** 763 * Make and insert the <code>DataChoice</code>-s for this 764 * <code>DataSource</code>. 765 */ 766 public void doMakeDataChoices() { 767 DataChoice choice = null; 768 if (adapters != null) { 769 for (int idx=0; idx<adapters.length; idx++) { 770 try { 771 String arrayName = (adapters[idx] == null) ? "_ " : adapters[idx].getArrayName(); 772 choice = doMakeDataChoice(idx, arrayName); 773 adapterMap.put(choice.getName(), adapters[idx]); 774 } 775 catch (Exception e) { 776 e.printStackTrace(); 777 System.out.println("doMakeDataChoice failed"); 778 } 779 780 if (choice != null) { 781 addDataChoice(choice); 782 } 783 } 784 } 785 } 786 787 private DataChoice doMakeDataChoice(int idx, String var) throws Exception { 788 String name = var; 789 DataSelection dataSel = (defaultSubsets[idx] == null) ? new MultiDimensionSubset() : new MultiDimensionSubset(defaultSubsets[idx]); 790 Hashtable props = new Hashtable(); 791 props.put(new MultiDimensionSubset(), dataSel); 792 793 if (propsArray != null) { 794 if (propsArray[idx] != null) { 795 propsArray[idx].put(new MultiDimensionSubset(), dataSel); 796 props = propsArray[idx]; 797 } 798 } 799 DirectDataChoice ddc = null; 800 801 if (categories != null) { 802 ddc = new DirectDataChoice(this, idx, name, name, categories, props); 803 } 804 else { 805 ddc = new DirectDataChoice(this, idx, name, name, categoriesArray[idx], props); 806 } 807 808 return ddc; 809 } 810 811 /** 812 * Check to see if this <code>HDFHydraDataSource</code> is equal to the object 813 * in question. 814 * @param o object in question 815 * @return true if they are the same or equivalent objects 816 */ 817 public boolean equals(Object o) { 818 if ( !(o instanceof MultiDimensionDataSource)) { 819 return false; 820 } 821 return (this == (MultiDimensionDataSource) o); 822 } 823 824 public MultiSpectralData getMultiSpectralData() { 825 return multiSpectData; 826 } 827 828 public String getDatasetName() { 829 return filename; 830 } 831 832 public void setDatasetName(String name) { 833 filename = name; 834 } 835 836 public HashMap getSubsetFromLonLatRect(MultiDimensionSubset select, GeoSelection geoSelection) { 837 GeoLocationInfo ginfo = geoSelection.getBoundingBox(); 838 return adapters[0].getSubsetFromLonLatRect(select.getSubset(), ginfo.getMinLat(), ginfo.getMaxLat(), 839 ginfo.getMinLon(), ginfo.getMaxLon()); 840 } 841 842 public synchronized Data getData(DataChoice dataChoice, DataCategory category, 843 DataSelection dataSelection, Hashtable requestProperties) 844 throws VisADException, RemoteException { 845 return this.getDataInner(dataChoice, category, dataSelection, requestProperties); 846 } 847 848 849 protected Data getDataInner(DataChoice dataChoice, DataCategory category, 850 DataSelection dataSelection, Hashtable requestProperties) 851 throws VisADException, RemoteException { 852 853 MultiDimensionAdapter adapter = null; 854 adapter = adapterMap.get(dataChoice.getName()); 855 856 Hashtable dataChoiceProps = dataChoice.getProperties(); 857 858 //- this hack keeps the HydraImageProbe from doing a getData() 859 //- TODO: need to use categories? 860 if (requestProperties != null) { 861 if ((requestProperties.toString()).equals("{prop.requester=MultiSpectral}")) { 862 return null; 863 } 864 } 865 866 GeoLocationInfo ginfo = null; 867 GeoSelection geoSelection = null; 868 869 if ((dataSelection != null) && (dataSelection.getGeoSelection() != null)) { 870 geoSelection = (dataSelection.getGeoSelection().getBoundingBox() != null) ? dataSelection.getGeoSelection() : 871 dataChoice.getDataSelection().getGeoSelection(); 872 } 873 874 if (geoSelection != null) { 875 ginfo = geoSelection.getBoundingBox(); 876 } 877 878 Data data = null; 879 if (adapters == null) { 880 return data; 881 } 882 883 HashMap subset = null; 884 MultiDimensionSubset select = null; 885 886 Hashtable table = dataChoice.getProperties(); 887 Enumeration keys = table.keys(); 888 while (keys.hasMoreElements()) { 889 Object key = keys.nextElement(); 890 if (key instanceof MultiDimensionSubset) { 891 select = (MultiDimensionSubset) table.get(key); 892 } 893 } 894 895 896 try { 897 subset = null; 898 if (ginfo != null) { 899 subset = adapter.getSubsetFromLonLatRect(ginfo.getMinLat(), ginfo.getMaxLat(), 900 ginfo.getMinLon(), ginfo.getMaxLon(), 901 geoSelection.getXStride(), 902 geoSelection.getYStride(), 903 geoSelection.getZStride()); 904 if (subset == null && select != null) { 905 subset = select.getSubset(); 906 } 907 } 908 else { 909 if (select != null) { 910 subset = select.getSubset(); 911 } 912 913 if (dataSelection != null) { 914 Hashtable props = dataSelection.getProperties(); 915 } 916 } 917 918 if (subset != null) { 919 data = adapter.getData(subset); 920 data = applyProperties(data, dataChoiceProps, subset); 921 } 922 } catch (Exception e) { 923 e.printStackTrace(); 924 System.out.println("getData exception e=" + e); 925 } 926 927 return data; 928 } 929 930 protected Data applyProperties(Data data, Hashtable requestProperties, HashMap subset) 931 throws VisADException, RemoteException { 932 Data new_data = data; 933 934 if (requestProperties == null) { 935 new_data = data; 936 return new_data; 937 } 938 939 if (requestProperties.containsKey("medianFilter")) { 940 String[] items = (String[]) requestProperties.get("medianFilter"); 941 double window_lenx = Double.parseDouble(items[0]); 942 double window_leny = Double.parseDouble(items[1]); 943 GriddedSet domainSet = (GriddedSet) ((FlatField)data).getDomainSet(); 944 int[] lens = domainSet.getLengths(); 945 float[] range_values = (((FlatField)data).getFloats())[0]; 946 range_values = 947 ProfileAlongTrack.medianFilter(range_values, lens[0], lens[1], 948 (int)window_lenx, (int)window_leny); 949 ((FlatField)new_data).setSamples(new float[][] {range_values}); 950 } 951 if (requestProperties.containsKey("setBelowSfcMissing")) { 952 FlatField track = (FlatField) track_adapter.getData(subset); 953 float[] sfcElev = (track.getFloats())[0]; 954 FlatField field = (FlatField) new_data; 955 GriddedSet gset = (GriddedSet) field.getDomainSet(); 956 float[][] samples = gset.getSamples(false); 957 int[] lens = gset.getLengths(); 958 float[] range_values = (field.getFloats())[0]; 959 960 int trkIdx = ((ProfileAlongTrack3D)adapters[0]).adapter2D.getTrackTupIdx(); 961 int vrtIdx = ((ProfileAlongTrack3D)adapters[0]).adapter2D.getVertTupIdx(); 962 963 int k = 0; 964 for (int j=0; j<lens[trkIdx]; j++) { 965 float val = sfcElev[j]*1000f; // convert to meters 966 for (int i=0; i<lens[vrtIdx]; i++) { 967 if (vrtIdx < trkIdx) k = i + j*lens[0]; 968 if (trkIdx < vrtIdx) k = j + i*lens[0]; 969 if (samples[2][k] <= val || samples[2][k] < 0.0) { 970 range_values[k] = Float.NaN; 971 } 972 } 973 } 974 field.setSamples(new float[][] {range_values}); 975 } 976 return new_data; 977 } 978 979 protected void initDataSelectionComponents( 980 List<DataSelectionComponent> components, 981 final DataChoice dataChoice) { 982 983 if (hasImagePreview) { 984 try { 985 FlatField image = (FlatField) getDataInner(dataChoice, null, null, null); 986 components.add(new PreviewSelection(dataChoice, image, null)); 987 //components.add(new edu.wisc.ssec.mcidasv.data.PreviewSelectionNew(dataChoice, image)); 988 } catch (Exception e) { 989 System.out.println("Can't make PreviewSelection: "+e); 990 e.printStackTrace(); 991 } 992 } 993 if (hasTrackPreview) { 994 try { 995 FlatField track = track_adapter.getData(track_adapter.getDefaultSubset()); 996 components.add(new TrackSelection(dataChoice, track)); 997 } catch (Exception e) { 998 System.out.println("Can't make PreviewSelection: "+e); 999 e.printStackTrace(); 1000 } 1001 } 1002 } 1003 } 1004 1005 class TrackSelection extends DataSelectionComponent { 1006 DataChoice dataChoice; 1007 FlatField track; 1008 1009 double[] x_coords = new double[2]; 1010 double[] y_coords = new double[2]; 1011 boolean hasSubset = true; 1012 MapProjectionDisplayJ3D mapProjDsp; 1013 DisplayMaster dspMaster; 1014 1015 int trackStride; 1016 int verticalStride; 1017 1018 JTextField trkStr; 1019 JTextField vrtStr; 1020 1021 1022 TrackSelection(DataChoice dataChoice, FlatField track) throws VisADException, RemoteException { 1023 super("track"); 1024 this.dataChoice = dataChoice; 1025 this.track = track; 1026 mapProjDsp = new MapProjectionDisplayJ3D(MapProjectionDisplay.MODE_2Din3D); 1027 mapProjDsp.enableRubberBanding(false); 1028 dspMaster = mapProjDsp; 1029 mapProjDsp.setMapProjection(getDataProjection()); 1030 LineDrawing trackDsp = new LineDrawing("track"); 1031 trackDsp.setLineWidth(2f); 1032 trackDsp.setData(track); 1033 mapProjDsp.addDisplayable(trackDsp); 1034 1035 1036 MapLines mapLines = new MapLines("maplines"); 1037 URL mapSource = 1038 mapProjDsp.getClass().getResource("/auxdata/maps/OUTLSUPU"); 1039 try { 1040 BaseMapAdapter mapAdapter = new BaseMapAdapter(mapSource); 1041 mapLines.setMapLines(mapAdapter.getData()); 1042 mapLines.setColor(java.awt.Color.cyan); 1043 mapProjDsp.addDisplayable(mapLines); 1044 } catch (Exception excp) { 1045 System.out.println("Can't open map file " + mapSource); 1046 System.out.println(excp); 1047 } 1048 1049 mapLines = new MapLines("maplines"); 1050 mapSource = 1051 mapProjDsp.getClass().getResource("/auxdata/maps/OUTLSUPW"); 1052 try { 1053 BaseMapAdapter mapAdapter = new BaseMapAdapter(mapSource); 1054 mapLines.setMapLines(mapAdapter.getData()); 1055 mapLines.setColor(java.awt.Color.cyan); 1056 mapProjDsp.addDisplayable(mapLines); 1057 } catch (Exception excp) { 1058 System.out.println("Can't open map file " + mapSource); 1059 System.out.println(excp); 1060 } 1061 1062 mapLines = new MapLines("maplines"); 1063 mapSource = 1064 mapProjDsp.getClass().getResource("/auxdata/maps/OUTLHPOL"); 1065 try { 1066 BaseMapAdapter mapAdapter = new BaseMapAdapter(mapSource); 1067 mapLines.setMapLines(mapAdapter.getData()); 1068 mapLines.setColor(java.awt.Color.cyan); 1069 mapProjDsp.addDisplayable(mapLines); 1070 } catch (Exception excp) { 1071 System.out.println("Can't open map file " + mapSource); 1072 System.out.println(excp); 1073 } 1074 1075 final LineDrawing selectBox = new LineDrawing("select"); 1076 selectBox.setColor(Color.green); 1077 1078 final RubberBandBox rbb = 1079 new RubberBandBox(RealType.Longitude, RealType.Latitude, 1); 1080 rbb.setColor(Color.green); 1081 rbb.addAction(new CellImpl() { 1082 public void doAction() 1083 throws VisADException, RemoteException 1084 { 1085 Gridded2DSet set = rbb.getBounds(); 1086 float[] low = set.getLow(); 1087 float[] hi = set.getHi(); 1088 x_coords[0] = low[0]; 1089 x_coords[1] = hi[0]; 1090 y_coords[0] = low[1]; 1091 y_coords[1] = hi[1]; 1092 1093 SampledSet[] sets = new SampledSet[4]; 1094 sets[0] = new Gridded2DSet(RealTupleType.SpatialEarth2DTuple, new float[][] {{low[0], hi[0]}, {low[1], low[1]}}, 2); 1095 sets[1] = new Gridded2DSet(RealTupleType.SpatialEarth2DTuple, new float[][] {{hi[0], hi[0]}, {low[1], hi[1]}}, 2); 1096 sets[2] = new Gridded2DSet(RealTupleType.SpatialEarth2DTuple, new float[][] {{hi[0], low[0]}, {hi[1], hi[1]}}, 2); 1097 sets[3] = new Gridded2DSet(RealTupleType.SpatialEarth2DTuple, new float[][] {{low[0], low[0]}, {hi[1], low[1]}}, 2); 1098 UnionSet uset = new UnionSet(sets); 1099 selectBox.setData(uset); 1100 } 1101 }); 1102 dspMaster.addDisplayable(rbb); 1103 dspMaster.addDisplayable(selectBox); 1104 1105 dspMaster.draw(); 1106 } 1107 1108 public MapProjection getDataProjection() { 1109 MapProjection mp = null; 1110 try { 1111 mp = new ProjectionCoordinateSystem(new LatLonProjection()); 1112 } catch (Exception e) { 1113 System.out.println(" getDataProjection"+e); 1114 } 1115 return mp; 1116 } 1117 1118 protected JComponent doMakeContents() { 1119 try { 1120 JPanel panel = new JPanel(new BorderLayout()); 1121 panel.add("Center", dspMaster.getDisplayComponent()); 1122 1123 JPanel stridePanel = new JPanel(new FlowLayout()); 1124 trkStr = new JTextField(Integer.toString(5), 3); 1125 vrtStr = new JTextField(Integer.toString(2), 3); 1126 trkStr.addActionListener(new ActionListener() { 1127 public void actionPerformed(ActionEvent ae) { 1128 setTrackStride(Integer.valueOf(trkStr.getText().trim())); 1129 } 1130 }); 1131 vrtStr.addActionListener(new ActionListener() { 1132 public void actionPerformed(ActionEvent ae) { 1133 setVerticalStride(Integer.valueOf(vrtStr.getText().trim())); 1134 } 1135 }); 1136 1137 stridePanel.add(new JLabel("track stride: ")); 1138 stridePanel.add(trkStr); 1139 stridePanel.add(new JLabel("vertical stride: ")); 1140 stridePanel.add(vrtStr); 1141 panel.add("South", stridePanel); 1142 1143 return panel; 1144 } 1145 catch (Exception e) { 1146 System.out.println(e); 1147 } 1148 return null; 1149 } 1150 1151 public void setTrackStride(int stride) { 1152 trackStride = stride; 1153 } 1154 1155 public void setVerticalStride(int stride) { 1156 verticalStride = stride; 1157 } 1158 1159 public void setTrackStride() { 1160 trackStride = Integer.valueOf(trkStr.getText().trim()); 1161 } 1162 1163 public void setVerticalStride() { 1164 verticalStride = Integer.valueOf(vrtStr.getText().trim()); 1165 } 1166 1167 public void applyToDataSelection(DataSelection dataSelection) { 1168 setTrackStride(); 1169 setVerticalStride(); 1170 if (hasSubset) { 1171 GeoSelection geoSelect = new GeoSelection( 1172 new GeoLocationInfo(y_coords[1], x_coords[0], y_coords[0], x_coords[1])); 1173 geoSelect.setXStride(trackStride); 1174 geoSelect.setYStride(verticalStride); 1175 dataSelection.setGeoSelection(geoSelect); 1176 } 1177 } 1178 }