import csv import numpy as np import laspy as lp import pdal import os import json import subprocess import datetime import traceback import time import fnmatch import sys import re from pathlib import Path # entrada: -Path al directorio que debiera contener archivos .las o -laz # -Path al directorio de salida # -Path a plantilla.txt con relacion de valores (colores) y clasificación # # salida: -geotiff en directorio salida con valores en cada pixel = maxima clasificación de los puntos dentro del píxel (1metro) # -log.txt en directorio de ejecución con archivos leidos y escritos # -log_error.txt en directorio de ejecución si ha habido error durante la ejecución directorio_entrada = sys.argv[1] directorio_salida = sys.argv[2] txt_clasificaion = sys.argv[3] directorio_logs = sys.argv[4] id_proceso = sys.argv[5] start_time = time.time() def geotiff_max_classif(origen,archivo,destino): nombrearchivo=archivo.rsplit('.',1)[0] jsonDTM=[origen+archivo] array_separado = archivo.split('-',1) coordenadas = re.search('[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]',archivo).group(0) xmin = int(coordenadas.split('-')[0]) * 1000 xmax = xmin + 2000 ymax = int(coordenadas.split('-')[1]) * 1000 ymin = ymax - 2000 bounds="(["+str(xmin)+","+str(xmax)+"],["+str(ymin)+","+str(ymax)+"])" merge = { "type": "filters.merge" } expression = { "type": "filters.expression", "expression": "Classification!=12" } writers = { "filename": destino+nombrearchivo+'_nocolored.tif', "dimension": "Classification", "output_type": "max", "type": "writers.gdal", "bounds": bounds, "resolution":1.0 } jsonDTM.append(merge) jsonDTM.append(expression) jsonDTM.append(writers) peticion = json.dumps(jsonDTM) pipeline = pdal.Pipeline(peticion) count = pipeline.execute() arrays = pipeline.arrays metadata = pipeline.metadata log = pipeline.log def geotiff_max_classif_coloreado(origen,destino,txt,logs,id): try: filogs=logs+"log_geotiff_clasificacion_max_"+id+".txt" file = open(filogs,"w") if(origen[len(origen)-1]!='/'): log='Path entrada mal especificado. Ha de acabar en "/"' print(log) file.write(log) return if(destino[len(destino)-1]!='/'): log='Path de salida mal especificado. Ha de acabar en "/"' print(log) file.write(log) return archivos = os.listdir(origen) nohay = True for archivo in archivos: print("########################################################################################################") print(f"++++ PROCESANDO {archivo}") if Path(f"{destino}{archivo.rsplit('.',1)[0]}_colored.tif").is_file(): print(f"- Ya existe el archivo {destino}{archivo.rsplit('.',1)[0]}_colored.tif") continue if fnmatch.fnmatch(archivo,'*.las') or fnmatch.fnmatch(archivo,'*.laz'): nohay = False try: geotiff_max_classif(origen,archivo,destino) except Exception: log="\n Error durante pdal archivo: "+archivo+"\n" file.write(log) print(log) traceback.print_exc() file.write(traceback.format_exc()) file2=open(logs+"log_error_geotiff_clasificacion_max_"+id+".txt","a") file2.write(log) file2.write(traceback.format_exc()) continue nombrearchivo=archivo.rsplit('.',1)[0] subprocess.run('gdaldem color-relief '+destino+nombrearchivo+'_nocolored.tif'+' '+txt+' '+destino+nombrearchivo+'_colored.tif'+' -of GTiff',shell=True) subprocess.run('rm '+destino+nombrearchivo+'_nocolored.tif',shell=True) log='\nleido:\n'+origen+archivo+'\n guardado: '+destino+nombrearchivo+'_colored.tif\n' file.write(log) if nohay: print('No hay archivos las o laz que recibir') return log="--- "+str(time.time() - start_time)+" seconds ---" file.write(log) file.close() except Exception: file = open(logs+"log_error_geotiff_clasificacion_max_"+id+".txt","a") log="--- "+str(time.time() - start_time)+" seconds ---" file.write(log) file.close() geotiff_max_classif_coloreado(directorio_entrada, directorio_salida, txt_clasificaion, directorio_logs, id_proceso)