private FlatField changeRangeType(FlatField image, RealType newRangeType) throws VisADException, RemoteException { FunctionType ftype = (FunctionType) image.getType(); FlatField new_image = new FlatField(new FunctionType(ftype.getDomain(), newRangeType), image.getDomainSet()); new_image.setSamples(image.getFloats(false), false); return new_image; }
/** create parallel coordinates display for data */ public static void parallel(DisplayImpl display, FlatField data) throws VisADException, RemoteException { FunctionType ftype = (FunctionType) data.getType(); RealType index = (RealType) ftype.getDomain().getComponent(0); RealTupleType range = (RealTupleType) ftype.getRange(); int ncoords = range.getDimension(); int nrows = data.getLength(); Set index_set = data.getDomainSet(); float[][] samples = data.getFloats(false); RealType x = RealType.getRealType("coordinate"); RealType y = RealType.getRealType("value"); SetType xy = new SetType(new RealTupleType(x, y)); FunctionType ptype = new FunctionType(index, xy); FieldImpl pfield = new FieldImpl(ptype, index_set); for (int j = 0; j < nrows; j++) { float[][] locs = new float[2][ncoords]; for (int i = 0; i < ncoords; i++) { locs[0][i] = i; locs[1][i] = samples[i][j]; } Gridded2DSet set = new Gridded2DSet(xy, locs, ncoords); pfield.setSample(j, set, false); } // create a DataReference for river system DataReference parallel_ref = new DataReferenceImpl("parallel"); parallel_ref.setData(pfield); display.addMap(new ScalarMap(x, Display.XAxis)); display.addMap(new ScalarMap(y, Display.YAxis)); // enable axis scales display.getGraphicsModeControl().setScaleEnable(true); // link display to parallel display display.addReference(parallel_ref); }
/** * Converts grid-relative wind to true (or absolute) wind. The U and V components of true wind are * {@link WesterlyWind} and {@link SoutherlyWind}, respectively. The domain of the input {@link * visad.FlatField} must have a manifold dimension of two or greater and it must have a reference * system which contains {@link visad.RealType#Latitude} and {@link visad.RealType#Longitude}. The * number of components in the range of the input {@link visad.FlatField} must be two. Both * components must have units convertible with {@link #DEFAULT_SPEED_UNIT}. The first and second * components are assumed to be the wind components in the direction of increasing first and * second manifold dimension indexes, respectively. The {@link visad.MathType} of the range of the * returned {@link visad.FlatField} will be <code>CartesianHorizontalWind.getEarthVectorType() * </code> and the domain will be the same as the input domain. * * @param rel The field of grid-relative wind. * @return The field of true wind corresponding to the input field. * @throws NullPointerException if <code>rel</code> is <code>null</code>. * @throws IllegalArgumentException if the input field doesn't have two and only two components in * its range, or if the default units of the input range aren't equal, or if the domain of the * input field doesn't have a transformation to latitude and longitude, or the grid is * irregular or has too few points. * @throws VisADException if a VisAD failure occurs. * @throws RemoteException if a Java RMI failure occurs. * @see CartesianHorizontalWind */ public static FlatField cartesianHorizontalWind(FlatField rel) throws VisADException, RemoteException { FunctionType funcType = (FunctionType) rel.getType(); MathType rangeType = funcType.getRange(); if (rel.getRangeDimension() != 2) { throw new IllegalArgumentException(rangeType.toString()); } Unit[] units = rel.getDefaultRangeUnits(); if (!units[0].equals(units[1])) { throw new IllegalArgumentException(units.toString()); } SampledSet grid = (SampledSet) rel.getDomainSet(); // check for single point grid if (grid instanceof SingletonSet) { return rel; } else if (grid instanceof GriddedSet) { int[] lengths = ((GriddedSet) grid).getLengths(); if ((lengths[0] == 1) && (lengths[1] == 1)) { return rel; } } FlatField abs = new FlatField( new FunctionType(funcType.getDomain(), CartesianHorizontalWind.getEarthVectorType()), grid, (CoordinateSystem[]) null, rel.getRangeSets(), units); abs.setSamples(trueWind(rel.getFloats(), grid), false); return abs; }
/** * Converts a time-series of grid-relative winds to a time-series of true (or absolute) winds. The * U and V components of true wind are {@link WesterlyWind} and {@link SoutherlyWind}, * respectively. The domain of the input {@link visad.Field} must be a temporal {@link * visad.Gridded1DSet} or a {@link visad.SingletonSet}. The range values of the input {@link * visad.Field} must be {@link visad.FlatField}s. The domains of the range {@link * visad.FlatField}s must have a manifold dimension of two or greater and they must have a * reference system which contains {@link visad.RealType#Latitude} and {@link * visad.RealType#Longitude}. The number of components in the range of the {@link * visad.FlatField}s must be two. Both components must have units convertible with {@link * #DEFAULT_SPEED_UNIT}. The first and second components are assumed to be the wind components in * the direction of increasing first and second manifold dimension indexes, respectively. The * domains of the {@link visad.FlatField}s must be equal. The {@link visad.Field} returned by this * method has the same domain as the input {@link visad.Field}. The range values of the returned * {@link visad.Field} are {@link visad.FlatField}s that have the same domain as the input {@link * visad.FlatField}s. The {@link visad.MathType} of the range of the returned {@link * visad.FlatField}s will be <code>CartesianHorizontalWind.getEarthVectorType()</code>. * * @param rel The time-series of grid-relative wind. * @return The time-series of true wind corresponding to the input. * @throws NullPointerException if <code>rel</code> is <code>null</code>. * @throws IllegalArgumentException if the input field doesn't have a time-series domain, or if * the range values aren't {@link visad.FlatField} with the same domain, or if the domain of * the {@link visad.FlatField}s doesn't have a transformation to latitude and longitude, or if * the domain is irregular or has too few points, or if the {@link visad.FlatField}s don't * have two and only two components in their range, or if the default units of the {@link * visad.FlatField}s range aren't equal. * @throws VisADException if a VisAD failure occurs. * @throws RemoteException if a Java RMI failure occurs. * @see CartesianHorizontalWind */ public static Field timeSeriesCartesianHorizontalWind(Field rel) throws VisADException, RemoteException { FunctionType outerFuncType = (FunctionType) rel.getType(); RealTupleType outerDomType = outerFuncType.getDomain(); if (!(RealType.Time.equalsExceptNameButUnits(outerDomType) || !RealType.TimeInterval.equalsExceptNameButUnits(outerDomType))) { throw new IllegalArgumentException(outerDomType.toString()); } MathType innerFuncType = outerFuncType.getRange(); if (!(innerFuncType instanceof FunctionType)) { throw new IllegalArgumentException(innerFuncType.toString()); } Field innerField = (Field) rel.getSample(0); Set innerDom = innerField.getDomainSet(); if (innerDom instanceof SingletonSet) { return rel; } else if (innerDom instanceof GriddedSet) { int[] lengths = ((GriddedSet) innerDom).getLengths(); if ((lengths[0] == 1) && (lengths[1] == 1)) { return rel; } } // account for null units, assume m/sec Unit[] rangeUnits = innerField.getDefaultRangeUnits(); if ((rangeUnits == null) || (rangeUnits[0] == null) || rangeUnits[0].isDimensionless()) { rangeUnits = CartesianHorizontalWind.getEarthVectorType().getDefaultUnits(); } FunctionType innerType = new FunctionType( ((SetType) innerDom.getType()).getDomain(), CartesianHorizontalWind.getEarthVectorType()); FlatField uvField = new FlatField(innerType, innerDom, (CoordinateSystem) null, (Set[]) null, rangeUnits); Field result = new FieldImpl(new FunctionType(outerDomType, uvField.getType()), rel.getDomainSet()); // System.out.println("making rHatField"); Field rHatField = (doNewCode ? hatFieldNew(innerDom, 0) : hatFieldOld(innerDom, 0)); // System.out.println("making sHatField"); Field sHatField = (doNewCode ? hatFieldNew(innerDom, 1) : hatFieldOld(innerDom, 1)); float[][] rHats = rHatField.getFloats(false); // ucar.unidata.util.Misc.printArray("rHats[0]", rHats[0]); // ucar.unidata.util.Misc.printArray("rHats[1]", rHats[1]); // System.out.println("\n"); float[][] sHats = sHatField.getFloats(false); // ucar.unidata.util.Misc.printArray("sHats[0]", sHats[0]); // ucar.unidata.util.Misc.printArray("sHats[1]", sHats[1]); // System.out.println("\n"); float[] us = new float[innerDom.getLength()]; float[] vs = new float[us.length]; for (int i = 0, n = rel.getLength(); i < n; i++) { if (i > 0) { innerField = (Field) rel.getSample(i); Set dom = innerField.getDomainSet(); if (!innerDom.equals(dom)) { // System.out.println("new domain"); innerDom = dom; rHatField = (doNewCode ? hatFieldNew(innerDom, 0) : hatFieldOld(innerDom, 0)); sHatField = (doNewCode ? hatFieldNew(innerDom, 1) : hatFieldOld(innerDom, 1)); rHats = rHatField.getFloats(false); sHats = sHatField.getFloats(false); /* throw new IllegalArgumentException("template=" + innerDom.toString() + "; domain=" + dom.toString()); */ } uvField = new FlatField(innerType, innerDom, (CoordinateSystem) null, (Set[]) null, rangeUnits); us = new float[innerDom.getLength()]; vs = new float[us.length]; } float[][] rsWinds = innerField.getFloats(false); float[] rWinds = rsWinds[0]; float[] sWinds = rsWinds[1]; // ucar.unidata.util.Misc.printArray("rWinds", rWinds); // System.out.println("\n"); // ucar.unidata.util.Misc.printArray("sWinds", sWinds); // System.out.println("\n"); for (int j = 0; j < us.length; j++) { us[j] = rWinds[j] * rHats[0][j] + sWinds[j] * sHats[0][j]; vs[j] = rWinds[j] * rHats[1][j] + sWinds[j] * sHats[1][j]; } // ucar.unidata.util.Misc.printArray("us", us); // System.out.println("\n"); // ucar.unidata.util.Misc.printArray("vs", vs); // System.out.println("\n"); uvField.setSamples(new float[][] {us, vs}, false); result.setSample(i, uvField, false); } return result; }
void setupServerData(LocalDisplay[] dpys) throws RemoteException, VisADException { DefaultFamily df = new DefaultFamily("loader"); DataReference ref1 = loadFile(df, file1, "img1"); if (ref1 == null) { System.err.println("\"" + file1 + "\" is not a valid file"); System.exit(1); return; } DataReference ref2 = loadFile(df, file2, "img2"); if (ref2 == null) { System.err.println("\"" + file2 + "\" is not a valid file"); System.exit(1); return; } FlatField img1 = (FlatField) ref1.getData(); FlatField img2 = (FlatField) ref2.getData(); /* if (!img1.getType().equals(img2.getType())) { System.err.println("Incompatible file types:"); System.err.println(" " + file1 + ": " + img1.getType()); System.err.println(" " + file2 + ": " + img2.getType()); System.exit(1); return; } */ // compute ScalarMaps from type components FunctionType ftype = (FunctionType) img1.getType(); RealTupleType dtype = ftype.getDomain(); RealTupleType rtype = (RealTupleType) ftype.getRange(); /* map domain elements to spatial axes */ final int dLen = dtype.getDimension(); for (int i = 0; i < dLen; i++) { ScalarType scalT; DisplayRealType dpyRT; switch (i) { case 0: dpyRT = Display.XAxis; break; case 1: dpyRT = Display.YAxis; break; case 2: dpyRT = Display.ZAxis; break; default: dpyRT = null; break; } if (dpyRT != null) { dpys[0].addMap(new ScalarMap((RealType) dtype.getComponent(i), dpyRT)); } } /* map range elements to colors */ final int rLen = rtype.getDimension(); for (int i = 0; i < rLen; i++) { ScalarType scalT; DisplayRealType dpyRT; switch (i) { case 0: dpyRT = Display.Red; break; case 1: dpyRT = Display.Green; break; case 2: dpyRT = Display.Blue; break; default: dpyRT = null; break; } if (dpyRT != null) { dpys[0].addMap(new ScalarMap((RealType) rtype.getComponent(i), dpyRT)); } } dpys[0].addReference(ref1, null); dpys[0].addReference(ref2, null); dpys[0].addActivityHandler(new SwitchGIFs(dpys[0])); }
/** * Construct a satellite display using the specified McIDAS map file, image source. The image can * be displayed on a 3D globe or on a flat rectillinear projection. * * @param mapFile location of the McIDAS map file (path or URL) * @param imageSource location of the image source (path or URL) * @param display3D if true, use 3D display, otherwise flat rectillinear * @param remap remap the image into a domain over North America */ public SatDisplay(String mapFile, String imageSource, boolean display3D, boolean remap) { try { // Read in the map file BaseMapAdapter baseMapAdapter; if (mapFile.indexOf("://") > 0) // URL specified { baseMapAdapter = new BaseMapAdapter(new URL(mapFile)); } else // local disk file { baseMapAdapter = new BaseMapAdapter(mapFile); } // Create the display and set up the scalar maps to map // data to the display ScalarMap latMap; // latitude -> YAxis ScalarMap lonMap; // longitude -> XAxis if (display3D) { display = new DisplayImplJ3D("display"); latMap = new ScalarMap(RealType.Latitude, Display.Latitude); lonMap = new ScalarMap(RealType.Longitude, Display.Longitude); } else { display = new DisplayImplJ3D("display", new TwoDDisplayRendererJ3D()); latMap = new ScalarMap(RealType.Latitude, Display.YAxis); lonMap = new ScalarMap(RealType.Longitude, Display.XAxis); } display.addMap(latMap); display.addMap(lonMap); // set the display to a global scale latMap.setRange(-90.0, 90.0); lonMap.setRange(-180.0, 180.0); // create a reference for the map line DataReference maplinesRef = new DataReferenceImpl("MapLines"); maplinesRef.setData(baseMapAdapter.getData()); // set the attributes of the map lines (color, location) ConstantMap[] maplinesConstantMap = new ConstantMap[4]; maplinesConstantMap[0] = new ConstantMap(0., Display.Blue); maplinesConstantMap[1] = new ConstantMap(1., Display.Red); maplinesConstantMap[2] = new ConstantMap(0., Display.Green); maplinesConstantMap[3] = new ConstantMap(1.001, Display.Radius); // just above the image // read in the image AreaAdapter areaAdapter = new AreaAdapter(imageSource); FlatField image = areaAdapter.getData(); // Extract the metadata from the image FunctionType imageFunctionType = (FunctionType) image.getType(); RealTupleType imageDomainType = imageFunctionType.getDomain(); RealTupleType imageRangeType = (RealTupleType) imageFunctionType.getRange(); // remap and resample the image if (remap) { int SIZE = 256; RealTupleType latlonType = ((CoordinateSystem) imageDomainType.getCoordinateSystem()).getReference(); Linear2DSet remapDomainSet = new Linear2DSet(latlonType, -4.0, 70.0, SIZE, -150.0, 5.0, SIZE); image = (FlatField) image.resample(remapDomainSet, Data.NEAREST_NEIGHBOR, Data.NO_ERRORS); } // select which band to show... ScalarMap rgbMap = new ScalarMap((RealType) imageRangeType.getComponent(0), Display.RGB); display.addMap(rgbMap); // set the enhancement to a grey scale ColorControl colorControl = (ColorControl) rgbMap.getControl(); colorControl.initGreyWedge(); // create a data reference for the image DataReferenceImpl imageRef = new DataReferenceImpl("ImageRef"); imageRef.setData(image); // add the data references to the display display.disableAction(); drmap = new DefaultRendererJ3D(); drimage = new DefaultRendererJ3D(); drmap.toggle(false); drimage.toggle(false); display.addDisplayListener(this); display.addReferences(drmap, maplinesRef, maplinesConstantMap); display.addReferences(drimage, imageRef, null); display.enableAction(); } catch (Exception ne) { ne.printStackTrace(); System.exit(1); } }
private static RealType getDomainType(final FlatField spectrum) { return (((FunctionType) spectrum.getType()).getDomain().getRealComponents())[0]; }
public static RealType getRangeType(final FlatField spectrum) { return (((FunctionType) spectrum.getType()).getFlatRange().getRealComponents())[0]; }