-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcbers4_wfi.py
129 lines (101 loc) · 3.58 KB
/
cbers4_wfi.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
from cbers4asat import Cbers4aAPI
from rasterio import open as rio_open
from cbers4asat.tools import rgbn_composite
from datetime import date, timedelta
from osgeo_utils import gdal2tiles
from osgeo.gdal import BuildVRT
from os import makedirs, cpu_count
from shutil import rmtree
from os.path import exists
from glob import glob
# Preencher
BASE_OUTPUT_DIR = "monitoramento"
BASE_OUTPUT_TEMP = f"/tmp/monitoramento-cb4-wfi-{date.today()}"
OUTPUT_XYZ_TILES = "xyz"
api = Cbers4aAPI("[email protected]")
# ==================
# Área de interesse. Pode ser: bouding box, path row ou polygon.
path_rows = [(176, 111)]
hoje = date.today()
semana_passada = hoje - timedelta(weeks=1)
if not exists(BASE_OUTPUT_DIR):
makedirs(BASE_OUTPUT_DIR)
if not exists(BASE_OUTPUT_TEMP):
makedirs(BASE_OUTPUT_TEMP)
for path_row in path_rows:
produtos = api.query(
location=path_row,
initial_date=semana_passada,
end_date=hoje,
cloud=100,
limit=100,
collections=["CBERS4_AWFI_L4_DN", "CBERS4_AWFI_L2_DN"],
)
if len(produtos.get("features")):
gdf = api.to_geodataframe(produtos, crs="EPSG:4326")
cena = gdf[gdf.datetime == gdf.datetime.min()].head(1)
data_imagem_mais_recente = cena.datetime.values[0].split("T")[0]
id_imagem_mais_recente = cena.index.values[0]
output_scenes_download = f"{BASE_OUTPUT_DIR}/cenas/{data_imagem_mais_recente}-{id_imagem_mais_recente}"
if not exists(output_scenes_download):
makedirs(output_scenes_download)
else:
continue # Pular iteração, pois já existe
api.download(
products=cena,
bands=["red", "green", "blue"],
outdir=output_scenes_download,
with_folder=False,
)
path, row = path_row
composition_filename = (
f"{id_imagem_mais_recente}_{data_imagem_mais_recente}_{path}_{row}.tif"
)
rgb_composite_outdir = f"{BASE_OUTPUT_TEMP}/coloridas/"
if not exists(rgb_composite_outdir):
makedirs(rgb_composite_outdir)
rgbn_composite(
red=glob(f"{output_scenes_download}/*_{path}_{row}_*_BAND15.tif")[0],
green=glob(f"{output_scenes_download}/*_{path}_{row}_*_BAND14.tif")[0],
blue=glob(f"{output_scenes_download}/*_{path}_{row}_*_BAND13.tif")[0],
outdir=rgb_composite_outdir,
filename=composition_filename,
)
if len(glob(f"{BASE_OUTPUT_TEMP}/coloridas/*.tif")):
for file in glob(f"{BASE_OUTPUT_TEMP}/coloridas/*.tif"):
raster = rio_open(file)
meta = raster.meta.copy()
meta.update(dtype="int8", nodata=0)
matrix = raster.read()
matrix = ((matrix - matrix.min()) / (matrix.max() + matrix.min())) * 255
with rio_open(file, "w", **meta) as r:
r.write(matrix)
del meta
del matrix
raster.close()
mosaico = BuildVRT(
destName=f"{BASE_OUTPUT_TEMP}/recente.vrt",
srcDSOrSrcDSTab=glob(f"{BASE_OUTPUT_TEMP}/coloridas/*.tif"),
)
mosaico = None # Por algum motivo o arquivo só é criado se isso aqui existir, não me pergunte pq
gdal2tiles.main(
[
"",
"-p",
"mercator",
"-z",
"7-15",
"-w",
"none",
"-r",
"near",
"--processes",
str(cpu_count()),
"--xyz",
"-q",
f"{BASE_OUTPUT_TEMP}/recente.vrt",
OUTPUT_XYZ_TILES,
]
)
if exists(BASE_OUTPUT_TEMP):
rmtree(BASE_OUTPUT_TEMP)