def get_years_where(where_sql, temporal_resolution):
    if where_sql["type"] == 'between':
        start_stop_years = sorted(
            list(map(lambda arg: arg['value'], where_sql['arguments'])))
        logging.debug(f"start_stop_years: {start_stop_years}")
        parsed = sorted(
            list(
                map(
                    lambda date: dateutil.parser.parse(str(date),
                                                       fuzzy=True,
                                                       ignoretz=True,
                                                       dayfirst=False,
                                                       yearfirst=True).
                    replace(tzinfo=None), start_stop_years)))
        logging.debug(parsed[0].isoformat())
        all_years = list(
            map(
                lambda date: dateutil.parser.parse(date, fuzzy=True).replace(
                    tzinfo=None), get_list_years(temporal_resolution)))
        final_years = list(
            map(lambda date: date.isoformat(), [
                date for date in all_years
                if date <= parsed[1] and date >= parsed[0]
            ]))
        if final_years == []:
            raise PeriodNotValid("Supplied dates are invalid")
    elif where_sql["type"] == "operator" and where_sql["value"] == '=':
        current_year = where_sql['right']['value'].strip("'")
        final_years = [current_year, current_year]
    return final_years
Esempio n. 2
0
    def get_rasdaman_query(query):
        logging.info('[QueryService] Executing rasdaman query')
        payload_arr = [
            '<?xml version="1.0" encoding="UTF-8" ?>',
            '<ProcessCoveragesRequest xmlns="http://www.opengis.net/wcps/1.0" service="WCPS" version="1.0.0">',
            '<query><abstractSyntax>', query, '</abstractSyntax></query>',
            '</ProcessCoveragesRequest>'
        ]
        payload = ''.join(payload_arr)
        headers = {'Content-Type': 'application/xml'}
        request = Request(method='POST',
                          url=RASDAMAN_URL,
                          data=payload,
                          headers=headers)
        session = Session()
        prepped = session.prepare_request(request)
        response = session.send(prepped)
        if response.status_code == 404:
            raise PeriodNotValid('Period Not Valid')

        with tempfile.NamedTemporaryFile(suffix='.tiff', delete=False) as f:
            for chunk in response.iter_content(chunk_size=1024):
                f.write(chunk)
            raster_filename = f.name
            logging.debug(
                f"[QueryService] Temporary raster filename: {raster_filename}")
            f.close()
            return raster_filename
def parse_year(value):
    if type(value) is int:
        return value
    else:
        try:
            result = dateutil.parser.parse(value).strftime('%Y-%m-%d')
            return result
        except Exception as e:
            raise PeriodNotValid("Supplied dates are invalid")
 def parse_year(value):
     if type(value) is int:
         return value
     else:
         try:
             result = dateutil.parser.parse(value).year
             return int(result)
         except Error as e:
             raise PeriodNotValid("Supplied dates are invalid")
Esempio n. 5
0
    def get_tile_diff_query(bbox, year, model, scenario, indicator, bounds,
                            year_b, dset_b):
        logging.info('[QueryService] Forming rasdaman query')
        coverage_a = f'{scenario}_{model}_processed'
        logging.debug(f'coverage_a: {coverage_a}')
        logging.debug(f'coverage_b: {dset_b}')
        logging.debug(f'bounds: {bounds}')

        lower_bound_expr = ' - ' + str(bounds[0]) if float(
            bounds[0]) >= 0 else str(' + ' + str(abs(bounds[0])))
        logging.debug(lower_bound_expr)
        bounds_range = str(float(bounds[1]) - float(bounds[0]))
        logging.debug(bounds_range)
        # x := (c - a) / (b - a)
        bbox_expr = f" Lat({bbox['lat'][0]}:{bbox['lat'][1]}),Long({bbox['lon'][0]}:{bbox['lon'][1]})]"
        query = ''.join([
            f"for cov1 in ({dset_b}), cov2 in ({coverage_a}) return encode(scale(",
            f"(((cov1.{indicator})[ansi(\"{year_b}\"),",
            bbox_expr,
            f" - (cov2.{indicator})[ansi(\"{year}\"),",
            bbox_expr,
            f") {lower_bound_expr} ) * (255 / ({bounds_range} )),",
            "{Lat: \"CRS:1\"(0:255), Long: \"CRS:1\"(0:255)}),\"PNG\")]"  # Not a f-expression
        ])

        logging.debug(query)

        envelope_list = [
            '<?xml version="1.0" encoding="UTF-8" ?>',
            '<ProcessCoveragesRequest xmlns="http://www.opengis.net/wcps/1.0" service="WCPS" version="1.0.0">',
            '<query><abstractSyntax>', query, '</abstractSyntax></query>',
            '</ProcessCoveragesRequest>'
        ]

        payload = ''.join(envelope_list)
        logging.debug(f"payload: {payload}")
        headers = {'Content-Type': 'application/xml'}
        request = Request(method='POST',
                          url=RASDAMAN_URL,
                          data=payload,
                          headers=headers)
        session = Session()
        prepped = session.prepare_request(request)
        response = session.send(prepped)
        if response.status_code == 404:
            raise PeriodNotValid('Data not found')
        with tempfile.NamedTemporaryFile(suffix='.png', delete=False) as f:
            for chunk in response.iter_content(chunk_size=1024):
                f.write(chunk)
            raster_filename = f.name
            logging.debug(
                f"[QueryService] Temporary raster filename: {raster_filename}")
            f.close()
            return raster_filename
Esempio n. 6
0
    def get_tile_query(bbox, year, model, scenario, indicator, bounds):
        logging.info('[QueryService] Forming rasdaman query')
        coverage = f'{scenario}_{model}_processed'
        logging.debug(f'coverage: {coverage}')
        query_list = [
            'for cov in (', coverage, ') return encode(scale((((cov.',
            indicator, ')[ansi("', f'{year}', '"),Lat(',
            str(bbox['lat'][0]), ':',
            str(bbox['lat'][1]), '),Long(',
            str(bbox['lon'][0]), ':',
            str(bbox['lon'][1]), ')]',
            ColoringHelper.normalize(*bounds),
            ', {Lat: "CRS:1"(0:255), Long: "CRS:1"(0:255)}),  "PNG")]'
        ]

        envelope_list = [
            '<?xml version="1.0" encoding="UTF-8" ?>',
            '<ProcessCoveragesRequest xmlns="http://www.opengis.net/wcps/1.0" service="WCPS" version="1.0.0">',
            '<query><abstractSyntax>', *query_list,
            '</abstractSyntax></query>', '</ProcessCoveragesRequest>'
        ]

        payload = ''.join(envelope_list)
        logging.debug(f"payload: {payload}")
        headers = {'Content-Type': 'application/xml'}
        request = Request(method='POST',
                          url=RASDAMAN_URL,
                          data=payload,
                          headers=headers)
        session = Session()
        prepped = session.prepare_request(request)
        response = session.send(prepped)
        if response.status_code == 404:
            raise PeriodNotValid('Data not found')
        with tempfile.NamedTemporaryFile(suffix='.png', delete=False) as f:
            for chunk in response.iter_content(chunk_size=1024):
                f.write(chunk)
            raster_filename = f.name
            logging.debug(
                f"[QueryService] Temporary raster filename: {raster_filename}")
            f.close()
            return raster_filename