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 # 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 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: 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('./in/','./out/',sys.argv[1],'./logs/',sys.argv[2])