#crear shapefile con poligonos que son cuadrados # cuyas 4 esquinas son xmin/max/ymin/max de i ficheros .las/.laz de entrada #archivo salida se llama "output" import geopandas as gpd import sys import csv import fnmatch from shapely.geometry import Polygon import shapefile # Hay que instalar este paquete -> pip install pyshp import os import json import pdal #pip install pdal / sudo apt-get install python3-pdal /apt-get install pdal import traceback import laspy as lp import numpy as np def crear_shape(entrada, salida,epsg,logs,id): try: archivos_lasz = os.listdir(entrada) nohaylases = True nombres=[] polygons=[] file = open(logs+"log_crear_cuadricula_"+id+".txt","w") for archivo in archivos_lasz: if fnmatch.fnmatch(archivo,'*.las') or fnmatch.fnmatch(archivo,'*.laz') or fnmatch.fnmatch(archivo,'*.LAS') or fnmatch.fnmatch(archivo,'*.LAZ'): nohaylases = False #print('He encontrado ',archivo) log='\n He encontrado '+archivo+'\n' file.write(log) try: point_cloud = lp.read(entrada+archivo) except: #print('este archivo no tiene nada o no se puede leer') log='\n Este archivo no tiene nada o no se puede leer \n'+'\n########################################################################################\n' file2 = open(logs+"log_error_crear_cuadricula_"+id+".txt","a") file2.write(log) continue #print('\n segun laspy: \n') laspyxmax = round(point_cloud.header.x_max) #print('\nAltitud maxima x:', laspyxmax) laspyymax = round(point_cloud.header.y_max) #print('\nAlitud maxima y:', laspyymax) laspyxmin = round(point_cloud.header.x_min) #print('\nAltitud minima x:', laspyxmin) laspyymin = round(point_cloud.header.y_min) #print('\nAltitud minima y:', laspyymin, '\n') cuadrado = Polygon([(laspyxmin,laspyymin), (laspyxmin,laspyymax), (laspyxmax,laspyymax), (laspyxmax,laspyymin), (laspyxmin,laspyymin)]) nombres.append(archivo) polygons.append(cuadrado) log = '\n ################### '+archivo+' ################### \n'+'\nAltitud maxima x:'+str(laspyxmax)+'\nAlitud maxima y:'+str(laspyymax)+'\nAltitud minima x:'+str(laspyxmin)+'\nAltitud minima y:'+str(laspyymin)+'\n'+'\n########################################################################################\n' file.write(log) if nohaylases: #print('#################### No hay .las/.laz en ', entrada,' ####################') log= '\n #################### No hay .las/.laz en '+entrada+' #################### \n' file2 = open(logs+"log_error_crear_cuadricula_"+id+".txt","a") file2.write(log) return file.close() df = {'name': nombres, 'geometry': polygons} gdf = gpd.GeoDataFrame(df,crs="EPSG:"+epsg) gdf.to_file(salida+'output'+id+'.shp', driver="ESRI Shapefile") return except Exception: #print(' \n ###################### ERROR ###################### \n') file = open(logs+"log_error_crear_cuadricula_"+id+".txt","a") traceback.print_exc() file.write(traceback.format_exc()) #print('\n fin traza error \n') crear_shape('./in/','./out/',sys.argv[1],'./logs/',sys.argv[2])