# Try displaying NOAA's OpenStreetMap WMS in Basemap
from pylab import *
import urllib
from PIL import Image
import cStringIO
from mpl_toolkits.basemap import Basemap
from datetime import datetime
from owslib.wms import WebMapService
# Cylindrical Basemap for Baja California
lon_min = -118.8
lon_max = -108.6
lat_min = 22.15
lat_max = 32.34
m = Basemap(llcrnrlon=lon_min, urcrnrlat=lat_max, urcrnrlon=lon_max, llcrnrlat=lat_min,
resolution='l', projection='cyl')
# OpenStreetMap WMS from NOAA
urlbase='http://osm.woc.noaa.gov/mapcache?'
wms = WebMapService(urlbase)
# What layers are available?
list(wms.contents)
['osm', 'rootlayer']
# What CRS projections are available?
wms['osm'].crsOptions
['EPSG:900913', 'EPSG:4326', 'EPSG:3857']
# What formats are available?
wms.getOperationByName('GetMap').formatOptions
['image/png', 'image/jpeg']
# Issue the WMS getmap request
img = wms.getmap(service='wms',layers=['osm'],transparent=True,srs='EPSG:4326',bbox=(lon_min,lat_min,lon_max,lat_max),size=(256,256),format='image/jpg')
# If I retrieve and store the jpg, imread can read it....
im = Image.open(cStringIO.StringIO(urllib.urlopen(img.url).read()))
# plot the image in Basemap
figure(figsize=(8,6),frameon=True)
cs=m.imshow(im)
m.drawcoastlines(linewidth=0.25)
parallels = arange(20,36,2.)
a=m.drawparallels(parallels,labels=[1,0,0,0],fontsize=10)
# draw meridians
meridians = np.arange(-120,-100,2.)
b=m.drawmeridians(meridians,labels=[0,0,0,1],fontsize=10)
img.url
'http://osm.woc.noaa.gov/mapcache?layers=osm&styles=&service=wms&srs=EPSG%3A4326&format=image%2Fjpg&request=GetMap&bgcolor=0xFFFFFF&height=256&width=256&version=1.1.1&bbox=-118.8%2C22.15%2C-108.6%2C32.34&exceptions=application%2Fvnd.ogc.se_xml&transparent=TRUE'