#' Reads the table of pies mayores
#'
#'
#' @name readPiesMayores
#'
#' @param prov Character vector with codes of provinces (e.g. \code{c("01","03")}) or \code{"all"} for all provinces.
#' @param DBFdir String with the path where provinces are stored
#' @param plotIDs String vector with a selection of plots
#' @param rem.nodensity Flag to remove records without density
#' @param rem.nospecies Flag to remove records without species identity
#' @param rem.noheight Flag to remove records without tree height
#' @param height.cm Flag to return height in 'cm' instead of 'meters'
#' @param subsetVars Flag to filter data columns
#'
#' @return a data frame
#'
#' @examples
#'
#' \dontrun{
#' accessfilesIFN3 = list.files("//SERVERPROCESS/Miquel/Datasets/IFN/IFN3/MSAccess/",
#' pattern = "*[.]accdb", full.names = T)
#'
#' treeData = readPiesMayoresIFN3(accessfilesIFN3[prov])
#'
#' }
readPiesMayoresIFN2<-function(prov, DBFdir = "DBF", plotIDs = NULL,
rem.nodensity=FALSE, rem.nospecies=FALSE, rem.noheight=FALSE,
height.cm = FALSE, subsetVars=TRUE){
if(prov=="all") prov = .getSpainProv()
provNum = as.numeric(prov)
treeDataIFN2<-read.dbf(paste(DBFdir,"/",prov[1],"/PIESMA",prov[1],".dbf",sep=""))
cat(paste(prov[1],".",sep=""))
treeDataIFN2$PROVINCIA = provNum[1]
if(length(prov)>1){
for(i in 2:length(prov)){
cat(paste(prov[i],".",sep=""))
td<-read.dbf(paste(DBFdir,"/",prov[i],"/PIESMA",prov[i],".dbf",sep=""))
td$PROVINCIA = provNum[i]
treeDataIFN2 = merge(treeDataIFN2, td, all=TRUE, sort=FALSE)
}
}
treeDataIFN2$ID<-as.character(treeDataIFN2$PROVINCIA*10000+as.numeric(as.character(treeDataIFN2$ESTADILLO)))
#Selection
sel = rep(TRUE, nrow(treeDataIFN2))
if(!is.null(plotIDs)) sel = sel & (treeDataIFN2$ID %in% as.character(plotIDs))
treeDataIFN2 <-treeDataIFN2[sel,]
treeDataIFN2$ESPECIE<-as.character(treeDataIFN2$ESPECIE)
treeDataIFN2$DISTANCI = sub(",",".",as.character(treeDataIFN2$DISTANCI))
treeDataIFN2$DISTANCI[treeDataIFN2$DISTANCI=="NA"]<-NA
treeDataIFN2$DISTANCI <- as.numeric(treeDataIFN2$DISTANCI)
treeDataIFN2$ALTURA = sub(",",".",as.character(treeDataIFN2$ALTURA))
treeDataIFN2$ALTURA[treeDataIFN2$ALTURA=="NA"]<-NA
treeDataIFN2$ALTURA <- as.numeric(treeDataIFN2$ALTURA)
treeDataIFN2$DIAMETRO1 = as.character(treeDataIFN2$DIAMETRO1)
treeDataIFN2$DIAMETRO1[treeDataIFN2$DIAMETRO1=="NA"]<-NA
treeDataIFN2$DIAMETRO1 <- as.numeric(treeDataIFN2$DIAMETRO1)
treeDataIFN2$DIAMETRO2 = as.character(treeDataIFN2$DIAMETRO2)
treeDataIFN2$DIAMETRO2[treeDataIFN2$DIAMETRO2=="NA"]<-NA
treeDataIFN2$DIAMETRO2 <- as.numeric(treeDataIFN2$DIAMETRO2)
treeDataIFN2$DM<-(treeDataIFN2$DIAMETRO1+treeDataIFN2$DIAMETRO2)/(2*10)
treeDataIFN2$N<-.densityFactor(treeDataIFN2$DM)
# SPECIFY SELECTION CRITERIA #
# remove tree when we lack Species #
if(rem.nospecies) treeDataIFN2<-treeDataIFN2[!is.na(treeDataIFN2$ESPECIE),]
# remove tree when we lack N #
if(rem.nodensity) treeDataIFN2<-treeDataIFN2[!is.na(treeDataIFN2$N),]
#Translate meters to cms
if(height.cm) treeDataIFN2$ALTURA = treeDataIFN2$ALTURA*100 #meters to cms
if(rem.noheight) treeDataIFN2<-treeDataIFN2[!is.na(treeDataIFN2$ALTURA),]
if(subsetVars){
n = names(treeDataIFN2)
treeDataIFN2 <- treeDataIFN2[,c(which(n=="PROVINCIA"),which(n=="ESTADILLO"),which(n=="ID"),which(n=="ESPECIE"),which(n=="N"), which(n=="DM"),
which(n=="ALTURA"), which(n=="NUMORDEN"))]
names(treeDataIFN2)<-c("Provincia", "Estadillo","ID","Species", "N", "DBH","H", "OIF2")
}
return(treeDataIFN2)
}
#' @rdname readPiesMayores
#' @param accessFiles A character vector of access files to be read.
#' @param plotTypeIFN3 Subset of plot types to include:
#' \itemize{
#' \item{N - Se levantan por primera vez en el IFN-3 y son utilizadas para el calculo de existencias actuales.}
#' \item{A - Parcelas levantadas en el IFN-2 que volveran a ser apeadas en el IFN-3. Existen cinco casos:
#' \itemize{
#' \item{
#' A1 . Parcelas en las que se localice el rejon y esta bien implantado. Se utilizan para la comparacion de inventarios y para el calculo de existencias actuales.
#' }
#' \item{
#' A3 . Parcela apeada en IFN2, pinchazo IFN2 y coordenada UTM situadas en diferentes teselas. Se cumplimentan dos estadillos:
#' \itemize{
#' \item{
#' A3C . Parcela para la Comparacion de Inventarios. Se levantan en el punto donde se encuentra el rejon del IFN-2.
#' }
#' \item{
#' A3E. Parcelas para el calculo de Existencias Actuales. Se levantan en el emplazamiento del IFN-3 ( Coordenada UTM)
#' }
#' }
#' }
#' \item{
#' A4 . Parcelas en las que no se localizo el rejon. Se utilizan para el calculo de existencias actuales.
#' }
#' \item{
#' A4C . Parcelas en las que no se localice el rej?n por cambio totales en la cubierta forestal de la tesela que contiene la parcela (p?rdida total de la masa
#' muestreada en el IFN2 o incorporaci?n de una nueva masa forestal inexistente en el IFN2). Se utilizar?n para la comparaci?n de inventarios y para el c?lculo de existencias actuales.
#' }
#' \item{
#' A6C . Parcelas en las que no se localice el rej?n por cambios totales en la
#' cubierta forestal de la tesela que contiene la parcela (p?rdida total de la masa
#' muestreada en el IFN2 e incorporaci?n de una nueva masa forestal). Se utilizar?n para la comparaci?n de inventarios y para el c?lculo de existencias actuales.
#' }
#' }
#' }
#' }
#' @param include.IFN2 Flag to include diameter and height measured in IFN2
#' @param rem.codes32 set of tree codes in IFN2 corresponding to records to be removed:
#' \itemize{
#' \item{'0' or '000' - Tree not tallied in IFN2 because of its small size.}
#' \item{'999' - Tree that should have been tallied in IFN2 but was not.}
#' }
#' @param rem.codes33 set of tree codes in IFN3 corresponding to records to be removed
#' \itemize{
#' \item{'000' - Tree tallied in IFN2 but cut between the two inventories.}
#' \item{'444' - Tree tallied in IFN2 and the stump is not found or it is in advanced decomposition state.}
#' \item{'777' - Cork oak tree tallied in IFN2 and scorched between the two inventories.}
#' \item{'888' - Tree tallied in IFN2 and dead between the two inventories.}
#' \item{'999' - Tree tallied in IFN2 but should have not been included.}
#' }
readPiesMayoresIFN3<-function(accessFiles, plotTypeIFN3=c("A1","NN"), plotIDs = NULL,
include.IFN2 = FALSE,
rem.nospecies=FALSE, rem.noheight=FALSE, rem.nodensity=FALSE,
rem.codes32 = character(0), rem.codes33 = character(0),
height.cm = FALSE, subsetVars=TRUE){
readFromConnection<-function(ch) {
findRow<-function(x) {
n = which(treeDataIFN2$Estadillo==x[["Estadillo"]] & treeDataIFN2$NumOrden==x[["OrdenIf2"]])
if(length(n)!=1) n = NA
return(n)
}
treeDataIFN3<-RODBC::sqlFetch(ch,"PCMayores")
treeDataIFN3$Provincia = ""
toFill = (treeDataIFN3$Provincia=="")
if(sum(toFill)>0) { #Get Provincia from PCparcelas if missing information in PCMayores
pcDataIFN3<-RODBC::sqlFetch(ch,"PCParcelas")
estunique = unique(treeDataIFN3$Estadillo[toFill])
for(est in estunique) {
treeDataIFN3$Provincia[treeDataIFN3$Estadillo==est] = pcDataIFN3$Provincia[pcDataIFN3$Estadillo==est][1]
}
}
if(include.IFN2) {
treeDataIFN3$Species2=NA
treeDataIFN3$Ht2=NA
treeDataIFN3$DBH2=NA
treeDataIFN3$N2=NA
treeDataIFN2 <-RODBC::sqlFetch(ch,"PCMayores2")
if(nrow(treeDataIFN2)>0) {
sel = !(treeDataIFN3$OrdenIf2 %in% c("0","888","999"))
sel[is.na(sel)] = FALSE
treeDataIFN2 = treeDataIFN2[!(treeDataIFN2[, "NumOrden"] %in% c("0","888","999")),] # Remove non-measured or dead trees (cannot be matched if there is more than one)
treeDataIFN2$CodeTree = paste(treeDataIFN2[,"Estadillo"],
treeDataIFN2[, "NumOrden"])
codeTree = paste(treeDataIFN3[sel,"Estadillo"], treeDataIFN3[sel, "OrdenIf2"])
rs <- rep(NA, length(codeTree))
pb = txtProgressBar(1, length(codeTree), style=3)
for(j in 1:length(codeTree)) {
setTxtProgressBar(pb, j)
r = which(treeDataIFN2$CodeTree==codeTree[j])
if(length(r)>0) {
rs[j] = r[1]
}
}
cat("\n")
#Do not look for values when the row is unknown
sel[sel] = !is.na(rs)
rs = rs[!is.na(rs)]
treeDataIFN3$Species2[sel] = as.character(treeDataIFN2[rs,"Especie"])
treeDataIFN3$Ht2[sel]<-treeDataIFN2[rs,"Altura"]
treeDataIFN3$DBH2[sel]<-0.05*(treeDataIFN2[rs,"Diametro1"]+ treeDataIFN2[rs,"Diametro2"])
treeDataIFN3$N2[sel]<-.densityFactor(treeDataIFN3$DBH2[sel])
treeDataIFN3$Forma2[sel]<-treeDataIFN2[rs,"Forma"]
}
}
return(treeDataIFN3)
}
cat(paste("Reading",accessFiles[1],"...\n"))
ch<-RODBC::odbcConnectAccess2007(accessFiles[1])
treeDataIFN3 = readFromConnection(ch)
close(ch)
if(length(accessFiles)>1){
for(i in 2:length(accessFiles)){
cat(paste("Reading",accessFiles[i],"...\n"))
chi<-RODBC::odbcConnectAccess2007(accessFiles[i])
tdi<-readFromConnection(chi)
close(chi)
treeDataIFN3 = merge(treeDataIFN3, tdi, all=TRUE, sort=FALSE)
}
}
sc = as.character(treeDataIFN3$Subclase)
sc[is.na(sc)]<-""
#remove extra spaces
nc = nchar(sc)
sel = (substr(sc,nc, nc) == " ")
sc[sel] = substr(sc[sel], 1, nc-1)
pdtype = paste(treeDataIFN3$Cla,sc, sep="")
treeDataIFN3$TYPE = pdtype
#ID
treeDataIFN3$ID<-as.character(as.numeric(as.character(treeDataIFN3$Provincia))*10000+as.numeric(as.character(treeDataIFN3$Estadillo)))
#Selection
sel = rep(TRUE, nrow(treeDataIFN3))
if(!is.null(plotTypeIFN3)) sel = sel & (pdtype %in% plotTypeIFN3)
if(!is.null(plotIDs)) sel = sel & (treeDataIFN3$ID %in% as.character(plotIDs))
treeDataIFN3 <-treeDataIFN3[sel,]
if(nrow(treeDataIFN3)>0) {
if(rem.nospecies) treeDataIFN3<-treeDataIFN3[!is.na(treeDataIFN3$Especie),]
treeDataIFN3$Estadillo<-as.character(treeDataIFN3$Estadillo)
treeDataIFN3$Especie<-as.character(treeDataIFN3$Especie)
treeDataIFN3$Dn1 = as.character(treeDataIFN3$Dn1)
treeDataIFN3$Dn1[treeDataIFN3$Dn1=="NA"]<-NA
treeDataIFN3$Dn1 <- as.numeric(treeDataIFN3$Dn1)
treeDataIFN3$Dn2 = as.character(treeDataIFN3$Dn2)
treeDataIFN3$Dn2[treeDataIFN3$Dn2=="NA"]<-NA
treeDataIFN3$Dn2 <- as.numeric(treeDataIFN3$Dn2)
treeDataIFN3$DM<-(treeDataIFN3$Dn1+treeDataIFN3$Dn2)/(2*10) #To cm
treeDataIFN3$N<-.densityFactor(treeDataIFN3$DM)
treeDataIFN3$Ht = sub(",",".",as.character(treeDataIFN3$Ht))
treeDataIFN3$Ht[treeDataIFN3$Ht=="NA"]<-NA
treeDataIFN3$Ht <- as.numeric(treeDataIFN3$Ht)
### SPECIFY SELECTION CRITERIA
### remove tree when we lack N
if(rem.nodensity) treeDataIFN3<-treeDataIFN3[!is.na(treeDataIFN3$N),]
### remove tree when we lack N
if(rem.noheight) treeDataIFN3<-treeDataIFN3[!is.na(treeDataIFN3$Ht),]
### remove tree codes
if(length(rem.codes32)>0){
treeDataIFN3<-treeDataIFN3[!(treeDataIFN3$OrdenIf2 %in% rem.codes32),]
}
if(length(rem.codes33)>0){
treeDataIFN3<-treeDataIFN3[!(treeDataIFN3$OrdenIf3 %in% rem.codes33),]
}
#Translate meters to cms
if(height.cm) treeDataIFN3$Ht = treeDataIFN3$Ht*100 #meters to cms
#Turn tree codes into numeric
treeDataIFN3$OrdenIf2 = as.character(as.numeric(treeDataIFN3$OrdenIf2))
treeDataIFN3$OrdenIf3 = as.character(as.numeric(treeDataIFN3$OrdenIf3))
} else {
treeDataIFN3$N<-numeric(0)
treeDataIFN3$DM<-numeric(0)
}
if(subsetVars){
vars = c("Provincia","Estadillo","ID","TYPE","Especie","N","DM","Ht","Rumbo","Distanci","OrdenIf3","OrdenIf2", "Forma")
if(include.IFN2) vars = c(vars, "Species2", "N2", "DBH2", "Ht2", "Forma2")
treeDataIFN3 <- treeDataIFN3[,vars]
nms <-c("Provincia","Estadillo","ID","Type","Species", "N", "DBH","H", "Angle", "Dist", "OIF3", "OIF2", "FC")
if(include.IFN2) nms <- c(nms,"Species2", "N2","DBH2","H2", "FC2")
names(treeDataIFN3)<-nms
}
return(treeDataIFN3)
}
#' @rdname readPiesMayores
#'
#' @param plotTypeIFN4 Subset of plot types to include:
#' @param include.IFN3 Flag to include diameter and height measured in IFN3
#' @param rem.codes43 set of tree codes in IFN3 corresponding to records to be removed:
#' \itemize{
#' \item{'0' or '000' - Tree not tallied in IFN3 because of its small size.}
#' \item{'999' - Tree that should have been tallied in IFN3 but was not for some reason.}
#' }
#' @param rem.codes44 set of tree codes in IFN4 corresponding to records to be removed
#' \itemize{
#' \item{'000' - Tree tallied in IFN3 but cut between the two inventories (stump is found).}
#' \item{'444' - Tree tallied in IFN3 and the stump is not found or it is in advanced decomposition state.}
#' \item{'777' - Cork oak tree tallied in IFN3 and scorched between the two inventories.}
#' \item{'888' - Tree tallied in IFN3 and dead between the two inventories.}
#' \item{'999' - Tree tallied in IFN3 but should have not been included.}
#' }
#' @param vars.IFN3 String vector with column names of variables in the IFN3 table
#'
readPiesMayoresIFN4<-function(accessFiles, plotTypeIFN4=c("A1","NN"),
plotIDs = NULL, include.IFN3 = FALSE,
rem.nospecies=FALSE, rem.noheight=FALSE, rem.nodensity=FALSE,
rem.codes43 = character(0), rem.codes44 = character(0),
height.cm = FALSE, subsetVars=TRUE, vars.IFN3=c("OrdenIf3", "Especie","Dn1","Dn2","Ht", "Forma")){
readFromConnection<-function(ch) {
getPCParcelas<-function(ch) {
pcDataIFN4<-RODBC::sqlFetch(ch,"PCParcelas")
nc = nchar(as.character(pcDataIFN4$Estadillo))
ncI = nc-3
if(!("Provincia" %in% names(pcDataIFN4))) pcDataIFN4$Provincia = as.numeric(substr(as.character(pcDataIFN4$Estadillo),1,nc-4))
pcDataIFN4$Estadillo = as.numeric(substr(as.character(pcDataIFN4$Estadillo),ncI,nc))
return(pcDataIFN4)
}
treeDataIFN4<-RODBC::sqlFetch(ch,"PCMayores")
nc = nchar(as.character(treeDataIFN4$Estadillo))
ncI = nc-3
if(!("Provincia" %in% names(treeDataIFN4))) treeDataIFN4$Provincia = as.numeric(substr(as.character(treeDataIFN4$Estadillo),1,nc-4))
treeDataIFN4$Estadillo = as.numeric(substr(as.character(treeDataIFN4$Estadillo),ncI,nc))
treeDataIFN4$Provincia[is.na(treeDataIFN4$Provincia)] = ""
toFill = treeDataIFN4$Provincia==""
if(sum(toFill)>0) { #Get Provincia from PCparcelas if missing information in PCMayores
pcDataIFN4 = getPCParcelas(ch)
estunique = unique(treeDataIFN4$Estadillo[toFill])
for(est in estunique) {
treeDataIFN4$Provincia[treeDataIFN4$Estadillo==est] = pcDataIFN4$Provincia[pcDataIFN4$Estadillo==est][1]
}
}
if(include.IFN3) {
#Define new fields
treeDataIFN4$Species3=NA
treeDataIFN4$N3=NA
treeDataIFN4$Ht3=NA
treeDataIFN4$DBH3=NA
#Retrieve IFN3 table
treeDataIFN3 <-RODBC::sqlFetch(ch,"PCMayores3")
if(nrow(treeDataIFN3)>0) {
#Fill province field
nc = nchar(as.character(treeDataIFN3$Estadillo))
ncI = nc-3
if(!("Provincia" %in% names(treeDataIFN3))) treeDataIFN3$Provincia = as.numeric(substr(as.character(treeDataIFN3$Estadillo),1,nc-4))
treeDataIFN3$Estadillo = as.numeric(substr(as.character(treeDataIFN3$Estadillo),ncI,nc))
treeDataIFN3$Provincia[is.na(treeDataIFN3$Provincia)] = ""
toFill = (treeDataIFN3$Provincia=="")
#Get Provincia from PCparcelas if missing information in PCMayores3
if(sum(toFill)>0) {
pcDataIFN4 = getPCParcelas(ch)
estunique = unique(treeDataIFN3$Estadillo[toFill])
for(est in estunique) {
treeDataIFN3$Provincia[treeDataIFN3$Estadillo==est] = pcDataIFN4$Provincia[pcDataIFN4$Estadillo==est][1]
}
}
sel = !(treeDataIFN4$OrdenIf3 %in% c("0","888","999"))
sel[is.na(sel)] = FALSE
treeDataIFN3 = treeDataIFN3[!(treeDataIFN3[,vars.IFN3[1]] %in% c("0","888","999")),] # Remove non-measured or dead trees (cannot be matched if there is more than one)
treeDataIFN3$CodeTree = paste(treeDataIFN3[, "Provincia"],treeDataIFN3[,"Estadillo"],
treeDataIFN3[,vars.IFN3[1]])
codeTree = paste(treeDataIFN4[sel, "Provincia"],treeDataIFN4[sel,"Estadillo"],
treeDataIFN4[sel, "OrdenIf3"])
rs <- rep(NA, length(codeTree))
pb = txtProgressBar(1, length(codeTree), style=3)
for(j in 1:length(codeTree)) {
setTxtProgressBar(pb, j)
r = which(treeDataIFN3$CodeTree==codeTree[j])
if(length(r)>0) {
rs[j] = r[1]
}
}
cat("\n")
#Do not look for values when the row is unknown
sel[sel] = !is.na(rs)
rs = rs[!is.na(rs)]
treeDataIFN4$Species3[sel] = as.character(treeDataIFN3[rs,vars.IFN3[2]])
treeDataIFN4$DBH3[sel]<-0.05*(treeDataIFN3[rs,vars.IFN3[3]]+ treeDataIFN3[rs,vars.IFN3[4]])
treeDataIFN4$Ht3[sel]<-treeDataIFN3[rs,vars.IFN3[5]]
treeDataIFN4$N3[sel]<-.densityFactor(treeDataIFN4$DBH3[sel])
treeDataIFN4$Forma3[sel] <- treeDataIFN3[rs,vars.IFN3[6]]
}
}
return(treeDataIFN4)
}
cat(paste("Reading",accessFiles[1],"...\n"))
ch<-RODBC::odbcConnectAccess2007(accessFiles[1])
treeDataIFN4 <-readFromConnection(ch)
close(ch)
if(length(accessFiles)>1){
for(i in 2:length(accessFiles)){
cat(paste("Reading",accessFiles[i],"...\n"))
ch<-RODBC::odbcConnectAccess2007(accessFiles[i])
treeDataIFN4 = merge(treeDataIFN4, readFromConnection(ch), all=TRUE, sort=FALSE)
close(ch)
}
}
sc = as.character(treeDataIFN4$Subclase)
sc[is.na(sc)]<-""
#remove extra spaces
nc = nchar(sc)
sel = (substr(sc,nc, nc) == " ")
sc[sel] = substr(sc[sel], 1, nc-1)
pdtype = paste(treeDataIFN4$Cla,sc, sep="")
treeDataIFN4$TYPE = pdtype
#Build ID (provincia + estadillo)
treeDataIFN4$ID<-as.character(as.numeric(as.character(treeDataIFN4$Provincia))*10000+as.numeric(as.character(treeDataIFN4$Estadillo)))
#Selection
sel = rep(TRUE, nrow(treeDataIFN4))
if(!is.null(plotTypeIFN4)) sel = sel & (pdtype %in% plotTypeIFN4)
if(!is.null(plotIDs)) sel = sel & (treeDataIFN4$ID %in% as.character(plotIDs))
treeDataIFN4 <-treeDataIFN4[sel,]
if(rem.nospecies) treeDataIFN4<-treeDataIFN4[!is.na(treeDataIFN4$Especie),]
treeDataIFN4$Especie<-as.character(treeDataIFN4$Especie)
treeDataIFN4$Dn1 = as.character(treeDataIFN4$Dn1)
treeDataIFN4$Dn1[treeDataIFN4$Dn1=="NA"]<-NA
treeDataIFN4$Dn1 <- as.numeric(treeDataIFN4$Dn1)
treeDataIFN4$Dn2 = as.character(treeDataIFN4$Dn2)
treeDataIFN4$Dn2[treeDataIFN4$Dn2=="NA"]<-NA
treeDataIFN4$Dn2 <- as.numeric(treeDataIFN4$Dn2)
treeDataIFN4$Dm<-(treeDataIFN4$Dn1+treeDataIFN4$Dn2)/(2*10)
treeDataIFN4$N<-.densityFactor(treeDataIFN4$Dm)
treeDataIFN4$Ht = sub(",",".",as.character(treeDataIFN4$Ht))
treeDataIFN4$Ht[treeDataIFN4$Ht=="NA"]<-NA
treeDataIFN4$Ht <- as.numeric(treeDataIFN4$Ht)
# SPECIFY SELECTION CRITERIA
# remove tree when we lack N
if(rem.nodensity) treeDataIFN4<-treeDataIFN4[!is.na(treeDataIFN4$N),]
# remove tree when we lack N
if(rem.noheight) treeDataIFN4<-treeDataIFN4[!is.na(treeDataIFN4$Ht),]
### remove tree codes
if(length(rem.codes43)>0){
treeDataIFN4<-treeDataIFN4[!(treeDataIFN4$OrdenIf3 %in% rem.codes43),]
}
if(length(rem.codes44)>0){
treeDataIFN4<-treeDataIFN4[!(treeDataIFN4$OrdenIf4 %in% rem.codes44),]
}
#Translate meters to cms
if(height.cm) treeDataIFN4$Ht = treeDataIFN4$Ht*100 #meters to cms
if(subsetVars){
vars = c("Provincia","Estadillo","ID","TYPE","Especie","N","Dm","Ht","Rumbo","Distanci","Forma","OrdenIf4","OrdenIf3")
if(include.IFN3) vars = c(vars, "Species3","N3","DBH3", "Ht3", "Forma3")
treeDataIFN4 <- treeDataIFN4[,vars]
nms <-c("Provincia","Estadillo","ID","Type","Species", "N", "DBH","H", "Angle", "Dist","FC", "OIF4", "OIF3")
if(include.IFN3) nms <- c(nms, "Species3", "N3", "DBH3","H3", "FC3")
names(treeDataIFN4)<-nms
}
return(treeDataIFN4)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.