From: <js...@us...> - 2007-10-29 12:53:24
|
Revision: 4042 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=4042&view=rev Author: jswhit Date: 2007-10-29 05:53:17 -0700 (Mon, 29 Oct 2007) Log Message: ----------- numpification and fixes for rotate_vector (EF) Modified Paths: -------------- trunk/toolkits/basemap/Changelog trunk/toolkits/basemap/lib/matplotlib/toolkits/basemap/basemap.py trunk/toolkits/basemap/setup.py Modified: trunk/toolkits/basemap/Changelog =================================================================== --- trunk/toolkits/basemap/Changelog 2007-10-28 19:03:49 UTC (rev 4041) +++ trunk/toolkits/basemap/Changelog 2007-10-29 12:53:17 UTC (rev 4042) @@ -1,3 +1,7 @@ +version 0.9.7 (not yet released) + * fix rotate_vector so it works in S. Hem and for non-orthogonal + grids (EF) + * numpification (EF) version 0.9.6 (svn revision 3888) * fix addcyclic function so it handles masked arrays. * labelling of meridians and parallels now works with Modified: trunk/toolkits/basemap/lib/matplotlib/toolkits/basemap/basemap.py =================================================================== --- trunk/toolkits/basemap/lib/matplotlib/toolkits/basemap/basemap.py 2007-10-28 19:03:49 UTC (rev 4041) +++ trunk/toolkits/basemap/lib/matplotlib/toolkits/basemap/basemap.py 2007-10-29 12:53:17 UTC (rev 4042) @@ -12,6 +12,7 @@ from proj import Proj import matplotlib.numerix as NX from matplotlib.numerix import ma +import numpy as npy from numpy import linspace from matplotlib.numerix.mlab import squeeze from matplotlib.cbook import popd, is_scalar @@ -20,7 +21,7 @@ # basemap data files now installed in lib/matplotlib/toolkits/basemap/data basemap_datadir = os.sep.join([os.path.dirname(__file__), 'data']) -__version__ = '0.9.6' +__version__ = '0.9.7' # test to see numerix set to use numpy (if not, raise an error) if NX.which[0] != 'numpy': @@ -2175,13 +2176,33 @@ uin = interp(uin,lons,lats,lonsout,latsout,checkbounds=checkbounds,order=order,masked=masked) vin = interp(vin,lons,lats,lonsout,latsout,checkbounds=checkbounds,order=order,masked=masked) # rotate from geographic to map coordinates. - delta = 0.1 # increment in latitude used to estimate derivatives. - xn,yn = self(lonsout,NX.where(latsout+delta<90.,latsout+delta,latsout-delta)) - # northangle is the angle between true north and the y axis. - northangle = NX.where(lats+delta<90, NX.arctan2(xn-x, yn-y), - NX.arctan2(x-xn, y-yn)) - uout = uin*NX.cos(northangle) + vin*NX.sin(northangle) - vout = vin*NX.cos(northangle) - uin*NX.sin(northangle) + if ma.isMaskedArray(uin): + mask = ma.getmaskarray(uin) + uin = uin.filled(1) + vin = vin.filled(1) + masked = True # override kwarg with reality + uvc = uin + 1j*vin + uvmag = npy.abs(uvc) + delta = 0.1 # increment in longitude + dlon = delta*uin/uvmag + dlat = delta*(vin/uvmag)*npy.cos(latsout*npy.pi/180.0) + farnorth = latsout+dlat >= 90.0 + somenorth = farnorth.any() + if somenorth: + dlon[farnorth] *= -1.0 + dlat[farnorth] *= -1.0 + lon1 = lonsout + dlon + lat1 = latsout + dlat + xn, yn = self(lon1, lat1) + vecangle = npy.arctan2(yn-y, xn-x) + if somenorth: + vecangle[farnorth] += npy.pi + uvcout = uvmag * npy.exp(1j*vecangle) + uout = uvcout.real + vout = uvcout.imag + if masked: + uout = ma.array(uout, mask=mask) + vout = ma.array(vout, mask=mask) if returnxy: return uout,vout,x,y else: @@ -2210,12 +2231,35 @@ """ x, y = self(lons, lats) # rotate from geographic to map coordinates. - delta = 0.1 # increment in latitude used to estimate derivatives. - xn,yn = self(lons,NX.where(lats+delta<90.,lats+delta,lats-delta)) - northangle = NX.where(lats+delta<90, NX.arctan2(xn-x, yn-y), - NX.arctan2(x-xn, y-yn)) - uout = uin*NX.cos(northangle) + vin*NX.sin(northangle) - vout = vin*NX.cos(northangle) - uin*NX.sin(northangle) + if ma.isMaskedArray(uin): + mask = ma.getmaskarray(uin) + masked = True + uin = uin.filled(1) + vin = vin.filled(1) + else: + masked = False + uvc = uin + 1j*vin + uvmag = npy.abs(uvc) + delta = 0.1 # increment in longitude + dlon = delta*uin/uvmag + dlat = delta*(vin/uvmag)*npy.cos(lats*npy.pi/180.0) + farnorth = lats+dlat >= 90.0 + somenorth = farnorth.any() + if somenorth: + dlon[farnorth] *= -1.0 + dlat[farnorth] *= -1.0 + lon1 = lons + dlon + lat1 = lats + dlat + xn, yn = self(lon1, lat1) + vecangle = npy.arctan2(yn-y, xn-x) + if somenorth: + vecangle[farnorth] += npy.pi + uvcout = uvmag * npy.exp(1j*vecangle) + uout = uvcout.real + vout = uvcout.imag + if masked: + uout = ma.array(uout, mask=mask) + vout = ma.array(vout, mask=mask) if returnxy: return uout,vout,x,y else: Modified: trunk/toolkits/basemap/setup.py =================================================================== --- trunk/toolkits/basemap/setup.py 2007-10-28 19:03:49 UTC (rev 4041) +++ trunk/toolkits/basemap/setup.py 2007-10-29 12:53:17 UTC (rev 4042) @@ -88,7 +88,7 @@ package_data = {'matplotlib.toolkits.basemap':pyproj_datafiles+basemap_datafiles} setup( name = "basemap", - version = "0.9.6", + version = "0.9.7", description = "Plot data on map projections with matplotlib", long_description = """ An add-on toolkit for matplotlib that lets you plot data This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |