#READ GRIDDED BINARY FILES read_sint <- function(handle) { return(readBin(handle, "int", 1, size=4, signed = TRUE, endian = "big")); } read_uint <- function(handle) { return(readBin(handle, "int", 1, size=4, signed = FALSE, endian = "big")); } read_real <- function(handle) { return(readBin(handle, "numeric", 1, size=4, endian = "big")); } read_header <- function(handle) { len <- read_uint(handle); if( len < 8*4 ) { print("invalid file format"); return(NA); } Mnow <- read_sint(handle); unk1 <- read_sint(handle); unk2 <- read_sint(handle); MONM <- read_sint(handle); unk3 <- read_sint(handle); IYRBEG <- read_sint(handle); BAD <- read_sint(handle); unk4 <- read_sint(handle); title <- rawToChar(readBin(handle, "raw", len-8*4)); if( read_uint(handle) != len ) { print("invalid file format"); return(NA); } return(pairlist(Mnow=Mnow, unk1=unk1, unk2=unk2, MONM=MONM, unk3=unk3, IYRBEG=IYRBEG, BAD=BAD, unk4=unk4, title=title)); } read_record <- function(handle, Mnow) { len <- read_uint(handle); if( length(len) == 0 ) { # no more data return(NA); } if( len != (8+Mnow)*4 ) { print("invalid file format"); return(NA); } Next <- read_sint(handle); LATS <- read_sint(handle); LATN <- read_sint(handle); LONW <- read_sint(handle); LONE <- read_sint(handle); NR1 <- read_sint(handle); NR2 <- read_sint(handle); DL <- read_sint(handle); temp_data <- readBin(handle, "numeric", Mnow, size=4, endian = "big"); if( read_uint(handle) != len ) { print("invalid file format"); return(NA); } return(pairlist(temp_data=temp_data, Next=Next, LATS=LATS, LATN=LATN, LONW=LONW, LONE=LONE, NR1=NR1, NR2=NR2, DL=DL)); } read_GISS_data <- function(handle) { header_data <- read_header(handle); Mnow = header_data$Mnow; records <- vector("pairlist", 1); num <- 1; while(TRUE) { record <- read_record(handle, Mnow); if( length(record) == 1 ) { return(pairlist(header=header_data, records=records)); } else { records[[num]] = record; num <- num+1; Mnow = record$Next; } } } ##MAKE GRID INFO make.grid.info=function (Data){ f=function(X) unlist(X[2:9]) grid.info=sapply(Data[[2]],f) grid.info=t(grid.info) grid.info=data.frame(grid.info) #the params LATS, LATN, LONW,LONE define the four parameters of the box #decimal values appear to be used grid.info[,2:5]=grid.info[,2:5]/10 #order1=order(-grid.info$LATS,grid.info$LONW) #grid.info[order1,][1:100,] make.grid.info=grid.info make.grid.info } hansenbox=function(lat,long) (1:8000)[(grid.info$LATS<=lat)&(grid.info$LATN>lat)&(grid.info$LONW<=long)&(grid.info$LONE>long)]