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.
Hi Ugo, I tried to implement your hints: This is where the array gets created: public void makeArray2() { double[][] coords = new double[2][east.length]; coords[0] = new double[east.length]; coords[1] = new double[north.length]; for (int i=0;i<coords[0].length;i++) { coords[0][i]=east[i]; coords[1][i]=north[i]; } for (int j=0;j<coords[0].length;j++) { System.out.println("e "+coords[0][j]); } for (int j=0;j<coords[1].length;j++) { System.out.println("n "+coords[1][j]); } } The arrays look similar to the one you mailed me, I even changed my north and east values in the RealTupleType, because GISterm looked somehow upside down (spiegelverkehrt?) in the screenshots to ArcView. I am getting a VisAD Exception which sais, samples are null, is this the coordinates array with the x and y values or the height array? And how do I have to specify the height array, does it include the missing values or not? Here is the VisAD stuff: public void makeSurface() { eastValues = RealType.getRealType("eastValues"); northValues = RealType.getRealType("northValues"); heightValues = RealType.getRealType("heightValues"); try { //domain_tuple = new RealTupleType(northValues,eastValues); domain_tuple = new RealTupleType(eastValues,northValues); // Create a FunctionType (domain_tuple -> range_tuple); func_en_h = new FunctionType(domain_tuple, heightValues); domain_set = new Gridded2DDoubleSet(domain_tuple,coords,nRows,nCols); // Get the Set samples to facilitate the calculations float[][] set_samples = domain_set.getSamples( true ); // We create another array, with the same number of elements of // altitude and temperature, but organized as float[][] flat_samples = new float[1][nCols * nRows]; // ...and then we fill our 'flat' array with the generated values // by looping over NCOLS and NROWS // specifiy height for(int c = 0; c < nCols; c++){ for(int r = 0; r < nRows; r++){ //flat_samples[0][c*nRows+r] = height[c*nRows+r]; flat_samples[0][c*nRows+r] = heightNaN[c*nRows+r]; } } /* for (int n=0;n<height.length;n++) { flat_samples[0][n]=height[n]; } */ for(int c = 0; c < nRows; c++){ for(int r = 0; r < nCols; r++){ System.out.println(c*nRows+r); // ursprüngliches quadratische x.y.z grid flat_samples[0][c*nRows+r] = height[c*nRows+r]; // nicht quadratische gridvisadlayer grid //flat_samples[0][c*nCols+r] = height[c*nCols+r]; } } // Create a FlatField // Use FlatField(FunctionType type, Set domain_set) vals_ff = new FlatField( func_en_h, domain_set); // ...and put the values above into it // Note the argument false, meaning that the array won't be copied vals_ff.setSamples( flat_samples , false ); // Create Display and its maps // A 2D display display = new DisplayImplJ3D("display1"); // Create the ScalarMaps: latitude to XAxis, longitude to YAxis and // altitude to RGB and temperature to IsoContour // Use ScalarMap(ScalarType scalar, DisplayRealType display_scalar) eastMap = new ScalarMap( eastValues, Display.YAxis ); northMap = new ScalarMap( northValues, Display.XAxis ); heightMap = new ScalarMap(heightValues,Display.ZAxis); eastMap.setRange(-1.0, 1.0); northMap.setRange(-1.0, 1.0); heightMap.setRange(-1.0, 1.0); // Add maps to display display.addMap( eastMap ); display.addMap( northMap ); display.addMap( heightMap ); // Create a data reference and set the FlatField as our data data_ref = new DataReferenceImpl("data_ref"); data_ref.setData( vals_ff ); renderer = new DefaultRendererJ3D(); // Add reference to display display.addReferences(renderer,data_ref); //display.addReference( data_ref ); display.addDisplayListener(listener); } catch (VisADException ve) { System.out.println("VisADException"); System.out.println(ve.getMessage()); } catch (RemoteException re) { System.out.println("RemoteExcpetion"); System.out.println(re.getMessage()); } } Thanks for your help Desiree oooooooooooooooooooooooooooooooooooooooooooooooo Desiree Hilbring Institut fuer Photogrammetrie und Fernerkundung Universitaet Karlsruhe, Germany email: hilbring@xxxxxxxxxxxxxxxxxxxx # 0721 6083676 oooooooooooooooooooooooooooooooooooooooooooooooo On Thu, 5 Jul 2001, Ugo Taddei wrote: > Hi Desiree, > > I'm not sure where your NullPointerExeption arises, but I want to make a > point or 2 about your set, anyway. > > I see you're using a Gridded2DDoubleSet, but with "manifold dimension > 1". That really means a line in 2D and samples in double precision. I > know you have a DEM, and this means a surface in 2D (forget for a moment > that it is 3D, i.e. that you might want to depict your data in 3D; the > height values will be given by the FlatField, as you know). > > You should use a Gridded2DSet, with manifold dim = 2. That is, > > Gridded2DSet(MathType type, float[][] samples, int lengthX, int > lengthY) > a 2-D set whose topology is a lengthX x lengthY > grid, with null errors, CoordinateSystem and Units are > defaults from type > > (I'm supposing your x,y coords are floats; if not, stick to a > Gridded2DDoubleSet, but use the constructor > Gridded2DDoubleSet(MathType type, double[][] samples, int lengthX, int > lengthY) > > and not > > Gridded2DDoubleSet(MathType type, double[][] samples, int lengthX) > ) > > That is, your DEM is organized in a grid, but the interval between > adjacent points is not necessarily constant (if it were, than you could > use a Linear2DSet. Your grid has LengthX samples in the x direction and > LengthY samples in the y direction, i.e., those are the dimensions of > your grid (your "nCols 9 nRows 5", as one sees from your code). > > The MathType is composed of your eastValues and northValues; just make > sure you've got them in the right order one constructing the > > domain_tuple = new RealTupleType(northValues,eastValues); > > I'd personally do the other way around, first east (= x) then north ( > y) but this is arbitrary. > > The "tricky" bit comes in the definition of float[][] samples. In this > case, it is a float[2][ nCols * nRows ] array. (Remember, when manifold > dim = 1, you have float[2][ lengthX ], which gives you enough values for > a line, i.e. a path in 2D space.) > > However, you want a DEM, a surface in 2d space. So you need to input > LengthX * lengthY (= nRows * nCols) values. These are the > (northValues,eastValues) coordinates of your DEM and are given by the > array described above. > > The x-values are in samples[0] and the y-values are in samples[1]; > > Let you DEM be > > 3.3 x x > north 2.7 x > > 1.3 x x x > 0.2 0.3 1.1 1.2 > east > > Sampled points are represented bx "x". > > You've got lenX = 3, lenY = 2, and, thus, must input 6 pairs of > coordinates. > So, samples is (something like): samples[0]={0.2,1.1,1.2, 0.2,0.3,1.2}; > // east, or x values > and samples[1]={1.3,1.3,1.3, 3.3,2.7,3.3}; // > north, or y values > > Well, to be honest I might have got confused with the ordering of the > coords. This has not only to do with choosing whether EastValues comes > before northValues in the RealTupleType, but also to do with the way > VisAD organises the samples (it is the Fortran way). I'd have to hack a > bit to get it right (sorry, I'm a mere mortal and errare humanun est ;-) > so i'll leave that for you to do :-)=) > > The basic ideas here are to choose a Gridded2DSet with lenX and lenY > parameters, as this will construct the right topology (your DEM surface) > and to get the samples[0] with the x-values and samples[1] with the > y-values (or just the other way around ;-) > > Final point is, your gridded set must correspond with a valid grid. Not > something like you'd find in triangulated irregular network (TIN). For > that you'd use an Irregular2DSet (and all those Delaunay objects), but I > reckon, from the list, you know that. > > I truly hope I managed help to clarify the issue a bit. > > Cheers, > > Ugo > >
visad
archives: