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.rmi.RemoteException; 032 import java.util.HashMap; 033 034 import visad.FlatField; 035 import visad.FunctionType; 036 import visad.Gridded3DSet; 037 import visad.Gridded2DSet; 038 import visad.RealTupleType; 039 import visad.RealType; 040 import visad.VisADException; 041 import visad.Set; 042 043 044 public class TrackDomain extends MultiDimensionAdapter { 045 RealTupleType domainType; 046 ArrayAdapter lonAdapter; 047 ArrayAdapter latAdapter; 048 ArrayAdapter altAdapter; 049 050 float[] trackLongitude; 051 float[] trackLatitude; 052 float[] trackAltitude; 053 054 int TrackLen; 055 056 public TrackDomain() { 057 } 058 059 public TrackDomain(ArrayAdapter lonAdapter, ArrayAdapter latAdapter) throws Exception { 060 this(lonAdapter, latAdapter, null); 061 } 062 063 public TrackDomain(ArrayAdapter lonAdapter, ArrayAdapter latAdapter, ArrayAdapter altAdapter) throws Exception { 064 this.lonAdapter = lonAdapter; 065 this.latAdapter = latAdapter; 066 this.altAdapter = altAdapter; 067 068 if (altAdapter != null) { 069 domainType = RealTupleType.SpatialEarth3DTuple; 070 trackAltitude = (altAdapter.getData(altAdapter.getDefaultSubset()).getFloats(false))[0]; 071 } 072 else { 073 domainType = RealTupleType.SpatialEarth2DTuple; 074 } 075 076 trackLongitude = (lonAdapter.getData(lonAdapter.getDefaultSubset()).getFloats(false))[0]; 077 trackLatitude = (latAdapter.getData(latAdapter.getDefaultSubset()).getFloats(false))[0]; 078 TrackLen = trackLongitude.length; 079 } 080 081 public Set makeDomain(Object subset) throws VisADException, RemoteException { 082 083 float[] lonValues = null; 084 float[] latValues = null; 085 float[] altValues = null; 086 087 double[] coords = (double[]) ((HashMap)subset).get("TrackDim"); 088 HashMap newSubset = this.getDefaultSubset(); 089 double[] newCoords = (double[])newSubset.get("TrackDim"); 090 System.arraycopy(coords, 0, newCoords, 0, coords.length); 091 subset = newSubset; 092 093 try { 094 lonValues = (lonAdapter.getData(subset).getFloats())[0]; 095 latValues = (latAdapter.getData(subset).getFloats())[0]; 096 097 if (altAdapter != null) { 098 altValues = (altAdapter.getData(subset).getFloats())[0]; 099 } 100 } 101 catch (Exception e) { 102 e.printStackTrace(); 103 return null; 104 } 105 106 Set set = null; 107 108 if (altAdapter != null) { 109 for (int k=0; k< altValues.length; k++) { 110 altValues[k] *= 1000.0; 111 } 112 set = new Gridded3DSet(domainType, new float[][] {lonValues, latValues, altValues}, lonValues.length); 113 } 114 else { 115 set = new Gridded2DSet(domainType, new float[][] {lonValues, latValues}, lonValues.length); 116 } 117 return set; 118 } 119 120 public float[] getTrackLongitude() { 121 return trackLongitude; 122 } 123 124 public float[] getTrackLatitude() { 125 return trackLatitude; 126 } 127 128 public float[] getTrackAlitude() { 129 return trackAltitude; 130 } 131 132 public int[] getTrackRangeInsideLonLatRect(double minLat, double maxLat, double minLon, double maxLon) { 133 int nn = 100; 134 int skip = TrackLen/nn; 135 double lon; 136 double lat; 137 138 int idx = 0; 139 while (idx < TrackLen) { 140 lon = (double)trackLongitude[idx]; 141 lat = (double)trackLatitude[idx]; 142 if (((lon > minLon) && (lon < maxLon)) && ((lat > minLat)&&(lat < maxLat))) break; 143 idx += skip; 144 } 145 if (idx > TrackLen-1) idx = TrackLen-1; 146 if (idx == TrackLen-1) return new int[] {-1,-1}; 147 148 int low_idx = idx; 149 while (low_idx > 0) { 150 lon = (double)trackLongitude[low_idx]; 151 lat = (double)trackLatitude[low_idx]; 152 if (((lon > minLon) && (lon < maxLon)) && ((lat > minLat)&&(lat < maxLat))) { 153 low_idx -= 1; 154 continue; 155 } 156 else { 157 break; 158 } 159 } 160 161 int hi_idx = idx; 162 while (hi_idx < TrackLen-1) { 163 lon = (double)trackLongitude[hi_idx]; 164 lat = (double)trackLatitude[hi_idx]; 165 if (((lon > minLon) && (lon < maxLon)) && ((lat > minLat)&&(lat < maxLat))) { 166 hi_idx += 1; 167 continue; 168 } 169 else { 170 break; 171 } 172 } 173 return new int[] {low_idx, hi_idx}; 174 } 175 176 public HashMap getSubsetFromLonLatRect(HashMap subset, double minLat, double maxLat, double minLon, double maxLon) { 177 double[] coords = (double[])subset.get("TrackDim"); 178 int[] idxs = getTrackRangeInsideLonLatRect(minLat, maxLat, minLon, maxLon); 179 coords[0] = (double) idxs[0]; 180 coords[1] = (double) idxs[1]; 181 if ((coords[0] == -1) || (coords[1] == -1)) return null; 182 return subset; 183 } 184 185 public HashMap getSubsetFromLonLatRect(HashMap subset, double minLat, double maxLat, double minLon, double maxLon, 186 int xStride, int yStride, int zStride) { 187 double[] coords = (double[])subset.get("TrackDim"); 188 int[] idxs = getTrackRangeInsideLonLatRect(minLat, maxLat, minLon, maxLon); 189 coords[0] = (double) idxs[0]; 190 coords[1] = (double) idxs[1]; 191 if ((coords[0] == -1) || (coords[1] == -1)) return null; 192 193 if (xStride > 0) { 194 coords[2] = xStride; 195 } 196 197 return subset; 198 } 199 200 public HashMap getDefaultSubset() { 201 return lonAdapter.getDefaultSubset(); 202 } 203 }