def validate_footprints(products_geojson, outpath, index, year): valid_list = [] for feature in products_geojson['features']: fname = feature['properties']['title'] footprintgeojson = os.path.join(outpath, f'{fname}.geojson') with open(footprintgeojson, 'w') as geofile: json.dump(feature['geometry'], geofile) footprint = gpd.read_file(footprintgeojson) footprint_32629 = footprint.to_crs("epsg:32629") footprint_bounds = footprint_32629.bounds array = footprint_bounds.to_numpy() footprint_polygon = box(array[0, 0], array[0, 1], array[0, 2], array[0, 3]) bbox_incendio = getlargebbox(index, year) polygon_incendio = box(bbox_incendio[0][0], bbox_incendio[0][1], bbox_incendio[0][2], bbox_incendio[0][3]) # object.contains(other) # retorna True se nenhum dos pontos do "other" estiverem no exterior do objecto # e se pelo menos um ponto do interior do "other" estiver no interior do objecto. verify = footprint_polygon.contains(polygon_incendio) if verify: valid_list.append(fname) geofile.close() del_file(footprintgeojson) return valid_list
def getdem(year="2017"): pathfolder = "Dataset" + str(year) num_total_subfolders = [folder for folder in os.listdir(pathfolder)] for i in range(len(num_total_subfolders)): pathdem = os.path.join(pathfolder, str(i)) bbox_32629 = getlargebbox(i, year) _dem_raster = heigths(bbox_32629, pathdem)
def drawimages(year="2017"): full_path = os.getcwd() os.chdir(Path(full_path).parents[1]) switcheryear = {2017: "AA2017", 2018: "ardida_2018", 2019: "ardida_2019"} path = os.path.join(switcheryear[int(year)], switcheryear[int(year)] + ".shp") pathimage = "Incendios_Completos_" + str(year) if year == "2018": sf = shapefile.Reader(path, encoding="ISO8859-1") else: sf = shapefile.Reader(path) var_image = Imagemap() i = 0 for shape in sf.iterShapeRecords(): # criar path com respetiva pasta new_path = os.path.join(pathimage, str(i)) var_image.criarpasta(new_path) # gerar mascaras binarias de cada shape # bbox aumentada para a forma como vai entrar na rede large_bbox = getlargebbox(i, year, initialshapefile=True)[0] # saída do png será de 256*256 Imagemap.getimage(var_image, shape, 2560, 2560, (256, 256), 'shape', new_path) # bbox expandida a partir do centro da shape com 2560 metros de largura e altura box = Imagemap.bbox(shape, 2560, 2560, modify=True) # georeferenciar em coordenadas (lat/lon) e converter imagem para geotiff src = os.path.join(new_path, "shape.png") dataset = rasterio.open(src, 'r+') bands = 1 data = dataset.read(bands) transform = rasterio.transform.from_bounds(box[0], box[1], box[2], box[3], 256, 256) dst = os.path.join(pathimage, str(i), "shape.tif") with rasterio.open(dst, 'w', driver='GTiff', width=256, height=256, count=bands, dtype=data.dtype, nodata=0, transform=transform, crs='EPSG:4326') as dst: dst.write(data, indexes=bands) # warp para sistema de coordenadas 32629 com 10m por pixel e com tamanho (width e height) # correcto para entrar na rede input_raster = gdal.Open(os.path.join(pathimage, str(i), "shape.tif")) output_raster = os.path.join(pathimage, str(i), "shape32629.tif") _warp = gdal.Warp(srcDSOrSrcDSTab=input_raster, destNameOrDestDS=output_raster, format="GTiff", outputBounds=[ large_bbox[0], large_bbox[1], large_bbox[2], large_bbox[3] ], xRes=10, yRes=10, dstSRS='EPSG:32629') _warp = None print("Gerado imagem do incendio", format(i)) i += 1
def cropsentinel(year="2017"): pathdataset = "Dataset" + str(year) pathproducts = r"Sentinel_Products" if not os.path.exists(pathproducts): sys.exit( "A pasta de produtos não está presente no caminho especificado!") if len(next(os.walk(pathproducts))[2]) == 0: sys.exit("A pasta de produtos está vazia!") num_total_subfolders = [folder for folder in os.listdir(pathdataset)] for i in range(len(num_total_subfolders)): pathimages = os.path.join(pathdataset, str(i), "Sentinel_Images") try: if not os.path.exists(pathimages): os.makedirs(pathimages) if os.path.exists(pathimages): shutil.rmtree(pathimages) os.makedirs(pathimages) except OSError: print("Erro: Ao criar a pasta " + pathimages) # para ignorar incêndios que não têm nenhum produto Sentinel associado empty_filename = os.path.join(pathdataset, str(i), "Sem_Produtos.txt") my_file_index = Path(empty_filename) if my_file_index.is_file(): continue bbox = getlargebbox(i, year) filetxtpath = os.path.join(pathdataset, str(i), "Final_Product.txt") match = False # o ficheiro txt só tem um produto, o que é suposto, se tivesse mais que um produto este conjunto seguinte # de comandos iria seleccionar o ficheiro zip cujo nome fosse igual ao ultimo produto (linha) presente no txt!!! with open(filetxtpath, "r") as txt_file: for line in txt_file: line = line.rstrip('\n') for zip_file in os.listdir(pathproducts): if re.match(f"{line}.zip", zip_file): zipname = line + ".zip" match = True txt_file.close() if not match: sys.exit("O produto associado ao incêndio " + f"{i}" + " do ano " + year + " não está presente na pasta Produtos_Sentinel!") zip_f = os.path.join(pathproducts, zipname) zf = ZipFile(zip_f, 'r') zf.extractall(pathproducts) zf.close() extracted = os.path.join(pathproducts, line + ".SAFE") itr_folder = iter(os.walk(os.path.join(extracted, "GRANULE"))) root, dirs, files = next(itr_folder) auxpath = os.path.join(os.path.join(extracted, "GRANULE"), dirs[0], "IMG_DATA") resolutions = [10, 20, 60] for k in range(len(resolutions)): finalpath = os.path.join(auxpath, f"R{resolutions[k]}m") for file in os.listdir(finalpath): channel = file.rsplit("_", 2)[1] list_already_done = os.listdir(pathimages) verify = any(channel in image for image in list_already_done) if verify: # se já foi feito o crop com menor resolução para esse canal passa à frente continue else: input_image = os.path.join(finalpath, file) outpath = os.path.join(pathimages, file[:-8] + ".tif") sentinelclip(bbox, input_image, outpath) shutil.rmtree(extracted)
def drawrastershapes(year="2017"): pathfolder = "Dataset" + str(year) num_total_subfolders = [folder for folder in os.listdir(pathfolder)] # Definir tamanho do pixel e o valor no_data para o novo raster pixel_size = 10 NoData_value = 0 # iterar for i in range(len(num_total_subfolders)): # Path para os shapefiles individuais pathshapefile = os.path.join(pathfolder, str(i), "ShapeIndividual", "Shape" + str(year[-2:]) + ".shp") # Nome para os ficheiros raster pathraster = os.path.join(pathfolder, str(i)) raster_fn = os.path.join(pathraster, "shapebboxincendio.tif") raster_fn2 = os.path.join(pathraster, "shapebboxaumentada.tif") # Abrir dados do shp e obter a extensao do shapefile source_ds = ogr.Open(pathshapefile) source_layer = source_ds.GetLayer() xmin, xmax, ymin, ymax = source_layer.GetExtent() aux_var = getlargebbox(i, year) box = aux_var[0] xmin_large = box[0] xmax_large = box[2] ymax_large = box[3] ymin_large = box[1] # Obter a projeção do raster epsg = 32629 srs = osr.SpatialReference() srs.ImportFromEPSG(epsg) dest_wkt = srs.ExportToWkt() # Criar os dados de destino x_res = round((xmax - xmin) / pixel_size) y_res = round((ymax - ymin) / pixel_size) target_ds = gdal.GetDriverByName('GTiff').Create( raster_fn, x_res, y_res, 1, gdal.GDT_Byte) # Criar os dados de destino x_res_large = round((xmax_large - xmin_large) / pixel_size) y_res_large = round((ymax_large - ymin_large) / pixel_size) target_ds_large = gdal.GetDriverByName('GTiff').Create( raster_fn2, x_res_large, y_res_large, 1, gdal.GDT_Byte) # Atribuir projeção target_ds.SetProjection(dest_wkt) target_ds_large.SetProjection(dest_wkt) target_ds.SetGeoTransform((xmin, pixel_size, 0, ymax, 0, -pixel_size)) target_ds_large.SetGeoTransform( (xmin_large, pixel_size, 0, ymax_large, 0, -pixel_size)) band = target_ds.GetRasterBand(1) band.SetNoDataValue(NoData_value) band2 = target_ds_large.GetRasterBand(1) band2.SetNoDataValue(NoData_value) gt = [xmin, pixel_size, 0, ymax, 0, -pixel_size] target_ds.SetGeoTransform(gt) gt2 = [xmin_large, pixel_size, 0, ymax_large, 0, -pixel_size] target_ds_large.SetGeoTransform(gt2) # Rasterizar gdal.RasterizeLayer(target_ds, [1], source_layer, burn_values=[255], options=["-tr 10 10"]) gdal.RasterizeLayer(target_ds_large, [1], source_layer, burn_values=[255], options=["-tr 10 10"]) # Fechar ficheiro _target_ds = None _target_ds_large = None