"""Add a bounding box to a Basemap plot.

"""
import numpy as np

from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure
from matplotlib.patches import Rectangle
from matplotlib.toolkits.basemap import Basemap

def create_map(fig_name, lats, lons):
    # define domain
    ll_lon = 15
    ll_lat = -40
    ur_lon = 35
    ur_lat = -20

    # create new figure
    fig = Figure()
    ax = fig.add_subplot(1,1,1)

    # make a plot on a map
    curr_map = Basemap(projection='cyl', llcrnrlon=ll_lon, llcrnrlat=ll_lat,
                        urcrnrlon=ur_lon, urcrnrlat=ur_lat, resolution='l',
                        ax=ax, area_thresh=1000.)
    
    # transform lons and lats to map coordinates.
    x, y = curr_map(lons, lats)
    
    # create a rectangle patch
    llcorner = (x[0], y[0])
    width = abs(x[1] - x[0])
    height = abs(y[1] - y[0])
    
    rect = Rectangle(llcorner, width, height, edgecolor='b', fill=False)
    ax.add_patch(rect)

    # draw country borders
    curr_map.drawcoastlines(linewidth=1.0)
    curr_map.drawcountries(linewidth=1.0)

    # draw parallels and meridians.
    delat = 5.
    circles = np.arange(0, -45, -delat)
    curr_map.drawparallels(circles, labels=[1,0,0,0])

    delon = 5.
    meridians = np.arange(-10, 60, delon)
    curr_map.drawmeridians(meridians, labels=[0,0,0,1])

    canvas = FigureCanvas(fig)
    canvas.print_figure(fig_name)

if __name__ == '__main__':
    fig_name = 'bbox.png'
    
    lats = [-35.31, -32.1]
    lons = [16.0, 23.0]
    
    create_map(fig_name, lats, lons)
