Source code for pypago.areas

# -*- coding: utf-8 -*-

"""
This function allows to extract spatial domains, by giving its section
boundaries.

"""
    
from matplotlib.colors import ListedColormap
import pypago.plot
import pypago.pyio
import pypago.misc
from pypago.disp import PypagoErrors
import pylab as plt
import numpy as np
import scipy.misc as misc

[docs]class Areas(object): """ Domain area class """ def __init__(self, grid, name, i, j, secnames=None, signs=None): self.name = name self.i = i self.j = j self.mask = np.zeros(grid.mask.shape) self.mask[i, j] = 1 self.volume = grid.volume[:, i, j] self.surface = grid.surface[i, j] self.secnames = secnames self.signs = signs self.jmin = grid.jmin self.jmax = grid.jmax self.imin = grid.imin self.imax = grid.imax self.nlon = grid.nlon self.modelname = grid.modelname def __str__(self): output = 'Domain area, %s model:\n' %self.modelname attrnames = pypago.misc.extract_attrlist(self) output += pypago.misc.extract_str(attrnames, self) return output
[docs] def finalplot(self, grid, gridsec=None, ax=None): """ Draws the areas mask. It draws the model mask and the model sections, and it fills the mask of the area :param pypago.grid.Grid grid: |pypago| object that contains the model grid :param pypago.sections.GridSection gridsec: |pypago| object that contains the model sections :param numpy.array mask: mask of the area """ pypago.plot.plot_dom_mask(grid, gridsec, self.mask, ax=ax)
[docs]def extract_dom_from_pol(grid, lonpol, latpol): """ Extracts the i, j indexes of the grid domain by provinding the longitudes and latitudes of a polygon. :param pypago.grid.Grid grid: Input grid :param numpy.array lonpol: Polygon longitude :param numpy.array lonpol: Polygon latitude :return: A tuple containing the i, j indexes of the domain point within the domain. :rtype: tuple """ from matplotlib.path import Path # convert list inputs into arrays lonpol = np.array(lonpol) latpol = np.array(latpol) # add cyclic values (if not) if lonpol[-1] != lonpol[0]: lonpol = np.append(lonpol, lonpol[-1:]) if latpol[-1] != latpol[0]: latpol = np.append(latpol, latpol[-1:]) if len(lonpol) != len(latpol): message = 'The lonpol and latpol must have the same length.\n' message += 'Currently:\n' message += ' -len(lonpol) = %3d\n' %len(lonpol) message += ' -len(latpol) = %3d\n' %len(latpol) message += 'This program will be stopped.' raise PypagoErrors(message) nlat, nlon = grid.latt.shape # creation the input of the path.Path command: # [(x1, y1), (x2, y2), (x3, y3)] path_input = [(lontemp, lattemp) for lontemp, lattemp in zip(lonpol, latpol)] pathobj = Path(path_input) mask = np.array([pathobj.contains_point((lontemp, lattemp)) for lontemp,lattemp in zip(np.ravel(grid.lont), np.ravel(grid.latt))]) mask = np.reshape(mask, (nlat, nlon)) i, j = np.nonzero(mask==1) return i, j