""" Services implemented: GMS/DEM/calls/edit POST: to edit raster """ import os from ...tools.gdal_python import GdalOptions from monitorT.task import Task from tools.system_tools import stream_output_command from tools.layer import Layer from tools import const import tempfile class TaskCustom(Task): """ clase interna itasker """ CONTROL = True def set_up(self): self.FLAG_PAUSE = False self.FLAG_CANCEL = False def cancel(self): self.FLAG_CANCEL = True def pause(self): self.FLAG_PAUSE = True def start(self): self.FLAG_start = True def post(task, user=None, raster: Layer = None, parameters=None): """ Service to edit a raster Parameters ---------- user: str User Id raster: str Path to raster directory. The same edit will be applied over all raster inside it. parameters: str Command line string options Go to https://gdal.org/programs/gdal_edit.html to get all the options. Returns ------- output: dict {"success": list of raster successfully processed, "error": list of raster processed with errors} Examples -------- >>> import requests >>> import json >>> # Default values -a_nodata 0 >>> data = {'user':'test', ... 'raster_list': ['/media/almacenamiento_a/almacenamiento_repositorio/Varios/vrt/prueba/pyramid/0/20_00.tiff', ... '/media/almacenamiento_a/almacenamiento_repositorio/Varios/vrt/prueba/pyramid/0/20_01.tiff', ... '/media/almacenamiento_a/almacenamiento_repositorio/Varios/vrt/prueba/pyramid/0/20_02.tiff'] ... 'parameters': "-a_nodata 0"} >>> response = requests.post(url='http:///GMS/raster/edit', json=data) {"success": ['/media/almacenamiento_a/almacenamiento_repositorio/Varios/vrt/prueba/pyramid/0/20_01.tiff', '/media/almacenamiento_a/almacenamiento_repositorio/Varios/vrt/prueba/pyramid/0/20_02.tiff'], "error": ['/media/almacenamiento_a/almacenamiento_repositorio/Varios/vrt/prueba/pyramid/0/20_00.tiff']} """ DEFAULT_PARAMS = "-a_nodata 0" ################################################### # Allow different users repositories # ################################################### # user_data = get_user_data(user) # # user_repo = user_data['repo'] # # if 'repo' in user_data.keys(): # # user_repo = user_data['repo'] # # data_base = StaticBase.load(user_repo) # # else: # # data_base = settings.STATIC_DATABASE[base] # ################################################### # gdal_edit do not support write actions with vsicurl so download, work and upload tmp_dir = tempfile.mkdtemp(dir=const.TMP_DIRECTORY) options = GdalOptions.parse_parameters(parameters, DEFAULT_PARAMS) current_file = 0 successful_list = [] error_list = [] if raster.is_file(): tmp_file = os.path.join(tmp_dir, raster['source'].split(os.sep)[-1]) raster.protocol.download(raster['source'], tmp_file) raster_url_list = [tmp_file] else: raster_url_list = raster.protocol.list_files(raster['source'], suffix='.{}'.format( raster.driver.format)) for file in raster_url_list: tmp_file = os.path.join(tmp_dir, file) raster.protocol.download(raster.protocol.join(raster['source'], file), tmp_file) raster_url_list = [tmp_file] total_files = len(raster_url_list) result = [] for raster_file in raster_url_list: if task.FLAG_CANCEL: exit() while task.FLAG_PAUSE: continue command = "gdal_edit.py {} {}".format(options.export_params(), raster_file) popen = stream_output_command(command) popen.communicate() error_code = popen.returncode if not error_code: successful_list.append(raster) else: error_list.append("Error {}: {}".format(error_code, raster)) successful_list.append(raster) current_file += 1 task.set_progress(current_file/total_files*100) result.append(raster_file) raster.attach_sources(result) return raster