""" Services implemented: GMS/DEM/calls/HSV POST: HSV """ from monitorT.task import Task import os import tempfile from tools.layer import Layer, OutLayer from GMS.tools.gdal_python import is_overlapping from skimage.color import rgb2hsv # Fix gdal 2.40 and 3.3 integration problems try: import gdal import ogr except ModuleNotFoundError: from osgeo import gdal, ogr import numpy as np from tools.drivers.driver import Drivers import cv2 class TaskCustom(Task): """ clase interna itasker """ CONTROL = True def post(task, user=None, aoi: Layer = None, raster_layer: Layer = None, output_layer: OutLayer = None): """ Servicio HSV Parameters ---------- task user aoi: Layer Capa de entidades de interes raster_layer: Layer Capa raster output_layer: OutLayer Capa de salida Returns ------- output_layer: OutLayer devuelve el objeto OutLayer """ # Generating temporal files tmp_directory = tempfile.mkdtemp(dir='tmp') orto_crop_path = tempfile.NamedTemporaryFile(suffix='.tif', prefix='orto_', dir=tmp_directory).name # Get available drivers drivers = Drivers() # Get feature of AOI layer aoi_ds = ogr.Open(aoi.gdal_layer()) aoi_layer = aoi_ds.GetLayer() aoi_feature = aoi_layer.GetFeature(0) aoi_geom = aoi_feature.GetGeometryRef() # Generating vrt from folder vrt_string = 'gdalbuildvrt {result} {files}' # Vrto of ortos ###################################################################################### if raster_layer.protocol.is_directory(raster_layer['source']): vrt_files = [] for file in raster_layer.protocol.list_files(raster_layer['source'], raster_layer.driver.format): lidar_parameter = raster_layer.parameters.copy() lidar_parameter['source'] = raster_layer.protocol.join(raster_layer['source'], file) new_layer = Layer(user, lidar_parameter) gdal_url = new_layer.gdal_layer() if is_overlapping(gdal_url, aoi_geom): vrt_files.append(gdal_url) del new_layer vrt_orto = tempfile.NamedTemporaryFile(suffix='.vrt', prefix='orto_', dir=tmp_directory).name os.system(vrt_string.format(result=vrt_orto, files=' '.join(vrt_files))) else: vrt_orto = raster_layer.protocol.gdal_url(raster_layer['source']) # First crop by AOI gdal_warp_sentence = 'gdalwarp -q -multi -cutline "{cut_shape}" -dstnodata 0 -overwrite -crop_to_cutline ' \ '-r near "{source}" "{dst}" '.format(cut_shape=aoi.gdal_layer(), source=vrt_orto, dst=orto_crop_path) os.system(gdal_warp_sentence) # Rading crop orto_ds = gdal.Open(orto_crop_path) xsize = orto_ds.GetRasterBand(1).XSize ysize = orto_ds.GetRasterBand(1).YSize gt = orto_ds.GetGeoTransform() # Creating empty result result = tempfile.NamedTemporaryFile(suffix='.tif', prefix='result_', dir=tmp_directory).name raster_driver = gdal.GetDriverByName(drivers.get_by_name('GeoTIFF').gdal_driver) result_dataset = raster_driver.Create(result, xsize, ysize, 3, gdal.GDT_Float32) result_dataset.SetGeoTransform(gt) result_dataset.SetProjection(orto_ds.GetProjection()) # Reading as array image_array = cv2.imread(orto_crop_path) array_hsv = rgb2hsv(image_array) # Writing for band in range(1, 4): result_dataset.GetRasterBand(band).WriteArray(array_hsv[:, :, band-1]*255.0) del result_dataset print(result, 'attached sourcesss') output_layer.attach_sources((result, )) output_layer.residual_sources.append(tmp_directory) return output_layer