Re: [visad] Convert Netcdf content to visad object in order generate contours coordinates

  • To: Tom Whittaker <whittaker@xxxxxxxx>
  • Subject: Re: [visad] Convert Netcdf content to visad object in order generate contours coordinates
  • From: Jose Carro <joandca@xxxxxxxxx>
  • Date: Thu, 4 Jul 2013 01:48:28 -0300
Hi Tom.
Happy independence day!
Sorry for my bad english...
I tried to say data points that lie between contours. As you said, points
between 5.0 and 7.0 lines.
Regards
Jose

2013/7/4 Tom Whittaker <whittaker@xxxxxxxx>

> Hi Jose....
>
> Sorry for the delay -- we are on holiday now and I will not return to
> the office until Monday.
>
> I hope the Jython scripting continues to be of  use to you!  I do have
> a question, though:
>
> When you say, "identify the points that are inside each contour" do
> you mean the actual coordinates of the contour lines?  Or do you mean
> the data points that lie between to contour "levels" (for example,
> between the 5.0 and 7.0 lines)?
>
> tom
>
> On Wed, Jul 3, 2013 at 9:16 PM, Jose Carro <joandca@xxxxxxxxx> wrote:
> >
> > Hi Tom
> > Using the below Jython code I was able to draw contours for 3,5,7....24
> > degrees Celsius.
> > Now I have to identify points that are inside each contours to apply
> > specific functions depending on the contour they are.
> > Do you know how I can get contour coordinates?
> > If you think I should do it in a different way please let me know.
> > Regards
> > Jose
> >
> > import ucar.visad.display.ContourLines as cLines
> > import visad.ContourControl as ContourControl
> > import ucar.visad.display.Contour2DDisplayable as Contour2DDisplayable
> > import ucar.unidata.util.ContourInfo as ContourInfo
> > import visad.Contour2D as Contour2D
> >
> > filename = 'd:/mymodel.nc'
> > file_opener = 'file.grid'
> > variable = 'sst'
> > ds = makeDataSource(filename, file_opener)
> > display_type = 'planviewcontour'
> > image_dimensions = (800, 600)
> > setOffScreen(1)
> > idv.getStateManager().setViewSize(java.awt.Dimension(image_dimensions[0],
> > image_dimensions[1]))
> > temperaturas = getData(ds.getName(), variable)
> > dc=createDisplay(display_type, temperaturas)
> > cInfo =
> >
> ContourInfo('3.0;5.0;7.0;10.0;12.0;15.0;18.0;20.0;22.0;24.0',0.0,0.0,24.0,1,0,1,1.0)
> > dc.setContourInfo(cInfo)
> >
> >
> >> 2013/7/3 Tom Whittaker <whittaker@xxxxxxxx>
> >>>
> >>> Hi Jose...
> >>>
> >>> Thanks for the background information.
> >>>
> >>> Have you considered writing your formula using Jython (Python)?  It is
> >>> very well integrated into the IDV and there are many, many functions
> >>> available that would allow you to, for example, obtain the latitude
> >>> and longitude of the grid points, and get an array of the data where
> >>> you could apply the algorithm and fill up a 3D array with values,
> >>> which you would then have to use to create a new FlatField.
> >>>
> >>> Even if you code this in Java, I would still recommend that you
> >>> consider using the IDV to read the data and then call your method
> >>> to do the computations and create the new data field for display.
> >>>
> >>> The "netCDF file adapter" in the VisAD library uses a very old version
> of
> >>> the netCDF library and may not understand the structure of the data in
> >>> your file.  We do not have the resources to re-write that code.
> >>>
> >>> Good luck.
> >>>
> >>> tom
> >>>
> >>> On Tue, Jul 2, 2013 at 3:27 PM, Jose Carro <joandca@xxxxxxxxx> wrote:
> >>> > Hi Tom
> >>> >
> >>> > Thanks for your quick response.
> >>> > I already tested my nc file in IDV and I was able to draw beautiful
> >>> > contours.
> >>> >
> >>> > The problem is that for my region (South America), specifically coast
> >>> > of
> >>> > Uruguay and Argentine, we have sea surface temperature data but
> missing
> >>> > measures for different depths.
> >>> >
> >>> > I am working with a local professor who developed a formula function,
> >>> > where
> >>> > he can get the approximate temperature for different depths based on
> >>> > SST
> >>> > isotherms.
> >>> >
> >>> > I am trying to develop a Java application using Visad libraries. This
> >>> > program should read the 2D Netcdf. Calculate the contours for
> different
> >>> > temperatures and depending on the lat.lon of each point I would
> apply a
> >>> > specific formula. That’s why I need the contours coordinates (each
> >>> > point
> >>> > lat,lon) for each coordinate in order to apply different formulas for
> >>> > different points depending between what contours they are. (I
> >>> > understand
> >>> > that class Conrourd2D can provide x,y for each points of the
> contours)
> >>> >
> >>> > With a new 3d array I plan to create a 3D Netcdf in order to be
> >>> > imported to
> >>> > IDV.
> >>> >
> >>> > I hope it clarifies my requirements.
> >>> >
> >>> > I will investigate the information you provided me.
> >>> >
> >>> > Thanks
> >>> >
> >>> > Jose
> >>> >
> >>> >
> >>> >
> >>> > 2013/7/2 Tom Whittaker <whittaker@xxxxxxxx>
> >>> >>
> >>> >> Hello Jose...
> >>> >>
> >>> >> Unless you need to write Java code, you might consider using a
> >>> >> higher-level application like McIDAS-V (which is based on the
> >>> >> IDV...which, in turn, uses the VisAD library for it's data model and
> >>> >> display).  If your file is truly CF-compliant, then either of these
> >>> >> applications would be able to display contour lines.  Both
> >>> >> applications are freely available -- for McIDAS-V, go to:
> >>> >> <http://www.ssec.wisc.edu/mcidas/software/v/download.html>.  The
> IDV
> >>> >> homepage is: <http://www.unidata.ucar.edu/software/idv/>.
> >>> >>
> >>> >> If you must write your own code, you can look in the examples in the
> >>> >> VisAD library in the various "File Adapters", or in some of the
> >>> >> "field" methods defined in the JPythonMethods which create
> FlatFields,
> >>> >> for examples.  In addition, the VisAD Develooper's Guide and the
> Data
> >>> >> Tutorial will be helpful.
> >>> >>
> >>> >> tom
> >>> >>
> >>> >>
> >>> >> On Tue, Jul 2, 2013 at 10:49 AM, Jose Carro <joandca@xxxxxxxxx>
> wrote:
> >>> >> > Dear visad group
> >>> >> > I am totally new in visad library and netcdf manipulation.
> >>> >> > The file I am trying to manipulate has this features:
> >>> >> >
> >>> >> > Netcdfile follows the convention CF-1.0
> >>> >> > type: Time -> ((Longitude, Latitude, zlev) -> (sst, anom, err,
> ice)
> >>> >> > It is 2D because zlev is 0.
> >>> >> >
> >>> >> > I wrote a small java program where I can read a Netcdf file and
> list
> >>> >> > values
> >>> >> > following some examples from netcdf library,
> >>> >> > My question is how can I transform this array into a format that
> >>> >> > visad
> >>> >> > can
> >>> >> > understand. As instance FieldImpl.
> >>> >> > My goal is to get isotherms (contours) lat,lon using some visad
> >>> >> > contour
> >>> >> > class.
> >>> >> > Thanks in advance
> >>> >> > Jose
> >>> >> > code:
> >>> >> >
> >>> >> > dataFile=NetcdfFile.open("d:/mymodel.nc");
> >>> >> > Variable tempVar = dataFile.findVariable("sst");
> >>> >> > if (tempVar == null) {
> >>> >> > System.out.println("Cant find Variable sst");
> >>> >> > return;
> >>> >> > }else{
> >>> >> > // read variable
> >>> >> > int [] shape = tempVar.getShape();
> >>> >> >   int recLen = shape[0]; // number of times
> >>> >> >   int[] origin = new int[4];
> >>> >> >    shape[0] = 1; // only one rec per read
> >>> >> >
> >>> >> >    // loop over the rec dimension
> >>> >> >    for (int rec = 0; rec < recLen; rec++) {
> >>> >> >     origin[0] = rec;  // read this index
> >>> >> >     // Get the lat/lon data from the file.
> >>> >> >     ArrayShort.D2 tempArray = null;
> >>> >> >     try {
> >>> >> > tempArray = (ArrayShort.D2) (tempVar.read(origin,
> shape).reduce());
> >>> >> > } catch (InvalidRangeException e) {
> >>> >> > // TODO Auto-generated catch block
> >>> >> > e.printStackTrace();
> >>> >> > }
> >>> >> >
> >>> >> >
> >>> >> >     // now checking the value
> >>> >> >     for (int lvl = 0; lvl < NLVL; lvl++)
> >>> >> >     for (int lat = 0; lat < NLAT; lat++)
> >>> >> >     for (int lon = 0; lon < NLON; lon++) {
> >>> >> >     // System.out.println(tempArray.get(1,1, lat, lon));
> >>> >> >     System.out.println("Longitude:" + lon);
> >>> >> >     System.out.println("Latitude:" + lat);
> >>> >> >     System.out.println("Temp:" + Float.toString(tempArray.get(lat,
> >>> >> > lon)));
> >>> >> >     }
> >>> >> >    }
> >>> >> >
> >>> >> >
> >>> >> >
> >>> >> >
> >>> >> >
> >>> >> >
> >>> >> >
> >>> >> > _______________________________________________
> >>> >> > visad mailing list
> >>> >> > visad@xxxxxxxxxxxxxxxx
> >>> >> > For list information, to unsubscribe, visit:
> >>> >> > http://www.unidata.ucar.edu/mailing_lists/
> >>> >>
> >>> >>
> >>> >>
> >>> >> --
> >>> >> Tom Whittaker
> >>> >> University of Wisconsin-Madison
> >>> >> Space Science & Engineering Center (SSEC)
> >>> >> Cooperative Institute for Meteorological Satellite Studies (CIMSS)
> >>> >> 1225 W. Dayton Street
> >>> >> Madison, WI  53706  USA
> >>> >> ph: +1 608 262 2759
> >>> >
> >>> >
> >>>
> >>>
> >>>
> >>> --
> >>> Tom Whittaker
> >>> University of Wisconsin-Madison
> >>> Space Science & Engineering Center (SSEC)
> >>> Cooperative Institute for Meteorological Satellite Studies (CIMSS)
> >>> 1225 W. Dayton Street
> >>> Madison, WI  53706  USA
> >>> ph: +1 608 262 2759
> >>
> >>
> >
>
>
>
> --
> Tom Whittaker
> University of Wisconsin-Madison
> Space Science & Engineering Center (SSEC)
> Cooperative Institute for Meteorological Satellite Studies (CIMSS)
> 1225 W. Dayton Street
> Madison, WI  53706  USA
> ph: +1 608 262 2759
>