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