Source code for flyingpigeon.processes.wps_subset_bbox

import logging
import tempfile
from pathlib import Path

from pywps import Process, LiteralInput, FORMATS
from pywps.inout.outputs import MetaFile, MetaLink4

from flyingpigeon.subset_base import Subsetter
from flyingpigeon.processes.wpsio import resource, variable, start, end, output, metalink
from pywps.ext_autodoc import MetadataUrl

import ocgis.exc

LOGGER = logging.getLogger("PYWPS")


[docs]class SubsetBboxProcess(Subsetter, Process): """Subset a NetCDF file using bounding box geometry.""" def __init__(self): inputs = [resource, LiteralInput('lon0', 'Minimum longitude', abstract='Minimum longitude.', data_type='float'), LiteralInput('lon1', 'Maximum longitude', abstract='Maximum longitude.', data_type='float'), LiteralInput('lat0', 'Minimum latitude', abstract='Minimum latitude.', data_type='float'), LiteralInput('lat1', 'Maximum latitude', abstract='Maximum latitude.', data_type='float'), start, end, variable] outputs = [output, metalink] super(SubsetBboxProcess, self).__init__( self._handler, identifier='subset_bbox', title='Subset netCDF file on bounding box', version='0.2', abstract=('Return the data for which grid cells intersect the ' 'bounding box for each input dataset as well as' 'the time range selected. This implies that the centroid of' 'a grid cell can be outside the bounding box.'), metadata=[ MetadataUrl('Doc', 'https://flyingpigeon.readthedocs.io/en/latest/processes_des.html#subset-processes', anonymous=True), ], inputs=inputs, outputs=outputs, status_supported=True, store_supported=True, ) def _handler(self, request, response): geom = self.parse_bbox(request) dr = self.parse_daterange(request) ml = MetaLink4('subset', workdir=self.workdir) response.update_status('Start processing the bbox subset', 30) for res in self.parse_resources(request): variables = self.parse_variable(request, res) prefix = Path(res).stem + "_bbox_subset" rd = ocgis.RequestDataset(res, variables) try: ops = ocgis.OcgOperations( dataset=rd, geom=geom, time_range=dr, output_format='nc', spatial_wrapping="wrap", interpolate_spatial_bounds=True, prefix=prefix, dir_output=tempfile.mkdtemp(dir=self.workdir)) out = ops.execute() mf = MetaFile(prefix, fmt=FORMATS.NETCDF) mf.file = out ml.append(mf) except ocgis.exc.ExtentError: continue response.update_status('Finished processing the bbox subset', 90) response.outputs['output'].file = ml.files[0].file response.outputs['metalink'].data = ml.xml response.update_status("Completed", 100) return response