julia
isvaluecol(::Type{Union{T, Missing}}) where T = isvaluecol(T)
isvaluecol(::Type{<: Number}) = true
isvaluecol(something) = false
"""
decompose_to_geoms_and_values(sources; features = nothing)
Decompose a table or feature collection into geometries and values.
Returns `(geometries::Vector{Geometry}, values::NamedTuple{Vector})`.
`values` is a namedtuple of each value column in `sources`. A value column
is something whose eltype satisfies `isvaluecol`, and is currently `Union{Number, Missing}`.
"""
function decompose_to_geoms_and_values(sources; features = nothing) # sources must be a Tables.Table or a GI.FeatureCollection
geometry_column = first(GI.geometrycolumns(sources))
namedtuple = Tables.columntable(sources)
feature_columns = setdiff(Tables.columnnames(namedtuple), (geometry_column,))
value_columns = if isnothing(features)
feature_columns[map(x -> isvaluecol(eltype(namedtuple[x])), feature_columns)]
else
features
end
geometries = namedtuple[geometry_column]
values = namedtuple[value_columns]
return (geometries, NamedTuple(zip(value_columns, values)))
end
"""
rasterized_polygon_areas(source_geometries, cellsize::Real)::Vector{Float64}
Compute the rasterized area of each polygon in `source_geometries`, on a
Raster with resolution `cellsize`. `sour`
Returns a vector of cell counts per source geometry.
"""
function rasterized_polygon_areas(source_geometries, cellsize)
polygon_index_raster = Rasters.rasterize(
last,
source_geometries;
res = cellsize,
fill = 1:size(source_geometries, 1),
boundary = :center,
missingval = size(source_geometries, 1)+1,
)
Now, we can also process areas:
julia
area_vec = zeros(Int, size(source_geometries, 1)+1)
for cell in polygon_index_raster
area_vec[cell] += 1
end
pop!(area_vec) # Remove the value for cells that are not in any polygon
return area_vec
end
We need the ability to set up a targeting
This page was generated using Literate.jl.