NOTICE: This version of the NSF Unidata web site (archive.unidata.ucar.edu) is no longer being updated.
Current content can be found at unidata.ucar.edu.

To learn about what's going on, see About the Archive Site.

Displaying 3D data in 2D

Hello, everyone

I have a problem which I have half-solved, but it appears to me that I am abusing the framework to get there, rather than working with it. Hints as to a better/more elegant way to do what I want would be greatly appreciated.

I have a 3D domain data set (altitude - lat - lon) of 1-D data (temperature). I need to make and display 2-D horizontal slices out of this data.

To date, I:

1) Convert my data from it's native format (ASCII vectors) to a VisAD data structure more or less as follows
        
        // declare the data types to be used
        RealTupleType domainType = new RealTupleType(altitude, latitude, 
longitude);
        RealTupleType rangeType = new RealTupleType(domainType,temp);

// parse the input file to create appropriately ordered temperature and coordinate ranges
        float geoSamples[][] = getCoords);
        float tempSamples[][] = getTemps();

        // make the domain set
Gridded3DSet domain3DSet = new Gridded3DSet(domainType, geoSamples, numAlts, numLats, numLons);

        // create the flatfield, and populate it with the observations
        FlatField dataItem = new FlatField(rangeType, domain3DSet);
        dataItem.setSamples(tempSamples);

        
2) To get, say, the surface level temperatures, I need to get this data structure into a 2D field, because I can't make a 2D ScalarMap to a 3D field. So I make a new 2D domain set and 2D Flatfield of the k-th level by
\
        // create data structures to hold new samples   
        float newGeoSamples[][] = new float[2][numLats*numLons];
        float newTemperatures[][] = new float[1][numLats*numLons];

        // extract the lats and lons we need to make a 2D set
        for (i=0; i<numLon; i++) {
                for (j=0; j < numLon; j++) {
                        index3D = level + numLevel*j + numLevel*numLat*i;       
                
                        index2D = j + numLat*i;
                        newGeoSamples[0][index2D] = geoSamples[1][index3D];
                        newGeoSamples[1][index2D] = geoSamples[2][index3D];
                        newTemperatures[0][index2D]
                }
        }
        
        // create the appropriate 2D data type descriptors
        domainTuple2D = new RealTuple   Type(latitude, longitude);
        functionType2D = new FunctionType(domainTuple2D, temperature);

        // create the 2D flat field
Gridded2DSet domain2DSet = new Gridded2DSet(domainTuple2D, newGeoSamples, numLats, numLons);
        FlatField field2D = new FlatField(functionType2D, domain2DSet);

3) Now I can create ScalarMaps, DataReferences, and plot my data in the normal satisfactory manner.

So why do I think I'm missing something?  Well,

A) I'm creating two entirely duplicative arrays in step two, at a considerable memory loss.

B) I'm entirely avoiding using any of resample's built-in interpolation features, which seems highly counterintuitive.

C) GriddedSets can't handle missing data, if any. Which can happen in my problem domain.

I can't be the first person to want to do this, so I'm sure there's a more straightforward, efficient way. What am I missing? Correct use of Coordinate Systems? Correct use of IrregularSets? Can anyone point me to some example code I should have been looking at?

        Edward


  • 2000 messages navigation, sorted by:
    1. Thread
    2. Subject
    3. Author
    4. Date
    5. ↑ Table Of Contents
  • Search the visad archives: