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
>
>