Skip to content

Commit 2ac6caf

Browse files
asinghvi17rafaqz
andauthored
Test zonal on geometries with extents that go beyond the raster (#817)
* test geometries with extents that go beyond the raster * Reverse didn't solve anything, remove it * fix bug * fix alg * fix test --------- Co-authored-by: Rafael Schouten <[email protected]>
1 parent 251bbbd commit 2ac6caf

File tree

3 files changed

+21
-9
lines changed

3 files changed

+21
-9
lines changed

src/methods/burning/edges.jl

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ _x_at_y(e::Edge, y) = (y - e.start[2]) * e.gradient + e.start[1]
4242
struct Edges <: AbstractVector{Edge}
4343
edges::Vector{Edge}
4444
max_ylen::Int
45+
min_y::Int
4546
edge_count::Int
4647
end
4748
Edges(geom, dims; kw...) = Edges(GI.geomtrait(geom), geom, dims; kw...)
@@ -55,12 +56,14 @@ function Edges(
5556
# TODO fix bug that requires this to be redefined
5657
edges = Vector{Edge}(undef, 0)
5758
local edge_count = max_ylen = 0
59+
local min_y = typemax(Int)
5860
if tr isa GI.AbstractCurveTrait
59-
edge_count, max_ylen = _to_edges!(edges, geom, dims, edge_count)
61+
edge_count, max_ylen, min_y = _to_edges!(edges, geom, dims, edge_count)
6062
else
6163
for ring in GI.getring(geom)
62-
edge_count, ring_max_ylen = _to_edges!(edges, ring, dims, edge_count)
64+
edge_count, ring_max_ylen, ring_min_y = _to_edges!(edges, ring, dims, edge_count)
6365
max_ylen = max(max_ylen, ring_max_ylen)
66+
min_y = min(min_y, ring_min_y)
6467
end
6568
end
6669

@@ -72,7 +75,7 @@ function Edges(
7275
sort!(edges1; scratch)
7376
end
7477

75-
return Edges(edges, max_ylen, edge_count)
78+
return Edges(edges, max_ylen, min_y, edge_count)
7679
end
7780

7881
Base.parent(edges::Edges) = edges.edges
@@ -99,8 +102,9 @@ end
99102
local firstpos = prevpos = nextpos = Position((0.0, 0.0), 0)
100103
isfirst = true
101104
local max_ylen = 0
105+
local min_y = typemax(Int)
102106

103-
GI.npoint(geom) > 0 || return edge_count, max_ylen
107+
GI.npoint(geom) > 0 || return edge_count, max_ylen, min_y
104108
xlookup, ylookup = lookup(dims, (X(), Y()))
105109
(length(xlookup) > 0 && length(ylookup) > 0) || return edge_count, max_ylen
106110

@@ -136,6 +140,7 @@ end
136140
edge = Edge(prevpos, nextpos)
137141
_add_edge!(edges, edge, edge_count)
138142
max_ylen = max(max_ylen, edge.iystop - edge.iystart)
143+
min_y = min(min_y, edge.iystart)
139144
prevpos = nextpos
140145
prevpoint = p
141146
end
@@ -145,11 +150,12 @@ end
145150
edge = Edge(prevpos, firstpos)
146151
# Update the longest y distance of any edge
147152
max_ylen = max(max_ylen, edge.iystop - edge.iystart)
153+
min_y = min(min_y, edge.iystart)
148154
# assign/push the edge to edges
149155
_add_edge!(edges, edge, edge_count)
150156
end
151157

152-
return edge_count, max_ylen
158+
return edge_count, max_ylen, min_y
153159
end
154160

155161
function _add_edge!(edges, edge, edge_count)

src/methods/burning/polygon.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,11 @@ function _set_crossings!(crossings::Vector{Float64}, edges::Edges, iy::Int, prev
6767
# max_ylen tells us how big the largest y edge is.
6868
# We can use this to jump back from the last y position
6969
# rather than iterating from the start of the edges
70-
ypos = max(1, prev_ypos - edges.max_ylen - 1)
71-
ncrossings = 0
72-
# We know the maximum size on y, so we can start from ypos
70+
ypos = max(edges.min_y, prev_ypos - edges.max_ylen - 1)
7371
start_ypos = searchsortedfirst(edges, ypos)
72+
# We know the maximum size on y, so we can start from ypos
7473
prev_ypos = start_ypos
74+
ncrossings = 0
7575
for i in start_ypos:lastindex(edges)
7676
e = @inbounds edges[i]
7777
# Edges are sorted on y, so we can skip

test/methods.jl

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,12 @@ end
220220
@test sum(skipmissing(mask(polytemplate; with=polygon, boundary=:touches, invert=true))) == prod(size(polytemplate)) - 21 * 21
221221
end
222222
end
223+
224+
@testset "geometry encompassing raster" begin
225+
geom = GeoInterface.Polygon([GeoInterface.LinearRing([(0.0, 0.0), (0.0, 10.0), (10.0, 10.0), (10.0, 0.0), (0.0, 0.0)])])
226+
raster = Raster(ones(X(1:0.1:2), Y(1:0.1:2)), missingval=false)
227+
@test sum(mask(raster; with=geom)) == sum(raster)
228+
end
223229
end
224230

225231
@testset "mask_replace_missing" begin
@@ -755,4 +761,4 @@ test = rebuild(ga; name = :test)
755761

756762
@test_throws "strictly positive" Rasters.sample(StableRNG(123), test, 3, skipmissing = true, replace = false)
757763
@test_throws "Cannot draw" Rasters.sample(StableRNG(123), test, 5, replace = false)
758-
end
764+
end

0 commit comments

Comments
 (0)