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
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")
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
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