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, Your problem is actually somewhat tricky, sorry to say. A connected surface display is generated using the topology of the Field's domain Set: the topology specifies which samples are neighbors that should be connected together to form little triangles or quads. Missing values delete points from the topology, so the little triangles and quads cannot be formed. I have experimented in the past with algorithms that try to only draw those triangles or quads for which all vertices are valid (non-missing) but this can be very misleading, as some non-missing points are then not visible. Although it is not very pretty, rendering as isolated points is the most reliable way to show exacty which points are missing. Of course, you'd like to find a work around, and there are a few possibilities: 1. Render as isolated points, but use the following code to make the points larger: GraphicsModeControl mode = display1.getGraphicsModeControl(); mode.setPointSize(5.0f); With the right size, the large points almost look like a surface. 2. Reconstruct an irregular topology using the non-missing points, as follows: float[][] set_samples = domainSet.getSamples(); // count non-missing samples int len = 0; for (int i=0; i<LengthX*LengthY; i++) { if (samples[0][i] == samples[0][i]) len++; // not missing } FlatField new_ff = null; if (len > 0) { float[][] new_set_samples = new float[2][len]; double[][] new_samples = new double[2][len]; for (int i=0; i<LengthX*LengthY; i++) { if (samples[0][i] == samples[0][i]) { new_set_samples[0][i] = set_samples[0][i]; new_set_samples[1][i] = set_samples[1][i]; new_samples[0][i] = samples[0][i]; new_samples[1][i] = samples[1][i]; len++; } } Set new_domainSet = new Irregular2DSet( Domain, new_set_samples ); new_ff = new FlatField( overfunc, new_domainSet ); new_ff.setSamples(new_samples); } // now new_ff can be used in place of ff // if all points are missing, new_ff == null This will draw a surface that just spans across the missing points. Users will see no indication of where the missing points are, but in some cases they may not want to. 3. If you want to color the missing points black, then you have to estimate the elevation of the surface at the missing points. One way to do this is to resample the new_ff Field to your original Set, by adding the following code to my code above: FlatField re_ff = (FlatField) new_ff.resample(domainSet, Data.WEIGHTED_AVERAGE, Data.NO_ERRORS); double[][] re_samples = re_ff.getValues(); for (int i=0; i<LengthX*LengthY; i++) { if (samples[0][i] != samples[0][i]) { samples[0][i] = re_samples[0][i]; samples[1][i] = temperature_mapped_to_black; } } ff.setSamples( samples ); If there are lots of missing points, then ff will still have missing points (since the irregular topology of the domain set of new_ff will not "cover" the domain of ff). So you may want to try a more robust way of estimating elevations at missing points. We have an old Fortran (!) function for doing this at: ftp://iris.ssec.wisc.edu/fbarn/fbarn.f and there are other algorithms. Sorry that I don't have a more definitive answer for you. What you want involves estimating values for missing values, and this is just a deep issue. Since I don't have your data or ArcGridReader I was not able to test my code examples, so there may be a few bugs. Please let me know if you have problems or further questions. Cheers, Bill ---------------------------------------------------------- Bill Hibbard, SSEC, 1225 W. Dayton St., Madison, WI 53706 whibbard@xxxxxxxxxxxxx 608-263-4427 fax: 608-263-6738 http://www.ssec.wisc.edu/~billh/vis.html
visad
archives: