Source code for wolfhece.wolf_tiles


"""
Author: HECE - University of Liege, Pierre Archambeau
Date: 2024

Copyright (c) 2024 University of Liege. All rights reserved.

This script and its content are protected by copyright law. Unauthorized
copying or distribution of this file, via any medium, is strictly prohibited.
"""

import glob
from os.path import join, exists
from os import remove
from osgeo import gdal
import logging

from .PyTranslate import _
from .wolf_array import WolfArray, WolfArrayMB
from .PyVertexvectors import zone,Zones,vector


[docs] class Tiles(Zones): """ Gestion de données, par ex. topographiques, par tuiles (fichiers .tif indépendants) Besoin d'un répertoire contenant les tuiles et d'un shapefile de référencement Si le répertoire ne contient qu'un seul fichier tif général, les fichiers par tuile seront créés à la volée et stocké sur disque ** SURCHARGE ** de la classe "Zones" pour récupérer les routines graphiques """ def __init__(self, filename='', ox: float = 0, oy: float = 0, tx: float = 0, ty: float = 0, parent=None, is2D=True, idx: str = '', plotted: bool = True, mapviewer=None, need_for_wx: bool = False, linked_data_dir=None) -> None: """ filename : le fichier de forme (ShapeFile) de tuilage linked_data_dir : le répertoire des données .tif """ super().__init__(filename, ox, oy, tx, ty, parent, is2D, idx, plotted, mapviewer, need_for_wx) self.linked_data_dir = linked_data_dir # Réprtoire de données source self.linked_data_dir_comp = linked_data_dir self.loaded_tiles = [] # liste des tuiles déjà chargées - noms des fichiers, pas les données
[docs] def set_comp_dir(self, comp_dir:str = None): """ Ajout d'un répertoire de comparaison Si le répertoire de comparaison est différent de celui des données alors la valeur renvoyée sera le différentiel Delta = comparaison - source """ if (comp_dir is not None): if len(comp_dir.strip())>0: self.linked_data_dir_comp = comp_dir.strip()
[docs] def get_array(self, boundvector:vector = None, forceupdate = True): """ Récupération de la matrice boundvector : vecteur duquel les bornes seront extraites -> polygon du shapefile de tuilage forceupdate : force la MAJ même si le fichier a déjà été chargé précédemment """ if boundvector is None: logging.warning(_('Click inside a polygon, not outside :-) !')) return #objet de retour retarray = None # récupération des bornes bbox = boundvector.get_bounds() # nom du vecteur --> utile pour idx boundname = boundvector.myname # instance de comparaison comp = None src = None if self.linked_data_dir == self.linked_data_dir_comp: # pas de comparaison car répertoire source et comp identique # récupération du fichier .tif avec le nom associé au vecteur file = glob.glob(join(self.linked_data_dir,'*{}*.tif').format(boundname)) if len(file)>0: # le fichier existe if not file[0] in self.loaded_tiles or forceupdate: # on ne le lit que si pas déjà chargé ou forcé retarray = WolfArray(fname=file[0], mapviewer=self.mapviewer, idx=boundname, plotted=True) if retarray.array.shape != (int(abs(bbox[1][0]-bbox[0][0])/retarray.dx), int(abs(bbox[1][1]-bbox[0][1])/retarray.dy)): # test des bornes réelles vis-à-vis des dimensions de la matrice logging.warning(_('Bad shape according to real coordinates -- Verify {}'.format(file[0]))) logging.warning(_('Return value is None')) return None self.loaded_tiles.append(file[0]) else: # recherche des fichiers .tif file = glob.glob(join(self.linked_data_dir,'*.tif')) file_vrt = glob.glob(join(self.linked_data_dir,'*.vrt')) if len(file)>0 or len(file_vrt)>0: # des fichiers tif existent # si ce sont des tuiles, alors on a supposé que "-" est dans le nom de fichier # s'il existe un fichier global alors le nom ne doit pas contenir "-" et il doit être listé en premier if '-' in file[0] and len(file_vrt)==0: logging.info(_('No file with {}'.format(boundname))) return None elif '-' in file[0] and len(file_vrt)>0: file[0] = file_vrt[0] logging.info(_('Using vrt file to extract {}'.format(boundname))) elif '-' in file[0]: logging.info(_('No file from which exract {}'.format(boundname))) return None # A partir d'ici, si le fichier de tuile existait sur disque, la première partie du test aurait dû être vérifiée # Il existe un fichier global, càd sans "-" # on va créer le fichier de tuile newname = file[0] + '-' + str(int(bbox[0][0])) + '_' + str(int(bbox[1][1])) + '.tif' gdal.Translate(newname, file[0], projWin = [bbox[0][0], bbox[1][1], bbox[1][0], bbox[0][1]]) retarray = WolfArray(fname=newname, mapviewer=self.mapviewer, idx=boundname, plotted=True) retarray.count() # identification des valeurs non nulles else: return None assert(isinstance(retarray, WolfArray)), 'Bad type' else: # comparaison car répertoire source et comp différents # recherche des fichiers de tuile dans les 2 répertoires file1 = glob.glob(join(self.linked_data_dir,'*{}*.tif').format(boundname)) file2 = glob.glob(join(self.linked_data_dir_comp,'*{}*.tif').format(boundname)) # Lecture ou création du fichier source if len(file1)>0: src = WolfArray(fname = file1[0], mapviewer = self.mapviewer, idx = file1[0]) else: file1 = glob.glob(join(self.linked_data_dir,'*.tif')) file1_vrt = glob.glob(join(self.linked_data_dir,'*.vrt')) if len(file1)>0 or len(file1_vrt)>0: if '-' in file1[0] and len(file1_vrt)==0: logging.info(_('No file with {}'.format(boundname))) return None elif '-' in file1[0] and len(file1_vrt)>0: file1[0] = file1_vrt[0] logging.info(_('Using vrt file to extract {}'.format(boundname))) elif '-' in file1[0]: logging.info(_('No file from which exract {}'.format(boundname))) return None newname = file1[0] + '-' + str(int(bbox[0][0])) + '_' + str(int(bbox[1][1])) + '.tif' gdal.Translate(newname, file1[0], projWin = [bbox[0][0], bbox[1][1], bbox[1][0], bbox[0][1]]) src = WolfArray(fname = newname, mapviewer = self, idx = file1[0]) if src.array.shape != (int(abs(bbox[1][0]-bbox[0][0])/src.dx), int(abs(bbox[1][1]-bbox[0][1])/src.dy)): logging.warning(_('Bad shape according to real coordinates -- Verify {}'.format(file1[0]))) logging.warning(_('Return value is None')) return None # Lecture ou création du fichier de comparaison if len(file2)>0: comp = WolfArray(fname = file2[0], mapviewer = self.mapviewer, idx = file2[0]) else: file2 = glob.glob(join(self.linked_data_dir_comp,'*.tif')) file2_vrt = glob.glob(join(self.linked_data_dir_comp,'*.vrt')) if len(file2)>0 or len(file2_vrt)>0: if '-' in file2[0] and len(file2_vrt)==0: logging.info(_('No comp file with {}'.format(boundname))) return None elif '-' in file2[0] and len(file1_vrt)>0: file2[0] = file2_vrt[0] logging.info(_('Using vrt file to extract {}'.format(boundname))) elif '-' in file2[0]: logging.info(_('No file from which exract comparaison {}'.format(boundname))) return None newname = file2[0] + '-' + str(int(bbox[0][0])) + '_' + str(int(bbox[1][1])) + '.tif' gdal.Translate(newname, file2[0], projWin = [bbox[0][0], bbox[1][1], bbox[1][0], bbox[0][1]]) comp = WolfArray(fname = newname, mapviewer = self, idx = file2[0]) if comp is None or src is None: logging.info(_('At least one file is missing -- Nothing to do ! -- Retry or Debug !')) return None if comp.dx != src.dx: logging.info(_('Different spatial resolution --> rebin comparison array')) comp.rebin(src.dx/comp.dx) if comp.array.shape == src.array.shape: retarray = comp-src retarray.count() assert(isinstance(retarray, WolfArray)), 'Bad type' else: logging.info(_('Bad shape for {}'.format(boundname))) try: if exists(newname): remove(newname) except: pass retarray = None return retarray