@@ -20,38 +20,38 @@ paquetes <- function() {
20
20
21
21
archivo_excel <- function () {
22
22
r <- " datos/2024 Todos_los_parametros_Victor1.xlsx"
23
-
23
+
24
24
return (r )
25
25
}
26
26
27
27
# función que genera script Python para la descarga de la imagen de la fecha dada
28
28
script_descarga_py <- function (fecha_de_adquisicion = fecha ) {
29
-
29
+
30
30
# rango de fechas para la búsqueda de la imagen
31
31
fecha_inicio <- ymd(fecha_de_adquisicion )
32
32
fecha_final <- ymd(fecha_de_adquisicion ) + 1
33
33
34
34
# leo las líneas del template
35
35
r_txt <- readLines(" scripts/plantilla.py" )
36
-
36
+
37
37
# remplazo las variables con las fechas
38
38
r_txt <- gsub(
39
39
pattern = " fecha_i" ,
40
40
replacement = fecha_inicio ,
41
41
x = r_txt
42
42
)
43
-
43
+
44
44
r_txt <- gsub(
45
45
pattern = " fecha_f" ,
46
46
replacement = fecha_final ,
47
47
x = r_txt
48
48
)
49
-
49
+
50
50
# write to new file
51
51
writeLines(r_txt , con = " scripts/d.py" )
52
-
52
+
53
53
mensaje(" Script Python creado" )
54
-
54
+
55
55
}
56
56
57
57
# ejecuto script Python para la descarga de la imagen
@@ -63,37 +63,37 @@ descarga <- function() {
63
63
reflectancia <- function () {
64
64
# condición de ERROR
65
65
# si NO existe el SAFE, NO extrae la reflectancia
66
- if (file.exists(glue(" producto/producto.zip" )) == FALSE )
66
+ if (file.exists(glue(" producto/producto.zip" )) == FALSE )
67
67
stop(mensaje(" SAFE NO descargado" ))
68
-
68
+
69
69
mensaje(" Leo producto S2-MSI" )
70
-
70
+
71
71
# cambio de nombre la variable
72
72
fecha_date <- fecha
73
-
73
+
74
74
# archivo .zip descargado
75
75
producto <- list.files(" producto/" , pattern = " zip" , full.names = TRUE )
76
-
76
+
77
77
# extraigo .zip
78
78
unzip(zipfile = producto , exdir = " producto/" )
79
-
79
+
80
80
mensaje(" Producto extraído" )
81
-
81
+
82
82
# nombre del producto
83
83
lis <- list.files(path = " producto/" , pattern = " SAFE" , full.names = TRUE )
84
-
84
+
85
85
# carpeta con las carpetas de distintas resoluciones
86
86
carpeta1 <- glue(" {lis}/GRANULE" )
87
87
carpeta2 <- list.files(carpeta1 )
88
88
carpeta3 <- glue(" {carpeta1}/{carpeta2}/IMG_DATA" )
89
-
89
+
90
90
r10m <- list.files(glue(" {carpeta3}/R10m" ), full.names = TRUE )
91
91
r20m <- list.files(glue(" {carpeta3}/R20m" ), full.names = TRUE )
92
-
92
+
93
93
# nombres de las bandas en el orden correcto
94
94
bandas_nombres <- c(
95
95
" B01" , " B02" , " B03" , " B04" , " B05" , " B06" , " B07" , " B08" , " B8A" , " B11" , " B12" )
96
-
96
+
97
97
# caminos para cada archivo de la banda requerida
98
98
b01 <- r20m [2 ]
99
99
b02 <- r10m [2 ]
@@ -106,155 +106,155 @@ reflectancia <- function() {
106
106
b8a <- r20m [11 ]
107
107
b11 <- r20m [9 ]
108
108
b12 <- r20m [10 ]
109
-
109
+
110
110
# vector de los caminos de los archivos en el orden correcto
111
111
vector_bandas <- c(b01 , b02 , b03 , b04 , b05 , b06 , b07 , b08 , b8a , b11 , b12 )
112
-
112
+
113
113
# leo los archivos
114
114
lista_bandas <- map(vector_bandas , rast )
115
115
names(lista_bandas ) <- bandas_nombres
116
-
116
+
117
117
mensaje(" Recorto y reproyecto el producto" )
118
-
118
+
119
119
# vector para recortar los raster alrededor del puente
120
120
recorte_puente <- vect(" vector/recorte_puente.gpkg" )
121
-
121
+
122
122
# recorte de cada elemento de la lista con el vector puente
123
123
lista_recortes <- map(
124
- .x = lista_bandas ,
124
+ .x = lista_bandas ,
125
125
~ terra :: crop(x = .x , y = recorte_puente ))
126
-
126
+
127
127
# los raster de 20m los reproyecto a 10m
128
128
lista_recortes $ B01 <- project(lista_recortes $ B01 , lista_recortes $ B02 )
129
129
lista_recortes $ B05 <- project(lista_recortes $ B05 , lista_recortes $ B02 )
130
130
lista_recortes $ B06 <- project(lista_recortes $ B06 , lista_recortes $ B02 )
131
131
lista_recortes $ B07 <- project(lista_recortes $ B07 , lista_recortes $ B02 )
132
132
lista_recortes $ B8A <- project(lista_recortes $ B8A , lista_recortes $ B02 )
133
- lista_recortes $ B11 <- project(lista_recortes $ B11 , lista_recortes $ B02 )
133
+ lista_recortes $ B11 <- project(lista_recortes $ B11 , lista_recortes $ B02 )
134
134
lista_recortes $ B12 <- project(lista_recortes $ B12 , lista_recortes $ B02 )
135
-
135
+
136
136
# creamos un stack con todas las bandas recortadas y la misma resolucion espacial (10m)
137
137
stack_bandas <- rast(lista_recortes )
138
-
138
+
139
139
# guardo stack de bandas recortado
140
140
writeRaster(stack_bandas , glue(" raster/{fecha_date}.tif" ), overwrite = TRUE )
141
-
141
+
142
142
mensaje(" Recorte almacenado" )
143
-
143
+
144
144
# leemos el excel que contiene las coordenadas geograficas de los puntos de muestreo
145
145
coord_sitios <- readxl :: read_xlsx(
146
146
path = " datos/2023 Todos_los_parametros_Victor.xlsx" ,
147
147
sheet = 1 ,
148
- .name_repair = " unique_quiet" ) | >
149
- select(fechas = 1 ,latitud = 4 ,longitud = 5 ) | >
150
- fill(fechas ) | >
151
- dplyr :: filter(fechas == fecha_date ) | >
152
- select(- fechas ) | >
148
+ .name_repair = " unique_quiet" ) | >
149
+ select(fechas = 1 ,latitud = 4 ,longitud = 5 ) | >
150
+ fill(fechas ) | >
151
+ dplyr :: filter(fechas == fecha_date ) | >
152
+ select(- fechas ) | >
153
153
mutate(punto = row_number(), .before = 1 )
154
-
154
+
155
155
# convertimos la tabla de coordenadas a sf
156
156
coord_vect <- vect(
157
- coord_sitios ,
158
- geom = c(" longitud" , " latitud" ),
159
- crs = " EPSG:4326" ,
160
- keepgeom = FALSE ) | >
157
+ coord_sitios ,
158
+ geom = c(" longitud" , " latitud" ),
159
+ crs = " EPSG:4326" ,
160
+ keepgeom = FALSE ) | >
161
161
project(" EPSG:32721" )
162
-
162
+
163
163
mensaje(" Vector de sitios de muestreo" )
164
-
164
+
165
165
# verificar probabilidad de NUBES
166
-
166
+
167
167
mensaje(" Verifico presencia de nubes" )
168
-
168
+
169
169
carpeta4 <- glue(" {carpeta1}/{carpeta2}/QI_DATA" )
170
-
170
+
171
171
# leo el raster
172
172
raster_prob <- terra :: rast(glue(" {carpeta4}/MSK_CLDPRB_20m.jp2" ))
173
-
173
+
174
174
# extraemos los valores de pixel para cada punto
175
- nubes <- terra :: extract(raster_prob , coord_vect ) | >
176
- as_tibble() | >
177
- rename(punto = ID , probabilidad = MSK_CLDPRB_20m ) | >
175
+ nubes <- terra :: extract(raster_prob , coord_vect ) | >
176
+ as_tibble() | >
177
+ rename(punto = ID , probabilidad = MSK_CLDPRB_20m ) | >
178
178
dplyr :: filter(probabilidad == 0 )
179
-
179
+
180
180
# se conservan los sitios de muestreo con probabilidad de nubes CERO
181
181
coord_sf_sin_nubes <- inner_join(
182
182
st_as_sf(coord_vect ),
183
183
nubes ,
184
184
by = join_by(punto ))
185
-
185
+
186
186
if (nrow(coord_sitios ) != nrow(coord_sf_sin_nubes )) {
187
-
187
+
188
188
# sitios con nubes
189
189
puntos_nubes <- anti_join(
190
190
st_as_sf(coord_vect ),
191
191
nubes ,
192
- by = join_by(punto )) | >
193
- pull(punto ) | >
194
- str_flatten_comma(string = _, last = " y " )
195
-
192
+ by = join_by(punto )) | >
193
+ pull(punto ) | >
194
+ stringr :: str_flatten_comma(string = _, last = " y " )
195
+
196
196
mensaje(glue(" Los sitios {} presentan nubes y se descartan" ))
197
197
}
198
-
198
+
199
199
# extraemos los valores de pixel para cada punto
200
200
# acomodo de los datos de reflectancia y se agregan las coord geof
201
-
201
+
202
202
# 1X1
203
- reflect_1x1 <- terra :: extract(stack_bandas , coord_sf_sin_nubes ) | >
204
- as_tibble() | >
205
- rename(punto = ID ) | >
206
- pivot_longer(cols = - punto , names_to = " banda" , values_to = " reflect" ) | >
207
- mutate(reflect = reflect / 10000 ) | >
208
- mutate(fecha = ymd(fecha ), .before = 1 ) | >
209
- inner_join(coord_sitios , by = join_by(punto )) | >
203
+ reflect_1x1 <- terra :: extract(stack_bandas , coord_sf_sin_nubes ) | >
204
+ as_tibble() | >
205
+ rename(punto = ID ) | >
206
+ pivot_longer(cols = - punto , names_to = " banda" , values_to = " reflect" ) | >
207
+ mutate(reflect = reflect / 10000 ) | >
208
+ mutate(fecha = ymd(fecha ), .before = 1 ) | >
209
+ inner_join(coord_sitios , by = join_by(punto )) | >
210
210
mutate(pixel = " 1x1" , .before = banda )
211
-
211
+
212
212
# 3X3
213
213
stack_bandas_3x3 <- terra :: focal(
214
214
stack_bandas , w = 3 , fun = mean , na.rm = TRUE )
215
-
216
- reflect_3x3 <- terra :: extract(stack_bandas_3x3 , coord_sf_sin_nubes ) | >
217
- as_tibble() | >
218
- rename(punto = ID ) | >
219
- pivot_longer(cols = - punto , names_to = " banda" , values_to = " reflect" ) | >
220
- mutate(reflect = reflect / 10000 ) | >
221
- mutate(fecha = ymd(fecha ), .before = 1 ) | >
222
- inner_join(coord_sitios , by = join_by(punto )) | >
215
+
216
+ reflect_3x3 <- terra :: extract(stack_bandas_3x3 , coord_sf_sin_nubes ) | >
217
+ as_tibble() | >
218
+ rename(punto = ID ) | >
219
+ pivot_longer(cols = - punto , names_to = " banda" , values_to = " reflect" ) | >
220
+ mutate(reflect = reflect / 10000 ) | >
221
+ mutate(fecha = ymd(fecha ), .before = 1 ) | >
222
+ inner_join(coord_sitios , by = join_by(punto )) | >
223
223
mutate(pixel = " 3x3" , .before = banda )
224
-
224
+
225
225
# combino las reflectancias 1x1 y 3x3
226
226
reflect <- bind_rows(reflect_1x1 , reflect_3x3 )
227
-
227
+
228
228
# guardo la tabla como .csv
229
229
if (file.exists(" datos/base_de_datos.csv" )) {
230
230
base_de_datos <- read_csv(" datos/base_de_datos.csv" , show_col_types = FALSE )
231
-
232
- bind_rows(base_de_datos , reflect ) | >
233
- arrange(fecha , punto ) | >
231
+
232
+ bind_rows(base_de_datos , reflect ) | >
233
+ arrange(fecha , punto ) | >
234
234
write_csv(" datos/base_de_datos.csv" )
235
-
235
+
236
236
mensaje(" Base de datos actualizada" )
237
-
237
+
238
238
} else {
239
239
write_csv(reflect , " datos/base_de_datos.csv" )
240
-
240
+
241
241
mensaje(" Datos almacenados" )
242
242
}
243
-
243
+
244
244
}
245
245
246
246
# elimino todos los archivos descargados
247
247
elimino <- function () {
248
-
248
+
249
249
# abro una ventana de confirmación
250
250
if (askYesNo(" ¿Eliminar archivos descargados?" )) {
251
-
251
+
252
252
unlink(" producto/*" , recursive = TRUE )
253
253
mensaje(" Archivos eliminados" )
254
-
254
+
255
255
} else {
256
-
256
+
257
257
mensaje(" Archivos NO eliminados" )
258
-
258
+
259
259
}
260
260
}
0 commit comments