Due to the current gap in continued funding from the U.S. National Science Foundation (NSF), the NSF Unidata Program Center has temporarily paused most operations. See NSF Unidata Pause in Most Operations for details.
>From: Mathias =?iso-8859-1?Q?St=FCmpert?= <AtzeS@xxxxxx> >Organization: >Keywords: 200009251222.e8PCMTb01493 Hi Mathias- >I need a possibility to extract slices out of my 3D-Dataset. I think of >a layer whose edges can be dragged along the axes. Is there an easy way >to do this with VisAD? We do this with some special classes that we created, but it can be done with straight VisAD as well. Basically, you need to grab the Altitude value that you want to resample your 3D FlatField on and create a new sample domain that is all the lat/lon points and that altitude. Then call FlatField.resample(). >My MathType looks like this: >((latitude, longitude, altitude) -> (pressure, temperature, ...)) What you need is a data reference with a DirectManipulationRenderer attached to it. You'd probably want your point along the Altitude axis. If you look at Test00, you can see how to do this. Essentially, create a Real whose value is some initial starting point along the Z (Altitude axis): double initialValue = 8000.0 // set to 8000 m Real slider = new Real(RealType.Altitude, initialValue); DataReference sliderRef = new DataReferenceImpl("slider"); ConstantMap[] constants = new ConstantMap[5]; constants[0] map = new ConstantMap(0.0, Display.Red); // make a blue constants[1] map = new ConstantMap(0.0, Display.Green); // point constants[2] map = new ConstantMap(1.0, Display.Blue); // constants[3] map = new ConstantMap(5.0, Display.PointSize); // make big constants[4] map = new ConstantMap(-1.0, Display.XAxis);// sets point constants[5] map = new ConstantMap(-1.0, Display.YAxis);// along left axis display.addReferences(new DirectManipulationRendererJ3D(), slider, constants); This will give you a point on the Z Axis (you'll need to have ScalarMaps that map RealType.(X,Y,Z)Axis to Display.(X,Y,Z)Axis respectively and set the ranges to (-1.0,1.0) for each so the constant maps will work. Then add a CellImpl to listen for changes in the data: CellImpl cell = new CellImpl() { public void doAction() throws VisADException, RemoteException { Real value = (Real) sliderRef.getData(); // Create a set that you want to evaluate on Gridded3DSet sampleSet = new Gridded3DSet(RealTupleType.LatitudeLongitudeAltitude, new float[][] { lats, lons, new float[] {value}}, numlats, numlons, 1); FlatField slice = 3Dfield.resample(sampleSet); } } cell.addReference(sliderRef); where lats is the lat points of your domain, lons is the longitude points of your domain. The slice should be a new FlatField of values on that sample set (i.e., at that altitude). As you manipulate the point with MB3, the point will move up and down the Z axis and you will sample. You could change the resampling to something other than nearest neighbor if you want. You also might want to check to see how much different the new altitude value is from the old so you don't sample unnecessarily. I haven't tried this code, but the basic idea is there. You can search the VisAD-list archives using "slice" or "resample" as a keyword to find other messages on this topic at: http://www.unidata.ucar.edu/staff/russ/visad/ Don ************************************************************* Don Murray UCAR Unidata Program dmurray@xxxxxxxxxxxxxxxx P.O. Box 3000 (303) 497-8628 Boulder, CO 80307 ************************************************************* Unidata WWW Server http://www.unidata.ucar.edu/ McIDAS Demonstration Machine http://mcdemo.unidata.ucar.edu/ *************************************************************
visad
archives: