Revision: 6825
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=6825&view=rev
Author:   jswhit
Date:     2009-01-25 14:29:31 +0000 (Sun, 25 Jan 2009)

Log Message:
-----------
added maskoceans function and example.

Modified Paths:
--------------
    trunk/toolkits/basemap/Changelog
    trunk/toolkits/basemap/MANIFEST.in
    trunk/toolkits/basemap/examples/README
    trunk/toolkits/basemap/lib/mpl_toolkits/basemap/__init__.py

Added Paths:
-----------
    trunk/toolkits/basemap/examples/maskoceans.py

Modified: trunk/toolkits/basemap/Changelog
===================================================================
--- trunk/toolkits/basemap/Changelog    2009-01-25 12:56:39 UTC (rev 6824)
+++ trunk/toolkits/basemap/Changelog    2009-01-25 14:29:31 UTC (rev 6825)
@@ -1,4 +1,5 @@
 version 0.99.4 (not yet released)
+           * added 'maskoceans' function.
            * update pupynere to version 1.0.8 (supports writing large files).
            * added more informative error message in readshapefile when
              one of the shapefile components can't be found.

Modified: trunk/toolkits/basemap/MANIFEST.in
===================================================================
--- trunk/toolkits/basemap/MANIFEST.in  2009-01-25 12:56:39 UTC (rev 6824)
+++ trunk/toolkits/basemap/MANIFEST.in  2009-01-25 14:29:31 UTC (rev 6825)
@@ -70,6 +70,7 @@
 include examples/plotprecip.py
 include examples/nws_precip_conus_20061222.nc
 include examples/NetCDFFile_tst.py
+include examples/maskoceans.py
 include examples/README
 include lib/mpl_toolkits/__init__.py
 include lib/mpl_toolkits/basemap/__init__.py

Modified: trunk/toolkits/basemap/examples/README
===================================================================
--- trunk/toolkits/basemap/examples/README      2009-01-25 12:56:39 UTC (rev 
6824)
+++ trunk/toolkits/basemap/examples/README      2009-01-25 14:29:31 UTC (rev 
6825)
@@ -123,3 +123,5 @@
 
 save_background.py shows how to save a map background and reuse it in another
 figure (without having to redraw coastlines).
+
+maskoceans.py shows how to mask 'wet' areas on a plot.

Added: trunk/toolkits/basemap/examples/maskoceans.py
===================================================================
--- trunk/toolkits/basemap/examples/maskoceans.py                               
(rev 0)
+++ trunk/toolkits/basemap/examples/maskoceans.py       2009-01-25 14:29:31 UTC 
(rev 6825)
@@ -0,0 +1,46 @@
+from mpl_toolkits.basemap import Basemap, shiftgrid, maskoceans, interp
+import numpy as np 
+import matplotlib.pyplot as plt
+import matplotlib.mlab as mlab
+
+topodatin = mlab.load('etopo20data.gz')
+lonsin = mlab.load('etopo20lons.gz')
+latsin = mlab.load('etopo20lats.gz')
+
+# shift data so lons go from -180 to 180 instead of 20 to 380.
+topoin,lons1 = shiftgrid(180.,topodatin,lonsin,start=False)
+lats1 = latsin
+
+fig=plt.figure()
+# setup basemap
+m=Basemap(resolution='l',projection='lcc',lon_0=-100,lat_0=40,width=8.e6,height=6.e6)
+lons, lats = np.meshgrid(lons1,lats1)
+x, y = m(lons, lats)
+# interpolate land/sea mask to topo grid, mask ocean values.
+topo = maskoceans(lons, lats, topoin, inlands=False)
+# make contour plot (ocean values will be masked)
+#CS=m.contourf(x,y,topo,np.arange(-300,3001,50),cmap=plt.cm.jet,extend='both')
+im=m.pcolormesh(x,y,topo,cmap=plt.cm.jet,vmin=-300,vmax=3000)
+# draw coastlines.
+m.drawcoastlines()
+plt.title('ETOPO data with marine areas masked (original grid)')
+
+fig=plt.figure()
+# interpolate topo data to higher resolution grid (to better match
+# the land/sea mask).
+nlats = 3*topoin.shape[0]
+nlons = 3*topoin.shape[1]
+lons = np.linspace(-180,180,nlons)
+lats = np.linspace(-90,90,nlats)
+lons, lats = np.meshgrid(lons, lats)
+topo = interp(topoin,lons1,lats1,lons,lats,order=1)
+x, y = m(lons, lats)
+# interpolate land/sea mask to topo grid, mask ocean values.
+topo = maskoceans(lons, lats, topo, inlands=False)
+# make contour plot (ocean values will be masked)
+#CS=m.contourf(x,y,topo,np.arange(-300,3001,50),cmap=plt.cm.jet,extend='both')
+im=m.pcolormesh(x,y,topo,cmap=plt.cm.jet,vmin=-300,vmax=3000)
+# draw coastlines.
+m.drawcoastlines()
+plt.title('ETOPO data with marine areas masked (data on finer grid)')
+plt.show()

Modified: trunk/toolkits/basemap/lib/mpl_toolkits/basemap/__init__.py
===================================================================
--- trunk/toolkits/basemap/lib/mpl_toolkits/basemap/__init__.py 2009-01-25 
12:56:39 UTC (rev 6824)
+++ trunk/toolkits/basemap/lib/mpl_toolkits/basemap/__init__.py 2009-01-25 
14:29:31 UTC (rev 6825)
@@ -8,6 +8,8 @@
 
 :func:`interp`:  bilinear interpolation between rectilinear grids.
 
+:func:`maskoceans`:  mask 'wet' points of an input array.
+
 :func:`shiftgrid`:  shifts global lat/lon grids east or west.
 
 :func:`addcyclic`: Add cyclic (wraparound) point in longitude.
@@ -3113,20 +3115,8 @@
             # read in.
             if self.lsmask is None:
                 # read in land/sea mask.
-                lsmaskf = 
open(os.path.join(basemap_datadir,'5minmask.bin'),'rb')
-                nlons = 4320; nlats = nlons/2
-                delta = 360./float(nlons)
-                lsmask = 
np.reshape(np.fromstring(lsmaskf.read(),np.uint8),(nlats,nlons))
-                lsmask_lons = np.arange(-180,180.,delta)
-                lsmask_lats = np.arange(-90.,90+0.5*delta,delta)
-                # add cyclic point in longitude
-                lsmask, lsmask_lons = addcyclic(lsmask, lsmask_lons)
-                nlons = nlons + 1; nlats = nlats + 1
-                # add North Pole point (assumed water)
-                tmparr = np.zeros((nlats,nlons),lsmask.dtype)
-                tmparr[0:nlats-1,0:nlons] = lsmask
-                lsmask = tmparr
-                lsmaskf.close()
+                lsmask_lons, lsmask_lats, lsmask = _readlsmask()
+
             # instance variable lsmask is set on first invocation,
             # it contains the land-sea mask interpolated to the native
             # projection grid.  Further calls to drawlsmask will not
@@ -3950,3 +3940,53 @@
     """
     cdftime = netcdftime.utime(units,calendar=calendar)
     return cdftime.date2num(dates)
+
+def maskoceans(lonsin,latsin,datain,inlands=False):
+    """
+    mask data (``datain``), defined on a grid with latitudes ``latsin``
+    longitudes ``lonsin`` so that points over water will not be plotted.
+
+    .. tabularcolumns:: |l|L|
+
+    ==============   ====================================================
+    Arguments         Description
+    ==============   ====================================================
+    lonsin, latsin   rank-2 arrays containing longitudes and latitudes of
+                     grid.
+    datain           rank-2 input array on grid defined by ``lonsin`` and
+                     ``latsin``.
+    inlands          if False, mask only ocean points.  If True, mask
+                     ocean points and points over inland water bodies.
+                     Default False.
+    ==============   ====================================================
+
+    returns a masked array the same shape as datain with "wet" points masked.
+    """
+    # read in land/sea mask.
+    lsmask_lons, lsmask_lats, lsmask = _readlsmask()
+    # nearest-neighbor interpolation to output grid.
+    lsmasko = 
interp(lsmask,lsmask_lons,lsmask_lats,lonsin,latsin,masked=True,order=0)
+    # mask input data.
+    if inlands: # mask inland water bodies.
+        mask = np.logical_or(lsmasko==0,lsmasko==2)
+    else: # mask just marine areas.
+        mask = lsmasko == 0
+    return ma.masked_array(datain,mask=mask)
+
+def _readlsmask():
+    # read in land/sea mask.
+    lsmaskf = open(os.path.join(basemap_datadir,'5minmask.bin'),'rb')
+    nlons = 4320; nlats = nlons/2
+    delta = 360./float(nlons)
+    lsmask = np.reshape(np.fromstring(lsmaskf.read(),np.uint8),(nlats,nlons))
+    lsmask_lons = np.arange(-180,180.,delta)
+    lsmask_lats = np.arange(-90.,90+0.5*delta,delta)
+    # add cyclic point in longitude
+    lsmask, lsmask_lons = addcyclic(lsmask, lsmask_lons)
+    nlons = nlons + 1; nlats = nlats + 1
+    # add North Pole point (assumed water)
+    tmparr = np.zeros((nlats,nlons),lsmask.dtype)
+    tmparr[0:nlats-1,0:nlons] = lsmask
+    lsmask = tmparr
+    lsmaskf.close()
+    return lsmask_lons, lsmask_lats, lsmask


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
This SF.net email is sponsored by:
SourcForge Community
SourceForge wants to tell your story.
http://p.sf.net/sfu/sf-spreadtheword
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to