Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Zonal function - TaskFailedException #438

Closed
pierrethiriet opened this issue May 4, 2023 · 13 comments · Fixed by #442
Closed

Zonal function - TaskFailedException #438

pierrethiriet opened this issue May 4, 2023 · 13 comments · Fixed by #442

Comments

@pierrethiriet
Copy link

I am using zonal to get the mean of slopes for agricultural plots (data from https://www.ign.fr/)

# Virtual raster of slope
slope = Raster("path_to_slope_raster.vrt")
# Plot as polygons
dataset = ArchGDAL.read("path_to_agri_plot_shape.gpkg")
rpg = DataFrames.DataFrame(ArchGDAL.getlayer(dataset, 0))
rename!(rpg, :geom => :geometry)

The zonal function returns a conversion error when passing the whole shape of plots:

rpg_slope_mean_1 = zonal(mean, slope; of=rpg, boundary=:touches)

TaskFailedException
nested task error: MethodError: Cannot convert an object of type Missing to an object of type Float32

It succeeds for a subset of rows below an indexes under 800, but any subset above fails.
While there is no issue when applying the zonal to features individually.

rpg_slope_mean_2 = [zonal(mean, slope; of=rpg.geometry[i], boundary=:touches) for i in 1:size(rpg,1)]

The issue should not be then related to the raster or shape.
For now, I am using the second solution, but it seems quite slower.

Side question: Is it possible to pass several functions directly to the zonal (min, max, mean, for example), or is it more efficient to reapply several times the zonal?
Thanks.

@rafaqz
Copy link
Owner

rafaqz commented May 4, 2023

Please put the file downloads in the script so its fully self contained and I can copy and paste snd run it.

I will not have time to find those files.

@pierrethiriet
Copy link
Author

Please find the file here:
https://we.tl/t-EplNlryJwz?utm_campaign=TRN_TDL_05&utm_source=sendgrid&utm_medium=email&trk=TRN_TDL_05

using Rasters
using CairoMakie
using ArchGDAL
using DataFrames
using Statistics

# Slope export folder
slope_folder = "main_path"
# Slope VRT
slope_vrt = "index_slope.vrt"

# Load slope
slope = Raster(joinpath(slope_folder, slope_vrt), crs = EPSG(2154))

# Load RPG
dataset = ArchGDAL.read(joinpath(slope_folder, "rpg.gpkg"))

rpg = DataFrames.DataFrame(ArchGDAL.getlayer(dataset, 0))
rename!(rpg, :geom => :geometry)

rpg_slope_mean_1 = zonal(mean, slope; of=rpg, boundary=:touches)

rpg_slope_mean_2 = [zonal(mean, slope; of=rpg.geometry[i], boundary=:touches) for i in 1:size(rpg,1)]

Thanks

@rafaqz
Copy link
Owner

rafaqz commented May 4, 2023

Can you put the file download in the script and run it from start to finish and include its output. So you can verify befire I try it. A full MWE makes my life so much easier

@pierrethiriet
Copy link
Author

Sorry, my bad...
The following example should work straight away.
https://we.tl/t-pxCFATFLbz?utm_campaign=TRN_TDL_05&utm_source=sendgrid&utm_medium=email&trk=TRN_TDL_05

@pierrethiriet
Copy link
Author

@rafaqz
Copy link
Owner

rafaqz commented May 4, 2023

I'm not able to load your file either with Rasters.jl or ArchGDAL.jl directly, something is broken with it.

Its actually really important to follow all the instructions in the template for me to be able to solve your problem, they are very specific because this happens all the time. So please:

  1. Paste a completely self-contained code including any download/unzip of files and running up until the error, right here in a comment, in a code block.
  2. Run the entire code, and only that code, yourself in a fresh julia session, and paste the output here.
  3. Share you julia version and Rasters.jl package version.

Then we can be fairly confident its reproducible.

@pierrethiriet
Copy link
Author

I apologize for my misuse of the GitHub issues template.
At the same time, trying to make a self-contained, reproducible example makes the simpler version of the script work with Julia 1.8.5, ArchGDAL v0.10.1, Rasters v0.6.1, DataFrames v1.5.0.

using Downloads
using Rasters
using ArchGDAL
using DataFrames
using Statistics

# Load slope rasters
println("load raster")
slope_url = "https://www.dropbox.com/s/mu7so62hqde868m/BDALTIV2_25M_FXX_0825_6525_MNT_LAMB93_IGN69_slope.tif?dl=0";
slope_file = Downloads.download(slope_url);
slope = Raster(slope_file, crs = EPSG(2154));

# Load RPG shapes
println("load vector")
rpg_url = "https://www.dropbox.com/s/1narkro2bdt12vn/rpg_1.gpkg?dl=0";
rpg_file = Downloads.download(rpg_url);
dataset = ArchGDAL.read(rpg_file);
rpg = DataFrames.DataFrame(ArchGDAL.getlayer(dataset, 0));
rename!(rpg, :geom => :geometry);

# Get zonal statistics
println("Stat zonal")
rpg_slope_mean = zonal(mean, slope; of=rpg, boundary=:touches)

Note: the same script on locale files was previously failing but now works too (problem of fresh Julia ?).

But, with the initial script (.vrt instead of .tif or problem size ?), the issue remains. I am still struggling to find a way to share the .vrt due to the nature of the type of file and the low internet bandwidth I have now.
I try to update the problem asap.
Thanks.

@rafaqz
Copy link
Owner

rafaqz commented May 4, 2023

Thanks for the update, and no worries at all, at least it demonstrates the reproducibility problem now.

@pierrethiriet
Copy link
Author

So, here are a version with bigger files that fail...
Julia 1.8.5, ArchGDAL v0.10.1, Rasters v0.6.1, DataFrames v1.5.0.

using Downloads
using Rasters
using ArchGDAL
using DataFrames
using Statistics

# Load slope rasters
println("load raster")
slope_url = "https://www.dropbox.com/s/xu8232h5cuym3us/slope_big.tif?dl=0";
slope_file = Downloads.download(slope_url);
slope = Raster(slope_file, crs = EPSG(2154));

# Load RPG shapes
println("load vector")
rpg_url = "https://www.dropbox.com/s/bl96xbez3ppwfg2/rpg.gpkg?dl=0";
rpg_file = Downloads.download(rpg_url);
dataset = ArchGDAL.read(rpg_file);
rpg = DataFrames.DataFrame(ArchGDAL.getlayer(dataset, 0));
rename!(rpg, :geom => :geometry);

# Get zonal statistics
println("Stat zonal")
# Version 1
rpg_slope_mean_1 = zonal(mean, slope; of=rpg, boundary=:touches)

# Version 2
rpg_slope_mean_2 = [zonal(mean, slope; of=rpg.geometry[i], boundary=:touches) for i in 1:size(rpg,1)]

And here are the output

load raster
load vector
Stat zonal
Applying mean to each geometry...   0%|█                                                 |  ETA: 1 days, 5:21:28ERROR: TaskFailedException
Stacktrace:
 [1] wait
   @ .\task.jl:345 [inlined]
 [2] threading_run(fun::Rasters.var"#765#threadsfor_fun#806"{Rasters.var"#765#threadsfor_fun#805#807"{Bool, Base.Pairs{Symbol, Symbol, Tuple{Symbol}, NamedTuple{(:boundary,), Tuple{Symbol}}}, typeof(mean), Raster{Float32, 3, Tuple{X{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}}, EPSG, Nothing, X{Colon}}}, Y{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}}, EPSG, Nothing, Y{Colon}}}, Band{DimensionalData.Dimensions.LookupArrays.Categorical{Int64, UnitRange{Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.NoMetadata}}}, Tuple{}, Array{Float32, 3}, Symbol, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, Float32}, Vector{ArchGDAL.IGeometry{ArchGDAL.wkbPolygon}}, ProgressMeter.Progress, Vector{Float32}, Base.OneTo{Int64}}}, static::Bool)
   @ Base.Threads .\threadingconstructs.jl:38
 [3] macro expansion
   @ .\threadingconstructs.jl:89 [inlined]
 [4] _zonal(f::Function, x::Raster{Float32, 3, Tuple{X{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}}, EPSG, Nothing, X{Colon}}}, Y{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}}, EPSG, Nothing, Y{Colon}}}, Band{DimensionalData.Dimensions.LookupArrays.Categorical{Int64, UnitRange{Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.NoMetadata}}}, Tuple{}, Array{Float32, 3}, Symbol, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, Float32}, ::Nothing, geoms::Vector{ArchGDAL.IGeometry{ArchGDAL.wkbPolygon}}; progress::Bool, kw::Base.Pairs{Symbol, Symbol, Tuple{Symbol}, NamedTuple{(:boundary,), Tuple{Symbol}}})
   @ Rasters C:\Users\pthir\.julia\packages\Rasters\61sPZ\src\methods\zonal.jl:121
 [5] _zonal(f::Function, x::Raster{Float32, 3, Tuple{X{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}}, EPSG, Nothing, X{Colon}}}, Y{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}}, EPSG, Nothing, Y{Colon}}}, Band{DimensionalData.Dimensions.LookupArrays.Categorical{Int64, UnitRange{Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.NoMetadata}}}, Tuple{}, Array{Float32, 3}, Symbol, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, Float32}, of::DataFrame; kw::Base.Pairs{Symbol, Symbol, Tuple{Symbol}, NamedTuple{(:boundary,), Tuple{Symbol}}})
   @ Rasters C:\Users\pthir\.julia\packages\Rasters\61sPZ\src\methods\zonal.jl:91
 [6] #zonal#792
   @ C:\Users\pthir\.julia\packages\Rasters\61sPZ\src\methods\zonal.jl:73 [inlined]
 [7] top-level scope
   @ c:\Users\pthir\Desktop\slope - Copie\RPG_ZoneStat.jl:24

    nested task error: MethodError: Cannot `convert` an object of type Missing to an object of type Float32
    Closest candidates are:
      convert(::Type{T}, ::ColorTypes.Gray24) where T<:Real at C:\Users\pthir\.julia\packages\ColorTypes\1dGw6\src\conversions.jl:114
      convert(::Type{T}, ::ColorTypes.Gray) where T<:Real at C:\Users\pthir\.julia\packages\ColorTypes\1dGw6\src\conversions.jl:113
      convert(::Type{T}, ::Base.TwicePrecision) where T<:Number at twiceprecision.jl:273
      ...
    Stacktrace:
     [1] setindex!(A::Vector{Float32}, x::Missing, i1::Int64)
       @ Base .\array.jl:966
     [2] macro expansion
       @ C:\Users\pthir\.julia\packages\Rasters\61sPZ\src\methods\zonal.jl:122 [inlined]
     [3] (::Rasters.var"#765#threadsfor_fun#806"{Rasters.var"#765#threadsfor_fun#805#807"{Bool, Base.Pairs{Symbol, Symbol, Tuple{Symbol}, NamedTuple{(:boundary,), Tuple{Symbol}}}, typeof(mean), Raster{Float32, 3, Tuple{X{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}}, EPSG, Nothing, X{Colon}}}, Y{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}}, EPSG, Nothing, Y{Colon}}}, Band{DimensionalData.Dimensions.LookupArrays.Categorical{Int64, UnitRange{Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.NoMetadata}}}, Tuple{}, Array{Float32, 3}, Symbol, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, Float32}, Vector{ArchGDAL.IGeometry{ArchGDAL.wkbPolygon}}, ProgressMeter.Progress, Vector{Float32}, Base.OneTo{Int64}}})(tid::Int64; onethread::Bool)
       @ Rasters .\threadingconstructs.jl:84
     [4] #765#threadsfor_fun
       @ .\threadingconstructs.jl:51 [inlined]
     [5] (::Base.Threads.var"#1#2"{Rasters.var"#765#threadsfor_fun#806"{Rasters.var"#765#threadsfor_fun#805#807"{Bool, Base.Pairs{Symbol, Symbol, Tuple{Symbol}, NamedTuple{(:boundary,), Tuple{Symbol}}}, typeof(mean), Raster{Float32, 3, Tuple{X{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}}, EPSG, Nothing, X{Colon}}}, Y{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}}, EPSG, Nothing, Y{Colon}}}, Band{DimensionalData.Dimensions.LookupArrays.Categorical{Int64, UnitRange{Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.NoMetadata}}}, Tuple{}, Array{Float32, 3}, Symbol, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, Float32}, Vector{ArchGDAL.IGeometry{ArchGDAL.wkbPolygon}}, ProgressMeter.Progress, Vector{Float32}, Base.OneTo{Int64}}}, Int64})()
       @ Base.Threads .\threadingconstructs.jl:30

@felixcremer
Copy link
Contributor

For me it seems that you have missing values in your data. Could you use x->mean(skipmissing(x)) as your inner function?

@pierrethiriet
Copy link
Author

Well, it was I thought at the begining, but it seems not the problem...
It fails the same way. But similarly, runing the script on each feature individually ([zonal(mean, slope; of=rpg.geometry[i], boundary=:touches) for i in 1:size(rpg,1)]) work well.
Maybe the geometries ? But they are considered valid for GEOS.

using Downloads
using Rasters
using ArchGDAL
using DataFrames
using Statistics

# Load slope rasters
println("load raster")
slope_url = "https://www.dropbox.com/s/xu8232h5cuym3us/slope_big.tif?dl=0";
slope_file = Downloads.download(slope_url);
slope = Raster(slope_file, crs = EPSG(2154));

# Load RPG shapes
println("load vector")
rpg_url = "https://www.dropbox.com/s/bl96xbez3ppwfg2/rpg.gpkg?dl=0";
rpg_file = Downloads.download(rpg_url);
dataset = ArchGDAL.read(rpg_file);
rpg = DataFrames.DataFrame(ArchGDAL.getlayer(dataset, 0));
rename!(rpg, :geom => :geometry);

# Get zonal statistics
println("Stat zonal")
# Version 1
rpg_slope_mean_1 = zonal(x->mean(skipmissing(x)), slope; of=rpg, boundary=:touches)

Output:

load raster
load vector
Stat zonal
Applying #5 to each geometry...   0%|█                                                 |  ETA: 1 days, 6:45:56ERROR: TaskFailedException
Stacktrace:
 [1] wait
   @ .\task.jl:345 [inlined]
 [2] threading_run(fun::Rasters.var"#765#threadsfor_fun#806"{Rasters.var"#765#threadsfor_fun#805#807"{Bool, Base.Pairs{Symbol, Symbol, Tuple{Symbol}, NamedTuple{(:boundary,), Tuple{Symbol}}}, var"#5#6", Raster{Float32, 3, Tuple{X{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}}, EPSG, Nothing, X{Colon}}}, Y{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}}, EPSG, Nothing, Y{Colon}}}, Band{DimensionalData.Dimensions.LookupArrays.Categorical{Int64, UnitRange{Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.NoMetadata}}}, Tuple{}, Array{Float32, 3}, Symbol, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, Float32}, Vector{ArchGDAL.IGeometry{ArchGDAL.wkbPolygon}}, ProgressMeter.Progress, Vector{Float32}, Base.OneTo{Int64}}}, static::Bool)
   @ Base.Threads .\threadingconstructs.jl:38
 [3] macro expansion
   @ .\threadingconstructs.jl:89 [inlined]
 [4] _zonal(f::Function, x::Raster{Float32, 3, Tuple{X{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}}, EPSG, Nothing, X{Colon}}}, Y{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}}, EPSG, Nothing, Y{Colon}}}, Band{DimensionalData.Dimensions.LookupArrays.Categorical{Int64, UnitRange{Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.NoMetadata}}}, Tuple{}, Array{Float32, 3}, Symbol, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, Float32}, ::Nothing, geoms::Vector{ArchGDAL.IGeometry{ArchGDAL.wkbPolygon}}; progress::Bool, kw::Base.Pairs{Symbol, Symbol, Tuple{Symbol}, NamedTuple{(:boundary,), Tuple{Symbol}}})
   @ Rasters C:\Users\pthir\.julia\packages\Rasters\61sPZ\src\methods\zonal.jl:121
 [5] _zonal(f::Function, x::Raster{Float32, 3, Tuple{X{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}}, EPSG, Nothing, X{Colon}}}, Y{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}}, EPSG, Nothing, Y{Colon}}}, Band{DimensionalData.Dimensions.LookupArrays.Categorical{Int64, UnitRange{Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.NoMetadata}}}, Tuple{}, Array{Float32, 3}, Symbol, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, Float32}, of::DataFrame; kw::Base.Pairs{Symbol, Symbol, Tuple{Symbol}, NamedTuple{(:boundary,), Tuple{Symbol}}})
   @ Rasters C:\Users\pthir\.julia\packages\Rasters\61sPZ\src\methods\zonal.jl:91
 [6] #zonal#792
   @ C:\Users\pthir\.julia\packages\Rasters\61sPZ\src\methods\zonal.jl:73 [inlined]
 [7] top-level scope
   @ c:\Users\pthir\Desktop\slope - Copie\RPG_ZoneStat.jl:24

    nested task error: MethodError: Cannot `convert` an object of type Missing to an object of type Float32
    Closest candidates are:
      convert(::Type{T}, ::ColorTypes.Gray24) where T<:Real at C:\Users\pthir\.julia\packages\ColorTypes\1dGw6\src\conversions.jl:114
      convert(::Type{T}, ::ColorTypes.Gray) where T<:Real at C:\Users\pthir\.julia\packages\ColorTypes\1dGw6\src\conversions.jl:113
      convert(::Type{T}, ::Base.TwicePrecision) where T<:Number at twiceprecision.jl:273
      ...
    Stacktrace:
     [1] setindex!(A::Vector{Float32}, x::Missing, i1::Int64)
       @ Base .\array.jl:966
     [2] macro expansion
       @ C:\Users\pthir\.julia\packages\Rasters\61sPZ\src\methods\zonal.jl:122 [inlined]
     [3] (::Rasters.var"#765#threadsfor_fun#806"{Rasters.var"#765#threadsfor_fun#805#807"{Bool, Base.Pairs{Symbol, Symbol, Tuple{Symbol}, NamedTuple{(:boundary,), Tuple{Symbol}}}, var"#5#6", Raster{Float32, 3, Tuple{X{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}}, EPSG, Nothing, X{Colon}}}, Y{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}}, EPSG, Nothing, Y{Colon}}}, Band{DimensionalData.Dimensions.LookupArrays.Categorical{Int64, UnitRange{Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.NoMetadata}}}, Tuple{}, Array{Float32, 3}, Symbol, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, Float32}, Vector{ArchGDAL.IGeometry{ArchGDAL.wkbPolygon}}, ProgressMeter.Progress, Vector{Float32}, Base.OneTo{Int64}}})(tid::Int64; onethread::Bool)
       @ Rasters .\threadingconstructs.jl:84
     [4] #765#threadsfor_fun
       @ .\threadingconstructs.jl:51 [inlined]
     [5] (::Base.Threads.var"#1#2"{Rasters.var"#765#threadsfor_fun#806"{Rasters.var"#765#threadsfor_fun#805#807"{Bool, Base.Pairs{Symbol, Symbol, Tuple{Symbol}, NamedTuple{(:boundary,), Tuple{Symbol}}}, var"#5#6", Raster{Float32, 3, Tuple{X{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}}, EPSG, Nothing, X{Colon}}}, Y{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}}, EPSG, Nothing, Y{Colon}}}, Band{DimensionalData.Dimensions.LookupArrays.Categorical{Int64, UnitRange{Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.NoMetadata}}}, Tuple{}, Array{Float32, 3}, Symbol, DimensionalData.Dimensions.LookupArrays.Metadata{Rasters.GDALsource, Dict{String, Any}}, Float32}, Vector{ArchGDAL.IGeometry{ArchGDAL.wkbPolygon}}, ProgressMeter.Progress, Vector{Float32}, Base.OneTo{Int64}}}, Int64})()
       @ Base.Threads .\threadingconstructs.jl:30

@rafaqz
Copy link
Owner

rafaqz commented May 5, 2023

Ok I can reproduce this one! Thanks for writing that up. I'll see what I can do.

@rafaqz
Copy link
Owner

rafaqz commented May 5, 2023

Solved. Should be registered in the hour. (it was missing values coming from polygons outside the rasters extent, which I had forgotten to put in the tests)

Unfortunately ArchGDAL points are super slow (yeesian/ArchGDAL.jl#369) most of the time zonal takes on your dataset is just reading the points in rather than Rasters.jl doing anything.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants