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, 11 Jul 2013 19:17:11 -0300
Thanks Tom
I am able to get the array of points.
I see that function "getLatLons() requires a GridDataset.
Based on the simple code below I have a FieldImpl object.
How can I get a gridset in order to send as parameter to getLanLons
function?

import visad.python.JPythonMethods as JPythonMethods

filename = 'd:/mymodel.nc'
file_opener = 'file.grid'
variable = 'sst'
ds = makeDataSource(filename, file_opener)
temperatures = getData(ds.getName(), variable)

#Obtain points for the required temperature range 0' - 2.99 Celsius
list=findWithinRange(temperatures,0,2.99)

latlonlist=getLatLons(Gridset?,list)

........more code .....

Regards
Jose


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

> Hello Jose --
>
> Sorry for the delays.  There are functions in the JPythonMethods
> library that will return a array of indecies of points between two
> values....look at "findWithinRange()" in this doc:
> <
> http://www.ssec.wisc.edu/visad-docs/javadoc/visad/python/JPythonMethods.html
> >
>
> You can then use the "getLatLons()" method to get back a list of
> Latitude,Longitude values for each of those points.
>
> I hope that helps....?
>
> tom
>
> On Wed, Jul 3, 2013 at 11:48 PM, Jose Carro <joandca@xxxxxxxxx> wrote:
> > 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
> >
> >
>
>
>
> --
> 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
>