From 311cdc25728d94fe01c0b0ce90a8d9a09f965f85 Mon Sep 17 00:00:00 2001 From: Anshul Singhvi Date: Mon, 2 Sep 2024 12:49:27 -0700 Subject: [PATCH 01/13] Drop Requires.jl code in __init__ (#724) It's not in the Project.toml anyway, and the Julia compat is set to 1.10 so this code can never run --- src/Rasters.jl | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/Rasters.jl b/src/Rasters.jl index a297096d..c602e444 100644 --- a/src/Rasters.jl +++ b/src/Rasters.jl @@ -144,17 +144,4 @@ include("sources/grd.jl") include("sources/commondatamodel.jl") include("extensions.jl") -# Compatibility with pre-1.9 julia -function __init__() - @static if !isdefined(Base, :get_extension) - @require ArchGDAL = "c9ce4bd3-c3d5-55b8-8973-c0e20141b8c3" include("../ext/RastersArchGDALExt/RastersArchGDALExt.jl") - @require CoordinateTransformations = "150eb455-5306-5404-9cee-2592286d6298" include("../ext/RastersCoordinateTransformationsExt/RastersCoordinateTransformationsExt.jl") - @require HDF5 = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f" include("../ext/RastersHDF5Ext/RastersHDF5Ext.jl") - @require Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" include("../ext/RastersMakieExt/RastersMakieExt.jl") - @require NCDatasets = "85f8d34a-cbdd-5861-8df4-14fed0d494ab" include("../ext/RastersNCDatasetsExt/RastersNCDatasetsExt.jl") - @require GRIBDatasets = "82be9cdb-ee19-4151-bdb3-b400788d9abc" include("../ext/RastersGRIBDatasetsExt/RastersGRIBDatasetsExt.jl") - @require RasterDataSources = "3cb90ccd-e1b6-4867-9617-4276c8b2ca36" include("../ext/RastersRasterDataSourcesExt/RastersRasterDataSourcesExt.jl") - end -end - end From 7620ba8a2b682c23cc6c04fe7914c23ea61228cb Mon Sep 17 00:00:00 2001 From: Anshul Singhvi Date: Tue, 3 Sep 2024 17:40:12 -0700 Subject: [PATCH 02/13] Add an informative error message to `resample` when passing crs as string (#727) We should probably just use ArchGDAL to interpret, or maybe Proj.jl, but that can come later. --- ext/RastersArchGDALExt/resample.jl | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/ext/RastersArchGDALExt/resample.jl b/ext/RastersArchGDALExt/resample.jl index 1a42d1a9..d5b067ed 100644 --- a/ext/RastersArchGDALExt/resample.jl +++ b/ext/RastersArchGDALExt/resample.jl @@ -50,7 +50,16 @@ function resample(A::RasterStackOrArray; # get crs from `to` or `x` if none was passed in isnothing(Rasters.crs(to)) ? Rasters.crs(A) : Rasters.crs(to) end - else + else # issomething(crs) + if crs isa String + error(""" + Strings as CRS aren't yet supported. + Please pass a `GeoFormatTypes.jl` CRS format, like `ESRIWellKnownText`, `ProjString`, or similar. + + You can find out more about GeoFormatTypes.jl at https://juliageo.org/GeoFormatTypes.jl/stable/. + """ + ) + end crs end if !isnothing(crs) From 2f7717e3d8fdf06e89de39b449e7efce93bc0d2b Mon Sep 17 00:00:00 2001 From: Tiem van der Deure Date: Wed, 4 Sep 2024 12:42:12 +0200 Subject: [PATCH 03/13] define isdisk for AbstractRasterSeries (#716) * define isdisk for AbstractRasterSeries * use any in isdisk * use any for isdisk on stack * use first raster in series for metadata and name * reverse previous commit * add tests * add one more test Co-authored-by: Rafael Schouten --------- Co-authored-by: Rafael Schouten --- src/series.jl | 1 + src/stack.jl | 2 +- test/series.jl | 5 ++++- test/sources/gdal.jl | 1 + 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/series.jl b/src/series.jl index 83a18de2..1b23caa6 100644 --- a/src/series.jl +++ b/src/series.jl @@ -24,6 +24,7 @@ abstract type AbstractRasterSeries{T,N,D,A} <: AbstractDimArray{T,N,D,A} end DD.metadata(A::AbstractRasterSeries) = NoMetadata() DD.name(A::AbstractRasterSeries) = NoName() DD.label(A::AbstractRasterSeries) = "" +isdisk(A::AbstractRasterSeries) = any(isdisk, A) """ modify(f, series::AbstractRasterSeries) diff --git a/src/stack.jl b/src/stack.jl index 5785feeb..ad5783c8 100644 --- a/src/stack.jl +++ b/src/stack.jl @@ -34,7 +34,7 @@ missingval(s::AbstractRasterStack, name::Symbol) = _singlemissingval(missingval( filename(stack::AbstractRasterStack{<:Any,<:Any,<:Any,<:NamedTuple}) = map(s -> filename(s), stack) filename(stack::AbstractRasterStack{<:Any,<:Any,<:Any,<:Union{FileStack,OpenStack}}) = filename(parent(stack)) -isdisk(st::AbstractRasterStack) = isdisk(layers(st, 1)) +isdisk(st::AbstractRasterStack) = any(isdisk, layers(st)) setcrs(x::AbstractRasterStack, crs) = set(x, setcrs(dims(x), crs)...) setmappedcrs(x::AbstractRasterStack, mappedcrs) = set(x, setmappedcrs(dims(x), mappedcrs)...) diff --git a/test/series.jl b/test/series.jl index eea85470..45647c9d 100644 --- a/test/series.jl +++ b/test/series.jl @@ -122,5 +122,8 @@ end @test all(Rasters.filename.(series) .== filenames) first_dims = dims(first(series)) @test all(dims(r) == first_dims for r in series) - end + @test Rasters.isdisk(series) + @test !Rasters.isdisk(read(series)) + @test Rasters.isdisk(Rasters.combine(series)) + end end diff --git a/test/sources/gdal.jl b/test/sources/gdal.jl index 7cb31a73..dc510e6c 100644 --- a/test/sources/gdal.jl +++ b/test/sources/gdal.jl @@ -586,6 +586,7 @@ end @testset "lazy" begin gdalstack_lazy = RasterStack((a=gdalpath, b=gdalpath); lazy=true) + @test Rasters.isdisk(gdalstack_lazy) @test Rasters.isdisk(gdalstack_lazy.a) @test Rasters.isdisk(gdalstack_lazy.b) gdalstack_read = read(gdalstack_lazy) From 38b8d3491f266865553ed8048b0d4cc951aa0550 Mon Sep 17 00:00:00 2001 From: Anshul Singhvi Date: Wed, 11 Sep 2024 05:44:32 -0700 Subject: [PATCH 04/13] make index page text single line (#734) --- docs/src/index.md | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/docs/src/index.md b/docs/src/index.md index ac0aecae..0e2f62e3 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -36,17 +36,11 @@ features: Rasters provides a standardised interface that allows many source data types to be used with identical syntax. - - Scripts and packages building on Rasters.jl can treat `Raster`, - `RasterStack`, and `RasterSeries` as black boxes. - - The data could hold GeoTiff or NetCDF files, `Array`s in memory or - `CuArray`s on the GPU - they will all behave in the same way. - - `RasterStack` can be backed by a Netcdf or HDF5 file, or a `NamedTuple` of - `Raster` holding `.tif` files, or all `Raster` in memory. + - Scripts and packages building on Rasters.jl can treat `Raster`, `RasterStack`, and `RasterSeries` as black boxes. + - The data could hold GeoTiff or NetCDF files, `Array`s in memory or `CuArray`s on the GPU - they will all behave in the same way. + - `RasterStack` can be backed by a Netcdf or HDF5 file, or a `NamedTuple` of `Raster` holding `.tif` files, or all `Raster` in memory. - Users do not have to deal with the specifics of spatial file types. - - `Projected` lookups with Cylindrical projections can by indexed using other Cylindrical projections - by setting the `mappedcrs` keyword on construction. You don't need to know the underlying - projection, the conversion is handled automatically. This means lat/lon - `EPSG(4326)` can be used seamlessly if you need that. + - `Projected` lookups with Cylindrical projections can by indexed using other Cylindrical projections by setting the `mappedcrs` keyword on construction. You don't need to know the underlying projection, the conversion is handled automatically. This means lat/lon `EPSG(4326)` can be used seamlessly if you need that. ## Installation @@ -104,4 +98,4 @@ To make an issue we can fix quickly (or at all) there are three key steps: Good issues are really appreciated, but they do take just a little extra effort with Rasters.jl because of this need for files. -::: \ No newline at end of file +::: From aa7164bd1f79609a0b5946bf338f4145de7191e5 Mon Sep 17 00:00:00 2001 From: Rafael Schouten Date: Wed, 18 Sep 2024 16:48:57 +0200 Subject: [PATCH 05/13] `zonal` optional skipmissing (#739) * zonal optional skipmissing * document skipmissing default value * bugfix * more bugfix * no end --- src/methods/zonal.jl | 36 +++++++++++++++++++++++++----------- test/methods.jl | 11 +++++++++++ 2 files changed, 36 insertions(+), 11 deletions(-) diff --git a/src/methods/zonal.jl b/src/methods/zonal.jl index 54496d2f..47638668 100644 --- a/src/methods/zonal.jl +++ b/src/methods/zonal.jl @@ -19,7 +19,10 @@ These can be used when `of` is or contains (a) GeoInterface.jl compatible object where the line `:touches` the pixel, or that are completely `:inside` inside the polygon. The default is `:center`. - `progress`: show a progress bar, `true` by default, `false` to hide.. - +- `skipmissing`: wether to apply `f` to the result of `skipmissing(A)` or not. If `true` + `f` will be passed an iterator over the values, which loses all spatial information. + if `false` `f` will be passes a masked `Raster` or `RasterStack`, and will be responsible + for handling missing values itself. The default value is `true`. # Example @@ -71,15 +74,18 @@ insertcols!(january_stats, 1, :country => first.(split.(countries.ADMIN, r"[^A-Z """ zonal(f, x::RasterStackOrArray; of, kw...) = _zonal(f, x, of; kw...) -_zonal(f, x::RasterStackOrArray, of::RasterStackOrArray) = _zonal(f, x, Extents.extent(of)) -_zonal(f, x::RasterStackOrArray, of::DimTuple) = _zonal(f, x, Extents.extent(of)) +_zonal(f, x::RasterStackOrArray, of::RasterStackOrArray; kw...) = + _zonal(f, x, Extents.extent(of); kw...) +_zonal(f, x::RasterStackOrArray, of::DimTuple; kw...) = + _zonal(f, x, Extents.extent(of); kw...) # We don't need to `mask` with an extent, it's square so `crop` will do enough. -_zonal(f, x::Raster, of::Extents.Extent) = f(skipmissing(crop(x; to=of, touches=true))) -function _zonal(f, x::RasterStack, ext::Extents.Extent) +_zonal(f, x::Raster, of::Extents.Extent; skipmissing=true) = + _maybe_skipmissing_call(f, crop(x; to=of, touches=true), skipmissing) +function _zonal(f, x::RasterStack, ext::Extents.Extent; skipmissing=true) cropped = crop(x; to=ext, touches=true) prod(size(cropped)) > 0 || return missing return map(cropped) do A - f(skipmissing(A)) + _maybe_skipmissing_call(f, A, skipmissing) end end # Otherwise of is a geom, table or vector @@ -89,22 +95,28 @@ _zonal(f, x, ::GI.AbstractFeatureCollectionTrait, fc; kw...) = _zonal(f, x, nothing, fc; kw...) _zonal(f, x::RasterStackOrArray, ::GI.AbstractFeatureTrait, feature; kw...) = _zonal(f, x, GI.geometry(feature); kw...) -function _zonal(f, x::AbstractRaster, ::GI.AbstractGeometryTrait, geom; kw...) +function _zonal(f, x::AbstractRaster, ::GI.AbstractGeometryTrait, geom; + skipmissing=true, kw... +) cropped = crop(x; to=geom, touches=true) prod(size(cropped)) > 0 || return missing masked = mask(cropped; with=geom, kw...) - return f(skipmissing(masked)) + return _maybe_skipmissing_call(f, masked, skipmissing) end -function _zonal(f, st::AbstractRasterStack, ::GI.AbstractGeometryTrait, geom; kw...) +function _zonal(f, st::AbstractRasterStack, ::GI.AbstractGeometryTrait, geom; + skipmissing=true, kw... +) cropped = crop(st; to=geom, touches=true) prod(size(cropped)) > 0 || return map(_ -> missing, st) masked = mask(cropped; with=geom, kw...) return map(masked) do A prod(size(A)) > 0 || return missing - f(skipmissing(A)) + _maybe_skipmissing_call(f, A, skipmissing) end end -function _zonal(f, x::RasterStackOrArray, ::Nothing, data; progress=true, threaded=true, geometrycolumn=nothing, kw...) +function _zonal(f, x::RasterStackOrArray, ::Nothing, data; + progress=true, threaded=true, geometrycolumn=nothing, kw... +) geoms = _get_geometries(data, geometrycolumn) n = length(geoms) n == 0 && return [] @@ -136,3 +148,5 @@ function _alloc_zonal(f, x, geoms, n; kw...) zs[n_missing + 1] = z1 return zs, n_missing + 1 end + +_maybe_skipmissing_call(f, A, sm) = sm ? f(skipmissing(A)) : f(A) diff --git a/test/methods.jl b/test/methods.jl index d97c87d8..6ee6d5d5 100644 --- a/test/methods.jl +++ b/test/methods.jl @@ -299,6 +299,17 @@ end zonal(sum, st; of=dims(st)) == zonal(sum, st; of=Extents.extent(st)) == sum(st) + + @testset "skipmissing" begin + a = Array{Union{Missing,Int}}(undef, 26, 31) + a .= (1:26) * (1:31)' + a[1:10, 3:10] .= missing + rast = Raster(a, (X(-20:5), Y(0:30))) + @test zonal(sum, rast; of=polygon, skipmissing=false) === missing + @test zonal(sum, rast; of=polygon, skipmissing=true) isa Int + @test !zonal(x -> x isa Raster, rast; of=polygon, skipmissing=true) + @test zonal(x -> x isa Raster, rast; of=polygon, skipmissing=false) + end end @testset "zonal return missing" begin From a93010187131d385af10dbd056a10339c381f3d6 Mon Sep 17 00:00:00 2001 From: Anshul Singhvi Date: Wed, 18 Sep 2024 21:36:31 -0700 Subject: [PATCH 06/13] Pass `geometrycolumn` to rasterizer as well in `rasterize` --- src/methods/rasterize.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/methods/rasterize.jl b/src/methods/rasterize.jl index 04292007..0b1640b0 100644 --- a/src/methods/rasterize.jl +++ b/src/methods/rasterize.jl @@ -426,7 +426,7 @@ function rasterize(reducer::typeof(DD.Statistics.mean), data; fill, kw...) rebuild(sums ./ counts; name=:mean) end function rasterize(data; to=nothing, fill, threaded=false, geometrycolumn=nothing, kw...) - r = Rasterizer(data; fill, threaded, kw...) + r = Rasterizer(data; fill, threaded, geometrycolumn, kw...) rc = RasterCreator(to, data; geometrycolumn, kw..., eltype=r.eltype, fill, missingval=r.missingval) allocs = r.shape == :points ? nothing : _burning_allocs(rc.to; threaded) return create_rasterize_dest(rc) do dest From bee3fe8a3fb0f361c718db248cda70b0c7844619 Mon Sep 17 00:00:00 2001 From: Anshul Singhvi Date: Thu, 19 Sep 2024 08:28:41 -0700 Subject: [PATCH 07/13] Add a test with GeoDataFrames blessed metadata --- test/rasterize.jl | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/test/rasterize.jl b/test/rasterize.jl index 4b4052cc..7329336a 100644 --- a/test/rasterize.jl +++ b/test/rasterize.jl @@ -1,4 +1,4 @@ -using Rasters, Test, ArchGDAL, ArchGDAL.GDAL, Dates, Statistics, DataFrames, Extents, Shapefile, GeometryBasics +using Rasters, Test, ArchGDAL, ArchGDAL.GDAL, Dates, Statistics, DataFrames, GeoDataFrames, Extents, Shapefile, GeometryBasics import GeoInterface as GI using Rasters.Lookups, Rasters.Dimensions using Rasters: bounds @@ -509,3 +509,18 @@ end # Too slow and unreliable to test in CI, but it warns and uses one thread given 32gb of RAM: # coverage(union, shphandle.shapes; threaded=true, res=1, scale=1000) end + +@testset "`geometrycolumn` kwarg and detection works" begin + # Replicate pointtable + fancy_table = deepcopy(pointtable) + fancy_table.geom = pointtable.geometry + delete!(fancy_table, :geometry) + # Test that rasterization works with provided geometry column + # Just test that it works and does not warn. + @test_nowarn rasterize(last, fancy_table; to = A1, geometrycolumn = :geom) + # Now add GeoDataFrames blessed metadata keys + DataFrames.metadata!(fancy_table, "GEOINTERFACE:geometrycolumns", (:geom,); style = :note) + # Test that we don't have to provide the geometry column explicitly + @test_nowarn rasterize(last, fancy_table; to = A1) + @test rasterize(last, pointtable; to = A1) == rasterize(last, fancy_table; to = A1) # sanity check +end From 0a4af1b22f17ed6d79afaac8b84d7b132737a6e7 Mon Sep 17 00:00:00 2001 From: Anshul Singhvi Date: Thu, 19 Sep 2024 08:30:29 -0700 Subject: [PATCH 08/13] Update Project.toml --- Project.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index f2300b76..6a787b00 100644 --- a/Project.toml +++ b/Project.toml @@ -82,6 +82,7 @@ ArchGDAL = "c9ce4bd3-c3d5-55b8-8973-c0e20141b8c3" CFTime = "179af706-886a-5703-950a-314cd64e0468" CoordinateTransformations = "150eb455-5306-5404-9cee-2592286d6298" DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +GeoDataFrames = "62cb38b5-d8d2-4862-a48e-6a340996859f" GRIBDatasets = "82be9cdb-ee19-4151-bdb3-b400788d9abc" GeometryBasics = "5c1252a2-5f33-56bf-86c9-59e7332b4326" Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" @@ -94,4 +95,4 @@ Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [targets] -test = ["Aqua", "ArchGDAL", "CFTime", "CoordinateTransformations", "DataFrames", "GeometryBasics", "GRIBDatasets", "NCDatasets", "Plots", "RasterDataSources", "SafeTestsets", "Shapefile", "Statistics", "Test", "ZarrDatasets"] +test = ["Aqua", "ArchGDAL", "CFTime", "CoordinateTransformations", "DataFrames", "GeoDataFrames", "GeometryBasics", "GRIBDatasets", "NCDatasets", "Plots", "RasterDataSources", "SafeTestsets", "Shapefile", "Statistics", "Test", "ZarrDatasets"] From e214dedb78c20d918bcf662323324368e6c916d2 Mon Sep 17 00:00:00 2001 From: Anshul Singhvi Date: Thu, 19 Sep 2024 10:05:56 -0700 Subject: [PATCH 09/13] use pointdf --- test/rasterize.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/rasterize.jl b/test/rasterize.jl index 7329336a..e79448a1 100644 --- a/test/rasterize.jl +++ b/test/rasterize.jl @@ -512,8 +512,8 @@ end @testset "`geometrycolumn` kwarg and detection works" begin # Replicate pointtable - fancy_table = deepcopy(pointtable) - fancy_table.geom = pointtable.geometry + fancy_table = deepcopy(pointdf) + fancy_table.geom = pointdf.geometry delete!(fancy_table, :geometry) # Test that rasterization works with provided geometry column # Just test that it works and does not warn. From 01d3ff3cdf994f2aafdb6a96fcf45ca40f8763eb Mon Sep 17 00:00:00 2001 From: Anshul Singhvi Date: Thu, 19 Sep 2024 10:17:31 -0700 Subject: [PATCH 10/13] Update rasterize.jl --- test/rasterize.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/rasterize.jl b/test/rasterize.jl index e79448a1..ed3c8d6c 100644 --- a/test/rasterize.jl +++ b/test/rasterize.jl @@ -514,7 +514,7 @@ end # Replicate pointtable fancy_table = deepcopy(pointdf) fancy_table.geom = pointdf.geometry - delete!(fancy_table, :geometry) + select!(fancy_table, Not(:geometry)) # Test that rasterization works with provided geometry column # Just test that it works and does not warn. @test_nowarn rasterize(last, fancy_table; to = A1, geometrycolumn = :geom) From a741f3c4fca207f1bd4ac58d58ef17e4f25c8043 Mon Sep 17 00:00:00 2001 From: Anshul Singhvi Date: Thu, 19 Sep 2024 10:32:48 -0700 Subject: [PATCH 11/13] fill correctly --- test/rasterize.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/rasterize.jl b/test/rasterize.jl index ed3c8d6c..1c82516a 100644 --- a/test/rasterize.jl +++ b/test/rasterize.jl @@ -517,10 +517,10 @@ end select!(fancy_table, Not(:geometry)) # Test that rasterization works with provided geometry column # Just test that it works and does not warn. - @test_nowarn rasterize(last, fancy_table; to = A1, geometrycolumn = :geom) + @test_nowarn rasterize(last, fancy_table; to = A1, geometrycolumn = :geom, fill = 1) # Now add GeoDataFrames blessed metadata keys DataFrames.metadata!(fancy_table, "GEOINTERFACE:geometrycolumns", (:geom,); style = :note) # Test that we don't have to provide the geometry column explicitly - @test_nowarn rasterize(last, fancy_table; to = A1) - @test rasterize(last, pointtable; to = A1) == rasterize(last, fancy_table; to = A1) # sanity check + @test_nowarn rasterize(last, fancy_table; to = A1, fill = 1) + @test rasterize(last, pointtable; to = A1, fill = 1) == rasterize(last, fancy_table; to = A1, fill = 1) # sanity check end From a6a77d7480a2d7dd6705a543fcbe830715a006ca Mon Sep 17 00:00:00 2001 From: Anshul Singhvi Date: Thu, 19 Sep 2024 15:12:58 -0700 Subject: [PATCH 12/13] Fix rasterize test --- test/rasterize.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/rasterize.jl b/test/rasterize.jl index 1c82516a..04e55619 100644 --- a/test/rasterize.jl +++ b/test/rasterize.jl @@ -522,5 +522,5 @@ end DataFrames.metadata!(fancy_table, "GEOINTERFACE:geometrycolumns", (:geom,); style = :note) # Test that we don't have to provide the geometry column explicitly @test_nowarn rasterize(last, fancy_table; to = A1, fill = 1) - @test rasterize(last, pointtable; to = A1, fill = 1) == rasterize(last, fancy_table; to = A1, fill = 1) # sanity check + @test replace_missing(rasterize(last, pointtable; to = A1, fill = 1), 0) == replace_missing(rasterize(last, fancy_table; to = A1, fill = 1), 0) # sanity check end From d7996dbb321f9e86223a0b187c071a0c70b3f33b Mon Sep 17 00:00:00 2001 From: Anshul Singhvi Date: Thu, 19 Sep 2024 15:43:17 -0700 Subject: [PATCH 13/13] Only import GeoDataFrames --- test/rasterize.jl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/rasterize.jl b/test/rasterize.jl index 04e55619..9c273001 100644 --- a/test/rasterize.jl +++ b/test/rasterize.jl @@ -1,4 +1,5 @@ -using Rasters, Test, ArchGDAL, ArchGDAL.GDAL, Dates, Statistics, DataFrames, GeoDataFrames, Extents, Shapefile, GeometryBasics +using Rasters, Test, ArchGDAL, ArchGDAL.GDAL, Dates, Statistics, DataFrames, Extents, Shapefile, GeometryBasics +import GeoDataFrames import GeoInterface as GI using Rasters.Lookups, Rasters.Dimensions using Rasters: bounds