HGrib
Unofficial bindings for ECMWF's GRIB API library for reading
WMO FM-92 GRIB edition 1 and edition 2 messages.
In this version of HGrib, only raw bindings for the
documented part of GRIB API is available. The next
versions are intended to include, in chronological order,
Installation
The following prerequisites are needed to build HGrib:
With these requirements available, HGrib can be installed from
Hackage with Cabal:
cabal install hgrib
Usage
Right now, only raw bindings for the documented part of
GRIB API is available in Data.Grib.Raw. Much of the documentation
is copied into HGrib's reference documentation generated
by Haddock. To be able to work with these bindings, bindings for
C's fopen is provided in Data.Grib.Raw.CFile (which is re-exported
by Data.Grib.Raw). An example of usage is GRIB API's
get.c example re-written with HGrib's bindings:
import Control.Exception (assert)
import Data.Grib.Raw
import Foreign (allocaArray, allocaBytes)
import Text.Printf (printf)
filename :: FilePath
filename = "test/stage/regular_latlon_surface.grib1"
assertIO :: Bool -> IO ()
assertIO = flip assert $ return ()
main :: IO ()
main = do
h <- withBinaryCFile filename ReadMode $
gribHandleNewFromFile defaultGribContext
_ <- gribSetString h "file" filename
gribGetLong h "Ni" >>= printf "numberOfPointsAlongAParallel=%d\n"
gribGetLong h "Nj" >>= printf "numberOfPointsAlongAMeridian=%d\n"
gribGetDouble h "yFirst" >>= printf "latitudeOfFirstGridPointInDegrees=%g\n"
gribGetDouble h "xFirst" >>= printf "longitudeOfFirstGridPointInDegrees=%g\n"
gribGetDouble h "yLast" >>= printf "latitudeOfLastGridPointInDegrees=%g\n"
gribGetDouble h "xLast" >>= printf "longitudeOfLastGridPointInDegrees=%g\n"
gribGetDouble h "DyInDegrees" >>= printf "jDirectionIncrementInDegrees=%g\n"
gribGetDouble h "DxInDegrees" >>= printf "iDirectionIncrementInDegrees=%g\n"
len <- gribGetLength h "packingType"
allocaBytes len $ \bufr -> do
packingType <- gribGetString h "packingType" bufr len
printf "packingType=%s (%d)\n" packingType (length packingType + 1)
size <- gribGetSize h "values"
allocaArray size $ \array -> do
values <- gribGetDoubleArray h "values" array size
let average = sum values / (fromIntegral . length $ values)
printf "There are %d values, average is %g\n" size average
len' <- gribGetLength h "file"
assertIO $ len' == 1 + length filename
allocaBytes len' $ \bufr' -> do
file <- gribGetString h "file" bufr' len'
assertIO $ file == filename
Contributing
Issues and pull requests are most welcome!
Licenses
HGrib was created and is currently maintained by
Mattias Jakobsson. It is released under the
GNU General Public License v3.0. ECMWF's GRIB API is released
under the Apache license. HGrib is in no way associated with
ECMWF or the original library.