Due to the current gap in continued funding from the U.S. National Science Foundation (NSF), the NSF Unidata Program Center has temporarily paused most operations. See NSF Unidata Pause in Most Operations for details.
Harold, I use my own projection code for most of the projected grids that Panoply handles, but I have also written versions for all of them that use the Unidata netCDF library's projection code. My method for getting the projection from the Unidata code is a bit different from yours, mostly because the various projections I have implemented extend from an abstract projection handler. That abstract class doesn't need to know what the specific projection is; it just works on a ProjectionImpl class, and LambertConformal extends from ProjectionImpl. private ProjectionImpl njProj; private void initUnidataProj ( ) { final VariableDS njvarDS = ...; final List<CoordinateSystem> csList = njvarDS.getCoordinateSystems ( ); if (csList == null || csList.isEmpty ( )) { throw new RuntimeException ("No coordinate systems found."); } final CoordinateSystem cs = csList.get (0); // Get coordinate system projection. CS will return LatLonProjection if no projection detected but // there is an auxiliary 2D grid in place. njProj = cs.getProjection ( ); // If projection is not Lambert Conformal Conic, that makes us unhappy. if (! (njProj instanceof LambertConformal)) { throw new RuntimeException ("CS returned " + njProj.getClass ( ) + " instead of LambertConformal"); } } And then as you indicate, call njproj.projToLatLon to translate grid coordinates to lon-lat pairs. But your final question is the opposite direction, given a lon-lat pair, to find the data value at that location. When gridding such data, Panoply creates an x-y grid using the projected grid coordinates. It then creates an output lon-lat grid, and calls lonLatToProj on each of the points in that grid, takes each returned x-y pair, and finds the nearest data point in the x-y grid to that pair. Since it is doing this an array of locations rather than just looking up single points on demand, there's some optimization in place. rbs -- Robert B. Schmunk Webmaster / Senior Systems Programmer NASA Goddard Institute for Space Studies 2880 Broadway, New York, NY 10025 -----Original Message----- From: <netcdf-java-bounces@xxxxxxxxxxxxxxxx> on behalf of Harold <harold@xxxxxxxxxxxxxx> Date: Tuesday, June 18, 2019 at 12:38 To: "netcdf-java@xxxxxxxxxxxxxxxx" <netcdf-java@xxxxxxxxxxxxxxxx> Subject: [netcdf-java] Reading grib2 with LambertConformal_Projection -> lat / lng Hello, First, thanks for this lib; it is very helpful and I don't know where we'd be without it. I encountered my first netcdf (.grib2) files recently, and hope to access the data therein to verify the output of another system. Here's an example file, if that helps: - https://s3.us-east-2.amazonaws.com/tech.public.data/grib2-test/3600.grib2 <https://s3.us-east-2.amazonaws.com/tech.public.data/grib2-test/3600.grib2> I found PanoplyJ, which works great, and summarizes the file like this: - https://i.imgur.com/VJXnpWH.png I am using the java libs `edu.ucar/cdm` and `edu.ucar/grib`, both at version 4.6.13 - which also work great and open the file without trouble. My intention is to verify the contents of this file against a different dataset which expresses surface location with lat/lng, while this grib2 file has x/y (under a Lambert conformal mapping). The path I found through the lib yesterday is: 1) NetcdfDataset/openDataset 2) .getVariables and store a reference to the `LambertConformal_Projection` variable 3) Construct a `LambertConformalConic` and call `.makeCoordinateTransform` with the dataset and the variable 4) From that I can `.getProjection` 5) Then I make a `float[][]` out of the separate x/y variables 6) Then I can call `.projToLatLon` with the projection and the `float[][]` 7) After this I go linear over the contents of the `Temperature_surface` variable associating each one with the correct lat/lng. This actually works, but I am wondering if there is a better way. I have a feeling that there is some higher level API that I missed that would do all this more automatically, and possibly more generally. My code feels brittle and over-specific to this particular file. Or, put another way, how best to (given a lat/lng) query the temp at that location in this file? With warm appreciation for your time, -Harold
netcdf-java
archives: