From ba1c7ce7349cb72d60ef867de9251c7d42778e84 Mon Sep 17 00:00:00 2001 From: Skylar A Gering Date: Fri, 12 Jan 2024 10:21:06 -0800 Subject: [PATCH] Fix Douglas simplifies (#44) * Update SimplifyAlgs constructors * Start recursive DP algorithm * Finish recursive algorithm and add test shapes * Add prefilter argument * Prefilter call works * Iterative Douglas working * Clean up and comment * Turn on tests * Added simplify tests * Fix repeated last point bug * Update comments and cleanup tests --- Project.toml | 3 +- src/GeometryOps.jl | 1 + src/methods/distance.jl | 26 ++- src/transformations/simplify.jl | 357 ++++++++++++++++++++----------- test/data/complex_polygons.jld2 | Bin 0 -> 160551 bytes test/runtests.jl | 4 +- test/transformations/simplify.jl | 29 ++- 7 files changed, 278 insertions(+), 142 deletions(-) create mode 100644 test/data/complex_polygons.jld2 diff --git a/Project.toml b/Project.toml index f6787b264..ad2d4f956 100644 --- a/Project.toml +++ b/Project.toml @@ -21,9 +21,10 @@ ArchGDAL = "c9ce4bd3-c3d5-55b8-8973-c0e20141b8c3" Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" GeoFormatTypes = "68eda718-8dee-11e9-39e7-89f7f65f511f" GeoJSON = "61d90e0f-e114-555e-ac52-39dfb47a3ef9" +JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819" LibGEOS = "a90b1aa1-3769-5649-ba7e-abc5a9d163eb" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [targets] -test = ["ArchGDAL", "Distributions", "GeoFormatTypes", "GeoJSON", "LibGEOS", "Random", "Test"] +test = ["ArchGDAL", "Distributions", "GeoFormatTypes", "GeoJSON", "JLD2", "LibGEOS", "Random", "Test"] diff --git a/src/GeometryOps.jl b/src/GeometryOps.jl index c94ff82d0..81e7a89d2 100644 --- a/src/GeometryOps.jl +++ b/src/GeometryOps.jl @@ -8,6 +8,7 @@ import Proj using LinearAlgebra import ExactPredicates import Proj.CoordinateTransformations.StaticArrays +import Base.@kwdef using GeoInterface.Extents: Extents diff --git a/src/methods/distance.jl b/src/methods/distance.jl index 2c2782fa5..a9cc4b8d5 100644 --- a/src/methods/distance.jl +++ b/src/methods/distance.jl @@ -184,7 +184,11 @@ end # Returns the Euclidean distance between two points. Base.@propagate_inbounds _euclid_distance(::Type{T}, p1, p2) where T = - _euclid_distance( + sqrt(_squared_euclid_distance(T, p1, p2)) + +# Returns the square of the euclidean distance between two points +Base.@propagate_inbounds _squared_euclid_distance(::Type{T}, p1, p2) where T = + _squared_euclid_distance( T, GeoInterface.x(p1), GeoInterface.y(p1), GeoInterface.x(p2), GeoInterface.y(p2), @@ -192,14 +196,24 @@ Base.@propagate_inbounds _euclid_distance(::Type{T}, p1, p2) where T = # Returns the Euclidean distance between two points given their x and y values. Base.@propagate_inbounds _euclid_distance(::Type{T}, x1, y1, x2, y2) where T = - T(sqrt((x2 - x1)^2 + (y2 - y1)^2)) + sqrt(_squared_euclid_distance(T, x1, y1, x2, y2)) +# Returns the squared Euclidean distance between two points given their x and y values. +Base.@propagate_inbounds _squared_euclid_distance(::Type{T}, x1, y1, x2, y2) where T = + T((x2 - x1)^2 + (y2 - y1)^2) #= Returns the minimum distance from point p0 to the line defined by endpoints p1 and p2. =# -function _distance_line(::Type{T}, p0, p1, p2) where T +_distance_line(::Type{T}, p0, p1, p2) where T = + sqrt(_squared_distance_line(T, p0, p1, p2)) + +#= +Returns the squared minimum distance from point p0 to the line defined by +endpoints p1 and p2. +=# +function _squared_distance_line(::Type{T}, p0, p1, p2) where T x0, y0 = GeoInterface.x(p0), GeoInterface.y(p0) x1, y1 = GeoInterface.x(p1), GeoInterface.y(p1) x2, y2 = GeoInterface.x(p2), GeoInterface.y(p2) @@ -216,16 +230,16 @@ function _distance_line(::Type{T}, p0, p1, p2) where T c1 = sum(w .* v) if c1 <= 0 # p0 is closest to first endpoint - return _euclid_distance(T, x0, y0, xfirst, yfirst) + return _squared_euclid_distance(T, x0, y0, xfirst, yfirst) end c2 = sum(v .* v) if c2 <= c1 # p0 is closest to last endpoint - return _euclid_distance(T, x0, y0, xlast, ylast) + return _squared_euclid_distance(T, x0, y0, xlast, ylast) end b2 = c1 / c2 # projection fraction - return _euclid_distance(T, x0, y0, xfirst + (b2 * v[1]), yfirst + (b2 * v[2])) + return _squared_euclid_distance(T, x0, y0, xfirst + (b2 * v[1]), yfirst + (b2 * v[2])) end diff --git a/src/transformations/simplify.jl b/src/transformations/simplify.jl index bdd734592..bb47f05cc 100644 --- a/src/transformations/simplify.jl +++ b/src/transformations/simplify.jl @@ -1,10 +1,27 @@ # # Geometry simplification -# This file holds implementations for the Douglas-Peucker and Visvalingam-Whyatt -# algorithms for simplifying geometries (specifically polygons and lines). +#= +This file holds implementations for the RadialDistance, Douglas-Peucker, and +Visvalingam-Whyatt algorithms for simplifying geometries (specifically for +polygons and lines). +=# export simplify, VisvalingamWhyatt, DouglasPeucker, RadialDistance +const MIN_POINTS = 3 +const SIMPLIFY_ALG_KEYWORDS = """ +## Keywords + +- `ratio`: the fraction of points that should remain after `simplify`. + Useful as it will generalise for large collections of objects. +- `number`: the number of points that should remain after `simplify`. + Less useful for large collections of mixed size objects. +""" +const DOUGLAS_PEUCKER_KEYWORDS = """ +$SIMPLIFY_ALG_KEYWORDS +- `tol`: the minimum distance a point will be from the line + joining its neighboring points. +""" """ abstract type SimplifyAlg @@ -20,33 +37,6 @@ the `_simplify(trait, alg, geom)` methods for whichever traits are necessary. """ abstract type SimplifyAlg end -const SIMPLIFY_ALG_KEYWORDS = """ -## Keywords - -- `ratio`: the fraction of points that should remain after `simplify`. - Useful as it will generalise for large collections of objects. -- `number`: the number of points that should remain after `simplify`. - Less useful for large collections of mixed size objects. -""" - -const MIN_POINTS = 3 - -function checkargs(number, ratio, tol) - count(isnothing, (number, ratio, tol)) == 2 || - error("Must provide one of `number`, `ratio` or `tol` keywords") - if !isnothing(ratio) - if ratio <= 0 || ratio > 1 - error("`ratio` must be 0 < ratio <= 1. Got $ratio") - end - end - if !isnothing(number) - if number < MIN_POINTS - error("`number` must be $MIN_POINTS or larger. Got $number") - end - end - return nothing -end - """ simplify(obj; kw...) simplify(::SimplifyAlg, obj; kw...) @@ -65,11 +55,14 @@ Pass in other [`SimplifyAlg`](@ref) to use other algorithms. # Keywords +- `prefilter_alg`: `SimplifyAlg` algorithm used to pre-filter object before + using primary filtering algorithm. $APPLY_KEYWORDS + Keywords for DouglasPeucker are allowed when no algorithm is specified: -$SIMPLIFY_ALG_KEYWORDS +$DOUGLAS_PEUCKER_KEYWORDS # Example @@ -108,28 +101,56 @@ GI.npoint(simple) 6 ``` """ -simplify(data; calc_extent=false, threaded=false, crs=nothing, kw...) = - _simplify(DouglasPeucker(; kw...), data; calc_extent, threaded, crs) simplify(alg::SimplifyAlg, data; kw...) = _simplify(alg, data; kw...) - -function _simplify(alg::SimplifyAlg, data; kw...) - ## Apply simplication to all curves, multipoints, and points, - ## reconstructing everything else around them. - simplifier(geom) = _simplify(trait(geom), alg, geom) - apply(simplifier, Union{PolygonTrait,AbstractCurveTrait,MultiPoint,PointTrait}, data; kw...) +# Default algorithm is DouglasPeucker +simplify( + data; prefilter_alg = nothing, + calc_extent=false, threaded=false, crs=nothing, kw..., + ) = _simplify(DouglasPeucker(; kw...), data; prefilter_alg, calc_extent, threaded, crs) + +#= For each algorithm, apply simplication to all curves, multipoints, and +points, reconstructing everything else around them. =# +function _simplify(alg::SimplifyAlg, data; prefilter_alg = nothing, kw...) + simplifier(geom) = _simplify(GI.trait(geom), alg, geom; prefilter_alg = prefilter_alg) + return apply( + simplifier, + Union{GI.PolygonTrait, GI.AbstractCurveTrait, GI.MultiPointTrait, GI.PointTrait}, + data; + kw..., + ) end + + ## For Point and MultiPoint traits we do nothing -_simplify(::PointTrait, alg, geom) = geom -_simplify(::MultiPointTrait, alg, geom) = geom -function _simplify(::PolygonTrait, alg, geom) +_simplify(::GI.PointTrait, alg, geom; kw...) = geom +_simplify(::GI.MultiPointTrait, alg, geom; kw...) = geom + +## For curves, rings, and polygon we simplify +function _simplify( + ::GI.AbstractCurveTrait, alg, geom; + prefilter_alg, preserve_endpoint = true, +) + points = if isnothing(prefilter_alg) + tuple_points(geom) + else + _simplify(prefilter_alg, tuple_points(geom), preserve_endpoint) + end + return rebuild(geom, _simplify(alg, points, preserve_endpoint)) +end + +function _simplify(::GI.PolygonTrait, alg, geom; kw...) ## Force treating children as LinearRing - rebuilder(g) = rebuild(g, _simplify(LinearRingTrait(), alg, g)) + simplifier(g) = _simplify( + GI.LinearRingTrait(), alg, g; + kw..., preserve_endpoint = false, + ) + rebuilder(g) = rebuild(g, simplifier(g)) lrs = map(rebuilder, GI.getgeom(geom)) return rebuild(geom, lrs) end -## For curves and rings we simplify -_simplify(::AbstractCurveTrait, alg, geom) = rebuild(geom, simplify(alg, tuple_points(geom))) + +# # Simplify with RadialDistance Algorithm """ RadialDistance <: SimplifyAlg @@ -138,42 +159,37 @@ Simplifies geometries by removing points less than $SIMPLIFY_ALG_KEYWORDS - `tol`: the minimum distance between points. + +Note: user input `tol` is squared to avoid uneccesary computation in algorithm. """ -struct RadialDistance <: SimplifyAlg - number::Union{Int64,Nothing} - ratio::Union{Float64,Nothing} - tol::Union{Float64,Nothing} -end -function RadialDistance(; number=nothing, ratio=nothing, tol=nothing) - checkargs(number, ratio, tol) - return RadialDistance(number, ratio, tol) +@kwdef struct RadialDistance <: SimplifyAlg + number::Union{Int64,Nothing} = nothing + ratio::Union{Float64,Nothing} = nothing + tol::Union{Float64,Nothing} = nothing + + function RadialDistance(number, ratio, tol) + _checkargs(number, ratio, tol) + # square tolerance for reduced computation + tol = isnothing(tol) ? tol : tol^2 + new(number, ratio, tol) + end end -settol(alg::RadialDistance, tol) = RadialDistance(alg.number, alg.ratio, tol) - -function _simplify(alg::RadialDistance, points::Vector) +function _simplify(alg::RadialDistance, points::Vector, _) previous = first(points) distances = Array{Float64}(undef, length(points)) for i in eachindex(points) point = points[i] - distances[i] = _squared_dist(point, previous) + distances[i] = _squared_euclid_distance(Float64, point, previous) previous = point end ## Never remove the end points distances[begin] = distances[end] = Inf - ## This avoids taking the square root of each distance above - if !isnothing(alg.tol) - alg = settol(alg, (alg.tol::Float64)^2) - end return _get_points(alg, points, distances) end -function _squared_dist(p1, p2) - dx = GI.x(p1) - GI.x(p2) - dy = GI.y(p1) - GI.y(p2) - return dx^2 + dy^2 -end +# # Simplify with DouglasPeucker Algorithm """ DouglasPeucker <: SimplifyAlg @@ -182,55 +198,130 @@ end Simplifies geometries by removing points below `tol` distance from the line between its neighboring points. -$SIMPLIFY_ALG_KEYWORDS -- `tol`: the minimum distance a point will be from the line - joining its neighboring points. +$DOUGLAS_PEUCKER_KEYWORDS +Note: user input `tol` is squared to avoid uneccesary computation in algorithm. """ -struct DouglasPeucker <: SimplifyAlg - number::Union{Int64,Nothing} - ratio::Union{Float64,Nothing} - tol::Union{Float64,Nothing} - prefilter::Bool -end -function DouglasPeucker(; number=nothing, ratio=nothing, tol=nothing, prefilter=false) - checkargs(number, ratio, tol) - return DouglasPeucker(number, ratio, tol, prefilter) +@kwdef struct DouglasPeucker <: SimplifyAlg + number::Union{Int64,Nothing} = nothing + ratio::Union{Float64,Nothing} = nothing + tol::Union{Float64,Nothing} = nothing + + function DouglasPeucker(number, ratio, tol) + _checkargs(number, ratio, tol) + # square tolerance for reduced computation + tol = isnothing(tol) ? tol : tol^2 + return new(number, ratio, tol) + end end -settol(alg::DouglasPeucker, tol) = DouglasPeucker(alg.number, alg.ratio, tol, alg.prefilter) - -function _simplify(alg::DouglasPeucker, points::Vector) - length(points) <= MIN_POINTS && return points - ## TODO do we need this? - ## points = alg.prefilter ? simplify(RadialDistance(alg.tol), points) : points - - distances = _build_tolerances(_squared_segdist, points) - return _get_points(alg, points, distances) +#= Simplify using the DouglasPeucker algorithm - nice gif of process on wikipedia: +(https://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm). =# +function _simplify(alg::DouglasPeucker, points::Vector, preserve_endpoint) + npoints = length(points) + npoints <= MIN_POINTS && return points + # Determine stopping critetia + max_points = if !isnothing(alg.tol) + npoints + else + npts = !isnothing(alg.number) ? alg.number : max(3, round(Int, alg.ratio * npoints)) + npts ≥ npoints && return points + npts + end + max_tol = !isnothing(alg.tol) ? alg.tol : zero(Float64) + # Set up queue + queue = Vector{Tuple{Int, Int, Int, Float64}}() + queue_idx, queue_dist = 0, zero(Float64) + len_queue = 0 + # Set up results vector + results = Vector{Int}(undef, max_points + (preserve_endpoint ? 0 : 1)) + results[1], results[2] = 1, npoints + # Loop through points until stopping criteria are fulfilled + i = 2 # already have first and last point added + start_idx, end_idx = 1, npoints + max_idx, max_dist = _find_max_squared_dist(points, start_idx, end_idx) + while i < max_points && max_dist > max_tol + # Add next point to results + i += 1 + results[i] = max_idx + # Determine which point to add next by checking left and right of point + left_idx, left_dist = _find_max_squared_dist(points, start_idx, max_idx) + right_idx, right_dist = _find_max_squared_dist(points, max_idx, end_idx) + left_vals = (start_idx, left_idx, max_idx, left_dist) + right_vals = (max_idx, right_idx, end_idx, right_dist) + # Add and remove values from queue + if queue_dist > left_dist && queue_dist > right_dist + # Value in queue is next value to add to results + start_idx, max_idx, end_idx, max_dist = queue[queue_idx] + # Add left and/or right values to queue or delete used queue value + if left_dist > 0 + queue[queue_idx] = left_vals + if right_dist > 0 + push!(queue, right_vals) + len_queue += 1 + end + elseif right_dist > 0 + queue[queue_idx] = right_vals + else + deleteat!(queue, queue_idx) + len_queue =- 1 + end + # Determine new maximum queue value + queue_dist, queue_idx = !isempty(queue) ? + findmax(x -> x[4], queue) : (zero(Float64), 0) + elseif left_dist > right_dist # use left value as next value to add to results + push!(queue, right_vals) # add right value to queue + len_queue += 1 + if right_dist > queue_dist + queue_dist = right_dist + queue_idx = len_queue + end + start_idx, max_idx, end_idx, max_dist = left_vals + else # use right value as next value to add to results + push!(queue, left_vals) # add left value to queue + len_queue += 1 + if left_dist > queue_dist + queue_dist = left_dist + queue_idx = len_queue + end + start_idx, max_idx, end_idx, max_dist = right_vals + end + end + sorted_results = sort!(@view results[1:i]) + if !preserve_endpoint && i > 3 + endpt_dist = _squared_distance_line(Float64, points[1], points[end - 1], points[2]) + if !isnothing(alg.tol) + if endpt_dist < max_tol + results[i] = results[2] + sorted_results = @view results[2:i] + end + else + if endpt_dist < max_dist + insert!(results, searchsortedfirst(sorted_results, max_idx), max_idx) + results[i+1] = results[2] + sorted_results = @view results[2:i+1] + end + end + end + return points[sorted_results] end -function _squared_segdist(l1, p, l2) - x, y = GI.x(l1), GI.y(l1) - dx = GI.x(l2) - x - dy = GI.y(l2) - y - - if !iszero(dx) || !iszero(dy) - t = ((GI.x(p) - x) * dx + (GI.y(p) - y) * dy) / (dx * dx + dy * dy) - if t > 1 - x = GI.x(l2) - y = GI.y(l2) - elseif t > 0 - x += dx * t - y += dy * t +#= find maximum distance of any point between the start_idx and end_idx to the line formed +by conencting the points at start_idx and end_idx. Note that the first index of maximum +value will be used, which might cause differences in results from other algorithms.=# +function _find_max_squared_dist(points, start_idx, end_idx) + max_idx = 0 + max_dist = zero(Float64) + for i in (start_idx + 1):(end_idx - 1) + d = _squared_distance_line(Float64, points[i], points[start_idx], points[end_idx]) + if d > max_dist + max_dist = d + max_idx = i end end - - dx = GI.x(p) - x - dy = GI.y(p) - y - - return dx^2 + dy^2 + return max_idx, max_dist end - +# # Simplify with VisvalingamWhyatt Algorithm """ VisvalingamWhyatt <: SimplifyAlg @@ -242,37 +333,33 @@ distance from the line between its neighboring points. $SIMPLIFY_ALG_KEYWORDS - `tol`: the minimum area of a triangle made with a point and its neighboring points. +Note: user input `tol` is doubled to avoid uneccesary computation in algorithm. """ -struct VisvalingamWhyatt <: SimplifyAlg - number::Union{Int,Nothing} - ratio::Union{Float64,Nothing} - tol::Union{Float64,Nothing} - prefilter::Bool -end -function VisvalingamWhyatt(; number=nothing, ratio=nothing, tol=nothing, prefilter=false) - checkargs(number, ratio, tol) - return VisvalingamWhyatt(number, ratio, tol, prefilter) +@kwdef struct VisvalingamWhyatt <: SimplifyAlg + number::Union{Int,Nothing} = nothing + ratio::Union{Float64,Nothing} = nothing + tol::Union{Float64,Nothing} = nothing + + function VisvalingamWhyatt(number, ratio, tol) + _checkargs(number, ratio, tol) + # double tolerance for reduced computation + tol = isnothing(tol) ? tol : tol*2 + return new(number, ratio, tol) + end end -settol(alg::VisvalingamWhyatt, tol) = VisvalingamWhyatt(alg.number, alg.ratio, tol, alg.prefilter) - -function _simplify(alg::VisvalingamWhyatt, points::Vector) +function _simplify(alg::VisvalingamWhyatt, points::Vector, _) length(points) <= MIN_POINTS && return points areas = _build_tolerances(_triangle_double_area, points) - - ## This avoids diving everything by two - if !isnothing(alg.tol) - alg = settol(alg, (alg.tol::Float64)*2) - end return _get_points(alg, points, areas) end -## calculates the area of a triangle given its vertices +# Calculates double the area of a triangle given its vertices _triangle_double_area(p1, p2, p3) = abs(p1[1] * (p2[2] - p3[2]) + p2[1] * (p3[2] - p1[2]) + p3[1] * (p1[2] - p2[2])) -# ### Shared utils +# # Shared utils function _build_tolerances(f, points) nmax = length(points) @@ -330,7 +417,7 @@ function _build_tolerances(f, points) end function tuple_points(geom) - points = Array{Tuple{Float64,Float64}}(undef, GI.ngeom(geom)) + points = Array{Tuple{Float64,Float64}}(undef, GI.npoint(geom)) for (i, p) in enumerate(GI.getpoint(geom)) points[i] = (GI.x(p), GI.y(p)) end @@ -395,3 +482,23 @@ function _flat_tolerances(f, points) end _remove!(s, i) = s[i:end-1] .= s[i+1:end] + +# Check SimplifyAlgs inputs to make sure they are valid for below algorithms +function _checkargs(number, ratio, tol) + count(isnothing, (number, ratio, tol)) == 2 || + error("Must provide one of `number`, `ratio` or `tol` keywords") + if !isnothing(number) + if number < MIN_POINTS + error("`number` must be $MIN_POINTS or larger. Got $number") + end + elseif !isnothing(ratio) + if ratio <= 0 || ratio > 1 + error("`ratio` must be 0 < ratio <= 1. Got $ratio") + end + else # !isnothing(tol) + if tol ≤ 0 + error("`tol` must be a positive number. Got $tol") + end + end + return nothing +end \ No newline at end of file diff --git a/test/data/complex_polygons.jld2 b/test/data/complex_polygons.jld2 new file mode 100644 index 0000000000000000000000000000000000000000..d530e0e218f17d37f60862d3bddf5ba417e76799 GIT binary patch literal 160551 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

_6Ng9x$9COV`IzuLq)w%7q9{EDEHMz3yl~h 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

2UI-eW~61kfQMgmbMB(jEK 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 b=N;U}h-vaXs{j61{$u2S$x6_E