Animating Rasters with Makie.jl¤
Author: Anshul Singhvi
"Rasters" are a common data format for representing spatial data, specifically data points on a uniform grid. In Julia, we can represent and manipulate these using the Rasters.jl package.
Rasters.jl currently handles raster arrays like GeoTIFF and NetCDF, R grd files, multi-layered stacks, and multi-file series of arrays and stacks.
In this example, we'll use Rasters.jl to load some climate data from WorldClim, and then visualize it in multiple ways using Makie's recipe system (sometimes automatically, and sometimes manually!).
We'll also show the Julia package ecosystem's effortless interoperability, by using DataInterpolations.jl to smoothly interpolate a timeseries of rasters, and animate them in Makie!
ENV["RASTERDATASOURCES_PATH"] = ".." # joinpath(tempdir(), "Rasters"), needed for RasterDataSources
Let's load the packages:
using Rasters
using RasterDataSources
using ArchGDAL
using GLMakie
using Makie.GeometryBasics
using Makie.GeometryBasics: Tesselation, uv_normal_mesh
using DataInterpolations, Printf
┌ Warning: Replacing docs for `RasterDataSources.getraster :: Union{}` in module `RasterDataSources`
└ @ Base.Docs docs/Docs.jl:243
Getting the data¤
First, we get the rasters. This is made really easy with Rasters.jl, and its integration with RasterDataSources.jl. This allows you to effortlessly get rasters from several popular datasets on demand, including WorldClim and MODIS!
Here, we get the WorldClim climate data, which is an average of the climate in a given month, for the entire globe. We obtain the data for all 12 months.
worldclim_stacks = [RasterStack(WorldClim{Climate}, month = i) for i in 1:12]
12-element Vector{Rasters.RasterStack{NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), Tuple{Matrix{Float32}, Matrix{Float32}, Matrix{Float32}, Matrix{Int16}, Matrix{UInt16}, Matrix{Float32}, Matrix{Float32}}}, Tuple{DimensionalData.Dimensions.X{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.X{Colon}}}, DimensionalData.Dimensions.Y{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ReverseOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.Y{Colon}}}}, Tuple{}, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), NTuple{7, Tuple{DimensionalData.Dimensions.X{Colon}, DimensionalData.Dimensions.Y{Colon}}}}, DimensionalData.Dimensions.LookupArrays.NoMetadata, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), NTuple{7, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}}}, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), Tuple{Float32, Float32, Float32, Int16, UInt16, Float32, Float32}}}}:
Rasters.RasterStack{NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), Tuple{Matrix{Float32}, Matrix{Float32}, Matrix{Float32}, Matrix{Int16}, Matrix{UInt16}, Matrix{Float32}, Matrix{Float32}}}, Tuple{DimensionalData.Dimensions.X{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.X{Colon}}}, DimensionalData.Dimensions.Y{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ReverseOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.Y{Colon}}}}, Tuple{}, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), NTuple{7, Tuple{DimensionalData.Dimensions.X{Colon}, DimensionalData.Dimensions.Y{Colon}}}}, DimensionalData.Dimensions.LookupArrays.NoMetadata, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), NTuple{7, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}}}, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), Tuple{Float32, Float32, Float32, Int16, UInt16, Float32, Float32}}}((tmin = Float32[-3.4f38 -3.4f38 … -19.9805 -20.338; -3.4f38 -3.4f38 … -21.058 -21.01; … ; -3.4f38 -3.4f38 … -22.4585 -22.41; -3.4f38 -3.4f38 … -20.7255 -21.05875], tmax = Float32[-3.4f38 -3.4f38 … -13.992 -14.263; -3.4f38 -3.4f38 … -14.7885 -14.759999; … ; -3.4f38 -3.4f38 … -17.0005 -16.991; -3.4f38 -3.4f38 … -15.6795 -15.95825], tavg = Float32[-3.4f38 -3.4f38 … -16.99 -17.2735; -3.4f38 -3.4f38 … -17.92 -17.8625; … ; -3.4f38 -3.4f38 … -19.73275 -19.67225; -3.4f38 -3.4f38 … -18.20025 -18.494], prec = Int16[-32768 -32768 … 0 0; -32768 -32768 … 0 0; … ; -32768 -32768 … 0 0; -32768 -32768 … 0 0], srad = UInt16[0xffff 0xffff … 0x866d 0x8773; 0xffff 0xffff … 0x8698 0x8779; … ; 0xffff 0xffff … 0x8ad8 0x8c4d; 0xffff 0xffff … 0x8aa9 0x8c44], wind = Float32[-3.4f38 -3.4f38 … 1.6832501 1.52475; -3.4f38 -3.4f38 … 1.6635001 1.52; … ; -3.4f38 -3.4f38 … 1.8 1.7099999; -3.4f38 -3.4f38 … 1.8125 1.7195], vapr = Float32[-3.4f38 -3.4f38 … 0.106 0.105000004; -3.4f38 -3.4f38 … 0.106300004 0.105000004; … ; -3.4f38 -3.4f38 … 0.0971 0.09125; -3.4f38 -3.4f38 … 0.0982 0.091875]), (DimensionalData.Dimensions.X{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.X{Colon}}}([-180.0, -179.83333333333334, -179.66666666666666, -179.5, -179.33333333333334, -179.16666666666666, -179.0, -178.83333333333334, -178.66666666666669, -178.5 … 178.33333333333331, 178.5, 178.66666666666666, 178.8333333333333, 178.99999999999997, 179.16666666666663, 179.33333333333334, 179.49999999999997, 179.66666666666666, 179.83333333333331]), DimensionalData.Dimensions.Y{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ReverseOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.Y{Colon}}}([89.83333333333333, 89.66666666666666, 89.5, 89.33333333333333, 89.16666666666666, 89.0, 88.83333333333333, 88.66666666666666, 88.5, 88.33333333333333 … -88.49999999999999, -88.66666666666667, -88.83333333333331, -89.0, -89.16666666666666, -89.33333333333333, -89.49999999999999, -89.66666666666667, -89.83333333333331, -90.0])), (), (tmin = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), tmax = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), tavg = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), prec = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), srad = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), wind = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), vapr = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon()))), DimensionalData.Dimensions.LookupArrays.NoMetadata(), (tmin = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tmin/wc2.1_10m_tmin_01.tif", "scale" => 1.0)), tmax = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tmax/wc2.1_10m_tmax_01.tif", "scale" => 1.0)), tavg = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tavg/wc2.1_10m_tavg_01.tif", "scale" => 1.0)), prec = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/prec/wc2.1_10m_prec_01.tif", "scale" => 1.0)), srad = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/srad/wc2.1_10m_srad_01.tif", "scale" => 1.0)), wind = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/wind/wc2.1_10m_wind_01.tif", "scale" => 1.0)), vapr = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/vapr/wc2.1_10m_vapr_01.tif", "scale" => 1.0))), (tmin = -3.4f38, tmax = -3.4f38, tavg = -3.4f38, prec = -32768, srad = 0xffff, wind = -3.4f38, vapr = -3.4f38))
Rasters.RasterStack{NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), Tuple{Matrix{Float32}, Matrix{Float32}, Matrix{Float32}, Matrix{Int16}, Matrix{UInt16}, Matrix{Float32}, Matrix{Float32}}}, Tuple{DimensionalData.Dimensions.X{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.X{Colon}}}, DimensionalData.Dimensions.Y{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ReverseOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.Y{Colon}}}}, Tuple{}, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), NTuple{7, Tuple{DimensionalData.Dimensions.X{Colon}, DimensionalData.Dimensions.Y{Colon}}}}, DimensionalData.Dimensions.LookupArrays.NoMetadata, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), NTuple{7, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}}}, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), Tuple{Float32, Float32, Float32, Int16, UInt16, Float32, Float32}}}((tmin = Float32[-3.4f38 -3.4f38 … -27.55275 -28.070002; -3.4f38 -3.4f38 … -28.84 -28.7975; … ; -3.4f38 -3.4f38 … -29.036 -29.01075; -3.4f38 -3.4f38 … -27.0715 -27.55975], tmax = Float32[-3.4f38 -3.4f38 … -20.74 -21.171; -3.4f38 -3.4f38 … -21.710001 -21.705; … ; -3.4f38 -3.4f38 … -23.078 -23.08875; -3.4f38 -3.4f38 … -21.56875 -22.0095], tavg = Float32[-3.4f38 -3.4f38 … -24.144249 -24.637999; -3.4f38 -3.4f38 … -25.286 -25.26775; … ; -3.4f38 -3.4f38 … -26.06 -26.0555; -3.4f38 -3.4f38 … -24.3165 -24.786001], prec = Int16[-32768 -32768 … 0 0; -32768 -32768 … 0 0; … ; -32768 -32768 … 0 0; -32768 -32768 … 0 0], srad = UInt16[0xffff 0xffff … 0x44ab 0x44ae; 0xffff 0xffff … 0x44bf 0x44b1; … ; 0xffff 0xffff … 0x4c3b 0x4cea; 0xffff 0xffff … 0x4c39 0x4ced], wind = Float32[-3.4f38 -3.4f38 … 1.2985 1.16125; -3.4f38 -3.4f38 … 1.256 1.1400001; … ; -3.4f38 -3.4f38 … 1.4725 1.3299999; -3.4f38 -3.4f38 … 1.535 1.3765], vapr = Float32[-3.4f38 -3.4f38 … 0.026999999 0.0262; -3.4f38 -3.4f38 … 0.026999999 0.0265; … ; -3.4f38 -3.4f38 … 0.0009999999 0.0; -3.4f38 -3.4f38 … 0.0009999999 0.0]), (DimensionalData.Dimensions.X{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.X{Colon}}}([-180.0, -179.83333333333334, -179.66666666666666, -179.5, -179.33333333333334, -179.16666666666666, -179.0, -178.83333333333334, -178.66666666666669, -178.5 … 178.33333333333331, 178.5, 178.66666666666666, 178.8333333333333, 178.99999999999997, 179.16666666666663, 179.33333333333334, 179.49999999999997, 179.66666666666666, 179.83333333333331]), DimensionalData.Dimensions.Y{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ReverseOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.Y{Colon}}}([89.83333333333333, 89.66666666666666, 89.5, 89.33333333333333, 89.16666666666666, 89.0, 88.83333333333333, 88.66666666666666, 88.5, 88.33333333333333 … -88.49999999999999, -88.66666666666667, -88.83333333333331, -89.0, -89.16666666666666, -89.33333333333333, -89.49999999999999, -89.66666666666667, -89.83333333333331, -90.0])), (), (tmin = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), tmax = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), tavg = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), prec = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), srad = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), wind = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), vapr = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon()))), DimensionalData.Dimensions.LookupArrays.NoMetadata(), (tmin = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tmin/wc2.1_10m_tmin_02.tif", "scale" => 1.0)), tmax = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tmax/wc2.1_10m_tmax_02.tif", "scale" => 1.0)), tavg = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tavg/wc2.1_10m_tavg_02.tif", "scale" => 1.0)), prec = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/prec/wc2.1_10m_prec_02.tif", "scale" => 1.0)), srad = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/srad/wc2.1_10m_srad_02.tif", "scale" => 1.0)), wind = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/wind/wc2.1_10m_wind_02.tif", "scale" => 1.0)), vapr = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/vapr/wc2.1_10m_vapr_02.tif", "scale" => 1.0))), (tmin = -3.4f38, tmax = -3.4f38, tavg = -3.4f38, prec = -32768, srad = 0xffff, wind = -3.4f38, vapr = -3.4f38))
Rasters.RasterStack{NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), Tuple{Matrix{Float32}, Matrix{Float32}, Matrix{Float32}, Matrix{Int16}, Matrix{UInt16}, Matrix{Float32}, Matrix{Float32}}}, Tuple{DimensionalData.Dimensions.X{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.X{Colon}}}, DimensionalData.Dimensions.Y{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ReverseOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.Y{Colon}}}}, Tuple{}, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), NTuple{7, Tuple{DimensionalData.Dimensions.X{Colon}, DimensionalData.Dimensions.Y{Colon}}}}, DimensionalData.Dimensions.LookupArrays.NoMetadata, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), NTuple{7, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}}}, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), Tuple{Float32, Float32, Float32, Int16, UInt16, Float32, Float32}}}((tmin = Float32[-3.4f38 -3.4f38 … -36.071503 -36.7935; -3.4f38 -3.4f38 … -37.535 -37.510002; … ; -3.4f38 -3.4f38 … -37.3455 -37.365; -3.4f38 -3.4f38 … -35.2315 -35.95], tmax = Float32[-3.4f38 -3.4f38 … -28.499998 -29.110249; -3.4f38 -3.4f38 … -29.669998 -29.669998; … ; -3.4f38 -3.4f38 … -30.758749 -30.787; -3.4f38 -3.4f38 … -29.03175 -29.66375], tavg = Float32[-3.4f38 -3.4f38 … -32.28725 -32.957; -3.4f38 -3.4f38 … -33.60225 -33.595; … ; -3.4f38 -3.4f38 … -34.054 -34.065; -3.4f38 -3.4f38 … -32.133 -32.80375], prec = Int16[-32768 -32768 … 2 2; -32768 -32768 … 2 2; … ; -32768 -32768 … 0 0; -32768 -32768 … 0 0], srad = UInt16[0xffff 0xffff … 0x0c3e 0x0c80; 0xffff 0xffff … 0x0c3e 0x0c80; … ; 0xffff 0xffff … 0x12ca 0x131f; 0xffff 0xffff … 0x12c8 0x1325], wind = Float32[-3.4f38 -3.4f38 … 1.07 1.013; -3.4f38 -3.4f38 … 1.0 0.95; … ; -3.4f38 -3.4f38 … 1.2 1.1400001; -3.4f38 -3.4f38 … 1.35 1.2825], vapr = Float32[-3.4f38 -3.4f38 … 0.0 0.0; -3.4f38 -3.4f38 … 0.0 0.0; … ; -3.4f38 -3.4f38 … 0.0 0.0; -3.4f38 -3.4f38 … 0.0 0.0]), (DimensionalData.Dimensions.X{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.X{Colon}}}([-180.0, -179.83333333333334, -179.66666666666666, -179.5, -179.33333333333334, -179.16666666666666, -179.0, -178.83333333333334, -178.66666666666669, -178.5 … 178.33333333333331, 178.5, 178.66666666666666, 178.8333333333333, 178.99999999999997, 179.16666666666663, 179.33333333333334, 179.49999999999997, 179.66666666666666, 179.83333333333331]), DimensionalData.Dimensions.Y{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ReverseOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.Y{Colon}}}([89.83333333333333, 89.66666666666666, 89.5, 89.33333333333333, 89.16666666666666, 89.0, 88.83333333333333, 88.66666666666666, 88.5, 88.33333333333333 … -88.49999999999999, -88.66666666666667, -88.83333333333331, -89.0, -89.16666666666666, -89.33333333333333, -89.49999999999999, -89.66666666666667, -89.83333333333331, -90.0])), (), (tmin = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), tmax = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), tavg = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), prec = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), srad = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), wind = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), vapr = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon()))), DimensionalData.Dimensions.LookupArrays.NoMetadata(), (tmin = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tmin/wc2.1_10m_tmin_03.tif", "scale" => 1.0)), tmax = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tmax/wc2.1_10m_tmax_03.tif", "scale" => 1.0)), tavg = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tavg/wc2.1_10m_tavg_03.tif", "scale" => 1.0)), prec = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/prec/wc2.1_10m_prec_03.tif", "scale" => 1.0)), srad = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/srad/wc2.1_10m_srad_03.tif", "scale" => 1.0)), wind = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/wind/wc2.1_10m_wind_03.tif", "scale" => 1.0)), vapr = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/vapr/wc2.1_10m_vapr_03.tif", "scale" => 1.0))), (tmin = -3.4f38, tmax = -3.4f38, tavg = -3.4f38, prec = -32768, srad = 0xffff, wind = -3.4f38, vapr = -3.4f38))
Rasters.RasterStack{NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), Tuple{Matrix{Float32}, Matrix{Float32}, Matrix{Float32}, Matrix{Int16}, Matrix{UInt16}, Matrix{Float32}, Matrix{Float32}}}, Tuple{DimensionalData.Dimensions.X{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.X{Colon}}}, DimensionalData.Dimensions.Y{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ReverseOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.Y{Colon}}}}, Tuple{}, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), NTuple{7, Tuple{DimensionalData.Dimensions.X{Colon}, DimensionalData.Dimensions.Y{Colon}}}}, DimensionalData.Dimensions.LookupArrays.NoMetadata, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), NTuple{7, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}}}, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), Tuple{Float32, Float32, Float32, Int16, UInt16, Float32, Float32}}}((tmin = Float32[-3.4f38 -3.4f38 … -39.9155 -40.74; -3.4f38 -3.4f38 … -41.429 -41.425; … ; -3.4f38 -3.4f38 … -41.21425 -41.215; -3.4f38 -3.4f38 … -39.08975 -39.8735], tmax = Float32[-3.4f38 -3.4f38 … -32.78625 -33.485; -3.4f38 -3.4f38 … -34.075 -34.07; … ; -3.4f38 -3.4f38 … -34.93 -34.96225; -3.4f38 -3.4f38 … -33.08725 -33.8], tavg = Float32[-3.4f38 -3.4f38 … -36.3325 -37.11425; -3.4f38 -3.4f38 … -37.735 -37.75; … ; -3.4f38 -3.4f38 … -38.085 -38.09; -3.4f38 -3.4f38 … -36.099503 -36.836502], prec = Int16[-32768 -32768 … 6 7; -32768 -32768 … 6 6; … ; -32768 -32768 … 0 0; -32768 -32768 … 0 0], srad = UInt16[0xffff 0xffff … 0x0000 0x0000; 0xffff 0xffff … 0x0000 0x0000; … ; 0xffff 0xffff … 0x0000 0x0000; 0xffff 0xffff … 0x0000 0x0000], wind = Float32[-3.4f38 -3.4f38 … 1.365 1.296; -3.4f38 -3.4f38 … 1.3 1.2349999; … ; -3.4f38 -3.4f38 … 1.9 1.805; -3.4f38 -3.4f38 … 2.047 1.938], vapr = Float32[-3.4f38 -3.4f38 … 0.0 0.0; -3.4f38 -3.4f38 … 0.0 0.0; … ; -3.4f38 -3.4f38 … 0.0 0.0; -3.4f38 -3.4f38 … 0.0 0.0]), (DimensionalData.Dimensions.X{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.X{Colon}}}([-180.0, -179.83333333333334, -179.66666666666666, -179.5, -179.33333333333334, -179.16666666666666, -179.0, -178.83333333333334, -178.66666666666669, -178.5 … 178.33333333333331, 178.5, 178.66666666666666, 178.8333333333333, 178.99999999999997, 179.16666666666663, 179.33333333333334, 179.49999999999997, 179.66666666666666, 179.83333333333331]), DimensionalData.Dimensions.Y{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ReverseOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.Y{Colon}}}([89.83333333333333, 89.66666666666666, 89.5, 89.33333333333333, 89.16666666666666, 89.0, 88.83333333333333, 88.66666666666666, 88.5, 88.33333333333333 … -88.49999999999999, -88.66666666666667, -88.83333333333331, -89.0, -89.16666666666666, -89.33333333333333, -89.49999999999999, -89.66666666666667, -89.83333333333331, -90.0])), (), (tmin = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), tmax = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), tavg = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), prec = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), srad = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), wind = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), vapr = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon()))), DimensionalData.Dimensions.LookupArrays.NoMetadata(), (tmin = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tmin/wc2.1_10m_tmin_04.tif", "scale" => 1.0)), tmax = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tmax/wc2.1_10m_tmax_04.tif", "scale" => 1.0)), tavg = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tavg/wc2.1_10m_tavg_04.tif", "scale" => 1.0)), prec = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/prec/wc2.1_10m_prec_04.tif", "scale" => 1.0)), srad = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/srad/wc2.1_10m_srad_04.tif", "scale" => 1.0)), wind = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/wind/wc2.1_10m_wind_04.tif", "scale" => 1.0)), vapr = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/vapr/wc2.1_10m_vapr_04.tif", "scale" => 1.0))), (tmin = -3.4f38, tmax = -3.4f38, tavg = -3.4f38, prec = -32768, srad = 0xffff, wind = -3.4f38, vapr = -3.4f38))
Rasters.RasterStack{NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), Tuple{Matrix{Float32}, Matrix{Float32}, Matrix{Float32}, Matrix{Int16}, Matrix{UInt16}, Matrix{Float32}, Matrix{Float32}}}, Tuple{DimensionalData.Dimensions.X{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.X{Colon}}}, DimensionalData.Dimensions.Y{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ReverseOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.Y{Colon}}}}, Tuple{}, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), NTuple{7, Tuple{DimensionalData.Dimensions.X{Colon}, DimensionalData.Dimensions.Y{Colon}}}}, DimensionalData.Dimensions.LookupArrays.NoMetadata, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), NTuple{7, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}}}, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), Tuple{Float32, Float32, Float32, Int16, UInt16, Float32, Float32}}}((tmin = Float32[-3.4f38 -3.4f38 … -40.92875 -41.7765; -3.4f38 -3.4f38 … -42.4085 -42.4035; … ; -3.4f38 -3.4f38 … -42.395 -42.39675; -3.4f38 -3.4f38 … -40.34725 -41.17225], tmax = Float32[-3.4f38 -3.4f38 … -33.7655 -34.4975; -3.4f38 -3.4f38 … -35.04 -35.05; … ; -3.4f38 -3.4f38 … -35.737 -35.745; -3.4f38 -3.4f38 … -33.952 -34.662], tavg = Float32[-3.4f38 -3.4f38 … -37.35 -38.11975; -3.4f38 -3.4f38 … -38.7155 -38.71; … ; -3.4f38 -3.4f38 … -39.0555 -39.07325; -3.4f38 -3.4f38 … -37.1465 -37.92525], prec = Int16[-32768 -32768 … 7 9; -32768 -32768 … 6 7; … ; -32768 -32768 … 0 0; -32768 -32768 … 0 1], srad = UInt16[0xffff 0xffff … 0x0000 0x0000; 0xffff 0xffff … 0x0000 0x0000; … ; 0xffff 0xffff … 0x0000 0x0000; 0xffff 0xffff … 0x0000 0x0000], wind = Float32[-3.4f38 -3.4f38 … 1.77925 1.6862501; -3.4f38 -3.4f38 … 1.7 1.615; … ; -3.4f38 -3.4f38 … 2.3 2.185; -3.4f38 -3.4f38 … 2.4765 2.3465], vapr = Float32[-3.4f38 -3.4f38 … 0.0 0.0; -3.4f38 -3.4f38 … 0.0 0.0; … ; -3.4f38 -3.4f38 … 0.0 0.0; -3.4f38 -3.4f38 … 0.0 0.0]), (DimensionalData.Dimensions.X{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.X{Colon}}}([-180.0, -179.83333333333334, -179.66666666666666, -179.5, -179.33333333333334, -179.16666666666666, -179.0, -178.83333333333334, -178.66666666666669, -178.5 … 178.33333333333331, 178.5, 178.66666666666666, 178.8333333333333, 178.99999999999997, 179.16666666666663, 179.33333333333334, 179.49999999999997, 179.66666666666666, 179.83333333333331]), DimensionalData.Dimensions.Y{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ReverseOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.Y{Colon}}}([89.83333333333333, 89.66666666666666, 89.5, 89.33333333333333, 89.16666666666666, 89.0, 88.83333333333333, 88.66666666666666, 88.5, 88.33333333333333 … -88.49999999999999, -88.66666666666667, -88.83333333333331, -89.0, -89.16666666666666, -89.33333333333333, -89.49999999999999, -89.66666666666667, -89.83333333333331, -90.0])), (), (tmin = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), tmax = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), tavg = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), prec = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), srad = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), wind = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), vapr = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon()))), DimensionalData.Dimensions.LookupArrays.NoMetadata(), (tmin = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tmin/wc2.1_10m_tmin_05.tif", "scale" => 1.0)), tmax = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tmax/wc2.1_10m_tmax_05.tif", "scale" => 1.0)), tavg = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tavg/wc2.1_10m_tavg_05.tif", "scale" => 1.0)), prec = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/prec/wc2.1_10m_prec_05.tif", "scale" => 1.0)), srad = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/srad/wc2.1_10m_srad_05.tif", "scale" => 1.0)), wind = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/wind/wc2.1_10m_wind_05.tif", "scale" => 1.0)), vapr = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/vapr/wc2.1_10m_vapr_05.tif", "scale" => 1.0))), (tmin = -3.4f38, tmax = -3.4f38, tavg = -3.4f38, prec = -32768, srad = 0xffff, wind = -3.4f38, vapr = -3.4f38))
Rasters.RasterStack{NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), Tuple{Matrix{Float32}, Matrix{Float32}, Matrix{Float32}, Matrix{Int16}, Matrix{UInt16}, Matrix{Float32}, Matrix{Float32}}}, Tuple{DimensionalData.Dimensions.X{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.X{Colon}}}, DimensionalData.Dimensions.Y{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ReverseOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.Y{Colon}}}}, Tuple{}, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), NTuple{7, Tuple{DimensionalData.Dimensions.X{Colon}, DimensionalData.Dimensions.Y{Colon}}}}, DimensionalData.Dimensions.LookupArrays.NoMetadata, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), NTuple{7, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}}}, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), Tuple{Float32, Float32, Float32, Int16, UInt16, Float32, Float32}}}((tmin = Float32[-3.4f38 -3.4f38 … -38.82 -39.61725; -3.4f38 -3.4f38 … -40.23425 -40.2185; … ; -3.4f38 -3.4f38 … -41.479248 -41.495; -3.4f38 -3.4f38 … -39.52325 -40.31925], tmax = Float32[-3.4f38 -3.4f38 … -32.36675 -33.0475; -3.4f38 -3.4f38 … -33.60025 -33.59; … ; -3.4f38 -3.4f38 … -35.014 -35.035; -3.4f38 -3.4f38 … -33.26475 -33.97025], tavg = Float32[-3.4f38 -3.4f38 … -35.58825 -36.333252; -3.4f38 -3.4f38 … -36.91175 -36.90025; … ; -3.4f38 -3.4f38 … -38.24825 -38.265; -3.4f38 -3.4f38 … -36.39375 -37.145], prec = Int16[-32768 -32768 … 0 0; -32768 -32768 … 0 0; … ; -32768 -32768 … 0 0; -32768 -32768 … 0 0], srad = UInt16[0xffff 0xffff … 0x0000 0x0000; 0xffff 0xffff … 0x0000 0x0000; … ; 0xffff 0xffff … 0x0000 0x0000; 0xffff 0xffff … 0x0000 0x0000], wind = Float32[-3.4f38 -3.4f38 … 2.086 1.98075; -3.4f38 -3.4f38 … 2.0 1.9; … ; -3.4f38 -3.4f38 … 2.5 2.33675; -3.4f38 -3.4f38 … 2.68425 2.5410001], vapr = Float32[-3.4f38 -3.4f38 … 0.0 0.0; -3.4f38 -3.4f38 … 0.0 0.0; … ; -3.4f38 -3.4f38 … 0.01 0.00355; -3.4f38 -3.4f38 … 0.01 0.004225]), (DimensionalData.Dimensions.X{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.X{Colon}}}([-180.0, -179.83333333333334, -179.66666666666666, -179.5, -179.33333333333334, -179.16666666666666, -179.0, -178.83333333333334, -178.66666666666669, -178.5 … 178.33333333333331, 178.5, 178.66666666666666, 178.8333333333333, 178.99999999999997, 179.16666666666663, 179.33333333333334, 179.49999999999997, 179.66666666666666, 179.83333333333331]), DimensionalData.Dimensions.Y{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ReverseOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.Y{Colon}}}([89.83333333333333, 89.66666666666666, 89.5, 89.33333333333333, 89.16666666666666, 89.0, 88.83333333333333, 88.66666666666666, 88.5, 88.33333333333333 … -88.49999999999999, -88.66666666666667, -88.83333333333331, -89.0, -89.16666666666666, -89.33333333333333, -89.49999999999999, -89.66666666666667, -89.83333333333331, -90.0])), (), (tmin = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), tmax = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), tavg = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), prec = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), srad = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), wind = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), vapr = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon()))), DimensionalData.Dimensions.LookupArrays.NoMetadata(), (tmin = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tmin/wc2.1_10m_tmin_06.tif", "scale" => 1.0)), tmax = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tmax/wc2.1_10m_tmax_06.tif", "scale" => 1.0)), tavg = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tavg/wc2.1_10m_tavg_06.tif", "scale" => 1.0)), prec = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/prec/wc2.1_10m_prec_06.tif", "scale" => 1.0)), srad = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/srad/wc2.1_10m_srad_06.tif", "scale" => 1.0)), wind = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/wind/wc2.1_10m_wind_06.tif", "scale" => 1.0)), vapr = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/vapr/wc2.1_10m_vapr_06.tif", "scale" => 1.0))), (tmin = -3.4f38, tmax = -3.4f38, tavg = -3.4f38, prec = -32768, srad = 0xffff, wind = -3.4f38, vapr = -3.4f38))
Rasters.RasterStack{NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), Tuple{Matrix{Float32}, Matrix{Float32}, Matrix{Float32}, Matrix{Int16}, Matrix{UInt16}, Matrix{Float32}, Matrix{Float32}}}, Tuple{DimensionalData.Dimensions.X{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.X{Colon}}}, DimensionalData.Dimensions.Y{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ReverseOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.Y{Colon}}}}, Tuple{}, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), NTuple{7, Tuple{DimensionalData.Dimensions.X{Colon}, DimensionalData.Dimensions.Y{Colon}}}}, DimensionalData.Dimensions.LookupArrays.NoMetadata, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), NTuple{7, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}}}, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), Tuple{Float32, Float32, Float32, Int16, UInt16, Float32, Float32}}}((tmin = Float32[-3.4f38 -3.4f38 … -40.71175 -41.58025; -3.4f38 -3.4f38 … -42.17 -42.19; … ; -3.4f38 -3.4f38 … -43.173252 -43.194; -3.4f38 -3.4f38 … -41.183 -42.041], tmax = Float32[-3.4f38 -3.4f38 … -33.9775 -34.698997; -3.4f38 -3.4f38 … -35.27 -35.26; … ; -3.4f38 -3.4f38 … -36.798 -36.81725; -3.4f38 -3.4f38 … -34.98025 -35.73], tavg = Float32[-3.4f38 -3.4f38 … -37.34475 -38.14675; -3.4f38 -3.4f38 … -38.72 -38.73; … ; -3.4f38 -3.4f38 … -39.98 -40.010498; -3.4f38 -3.4f38 … -38.066498 -38.87975], prec = Int16[-32768 -32768 … 2 2; -32768 -32768 … 2 2; … ; -32768 -32768 … 0 0; -32768 -32768 … 0 0], srad = UInt16[0xffff 0xffff … 0x0000 0x0000; 0xffff 0xffff … 0x0000 0x0000; … ; 0xffff 0xffff … 0x0000 0x0000; 0xffff 0xffff … 0x0000 0x0000], wind = Float32[-3.4f38 -3.4f38 … 2.5605 2.43; -3.4f38 -3.4f38 … 2.5 2.375; … ; -3.4f38 -3.4f38 … 3.4 3.175; -3.4f38 -3.4f38 … 3.5225 3.32825], vapr = Float32[-3.4f38 -3.4f38 … 0.0 0.0; -3.4f38 -3.4f38 … 0.0 0.0; … ; -3.4f38 -3.4f38 … 0.04 0.04; -3.4f38 -3.4f38 … 0.04 0.04]), (DimensionalData.Dimensions.X{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.X{Colon}}}([-180.0, -179.83333333333334, -179.66666666666666, -179.5, -179.33333333333334, -179.16666666666666, -179.0, -178.83333333333334, -178.66666666666669, -178.5 … 178.33333333333331, 178.5, 178.66666666666666, 178.8333333333333, 178.99999999999997, 179.16666666666663, 179.33333333333334, 179.49999999999997, 179.66666666666666, 179.83333333333331]), DimensionalData.Dimensions.Y{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ReverseOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.Y{Colon}}}([89.83333333333333, 89.66666666666666, 89.5, 89.33333333333333, 89.16666666666666, 89.0, 88.83333333333333, 88.66666666666666, 88.5, 88.33333333333333 … -88.49999999999999, -88.66666666666667, -88.83333333333331, -89.0, -89.16666666666666, -89.33333333333333, -89.49999999999999, -89.66666666666667, -89.83333333333331, -90.0])), (), (tmin = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), tmax = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), tavg = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), prec = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), srad = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), wind = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), vapr = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon()))), DimensionalData.Dimensions.LookupArrays.NoMetadata(), (tmin = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tmin/wc2.1_10m_tmin_07.tif", "scale" => 1.0)), tmax = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tmax/wc2.1_10m_tmax_07.tif", "scale" => 1.0)), tavg = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tavg/wc2.1_10m_tavg_07.tif", "scale" => 1.0)), prec = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/prec/wc2.1_10m_prec_07.tif", "scale" => 1.0)), srad = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/srad/wc2.1_10m_srad_07.tif", "scale" => 1.0)), wind = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/wind/wc2.1_10m_wind_07.tif", "scale" => 1.0)), vapr = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/vapr/wc2.1_10m_vapr_07.tif", "scale" => 1.0))), (tmin = -3.4f38, tmax = -3.4f38, tavg = -3.4f38, prec = -32768, srad = 0xffff, wind = -3.4f38, vapr = -3.4f38))
Rasters.RasterStack{NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), Tuple{Matrix{Float32}, Matrix{Float32}, Matrix{Float32}, Matrix{Int16}, Matrix{UInt16}, Matrix{Float32}, Matrix{Float32}}}, Tuple{DimensionalData.Dimensions.X{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.X{Colon}}}, DimensionalData.Dimensions.Y{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ReverseOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.Y{Colon}}}}, Tuple{}, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), NTuple{7, Tuple{DimensionalData.Dimensions.X{Colon}, DimensionalData.Dimensions.Y{Colon}}}}, DimensionalData.Dimensions.LookupArrays.NoMetadata, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), NTuple{7, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}}}, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), Tuple{Float32, Float32, Float32, Int16, UInt16, Float32, Float32}}}((tmin = Float32[-3.4f38 -3.4f38 … -42.604748 -43.514; -3.4f38 -3.4f38 … -44.1155 -44.13; … ; -3.4f38 -3.4f38 … -43.928 -43.954998; -3.4f38 -3.4f38 … -41.891 -42.7625], tmax = Float32[-3.4f38 -3.4f38 … -36.19675 -36.98225; -3.4f38 -3.4f38 … -37.585 -37.595; … ; -3.4f38 -3.4f38 … -37.9495 -37.975; -3.4f38 -3.4f38 … -36.0125 -36.77875], tavg = Float32[-3.4f38 -3.4f38 … -39.38725 -40.242252; -3.4f38 -3.4f38 … -40.8395 -40.855; … ; -3.4f38 -3.4f38 … -40.95125 -40.971; -3.4f38 -3.4f38 … -38.96 -39.77675], prec = Int16[-32768 -32768 … 20 20; -32768 -32768 … 20 20; … ; -32768 -32768 … 7 6; -32768 -32768 … 6 6], srad = UInt16[0xffff 0xffff … 0x0000 0x0000; 0xffff 0xffff … 0x0000 0x0000; … ; 0xffff 0xffff … 0x0000 0x0000; 0xffff 0xffff … 0x0000 0x0000], wind = Float32[-3.4f38 -3.4f38 … 2.94425 2.783; -3.4f38 -3.4f38 … 2.9 2.719; … ; -3.4f38 -3.4f38 … 3.0995 2.86325; -3.4f38 -3.4f38 … 3.1799998 2.9775], vapr = Float32[-3.4f38 -3.4f38 … 0.0 0.0; -3.4f38 -3.4f38 … 0.0 0.0; … ; -3.4f38 -3.4f38 … 0.015 0.0139999995; -3.4f38 -3.4f38 … 0.0156 0.0139999995]), (DimensionalData.Dimensions.X{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.X{Colon}}}([-180.0, -179.83333333333334, -179.66666666666666, -179.5, -179.33333333333334, -179.16666666666666, -179.0, -178.83333333333334, -178.66666666666669, -178.5 … 178.33333333333331, 178.5, 178.66666666666666, 178.8333333333333, 178.99999999999997, 179.16666666666663, 179.33333333333334, 179.49999999999997, 179.66666666666666, 179.83333333333331]), DimensionalData.Dimensions.Y{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ReverseOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.Y{Colon}}}([89.83333333333333, 89.66666666666666, 89.5, 89.33333333333333, 89.16666666666666, 89.0, 88.83333333333333, 88.66666666666666, 88.5, 88.33333333333333 … -88.49999999999999, -88.66666666666667, -88.83333333333331, -89.0, -89.16666666666666, -89.33333333333333, -89.49999999999999, -89.66666666666667, -89.83333333333331, -90.0])), (), (tmin = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), tmax = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), tavg = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), prec = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), srad = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), wind = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), vapr = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon()))), DimensionalData.Dimensions.LookupArrays.NoMetadata(), (tmin = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tmin/wc2.1_10m_tmin_08.tif", "scale" => 1.0)), tmax = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tmax/wc2.1_10m_tmax_08.tif", "scale" => 1.0)), tavg = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tavg/wc2.1_10m_tavg_08.tif", "scale" => 1.0)), prec = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/prec/wc2.1_10m_prec_08.tif", "scale" => 1.0)), srad = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/srad/wc2.1_10m_srad_08.tif", "scale" => 1.0)), wind = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/wind/wc2.1_10m_wind_08.tif", "scale" => 1.0)), vapr = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/vapr/wc2.1_10m_vapr_08.tif", "scale" => 1.0))), (tmin = -3.4f38, tmax = -3.4f38, tavg = -3.4f38, prec = -32768, srad = 0xffff, wind = -3.4f38, vapr = -3.4f38))
Rasters.RasterStack{NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), Tuple{Matrix{Float32}, Matrix{Float32}, Matrix{Float32}, Matrix{Int16}, Matrix{UInt16}, Matrix{Float32}, Matrix{Float32}}}, Tuple{DimensionalData.Dimensions.X{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.X{Colon}}}, DimensionalData.Dimensions.Y{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ReverseOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.Y{Colon}}}}, Tuple{}, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), NTuple{7, Tuple{DimensionalData.Dimensions.X{Colon}, DimensionalData.Dimensions.Y{Colon}}}}, DimensionalData.Dimensions.LookupArrays.NoMetadata, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), NTuple{7, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}}}, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), Tuple{Float32, Float32, Float32, Int16, UInt16, Float32, Float32}}}((tmin = Float32[-3.4f38 -3.4f38 … -39.19775 -40.0525; -3.4f38 -3.4f38 … -40.618 -40.6525; … ; -3.4f38 -3.4f38 … -42.375248 -42.40975; -3.4f38 -3.4f38 … -40.4175 -41.27125], tmax = Float32[-3.4f38 -3.4f38 … -33.014 -33.73825; -3.4f38 -3.4f38 … -34.29 -34.31125; … ; -3.4f38 -3.4f38 … -35.96 -35.99225; -3.4f38 -3.4f38 … -34.14425 -34.882], tavg = Float32[-3.4f38 -3.4f38 … -36.108 -36.89725; -3.4f38 -3.4f38 … -37.455 -37.48425; … ; -3.4f38 -3.4f38 … -39.166252 -39.2; -3.4f38 -3.4f38 … -37.2815 -38.07975], prec = Int16[-32768 -32768 … 2 2; -32768 -32768 … 1 2; … ; -32768 -32768 … 0 0; -32768 -32768 … 0 0], srad = UInt16[0xffff 0xffff … 0x08c1 0x085f; 0xffff 0xffff … 0x08a8 0x085d; … ; 0xffff 0xffff … 0x0a98 0x0a4c; 0xffff 0xffff … 0x0aa6 0x0a46], wind = Float32[-3.4f38 -3.4f38 … 3.0925 2.885; -3.4f38 -3.4f38 … 3.1 2.87275; … ; -3.4f38 -3.4f38 … 3.4 3.1725; -3.4f38 -3.4f38 … 3.38 3.17125], vapr = Float32[-3.4f38 -3.4f38 … 0.0 0.0; -3.4f38 -3.4f38 … 0.0 0.0; … ; -3.4f38 -3.4f38 … 0.0 0.0; -3.4f38 -3.4f38 … 0.0 0.0]), (DimensionalData.Dimensions.X{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.X{Colon}}}([-180.0, -179.83333333333334, -179.66666666666666, -179.5, -179.33333333333334, -179.16666666666666, -179.0, -178.83333333333334, -178.66666666666669, -178.5 … 178.33333333333331, 178.5, 178.66666666666666, 178.8333333333333, 178.99999999999997, 179.16666666666663, 179.33333333333334, 179.49999999999997, 179.66666666666666, 179.83333333333331]), DimensionalData.Dimensions.Y{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ReverseOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.Y{Colon}}}([89.83333333333333, 89.66666666666666, 89.5, 89.33333333333333, 89.16666666666666, 89.0, 88.83333333333333, 88.66666666666666, 88.5, 88.33333333333333 … -88.49999999999999, -88.66666666666667, -88.83333333333331, -89.0, -89.16666666666666, -89.33333333333333, -89.49999999999999, -89.66666666666667, -89.83333333333331, -90.0])), (), (tmin = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), tmax = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), tavg = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), prec = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), srad = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), wind = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), vapr = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon()))), DimensionalData.Dimensions.LookupArrays.NoMetadata(), (tmin = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tmin/wc2.1_10m_tmin_09.tif", "scale" => 1.0)), tmax = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tmax/wc2.1_10m_tmax_09.tif", "scale" => 1.0)), tavg = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tavg/wc2.1_10m_tavg_09.tif", "scale" => 1.0)), prec = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/prec/wc2.1_10m_prec_09.tif", "scale" => 1.0)), srad = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/srad/wc2.1_10m_srad_09.tif", "scale" => 1.0)), wind = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/wind/wc2.1_10m_wind_09.tif", "scale" => 1.0)), vapr = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/vapr/wc2.1_10m_vapr_09.tif", "scale" => 1.0))), (tmin = -3.4f38, tmax = -3.4f38, tavg = -3.4f38, prec = -32768, srad = 0xffff, wind = -3.4f38, vapr = -3.4f38))
Rasters.RasterStack{NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), Tuple{Matrix{Float32}, Matrix{Float32}, Matrix{Float32}, Matrix{Int16}, Matrix{UInt16}, Matrix{Float32}, Matrix{Float32}}}, Tuple{DimensionalData.Dimensions.X{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.X{Colon}}}, DimensionalData.Dimensions.Y{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ReverseOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.Y{Colon}}}}, Tuple{}, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), NTuple{7, Tuple{DimensionalData.Dimensions.X{Colon}, DimensionalData.Dimensions.Y{Colon}}}}, DimensionalData.Dimensions.LookupArrays.NoMetadata, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), NTuple{7, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}}}, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), Tuple{Float32, Float32, Float32, Int16, UInt16, Float32, Float32}}}((tmin = Float32[-3.4f38 -3.4f38 … -33.6825 -34.37175; -3.4f38 -3.4f38 … -35.055 -35.049; … ; -3.4f38 -3.4f38 … -36.685 -36.671; -3.4f38 -3.4f38 … -34.67875 -35.35775], tmax = Float32[-3.4f38 -3.4f38 … -27.21575 -27.8165; -3.4f38 -3.4f38 … -28.36675 -28.385; … ; -3.4f38 -3.4f38 … -30.18 -30.19175; -3.4f38 -3.4f38 … -28.466 -29.0635], tavg = Float32[-3.4f38 -3.4f38 … -30.46525 -31.095749; -3.4f38 -3.4f38 … -31.72625 -31.72; … ; -3.4f38 -3.4f38 … -33.43 -33.435; -3.4f38 -3.4f38 … -31.5685 -32.20975], prec = Int16[-32768 -32768 … 1 1; -32768 -32768 … 1 1; … ; -32768 -32768 … 0 0; -32768 -32768 … 0 0], srad = UInt16[0xffff 0xffff … 0x4082 0x4093; 0xffff 0xffff … 0x4084 0x408f; … ; 0xffff 0xffff … 0x446f 0x44b1; 0xffff 0xffff … 0x4462 0x44ac], wind = Float32[-3.4f38 -3.4f38 … 2.4250002 2.2895; -3.4f38 -3.4f38 … 2.4 2.2432501; … ; -3.4f38 -3.4f38 … 3.1 2.945; -3.4f38 -3.4f38 … 3.15125 2.9924998], vapr = Float32[-3.4f38 -3.4f38 … 0.0 0.0; -3.4f38 -3.4f38 … 0.0 0.0; … ; -3.4f38 -3.4f38 … 0.0 0.0; -3.4f38 -3.4f38 … 0.0 0.0]), (DimensionalData.Dimensions.X{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.X{Colon}}}([-180.0, -179.83333333333334, -179.66666666666666, -179.5, -179.33333333333334, -179.16666666666666, -179.0, -178.83333333333334, -178.66666666666669, -178.5 … 178.33333333333331, 178.5, 178.66666666666666, 178.8333333333333, 178.99999999999997, 179.16666666666663, 179.33333333333334, 179.49999999999997, 179.66666666666666, 179.83333333333331]), DimensionalData.Dimensions.Y{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ReverseOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.Y{Colon}}}([89.83333333333333, 89.66666666666666, 89.5, 89.33333333333333, 89.16666666666666, 89.0, 88.83333333333333, 88.66666666666666, 88.5, 88.33333333333333 … -88.49999999999999, -88.66666666666667, -88.83333333333331, -89.0, -89.16666666666666, -89.33333333333333, -89.49999999999999, -89.66666666666667, -89.83333333333331, -90.0])), (), (tmin = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), tmax = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), tavg = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), prec = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), srad = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), wind = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), vapr = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon()))), DimensionalData.Dimensions.LookupArrays.NoMetadata(), (tmin = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tmin/wc2.1_10m_tmin_10.tif", "scale" => 1.0)), tmax = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tmax/wc2.1_10m_tmax_10.tif", "scale" => 1.0)), tavg = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tavg/wc2.1_10m_tavg_10.tif", "scale" => 1.0)), prec = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/prec/wc2.1_10m_prec_10.tif", "scale" => 1.0)), srad = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/srad/wc2.1_10m_srad_10.tif", "scale" => 1.0)), wind = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/wind/wc2.1_10m_wind_10.tif", "scale" => 1.0)), vapr = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/vapr/wc2.1_10m_vapr_10.tif", "scale" => 1.0))), (tmin = -3.4f38, tmax = -3.4f38, tavg = -3.4f38, prec = -32768, srad = 0xffff, wind = -3.4f38, vapr = -3.4f38))
Rasters.RasterStack{NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), Tuple{Matrix{Float32}, Matrix{Float32}, Matrix{Float32}, Matrix{Int16}, Matrix{UInt16}, Matrix{Float32}, Matrix{Float32}}}, Tuple{DimensionalData.Dimensions.X{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.X{Colon}}}, DimensionalData.Dimensions.Y{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ReverseOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.Y{Colon}}}}, Tuple{}, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), NTuple{7, Tuple{DimensionalData.Dimensions.X{Colon}, DimensionalData.Dimensions.Y{Colon}}}}, DimensionalData.Dimensions.LookupArrays.NoMetadata, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), NTuple{7, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}}}, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), Tuple{Float32, Float32, Float32, Int16, UInt16, Float32, Float32}}}((tmin = Float32[-3.4f38 -3.4f38 … -25.1355 -25.5845; -3.4f38 -3.4f38 … -26.32475 -26.26; … ; -3.4f38 -3.4f38 … -28.405 -28.359999; -3.4f38 -3.4f38 … -26.5525 -27.015999], tmax = Float32[-3.4f38 -3.4f38 … -19.236 -19.611; -3.4f38 -3.4f38 … -20.18925 -20.15; … ; -3.4f38 -3.4f38 … -22.87575 -22.86325; -3.4f38 -3.4f38 … -21.36325 -21.774], tavg = Float32[-3.4f38 -3.4f38 … -22.178999 -22.61325; -3.4f38 -3.4f38 … -23.2525 -23.2255; … ; -3.4f38 -3.4f38 … -25.63325 -25.609749; -3.4f38 -3.4f38 … -23.94775 -24.394], prec = Int16[-32768 -32768 … 0 0; -32768 -32768 … 0 0; … ; -32768 -32768 … 0 0; -32768 -32768 … 0 0], srad = UInt16[0xffff 0xffff … 0x80ca 0x80f2; 0xffff 0xffff … 0x80cb 0x80f3; … ; 0xffff 0xffff … 0x8730 0x87d8; 0xffff 0xffff … 0x8730 0x87cf], wind = Float32[-3.4f38 -3.4f38 … 2.8105 2.639; -3.4f38 -3.4f38 … 2.8 2.6085; … ; -3.4f38 -3.4f38 … 3.0 2.7827501; -3.4f38 -3.4f38 … 3.02 2.825], vapr = Float32[-3.4f38 -3.4f38 … 0.02 0.02; -3.4f38 -3.4f38 … 0.02 0.02; … ; -3.4f38 -3.4f38 … 0.0095 0.0067249998; -3.4f38 -3.4f38 … 0.0095 0.0072999997]), (DimensionalData.Dimensions.X{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.X{Colon}}}([-180.0, -179.83333333333334, -179.66666666666666, -179.5, -179.33333333333334, -179.16666666666666, -179.0, -178.83333333333334, -178.66666666666669, -178.5 … 178.33333333333331, 178.5, 178.66666666666666, 178.8333333333333, 178.99999999999997, 179.16666666666663, 179.33333333333334, 179.49999999999997, 179.66666666666666, 179.83333333333331]), DimensionalData.Dimensions.Y{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ReverseOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.Y{Colon}}}([89.83333333333333, 89.66666666666666, 89.5, 89.33333333333333, 89.16666666666666, 89.0, 88.83333333333333, 88.66666666666666, 88.5, 88.33333333333333 … -88.49999999999999, -88.66666666666667, -88.83333333333331, -89.0, -89.16666666666666, -89.33333333333333, -89.49999999999999, -89.66666666666667, -89.83333333333331, -90.0])), (), (tmin = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), tmax = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), tavg = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), prec = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), srad = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), wind = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), vapr = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon()))), DimensionalData.Dimensions.LookupArrays.NoMetadata(), (tmin = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tmin/wc2.1_10m_tmin_11.tif", "scale" => 1.0)), tmax = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tmax/wc2.1_10m_tmax_11.tif", "scale" => 1.0)), tavg = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tavg/wc2.1_10m_tavg_11.tif", "scale" => 1.0)), prec = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/prec/wc2.1_10m_prec_11.tif", "scale" => 1.0)), srad = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/srad/wc2.1_10m_srad_11.tif", "scale" => 1.0)), wind = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/wind/wc2.1_10m_wind_11.tif", "scale" => 1.0)), vapr = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/vapr/wc2.1_10m_vapr_11.tif", "scale" => 1.0))), (tmin = -3.4f38, tmax = -3.4f38, tavg = -3.4f38, prec = -32768, srad = 0xffff, wind = -3.4f38, vapr = -3.4f38))
Rasters.RasterStack{NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), Tuple{Matrix{Float32}, Matrix{Float32}, Matrix{Float32}, Matrix{Int16}, Matrix{UInt16}, Matrix{Float32}, Matrix{Float32}}}, Tuple{DimensionalData.Dimensions.X{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.X{Colon}}}, DimensionalData.Dimensions.Y{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ReverseOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.Y{Colon}}}}, Tuple{}, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), NTuple{7, Tuple{DimensionalData.Dimensions.X{Colon}, DimensionalData.Dimensions.Y{Colon}}}}, DimensionalData.Dimensions.LookupArrays.NoMetadata, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), NTuple{7, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}}}, NamedTuple{(:tmin, :tmax, :tavg, :prec, :srad, :wind, :vapr), Tuple{Float32, Float32, Float32, Int16, UInt16, Float32, Float32}}}((tmin = Float32[-3.4f38 -3.4f38 … -19.20925 -19.505001; -3.4f38 -3.4f38 … -20.255001 -20.17; … ; -3.4f38 -3.4f38 … -21.9135 -21.85; -3.4f38 -3.4f38 … -20.20075 -20.513], tmax = Float32[-3.4f38 -3.4f38 … -13.805 -14.046; -3.4f38 -3.4f38 … -14.607 -14.5545; … ; -3.4f38 -3.4f38 … -16.751251 -16.720001; -3.4f38 -3.4f38 … -15.424251 -15.701], tavg = Float32[-3.4f38 -3.4f38 … -16.50725 -16.7755; -3.4f38 -3.4f38 … -17.432 -17.36075; … ; -3.4f38 -3.4f38 … -19.3275 -19.27975; -3.4f38 -3.4f38 … -17.808 -18.091], prec = Int16[-32768 -32768 … 0 0; -32768 -32768 … 0 0; … ; -32768 -32768 … 0 0; -32768 -32768 … 0 0], srad = UInt16[0xffff 0xffff … 0x9290 0x9379; 0xffff 0xffff … 0x92bb 0x9390; … ; 0xffff 0xffff … 0xa477 0xa7f8; 0xffff 0xffff … 0xa43f 0xa7ee], wind = Float32[-3.4f38 -3.4f38 … 2.0 1.82775; -3.4f38 -3.4f38 … 2.0 1.816; … ; -3.4f38 -3.4f38 … 2.036 1.9; -3.4f38 -3.4f38 … 2.0614998 1.90575], vapr = Float32[-3.4f38 -3.4f38 … 0.12284999 0.1205; -3.4f38 -3.4f38 … 0.122499995 0.12015; … ; -3.4f38 -3.4f38 … 0.12785 0.113; -3.4f38 -3.4f38 … 0.12755 0.113699995]), (DimensionalData.Dimensions.X{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.X{Colon}}}([-180.0, -179.83333333333334, -179.66666666666666, -179.5, -179.33333333333334, -179.16666666666666, -179.0, -178.83333333333334, -178.66666666666669, -178.5 … 178.33333333333331, 178.5, 178.66666666666666, 178.8333333333333, 178.99999999999997, 179.16666666666663, 179.33333333333334, 179.49999999999997, 179.66666666666666, 179.83333333333331]), DimensionalData.Dimensions.Y{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ReverseOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.Y{Colon}}}([89.83333333333333, 89.66666666666666, 89.5, 89.33333333333333, 89.16666666666666, 89.0, 88.83333333333333, 88.66666666666666, 88.5, 88.33333333333333 … -88.49999999999999, -88.66666666666667, -88.83333333333331, -89.0, -89.16666666666666, -89.33333333333333, -89.49999999999999, -89.66666666666667, -89.83333333333331, -90.0])), (), (tmin = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), tmax = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), tavg = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), prec = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), srad = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), wind = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon())), vapr = (DimensionalData.Dimensions.X{Colon}(Colon()), DimensionalData.Dimensions.Y{Colon}(Colon()))), DimensionalData.Dimensions.LookupArrays.NoMetadata(), (tmin = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tmin/wc2.1_10m_tmin_12.tif", "scale" => 1.0)), tmax = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tmax/wc2.1_10m_tmax_12.tif", "scale" => 1.0)), tavg = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/tavg/wc2.1_10m_tavg_12.tif", "scale" => 1.0)), prec = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/prec/wc2.1_10m_prec_12.tif", "scale" => 1.0)), srad = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/srad/wc2.1_10m_srad_12.tif", "scale" => 1.0)), wind = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/wind/wc2.1_10m_wind_12.tif", "scale" => 1.0)), vapr = DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}(Dict{String, Any}("units" => "", "offset" => 0.0, "filepath" => "../WorldClim/Climate/vapr/wc2.1_10m_vapr_12.tif", "scale" => 1.0))), (tmin = -3.4f38, tmax = -3.4f38, tavg = -3.4f38, prec = -32768, srad = 0xffff, wind = -3.4f38, vapr = -3.4f38))
These are RasterStacks, which are basically a collection of associated rasters. We can get individual rasters from these stacks:
worldclim_stacks[1].tmax
2160×1080 Raster{Float32,2} tmax with dimensions:
X Projected{Float64} LinRange{Float64}(-180.0, 179.833, 2160) ForwardOrdered Regular Intervals crs: WellKnownText,
Y Projected{Float64} LinRange{Float64}(89.8333, -90.0, 1080) ReverseOrdered Regular Intervals crs: WellKnownText
extent: Extent(X = (-180.0, 179.99999999999997), Y = (-90.0, 90.0))missingval: -3.4f38crs: GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]
parent:
89.8333 89.6667 89.5 … -89.6667 -89.8333 -90.0
-180.0 -3.4f38 -3.4f38 -3.4f38 -15.603 -13.992 -14.263
-179.833 -3.4f38 -3.4f38 -3.4f38 -16.155 -14.7885 -14.76
-179.667 -3.4f38 -3.4f38 -3.4f38 -16.155 -14.793 -14.76
-179.5 -3.4f38 -3.4f38 -3.4f38 -16.1555 -14.7945 -14.76
-179.333 -3.4f38 -3.4f38 -3.4f38 … -16.16 -14.7995 -14.76
⋮ ⋱ ⋮
179.0 -3.4f38 -3.4f38 -3.4f38 -18.607 -17.0483 -17.013
179.167 -3.4f38 -3.4f38 -3.4f38 -18.5917 -17.0345 -17.0005
179.333 -3.4f38 -3.4f38 -3.4f38 -18.582 -17.028 -17.0
179.5 -3.4f38 -3.4f38 -3.4f38 … -18.5627 -17.0228 -17.0
179.667 -3.4f38 -3.4f38 -3.4f38 -18.549 -17.0005 -16.991
179.833 -3.4f38 -3.4f38 -3.4f38 -17.4212 -15.6795 -15.9583
In order to get them into a form which we can use directly with Makie, we can call Makie.convert_arguments
directly on individual rasters from these stacks.
This will return a tuple of (x::Vector, y::Vector, z::Matrix)
, where z
are the values of the raster at the points (x, y)
. This is the format that we can supply directly to Makie.
Makie.convert_arguments(Makie.ContinuousSurface(), worldclim_stacks[1].tmax)
(LinRange{Float64}(-180.0, 179.83333333333331, 2160), LinRange{Float64}(89.83333333333333, -90.0, 1080), Float32[NaN NaN … -13.992 -14.263; NaN NaN … -14.7885 -14.759999; … ; NaN NaN … -17.0005 -16.991; NaN NaN … -15.6795 -15.95825])
Let's extract two variables from this stack, the maximum temperature (:tmax
), and the precipitation (:prec
).
temp_rasters = getproperty.(worldclim_stacks, :tmax)
prec_rasters = getproperty.(worldclim_stacks, :prec)
12-element Vector{Rasters.Raster{Int16, 2, Tuple{DimensionalData.Dimensions.X{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.X{Colon}}}, DimensionalData.Dimensions.Y{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ReverseOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.Y{Colon}}}}, Tuple{}, Matrix{Int16}, Symbol, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, Int16}}:
[-32768 -32768 … 0 0; -32768 -32768 … 0 0; … ; -32768 -32768 … 0 0; -32768 -32768 … 0 0]
[-32768 -32768 … 0 0; -32768 -32768 … 0 0; … ; -32768 -32768 … 0 0; -32768 -32768 … 0 0]
[-32768 -32768 … 2 2; -32768 -32768 … 2 2; … ; -32768 -32768 … 0 0; -32768 -32768 … 0 0]
[-32768 -32768 … 6 7; -32768 -32768 … 6 6; … ; -32768 -32768 … 0 0; -32768 -32768 … 0 0]
[-32768 -32768 … 7 9; -32768 -32768 … 6 7; … ; -32768 -32768 … 0 0; -32768 -32768 … 0 1]
[-32768 -32768 … 0 0; -32768 -32768 … 0 0; … ; -32768 -32768 … 0 0; -32768 -32768 … 0 0]
[-32768 -32768 … 2 2; -32768 -32768 … 2 2; … ; -32768 -32768 … 0 0; -32768 -32768 … 0 0]
[-32768 -32768 … 20 20; -32768 -32768 … 20 20; … ; -32768 -32768 … 7 6; -32768 -32768 … 6 6]
[-32768 -32768 … 2 2; -32768 -32768 … 1 2; … ; -32768 -32768 … 0 0; -32768 -32768 … 0 0]
[-32768 -32768 … 1 1; -32768 -32768 … 1 1; … ; -32768 -32768 … 0 0; -32768 -32768 … 0 0]
[-32768 -32768 … 0 0; -32768 -32768 … 0 0; … ; -32768 -32768 … 0 0; -32768 -32768 … 0 0]
[-32768 -32768 … 0 0; -32768 -32768 … 0 0; … ; -32768 -32768 … 0 0; -32768 -32768 … 0 0]
Interpolating Rasters in time¤
This is good data, but we only have twelve time points. If we want a smooth animation, we could interpolate them.
Let's take advantage of Julia's easy interoperability, and use a totally different package, which has no idea that Rasters.jl exists, but works with it thanks to the generic nature of well-written Julia code!
Here, we're performing a quadratic interpolation across the timeseries of rasters.
temp_interpolated = DataInterpolations.QuadraticInterpolation(temp_rasters, 1:length(temp_rasters))
prec_interpolated = DataInterpolations.QuadraticInterpolation(prec_rasters, 1:length(temp_rasters))
24-element DataInterpolations.QuadraticInterpolation{Vector{Rasters.Raster{Int16, 2, Tuple{DimensionalData.Dimensions.X{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.X{Colon}}}, DimensionalData.Dimensions.Y{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ReverseOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.Y{Colon}}}}, Tuple{}, Matrix{Int16}, Symbol, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, Int16}}, Vector{Int64}, true, Rasters.Raster{Int16, 2, Tuple{DimensionalData.Dimensions.X{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.X{Colon}}}, DimensionalData.Dimensions.Y{Rasters.Projected{Float64, LinRange{Float64, Int64}, DimensionalData.Dimensions.LookupArrays.ReverseOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Float64}, DimensionalData.Dimensions.LookupArrays.Intervals{DimensionalData.Dimensions.LookupArrays.Start}, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, GeoFormatTypes.WellKnownText{GeoFormatTypes.CRS}, Nothing, DimensionalData.Dimensions.Y{Colon}}}}, Tuple{}, Matrix{Int16}, Symbol, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, Int16}}:
[-32768 -32768 … 0 0; -32768 -32768 … 0 0; … ; -32768 -32768 … 0 0; -32768 -32768 … 0 0]
[-32768 -32768 … 0 0; -32768 -32768 … 0 0; … ; -32768 -32768 … 0 0; -32768 -32768 … 0 0]
[-32768 -32768 … 2 2; -32768 -32768 … 2 2; … ; -32768 -32768 … 0 0; -32768 -32768 … 0 0]
[-32768 -32768 … 6 7; -32768 -32768 … 6 6; … ; -32768 -32768 … 0 0; -32768 -32768 … 0 0]
[-32768 -32768 … 7 9; -32768 -32768 … 6 7; … ; -32768 -32768 … 0 0; -32768 -32768 … 0 1]
[-32768 -32768 … 0 0; -32768 -32768 … 0 0; … ; -32768 -32768 … 0 0; -32768 -32768 … 0 0]
[-32768 -32768 … 2 2; -32768 -32768 … 2 2; … ; -32768 -32768 … 0 0; -32768 -32768 … 0 0]
[-32768 -32768 … 20 20; -32768 -32768 … 20 20; … ; -32768 -32768 … 7 6; -32768 -32768 … 6 6]
[-32768 -32768 … 2 2; -32768 -32768 … 1 2; … ; -32768 -32768 … 0 0; -32768 -32768 … 0 0]
[-32768 -32768 … 1 1; -32768 -32768 … 1 1; … ; -32768 -32768 … 0 0; -32768 -32768 … 0 0]
⋮
4
5
6
7
8
9
10
11
12
This returned an interpolation object which can be called with any time value (as temp_interpolated(1.5)
) between those it's given in the second parameter of the call.
A simple animation¤
Let's see if this interpolation worked. We create a figure to animate:
fig, ax, plt = surface(temp_interpolated(1.0); transparency=true,
axis = (; type = Axis3,
perspectiveness = 0.5,
azimuth = -0.5,
elevation = 0.57,
aspect = (1, 1, 1)),
figure =(;resolution = (800, 800))
)
hm = heatmap!(ax, temp_interpolated(1.0); nan_color = :black)
translate!(hm, 0, 0, -30) # get the heatmap to the bottom of the plot
Now that the figure has been created, we can animate and record it.
This is done using Makie's record
convenience function, which can iterate through a range, and capture each frame and stitch it into an animation (using FFMpeg) automatically!
We use the @time
macro to time how long the recording takes (note that this is on a device without a GPU, it will be significantly faster with one).
@time record(fig, "temperature_surface_animation.mp4", LinRange(1, 12, 480÷4); framerate = 30) do i
ax.title[] = @sprintf "%.2f" i
plt.input_args[1][] = temp_interpolated(i)
hm.input_args[1][] = temp_interpolated(i)
end;
464.391952 seconds (1.86 M allocations: 30.372 GiB, 0.62% gc time)
Animating a 3-D globe¤
The last animation was pretty cool! But let's do something a little more 3D.
We can plot these fields on a sphere, so it looks like the actual Earth!
This is done by plotting the rasters on a spherical mesh, which we can color using a matrix of color values as a "texture" (in computer graphics terminology).
We want to represent the Earth as a sphere, so we tesselate (break up in to triangles) a sphere, which represents Earth, into a mesh.
Makie uses GeometryBasics.jl to represent geometries, and it has very simple and efficient routines to create meshes from simple shapes!
m = Makie.GeometryBasics.uv_normal_mesh(
Makie.GeometryBasics.Tesselation(
Makie.GeometryBasics.Sphere(
Point3f(0), 1f0
),
200
)
);
Now, we can decompose this mesh into its vertices, uv coordinates, and normals.
- The vertices of the mesh are the coordinates of the points on the sphere.
- "UV coordinates" are 2-vectors, going from 0 to 1. Each vertex has an associated UV coordinate. They provide the link between a mesh and how an image texture, like the raster we're going to color the mesh by, gets applied onto that mesh.
p = decompose(Point3f0, m)
uv = decompose_uv(m)
norms = decompose_normals(m);
Now, we move to the visualization!
Let's first define a colormap which we'll use to plot:
cmap = [:darkblue, :deepskyblue2, :deepskyblue, :gold, :tomato3, :red, :darkred]
7-element Vector{Symbol}:
:darkblue
:deepskyblue2
:deepskyblue
:gold
:tomato3
:red
:darkred
this colormap is fun, but its confusing when including also the one for precipitation.
We create the Figure, which is the top-level object in Makie, and holds the axis which holds our plots.
fig = Figure(resolution = (800,800), backgroundcolor=:snow2)
First, we plot an empty the sphere
ax, plt_obj = mesh(fig[1,1], uv_normal_mesh(Tesselation(Sphere(Point3f(0), 0.99),128));
color = (:white,0.1), transparency=true,
axis = (type = LScene, show_axis = false)
)
Makie.AxisPlot(Makie.LScene(), MakieCore.Mesh{Tuple{GeometryBasics.Mesh{3, Float32, GeometryBasics.TriangleP{3, Float32, GeometryBasics.PointMeta{3, Float32, GeometryBasics.Point{3, Float32}, (:uv, :normals), Tuple{GeometryBasics.Vec{2, Float32}, GeometryBasics.Vec{3, Float32}}}}, GeometryBasics.FaceView{GeometryBasics.TriangleP{3, Float32, GeometryBasics.PointMeta{3, Float32, GeometryBasics.Point{3, Float32}, (:uv, :normals), Tuple{GeometryBasics.Vec{2, Float32}, GeometryBasics.Vec{3, Float32}}}}, GeometryBasics.PointMeta{3, Float32, GeometryBasics.Point{3, Float32}, (:uv, :normals), Tuple{GeometryBasics.Vec{2, Float32}, GeometryBasics.Vec{3, Float32}}}, GeometryBasics.NgonFace{3, GeometryBasics.OffsetInteger{-1, UInt32}}, StructArrays.StructVector{GeometryBasics.PointMeta{3, Float32, GeometryBasics.Point{3, Float32}, (:uv, :normals), Tuple{GeometryBasics.Vec{2, Float32}, GeometryBasics.Vec{3, Float32}}}, NamedTuple{(:position, :uv, :normals), Tuple{Vector{GeometryBasics.Point{3, Float32}}, Vector{GeometryBasics.Vec{2, Float32}}, Vector{GeometryBasics.Vec{3, Float32}}}}, Int64}, Vector{GeometryBasics.NgonFace{3, GeometryBasics.OffsetInteger{-1, UInt32}}}}}}})
Then, we plot the sphere, which displays temperature.
temperature_plot = mesh!(
m;
color = Makie.convert_arguments(Makie.ContinuousSurface(), worldclim_stacks[10].tmax)[3]',
colorrange = (-50, 50),
colormap = :tableau_temperature, #cmap,
shading = true,
transparency=false,
)
fig
Note how we defined the color! We called Makie.convert_arguments
on a Raster
to get a tuple of (x, y, z)
, then used the z
matrix as a texture to color the mesh.
The auto-generated UV coordinates are in the convention which devices use, and are actually swapped from the dimensions of column-major matrices in Julia. That's why we have to transpose the matrix we get from convert_arguments
.
Next, we plot the water as a meshscatter plot, in this case kind of like a 3-D barplot on the sphere.
This is a simple utility function which retrieves the water values from the raster, and resamples them to the mesh's nonlinear grid.
function watermap(uv, water, normalization = 908f0 * 4f0)
markersize = map(uv) do uv
wsize = reverse(size(water))
wh = wsize .- 1
x, y = round.(Int, Tuple(uv) .* wh) .+ 1
val = water[size(water)[1] - (y - 1), x] / normalization
(isnan(val) || (val < 0.0)) ? -1f0 : val
end
end
watermap (generic function with 2 methods)
We don't want to call convert_arguments
all the time, so let's define a convenience function to do it:
raster2array(raster) = Makie.convert_arguments(Makie.ContinuousSurface(), raster)[3]
watervals = watermap(uv, raster2array(worldclim_stacks[1].prec)')
40000-element Vector{Float32}:
-1.0
-1.0
-1.0
-1.0
-1.0
-1.0
-1.0
-1.0
-1.0
-1.0
⋮
-1.0
-1.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
Let's finally plot the meshscatter!
xy_width = 0.01
prec_plot = meshscatter!(
p, # the positions of the tessellated mesh we got last time
rotations = norms, # rotate according to the normal vector, pointing out of the sphere
marker = Rect3(Vec3f(0), Vec3f(1)), # unit box
markersize = Vec3f0.(xy_width, xy_width, max.(0,watervals)), # scale by 0.01 in x and y, and `watervals` in z
color = max.(0,watervals),
colorrange= (0, 0.2),
colormap = [(:red, 0.01), (:dodgerblue, 0.7)],
shading = false,
transparency=true,
)
Before we animate, we could change the camera angles with:
#eye_position = Vec3f(0.31496838, -1.1342758, 2.535153)
#lookat = Vec3f(0.084392734, -0.011545606, 0.12137972)
#upvector = Vec3f(0.29894897, 0.71282643, 0.6344353)
#update_cam!(ax.scene, eye_position, lookat, upvector)
Let's also add a little title which tells us which season we're in:
title_label = Label(fig[0, 1]; tellwidth = false, font = :bold, fontsize = 20)
Colorbar(fig[1,2], temperature_plot, label="Temperature", height = Relative(0.5))
Colorbar(fig[2,1], prec_plot, label="Precipitation", width = Relative(0.5), vertical=false)
zoom!(ax.scene, cameracontrols(ax.scene), 0.65)
Now, we animate the water and temperature plots!
record(fig, "worldclim_visualization.mp4", LinRange(1, 24, 600÷4); framerate = 24) do i
title_label.text[] = @sprintf "%.2f" (i % 12)
temperature_plot.color[] = raster2array(temp_interpolated(i % 12))'
watervals = max.(0, watermap(uv, raster2array(prec_interpolated(i % 12))'))
prec_plot.color[] = watervals
prec_plot.markersize[] .= Vec3f0.(xy_width, xy_width, watervals)
# since we modify markersize inplace above, we need to notify the signal
rotate!(ax.scene, i/8)
notify(prec_plot.markersize)
end;
This example, and some of the development work which made it possible, was funded by the xKDR Forum.
This page was generated using Literate.jl.