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: Mon, 8 Jul 2013 13:34:14 -0300
Hi Tom
Did you have the chance to look into this?
Do you think is there a way to get all points coordinates between for each
contour?
Thanks
Jose

2013/7/4 Jose Carro <joandca@xxxxxxxxx>

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