/
MODIStsp_read_xml.R
200 lines (165 loc) · 8.54 KB
/
MODIStsp_read_xml.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
#' @title Read MODIS products characteristics from XML
#' @description function used to parse the XML file used to store the characteristics of
#' MODIS Land Products and store them in the "prod_opts" data frame
#' @details The function parses the XML file product by product, stores data in a data frame
#' and saves the data frame within the "MODIStsp_previous" RData file as a list of lists
#' @param prodopts_file string filename of the RData in which to store the data
#' parsed from the XML file
#' @param xml_file string filename of the XML file containing the MODIS products
#' characteristics
#' @return NULL - retrieved data are stored in the specified RData file
#'
#' @author Lorenzo Busetto, phD (2014-2017)
#' @author Luigi Ranghetti, phD (2015)
#' @note License: GPL 3.0
#' @importFrom xml2 as_list read_xml
#'
MODIStsp_read_xml <- function(prodopts_file,
xml_file) {
prod_opt_list <- list()
xmldata <- xml2::as_list(xml2::read_xml(xml_file))[["products"]]
# names of the single products
names_products <- names(xmldata)
names_products <- names_products[names_products != "comment"]
# cycle on available products
for (prod in names_products) {
prodopts <- list() # initialize the prodopts list
prodopts_name <- xmldata[[prod]][["name"]][[1]]
# number of available versions
n_versions <- length(xmldata[[prod]][["versions"]])
for (n_version in 1:n_versions) {
prod_data <- xmldata[[prod]][["versions"]][[n_version]]
# General info
version_name <- prod_data[["v_number"]][[1]]
prodopts[[version_name]] <- list() # one element per version
prodopts[[version_name]]$v_number <- version_name
prodopts[[version_name]]$prod_fullname <- prod_data[["prod_fullname"]][[1]] #nolint
prodopts[[version_name]]$main_out_folder <-
prod_data[["main_out_folder"]][[1]]
prodopts[[version_name]]$native_res <- prod_data[["native_res"]][[1]]
prodopts[[version_name]]$tiled <- prod_data[["tiled"]][[1]]
prodopts[[version_name]]$combined <- prod_data[["combined"]][[1]]
prodopts[[version_name]]$cat01 <- xmldata[[prod]][["cat_01"]][[1]]
prodopts[[version_name]]$cat02 <- xmldata[[prod]][["cat_02"]][[1]]
file_prefix_terra <- xmldata[[prod]][["file_prefix_terra"]][[1]]
http_terra <- prod_data[["http_terra"]][[1]]
file_prefix_aqua <- xmldata[[prod]][["file_prefix_aqua"]][[1]]
http_aqua <- prod_data[["http_aqua"]][[1]]
prodopts[[version_name]]$www <- prod_data[["www"]][[1]]
prodopts[[version_name]]$file_prefix <- list(
"Terra" = file_prefix_terra,
"Aqua" = file_prefix_aqua
)
prodopts[[version_name]]$http <- list("Terra" = http_terra,
"Aqua" = http_aqua)
# Band info
nbands <- length(prod_data[["bands"]])
bandnames <- band_fullname <- datatype <- nodata_in <-
nodata_out <- scale_factor <- offset <- NULL
# get chars of original layers
for (band in seq_len(nbands)) {
bandnames <- c(bandnames,
prod_data[["bands"]][[band]][["bandname"]][[1]])
band_fullname <- c(band_fullname,
prod_data[["bands"]][[band]][["fullname"]][[1]])
datatype <- c(datatype,
prod_data[["bands"]][[band]][["datatype"]][[1]])
nodata_in <- c(nodata_in,
prod_data[["bands"]][[band]][["nodata_in"]][[1]])
nodata_out <- c(nodata_out,
prod_data[["bands"]][[band]][["nodata_out"]][[1]])
scale_factor <- c(scale_factor,
prod_data[["bands"]][[band]][["scale_factor"]][[1]])
offset <- c(offset,
prod_data[["bands"]][[band]][["offset"]][[1]])
}
#End Cycle on bands - store in prodopts ----
prodopts[[version_name]]$bandnames <- bandnames
prodopts[[version_name]]$band_fullnames <- band_fullname
datatype <- as.factor(datatype)
# Convert MODIS datatypes to R/Gdal datatypes
#
levels(datatype)[levels(datatype) == "8-bit signed integer"] <- "Byte"
levels(datatype)[levels(datatype) == "8-bit unsigned integer"] <- "Byte"
levels(datatype)[levels(datatype) == "16-bit signed integer"] <- "Int16"
levels(datatype)[levels(datatype) == "16-bit unsigned integer"] <- "UInt16" #nolint
levels(datatype)[levels(datatype) == "32-bit signed integer"] <- "Int32"
levels(datatype)[levels(datatype) == "32-bit unsigned integer"] <- "UInt32" #nolint
levels(datatype)[levels(datatype) == "32-bit float"] <- "Float32" #nolint
prodopts[[version_name]]$datatype <- datatype
prodopts[[version_name]]$nodata_in <- nodata_in
prodopts[[version_name]]$nodata_out <- nodata_out
prodopts[[version_name]]$scale_factor <- scale_factor
prodopts[[version_name]]$offset <- offset
# Indices info
# number of Spectral Indexes
nindexes <- length(prod_data[["indexes"]])
if (nindexes > 0) {
indexes_bandnames <- indexes_fullnames <- indexes_formulas <-
indexes_nodata_out <- NULL
# get charcteristics of indexes
for (index in seq_len(nindexes)) {
indexes_bandnames <- c(indexes_bandnames,
prod_data[["indexes"]][[index]][["indexes_bandname"]][[1]]) #nolint
indexes_fullnames <- c(indexes_fullnames,
prod_data[["indexes"]][[index]][["indexes_fullname"]][[1]]) #nolint
indexes_formulas <- c(indexes_formulas,
prod_data[["indexes"]][[index]][["indexes_formula"]][[1]]) #nolint
indexes_nodata_out <- c(indexes_nodata_out,
prod_data[["indexes"]][[index]][["indexes_nodata_out"]][[1]]) #nolint
}
#End Cycle on index - store in prodopts ----
prodopts[[version_name]]$indexes_bandnames <- indexes_bandnames
prodopts[[version_name]]$indexes_fullnames <- indexes_fullnames
prodopts[[version_name]]$indexes_formulas <- indexes_formulas
prodopts[[version_name]]$indexes_nodata_out <- indexes_nodata_out
} #end if on indexes existence
# Quality flag info
nquality <- length(prod_data[["quality_indicators"]])
if (nquality > 0 ) {
quality_bandnames <- quality_fullnames <- quality_source <-
quality_bitN <- NULL
# get charcteristics of QIs
for (quality in seq_len(nquality)) {
quality_bandnames <- c(
quality_bandnames,
prod_data[["quality_indicators"]][[quality]][["quality_bandname"]][[1]] #nolint
)
quality_fullnames <- c(
quality_fullnames,
prod_data[["quality_indicators"]][[quality]][["quality_fullname"]][[1]] #nolint
)
quality_source <- c(
quality_source,
prod_data[["quality_indicators"]][[quality]][["quality_source"]][[1]] #nolint
)
quality_bitN <- c(
quality_bitN,
prod_data[["quality_indicators"]][[quality]][["quality_bitN"]][[1]]
)
}
#End Cycle on quality - store in prodopts
prodopts[[version_name]]$quality_bandnames <- quality_bandnames
prodopts[[version_name]]$quality_fullnames <- quality_fullnames
prodopts[[version_name]]$quality_source <- quality_source
prodopts[[version_name]]$quality_bitN <- quality_bitN
# nodata in for quality bands (dummy - always 255)
prodopts[[version_name]]$quality_nodata_in <- rep(
"255", length(prodopts[[version_name]]$quality_bandnames)
)
# nodata out for quality bands (dummy - always 255)
prodopts[[version_name]]$quality_nodata_out <- rep(
"255", length(prodopts[[version_name]]$quality_bandnames))
} # end if on quality existence
} # end of n_versions cycle
# At each cycle, add product name to mod_prod_list and prodopts to
# prod_opt_list
prod_opt_list[[prodopts_name]] <- prodopts
} #End Cycle on products
# Add attributes to these 3 lists (this is used as a check when charging them)
attr(prod_opt_list, "GeneratedBy") <- "MODIStsp"
attr(prod_opt_list, "MODIStspVersion") <- packageVersion("MODIStsp")
# Save the products list and the chars of the products in previous file
dir.create(dirname(prodopts_file), recursive = TRUE, showWarnings = FALSE)
save(prod_opt_list, file = prodopts_file)
}