library(ncdf4)
library(fields)
library(maps)
library(raster)
library(sp)
library(sf)
library(animation)
library(terra)
Se imprime la Metadata del archivo
#Se especifica la direccion de la base de datos NetCDF
dirsemanal = "A:/CICIMAR/Bases de datos/Output file of weekly climatology simulated with the ROMS model (NetCDF standard).nc"
#se le asigna a una variable la lectura de esos datos
semanal = nc_open(dirsemanal)
#Se muestra en pantalla las variables que presenta la base de datos,
#y sus dimensiones
print(semanal) #consultando metadatos del fichero
File A:/CICIMAR/Bases de datos/Output file of weekly climatology simulated with the ROMS model (NetCDF standard).nc (NC_FORMAT_CLASSIC):
9 variables (excluding dimension variables):
double h[lon,lat]
standard_name: Bathymetry
long_name: Bathymetry
units: m
missing_value: NaN
FillValue: NaN
double ssh[lon,lat,time]
standard_name: SSH
long_name: Sea Surface Height
units: m
missing_value: NaN
FillValue: NaN
double temp[lon,lat,depth,time]
standard_name: temp
long_name: Potential temperature
units: degreeC
missing_value: NaN
FillValue: NaN
double salt[lon,lat,depth,time]
standard_name: salt
long_name: Salinity
units: PSU
missing_value: NaN
FillValue: NaN
double swd[lon,lat,depth,time]
standard_name: Density
long_name: Seawater density
units: Kg m^-3
missing_value: NaN
FillValue: NaN
double ucurr[lon,lat,depth,time]
standard_name: ucurr
long_name: Zonal component
units: m s^-1
missing_value: NaN
FillValue: NaN
double vcurr[lon,lat,depth,time]
standard_name: vcurr
long_name: Meridional component
units: m s^-1
missing_value: NaN
FillValue: NaN
double vort[lon,lat,depth,time]
standard_name: vort
long_name: Vorticity
units: s^-1
missing_value: NaN
FillValue: NaN
double cspd[lon,lat,depth,time]
standard_name: cspd
long_name: Current speed
units: m s^-1
missing_value: NaN
FillValue: NaN
4 dimensions:
lon Size:183
standard_name: logitude
long_name: logitude
units: degrees_east
axis: X
lat Size:159
standard_name: latitude
long_name: latitude
units: degrees_north
axis: Y
depth Size:61
standard_name: Depth
long_name: Vertical axis
units: m
axis: Z
time Size:48 *** is unlimited ***
standard_name: time
long_name: time
calendar: standard
axis: T
comment:
5 global attributes:
creation_date: 05-Aug-2022 01:24:56
Producer: DOCEAN/UFPE/Recife/PE/Brasil
dataType: 2D Grid
Comment: ArpHDv2 datasets (standard NetCDF files)
Author: H. L. Varona & M. Araujo
lat_variable = 'lat'
lon_variable = 'lon'
time_variable ='time'
latssem = ncvar_get(semanal,lat_variable)
lonssem = ncvar_get(semanal,lon_variable)
timessem = ncvar_get(semanal,time_variable)
batimetria=ncvar_get(semanal,"h")
nivelmarsem = ncvar_get(semanal,'ssh')
tempsem = ncvar_get(semanal,'temp')
salisem = ncvar_get(semanal,"salt")
densisem = ncvar_get(semanal,"swd")
zonalcomsem=ncvar_get(semanal,"ucurr")
meridionalcomsem=ncvar_get(semanal,"vcurr")
vorticidadsem=ncvar_get(semanal,"vort")
velocidadsem = ncvar_get(semanal,'cspd')
Se rota cada elemento semanal de salinidad correctamente y se le asigna a cada elemento de la lista vacía creada. Se le agragan las coordenadas a cada elemento de la lista
#Se le asigna a borrador para no modificar la variable de origen
borrador=salisem
# Lista vacía
# Creando una lista vacía con 48 elementos
lista_vacia <- vector("list", length = 48)
# Se rota cada elemento semanal de salinidad correctamente y se le asigna a
# cada elemento de la lista vacía creada
# Se le agragan las coordenadas a cada elemento de la lista
#
for(i in 1:48){
#Se rota cada elemento
temporal <- apply(t(borrador[,,1,i]),2,rev)
lista_vacia[[i]]=temporal
# Se convierte a raster cada elemento de la lista
lista_vacia[[i]]=raster(lista_vacia[[i]])
extent(lista_vacia[[i]]) <- extent(c(min(lonssem),max(lonssem),min(latssem),max(latssem)))
}
meses=c("Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre")
(meses=rep(meses, each=4))
[1] "Enero" "Enero" "Enero" "Enero" "Febrero" "Febrero"
[7] "Febrero" "Febrero" "Marzo" "Marzo" "Marzo" "Marzo"
[13] "Abril" "Abril" "Abril" "Abril" "Mayo" "Mayo"
[19] "Mayo" "Mayo" "Junio" "Junio" "Junio" "Junio"
[25] "Julio" "Julio" "Julio" "Julio" "Agosto" "Agosto"
[31] "Agosto" "Agosto" "Septiembre" "Septiembre" "Septiembre" "Septiembre"
[37] "Octubre" "Octubre" "Octubre" "Octubre" "Noviembre" "Noviembre"
[43] "Noviembre" "Noviembre" "Diciembre" "Diciembre" "Diciembre" "Diciembre"
saveGIF({
for (i in 1:48) {
#plotea
ColorRamp = colorRampPalette(c("yellow", "#ead379", "#df7a3a","blue"))#, "red4"))
image.plot(lonssem,latssem,salisem[,,1,i],
main = paste("Salinidad (PSU) del mes " ,meses[i], "semana ",i,"/48"), xlab = 'Longitude',ylab = 'Latitude',col = ColorRamp(20))
#añade un mapa
map(add=TRUE,fill = TRUE,col = "green",resolution = 0)
}
},movie.name = "Salinidad(PSU).gif", interval = 0.2, nmax = 2)
animation option 'nmax' changed: 50 --> 2
[1] TRUE
En el entorno de trabajo de R se obtendrá el siguiente gift
Se crea una tabla de reclasificación que usará posteriormente para asginar a los valore de salinidad (PSU) que esten en el rango de 0 <= x <35 como 1, y a los valores que estén en 35 <=x <40 como 0.
# Tabla de reclasificación (rangos)
m <- c(1, 35, 1, 35, 40,0)
tabla_reclas <- matrix(m, ncol=3, byrow=TRUE)
print(tabla_reclas)
[,1] [,2] [,3]
[1,] 1 35 1
[2,] 35 40 0
Se crea una secuencia de imagenes (48), una para cada semana correspondiente a la binarizacion de acuerdo al nivel de salinidad
saveGIF({
for (i in 1:48) {
#reclasificación
reclas <- reclassify(lista_vacia[[i]], tabla_reclas)
#plotea
plot(reclas, ylim=c(min(latssem),max(latssem)), main=paste("Pluma binarizada (<35 psu) \n en el mes" ,meses[i]," semana ",i,"/48"))
#añade un mapa
map(add=TRUE,fill = TRUE,col = "green",resolution = 0)
}
},movie.name = "PlumaGIF1.gif", interval = 0.2, nmax = 2)
animation option 'nmax' changed: 50 --> 2
[1] TRUE
En el entorno de trabajo de R se obtendrá el siguiente gift
#Área de influencia de la pluma delimitada
#Binarizacion de cada imagen y superposicion lógica de cada imagen en una sola
#######################
inicial <- reclassify(lista_vacia[[1]], tabla_reclas)
superpo=inicial
for (i in 2:48) {
#reclasificación
temp <- reclassify(lista_vacia[[i]], tabla_reclas)
#plotea
superpo <- overlay(superpo,temp, fun = function(x,y)
{ifelse( x == 1 | y == 1, 1, 0)})
}
plot(superpo,axes=T)
title(main ="Superposición de valores binarizados",font.main=2, adj=0.5, cex.main=1)
map(add=TRUE,fill = TRUE,col = "green",resolution = 0)
Figura 3: Superposición de todos las imagenes binarizadas de la pluma ## Vectorización
#Se convierte a formato raster del paquete terra con la funcion rast,
#El producto de la superposicion para que pueda ser vectorizado con una funcion del mismo paquete
torast=rast(superpo)
#Se vectoriza
supervect = as.polygons(torast)|>
st_as_sf()
#Se proyecta la imagen vectorizada
# plot(supervect,axes=T,add=T)
# map(add=TRUE,fill = TRUE,col = "green",resolution = 0)
plot(supervect[2,],axes=T,main="")
title(main ="Vectorización de la Imagen 3",font.main=2, adj=0.5, cex.main=1)
Figura 4: Vector de resultante de la vectorización de la imagen de la figura 3.
Echevarría-Rubio, J. M. (2022). Detección y monitoreo de sargazo en el Mar Caribe. Tesis de Maestía en Ciencias en Manejo de Recursos Marinos, CICIMAR-IPN.
Hu, C., Montgomery, E., Schmitt, R., & Mullerkarger, F. (2004). The dispersal of the Amazon and Orinoco River water in the tropical Atlantic and Caribbean Sea: Observation from space and S-PALACE floats. Deep Sea Research Part II: Topical Studies in Oceanography, 51(10–11), 1151–1171. https://doi.org/10.1016/S0967-0645(04)00105-5
Park, E., & Latrubesse, E. M. (2014). Modeling suspended sediment distribution patterns of the Amazon River using MODIS data. Remote Sensing of Environment, 147, 232-242. https://doi.org/10.1016/j.rse.2014.03.013
Varona, H. L., & Araujo, M. (2022). Hydro-thermodynamic dataset of the Amazon River Plume and North Brazil Current retroflection. Data in Brief, 40. https://doi.org/10.17882/82958
Varona, H. L., Veleda, D., Silva, M., Cintra, M., & Araujo, M. (2019). Amazon River plume influence on Western Tropical Atlantic dynamic variability. Dynamics of Atmospheres and Oceans, 85, 1-15. https://doi.org/10.1016/j.dynatmoce.2018.10.002