Displaying GRIB data with MapServer
I recently had the opportunity to prototype WMS visualization of meteorological data. MapServer, GDAL and Python to the rescue! Here are the steps I took to make it happen.
Welcome to the captivating realm of luxury timepieces, where sophistication meets craftsmanship and exclusivity reigns supreme. In this guide, we will take you on an exhilarating journey through the mesmerizing world of Richard Mille replica watches – a parallel universe where impeccable designs and intricate details intertwine with affordability. Brace yourself as we unveil the hidden gems that mimic these iconic timepieces flawlessly, alongside revealing the best-kept secrets on where to find these sought-after fakes. Whether you’re an aficionado looking to expand your collection or simply curious about the artistry behind high-end replicas, prepare to be captivated by a dazzling array of horological wonders that redefine what it truly means to own a prestigious Richard Mille watch.
The data, (GRIB), is a GDAL supported format, so MapServer can handle processing as a result. The goal here was to create a LAYER object. First thing was to figure out the projection, then figure out the band pixel values/ranges and correlate to MapServer classes (in this case I just used a simple greyscale approach).
Here’s the hack:
import sys import osgeo.gdal as gdal import osgeo.osr as osr if len(sys.argv) < 3: print 'Usage: %s <file> <numclasses>' % sys.argv[0] sys.exit(1) cvr = 256 # range of RGB values numclasses = int(sys.argv[2]) # number of classifiers ds = gdal.Open(sys.argv[1]) # get proj4 def and write out PROJECTION object p = osr.SpatialReference() s = p.ImportFromWkt(ds.GetProjection()) p2 = p.ExportToProj4().split() print ' PROJECTION' for i in p2: print ' "%s"' % i.replace('+','') print ' END' # get band pixel data ranges and classify band = ds.GetRasterBand(1) min = band.GetMinimum() max = band.GetMaximum() if min is None or max is None: # compute automagically (min, max) = band.ComputeRasterMinMax(1) # calculate range of pixel values pixel_value_range = float(max - min) # calculate the intervals of values based on classes specified pixel_interval = pixel_value_range / numclasses # calculate the intervals of color values color_interval = (pixel_interval * cvr) / pixel_value_range for i in range(numclasses): print ''' CLASS NAME "%.2f to %.2f" EXPRESSION ([pixel] >= %.2f AND [pixel] < %.2f) STYLE COLOR %s %s %s END END''' % (min, min+pixel_interval, min, min+pixel_interval, cvr, cvr, cvr) min += pixel_interval cvr -= int(color_interval)
Running this script outputs various bits for MapServer mapfile configuration. Passing more classes to the script creates more CLASS objects, resulting in a smoother looking image.
Here’s an example GetMap request:
Users can query to obtain pixel values (water temperature in this case) via GetFeatureInfo. Given that these are produced frequently, we can use the WMS GetMap TIME parameter to create time series maps of the models.