Menú

viernes, 8 de marzo de 2019

miércoles, 19 de diciembre de 2018

domingo, 28 de octubre de 2018

Leer los archivos de CMORPH utilizando R


CMORPH (técnica de CPC MORPHing) este análisis de precipitación global con una resolución espacial y temporal muy alta. Esta técnica utiliza estimaciones de precipitación derivadas exclusivamente de observaciones de satélites de microondas de órbita baja, y cuyas características se transportan a través de información de propagación espacial que se obtiene completamente de los datos de IR de los satélites geoestacionarios. 

En la actualidad se incorporan las estimaciones de precipitación derivadas de los microondas pasivos a bordo del DMSP 13, 14 y 15 (SSM / I), NOAA-15, 16, 17 y 18 (AMSU-B) y AMSR-E y TMI a bordo del Aqua de la NASA. y la nave espacial TRMM, respectivamente. Estas estimaciones son generadas por los algoritmos de Ferraro (1997) para SSM / I, Ferraro et al. (2000) para AMSU-B y Kummerow et al. (2001) para TMI. Tenga en cuenta que esta técnica no es un algoritmo de estimación de precipitación, sino un medio por el cual se pueden combinar las estimaciones de los algoritmos de lluvia de microondas existentes. Por lo tanto, este método es extremadamente flexible, de modo que se pueden incorporar las estimaciones de precipitación de cualquier fuente de satélite de microondas.

Las estimaciones de precipitación están disponibles en una cuadrícula con un espaciado de 8 km (en el ecuador), la resolución de las estimaciones individuales derivadas de satélites menor que eso, y oscilan entre los 12 x 15 km más o menos, para obtener una resolución más fina,  se realizan interpolaciones de la estimaciones.

Los datos los puede descargar de:

los registros históricos desde enero de 1998 a julio de 2017, los puede descargar de:


Los datos los pueden visualizar en R y guardar en Geotiff, para luego porcesar en Qgis o cualquier GIS


Comparación de la lluvia diaria de las estaciones y CMORPH
Añadir leyenda


Grado de asociación entre la lluvia diaria y CMORPH para las estaciones de la red de INSIVUMEH, durante el periodo 2001 a 2015


############################################################################
#
#       Leer archivos de CMORPH con R
#       Walter Bardales (bardaleswa@gmail.com)
#
#

# Infomracion del archivo CTL
# TITLE  Precipitation estimates
# XDEF 4948 LINEAR   0.036378335 0.072756669
# YDEF 1649 LINEAR -59.963614    0.072771377
# ZDEF   01 LEVELS 1
# TDEF 999999 LINEAR  00z01jan2005 30mn
# VARS 1
# cmorph   1  99  hourly cmorph [ mm/hr ]

# Cargar librerias
library(raster)
library(tibble)
library(stats)
library(rgdal)

# Definir directorio de trabajo
setwd("D:/Documents/chirps")

# Leer archivo binario de cmorph
cmorph.file = file("CMORPH_V1.0_RAW_8km-30min_1998010105", "rb")

# Cerrar
on.exit(close(cmorph.file))

# Cantidad de bites XDEF * YDEF * 2
bites = (4948*1649*2)

# Coordenadas iniciales CMORPH, coordenada inicial, cantidad de pixeles y tamaño de pixel
longitud = seq(0.036378335, length.out = 4948, by=0.072756669)
latitud = seq(-59.963614, length.out = 1649, by=0.072771377)

# Leer datos binarios
temporal = readBin(cmorph.file, numeric(), n = bites, size = 4, endian = "little")
temporal = temporal[seq_len(bites/2)] * 0.1

# hacer data.frame
datacmorph = as_data_frame(
  setNames(
    cbind(expand.grid(longitud, latitud), temporal),
    c("lon", "lat", "lluvia")
  )
)

# Convertir en puntos
coordinates(datacmorph) = ~lon+lat

# Crear una grilla de puntos
gridded(datacmorph) = TRUE

# Crear un raster a partir de los puntos y poner los valores como NA si son menores a 0
rascmorph = raster(datacmorph)
rascmorph[rascmorph<0 0="" na="" p="">

<0 na="" p=""># Convertir longitude 0-360 a longitude -180-180
rascmorph = rotate(rascmorph)

# ASignarle la proyección al raster
crs(rascmorph) = "+proj=longlat +datum=WGS84"

# Guardar el raster
writeRaster(rascmorph, "cmorph.tif", format="GTiff", overwrite=TRUE)

Leer los archivos del Hidroestimador Nesdis usando R


La técnica Hidroestimador es empleada para estimar lluvia a través de satélites, esta técnica fue desarrollada por la Administración Nacional Oceánica y Atmosférica / Servicio Nacional de Satélites Ambientales, Datos e Información. (NOAA/NESDIS).  

NESDIS trabaja con las imágenes del canal infrarrojo del satélite GOES e información de variables meteorológicas pronosticadas por el modelo NAM.  
  • Los píxeles de lluvia y no lluvia, se separan de acuerdo a un valor construido con la media y la desviación estándar de la temperatura de brillo en un área centrada en el píxel de interés. 
  • Las nubes en un determinado píxel, producen precipitación si poseen topes más fríos que la media de los píxeles circundantes. 
  • La tasa de precipitación, se ajusta teniendo en cuenta la humedad del entorno, a partir de datos de humedad relativa y agua precipitable de los modelos de pronóstico numérico. 


Los datos para la región centroamericana están disponibles  en:
https://www.star.nesdis.noaa.gov/smcd/emb/ff/HEcentralAmerica.php

Esta página proporciona estimaciones de la tasa de lluvia en tiempo real:
  • Los promedios de la tasa de lluvia de 1 hora y las estimaciones acumuladas de 3 horas están disponibles cada hora a partir de las 00:00 h con actualizaciones cada 15 minutos después de la hora. 
  • Las estimaciones de 6 horas acumuladas se actualizan a las 00: 15Z, 06: 15Z, 12: 15Z y 18: 15Z y la acumulación de 24 horas cada 12: 15Z. 
  • Las estimaciones pueden ser demasiado altas para las nubes frías y demasiado bajas para las nubes cálidas. El uso de este producto es a discreción del usuario.

Esta información puede servir para generar información en regiones donde no se tiene el monitoreo o para mejorar lo métodos de interpolación empleados en la actualidad. 

Al leer los datos en R y guardarlos como raster en formato geotif se pueden abrir en qgis u otro software gis.


############################################################################
#
#       Leer archivos de hydroestimador Nesdis con R
#       Walter Bardales (bardaleswa@gmail.com)
#
#


# Configuración del archivo Nesdis para Centro América
#DSET K20053141609
#UNDEF -1.0
#TITLE Rain Rate Estimates (mm)
#XDEF 1464 LINEAR 245 0.0382513
#YDEF 667 LINEAR 6 0.0359477
#ZDEF 01 LEVELS 1
#TDEF 1 LINEAR 16:09Z10NOV2005 1hr
#VARS 1
#rr 0 99 Goes Data
#ENDVARS

# Cargar librerias
library(raster)
library(tibble)
library(stats)

# Directorio de trabajo
setwd("D:/Documents/Nesdis")

# Leer archivo binario y almacenarlo en objeto
archivo.nesdis = file("N20182631200", "rb")

# Salir
on.exit(close(archivo.nesdis))


# Cantidad de bits del archivo XDEF * YDEF * 2 bits
bites = (667*1464*2)


# Coordenadas de inicio, informacion extraidad de XDEF y YDEF
longitud = seq(-115, length.out = 1464, by=0.0382513)
latitud = seq(6, length.out = 667, by=0.0359477)


# Leer datos binarios
temporal = readBin(archivo.nesdis, numeric(), n = bites, size = 4, endian = "little")
temporal = temporal[seq_len(bites/2)] * 0.1

# hacer data.frame de las coordenadas y cantidad de lluvia
datanesdis = as_data_frame(
  setNames(
    cbind(expand.grid(longitud, latitud), temporal),
    c('lon', 'lat', 'lluvia_mm')
  )
)


# Convertir el dataframe en puntos
coordinates(datanesdis) = ~lon+lat

# Asignar el valor True para realizar una grilla con los puntos
gridded(datanesdis) = TRUE

# Convertir los puntos a raster, valores negativos como NA
rasnesdis = raster(datanesdis)
rasnesdis[rasnesdis < 0] = NA

# ASignarle la proyección al raster
crs(rasnesdis) = "+proj=longlat +datum=WGS84"

# Guardar el raster
writeRaster(rasnesdis, "nesdis.tif", format="GTiff", overwrite=TRUE)

domingo, 7 de octubre de 2018

Interpolar lluvia usando de covariable elevación con el método Thin Plate Spline

Thin Plate Splines (Tps)
La interpolación de Thin Plate Spline corresponde a las técnicas de interpolación n-dimensional a partir de datos dispersos. La función de interpolación correspondiente es una función continuamente diferenciable (función C1) que tiene la energía (norma L2) de su segundo derivado mínimo.

El residuo de interpolación con respecto a esta interpolación puede ser 0 ó, lo que es más interesante, se puede hacer una compensación de regularidad entre el error de interpolación y la energía de la curvatura de la función.
Wahba (1990) propone un método basado en la validación cruzada para determinar la compensación óptima.

  • Thin Plate Spline adapta los datos espaciados irregularmente a una superficie. 
  • El parámetro de suavizado se elige mediante validación cruzada generalizada. 
  • El modelo asumido es el aditivo Y = f (X) + e donde f (X) es una superficie dimensional. 
  • Este es un caso especial de la estimación espacial.
Thin Plate Spline es el resultado de minimizar la suma residual de cuadrados sujetos a una restricción de que la función tiene un cierto nivel de suavidad (o penalización de rugosidad). En donde la rugosidad se cuantifica por la integral de los derivados de orden m cuadrado al cuadrado.


Para una dimensión y m = 2, la penalización de rugosidad es el cuadrado integrado de la segunda derivada de la función. Para dos dimensiones, la penalización por rugosidad es la integral de

(Dxx (f))^2 + 2 (Dxy (f)) ^2 + (Dyy (f)) ^2

Además de controlar el orden de las derivadas, el valor de m también determina el polinomio base que se ajusta a los datos. El grado de este polinomio es (m-1).

El parámetro de suavizado controla la cantidad de suavización de los datos. En la forma habitual, esto se denota con lambda, el multiplicador de Lagrange del problema de minimización. Aunque esta es una escala incómoda, lambda = 0 no corresponde con restricciones de suavidad y los datos se interpolan. lambda = infinito corresponde a simplemente ajustar el modelo de base polinomial por mínimos cuadrados ordinarios.

Este estimador se implementa pasando la función de covarianza generalizada correcta basada en funciones de base radial a la función más general Krig.  Una ventaja de esta implementación es que una vez que se crea un objeto Tps / Krig, el estimador se puede encontrar rápidamente para otros datos y parámetros de suavizado siempre que las ubicaciones permanezcan sin cambios. Esto hace que la simulación dentro de R sea eficiente.  Tps no admite actualmente el argumento de los nudos donde se puede usar un conjunto reducido de funciones básicas. Esto es principalmente para simplificar y una buena alternativa al usar nudos sería usar una covarianza válida de la familia Matern y un parámetro de gran rango.

Código utilizado en R

##################################################################
#
#       Walter Arnoldo Bardales Espinoza (bardaleswa@gmail.com)
#       julio de 2018
#
##################################################################

# Cargar librerias
library(fields)
library(raster)
library(rgdal)
library(lattice)
library(stringr)


# Cargar modelo de elevación
dem = raster("D:/Documents/GIS DataBase/DEM_CA/geotif/dem_90_gtm.tif")

# Extraer las coordenadas del DEM
coords = xyFromCell(dem,1:ncell(dem))

# Extraer los factores de las coordenadas x e y
coord_x = as.numeric(levels(factor(coords[,"x"])))
coord_y = as.numeric(levels(factor(coords[,"y"])))

# Convertir el dem en matriz y transponerlo
z = t(as.matrix(dem))

# Corregir la matriz de elevacion debido a que esta rotada 180 grados
coord_z = matrix(, nrow=length(coord_x), ncol=length(coord_y))

for(i in 1:length(coord_y)){
  j = length(coord_y)+1-i
  coord_z[,j] = z[,i]
}

#crear lista de elevación a partir del dem
elevacion = list(x=coord_x,y=coord_y,z=coord_z)

# Evaluar la lista
str(elevacion)

# Cargar los datos de lluvia
datospp = read.csv("D:/Documents/Lluvia/Lluviaxy_1980_2016.csv",sep=",")
datos = datospp

# Convertir en puntos geograficos y asignarle las coordenadas GTM
coordinates(datos) = ~x + y
gtm = CRS("+proj=tmerc +lat_0=0 +lon_0=-90.5 +y_0=0 +x_0=500000 +k=0.9998  +datum=WGS84 +units=m  +no_defs +ellps=WGS84 +towgs84=0,0,0")

proj4string(datos) = gtm

# Extraer los valores de elevacion de las estaciones a partir del DEM
altura = extract(dem,datos)

# Crear lista con los datos x, y, z y variable
xydatos = data.frame(lon=datospp$x,lat=datospp$y)
zdatos = altura

# Antes de continuar verificar que no hallan datos faltantes en las series

# Nombrar columnas
mes = c(0,0,0,1:13)
meses = c("","","","enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre", "Anual")

for(k in 4:16){
  ydatos = datospp[,k]
  
  precip = list(x=xydatos,elev=zdatos,y=ydatos)
  
  # Graficar las estaciones y valores de lluvia
  quilt.plot(precip$x,precip$y)
  
  # Crear el modelo de lluvia elevacion
  fit = Tps(precip$x, precip$y, Z=precip$elev)
  
  # Resumen del modelo lluvia elevacion con TPS
  summary(fit)
  
  # Graficar los resultados
  set.panel(2,2)
  plot(fit)
  
  # Intrpolar superficie del modelo creado
  set.panel()

  # Crear la lista de coordenadas a interpolar
  grid.list = list(x=elevacion$x, y=elevacion$y)
  
  #Interpolacion del modelo usando de covariable la elevación
  fit.full = predictSurface(fit, grid.list, extrap=TRUE, ZGrid = elevacion)

  # Transponer la matriz de resultados
  pp_z1 = t(fit.full$z)
  
  # Crear el raster interpolado
  ras = raster(pp_z1, xmn=extent(dem)[1],xmx=extent(dem)[2],ymn=extent(dem)[3],ymx=extent(dem)[4])
  ras = flip(ras,direction="y")
  crs(ras) = gtm
  ras[ras<0 0="" p="">
  
  # Guardaer el raster
  destino5 = paste("D:/Documents/Consultorias_2018/balance_hidrico/Raster/lluvia/prueb/prec_",str_pad(mes[k],width =2, pad="0"),".tif", sep ="")
  writeRaster(ras,filename=destino5, overwrite=TRUE)
}

Resultados de la interpolación 















domingo, 5 de agosto de 2018