mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 09:40:21 +00:00
173 lines
5.2 KiB
Plaintext
173 lines
5.2 KiB
Plaintext
;----------------------------------------------------------------------
|
|
; topo_9.ncl
|
|
;
|
|
; Concepts illustrated:
|
|
; - Recreating a jpeg topographic image as an NCL map object
|
|
; - Zooming in on a jpeg image
|
|
; - Drawing a box around an area of interest on a map
|
|
; - Attaching polylines to a map
|
|
; - Using "overlay" to overlay multiple contour plots
|
|
; - Using more than 256 colors per frame
|
|
; - Using functions for cleaner code
|
|
;----------------------------------------------------------------------
|
|
; NOTE: This example will only work with NCL V6.1.0 and later.
|
|
;
|
|
; This script recreates a JPEG image that was converted to a NetCDF
|
|
; file with color separated bands using the open source tool
|
|
; "gdal_translate":
|
|
;
|
|
; gdal_translate -ot Int16 -of netCDF EarthMap_2500x1250.jpg \
|
|
; EarthMap_2500x1250.nc
|
|
;----------------------------------------------------------------------
|
|
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
|
|
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl"
|
|
|
|
;----------------------------------------------------------------------
|
|
; This function imports a JPEG image that's on the whole globe,
|
|
; and recreates it as an NCL map object that is zoomed in on the
|
|
; southern tip of Africa.
|
|
;----------------------------------------------------------------------
|
|
undef("recreate_jpeg_image")
|
|
function recreate_jpeg_image(wks,minlat,maxlat,minlon,maxlon)
|
|
begin
|
|
orig_jpg_filename = "EarthMap_2500x1250.jpg"
|
|
nc_filename = "EarthMap_2500x1250.nc"
|
|
|
|
;--You could use a system call to do the NetCDF conversion
|
|
; cmd = "gdal_translate -ot Int16 -of netCDF " + jpeg_filename + \
|
|
; " " + nc_filename)
|
|
; system(cmd)
|
|
|
|
;---Read the three bands of data
|
|
f = addfile(nc_filename,"r")
|
|
Band1 = where(f->Band1.gt.255, 255, f->Band1) ; red channel
|
|
Band2 = where(f->Band2.gt.255, 255, f->Band2) ; green channel
|
|
Band3 = where(f->Band3.gt.255, 255, f->Band3) ; blue channel
|
|
|
|
band_dims = dimsizes(Band3)
|
|
nlat = band_dims(0)
|
|
nlon = band_dims(1)
|
|
print("dimensions of image = " + nlat + " x " + nlon)
|
|
|
|
;
|
|
; Add lat/lon data so we can overlay on a map, and/or
|
|
; overlay contours. We know the image is global,
|
|
; cylindrical equidistant, and centered about lon=0.
|
|
;
|
|
lat = fspan( -90, 90,nlat)
|
|
lon = fspan(-180,180,nlon)
|
|
lat@units = "degrees_north"
|
|
lon@units = "degrees_east"
|
|
|
|
Band1!0 = "lat"
|
|
Band1!1 = "lon"
|
|
Band2!0 = "lat"
|
|
Band2!1 = "lon"
|
|
Band3!0 = "lat"
|
|
Band3!1 = "lon"
|
|
Band1&lat = lat
|
|
Band1&lon = lon
|
|
Band2&lat = lat
|
|
Band2&lon = lon
|
|
Band3&lat = lat
|
|
Band3&lon = lon
|
|
|
|
res = True
|
|
|
|
res@gsnMaximize = True
|
|
|
|
res@gsnFrame = False ; Don't draw or advance
|
|
res@gsnDraw = False ; frame yet.
|
|
|
|
res@cnFillOn = True
|
|
res@cnFillMode = "RasterFill" ; Raster fill can be faster
|
|
|
|
res@cnLevelSelectionMode = "EqualSpacedLevels"
|
|
res@cnMaxLevelCount = 254
|
|
res@cnFillBackgroundColor = (/ 1., 1., 1., 1./)
|
|
|
|
res@cnLinesOn = False ; Turn off contour lines .
|
|
res@cnLineLabelsOn = False ; Turn off contour labels
|
|
res@cnInfoLabelOn = False ; Turn off info label
|
|
res@lbLabelBarOn = False ; Turn off labelbar
|
|
res@gsnRightString = "" ; Turn off subtitles
|
|
res@gsnLeftString = ""
|
|
res@pmTickMarkDisplayMode = "Always"
|
|
|
|
;---Construct RGBA colormaps...
|
|
ramp = fspan(0., 1., 255)
|
|
reds = new((/255, 4/), float)
|
|
greens = new((/255, 4/), float)
|
|
blues = new((/255, 4/), float)
|
|
|
|
reds = 0
|
|
greens = 0
|
|
blues = 0
|
|
|
|
reds(:,0) = ramp
|
|
greens(:,1) = ramp
|
|
blues(:,2) = ramp
|
|
|
|
; The red contour map is plotted fully opaque; the green and blue
|
|
; are plotted completely transparent. When overlain, the colors
|
|
; combine (rather magically).
|
|
reds(:,3) = 1.
|
|
greens(:,3) = 0
|
|
blues(:,3) = 0
|
|
|
|
res@cnFillColors = greens
|
|
greenMap = gsn_csm_contour(wks, Band2, res)
|
|
|
|
res@cnFillColors = blues
|
|
blueMap = gsn_csm_contour(wks, Band3, res)
|
|
|
|
;---This will be our base, so make it a map plot.
|
|
res@cnFillColors = reds
|
|
res@gsnAddCyclic = False
|
|
|
|
res@mpFillOn = False
|
|
|
|
;---Zoom in on area of interest
|
|
res@mpMinLatF = minlat
|
|
res@mpMaxLatF = maxlat
|
|
res@mpMinLonF = minlon
|
|
res@mpMaxLonF = maxlon
|
|
|
|
redMap = gsn_csm_contour_map(wks, Band1, res)
|
|
|
|
;---Overlay everything to create the topo map
|
|
overlay(redMap, greenMap)
|
|
overlay(redMap, blueMap)
|
|
|
|
return(redMap)
|
|
end
|
|
|
|
;----------------------------------------------------------------------
|
|
; Main code
|
|
;----------------------------------------------------------------------
|
|
begin
|
|
;---Recreating jpeg images only works for X11 and PNG.
|
|
wks = gsn_open_wks("png","topo")
|
|
|
|
;---Southern part of Africa
|
|
minlat = -40
|
|
maxlat = 5
|
|
minlon = 10
|
|
maxlon = 40
|
|
|
|
map = recreate_jpeg_image(wks,minlat,maxlat,minlon,maxlon)
|
|
|
|
;---Overlay a red box
|
|
lonbox = (/ 15, 35, 35, 15, 15/)
|
|
latbox = (/-30,-30,-10,-10,-30/)
|
|
|
|
lnres = True
|
|
lnres@gsLineColor = "red" ; red box
|
|
lnres@gsLineThicknessF = 4.0 ; make box thicker
|
|
box = gsn_add_polyline(wks,map,lonbox,latbox,lnres)
|
|
|
|
draw(map) ; Drawing the map will draw the red box
|
|
frame(wks)
|
|
|
|
end
|