Skip to content

Commit 2d6f7d7

Browse files
authored
Merge pull request #26 from lazarusA/la/fix_gdal_extension
fix gdal extension
2 parents 97d7fab + 127650b commit 2d6f7d7

File tree

9 files changed

+172
-1066
lines changed

9 files changed

+172
-1066
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
.vscode
12
*.jl.cov
23
*.jl.*.cov
34
*.jl.mem

ext/ArchGDALExt/ArchGDALExt.jl

Lines changed: 84 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,93 +1,98 @@
11
module ArchGDALExt
2-
import ArchGDAL: RasterDataset, AbstractRasterBand,
3-
getgeotransform, width, height, getname, getcolorinterp,
4-
getband, nraster, getdataset
5-
using ArchGDAL: ArchGDAL as AG
6-
import YAXArrayBase: dimname, dimnames, dimvals, iscontdim, getattributes, getdata, yaxcreate
2+
import ArchGDAL: RasterDataset, AbstractRasterBand, getgeotransform, width, height
3+
import ArchGDAL: getname, getcolorinterp, getband, nraster, getdataset
4+
using ArchGDAL: ArchGDAL as AG
75

8-
#include("archgdaldataset.jl")
6+
import ArchGDAL.DiskArrays: GridChunks, eachchunk
7+
import ArchGDAL.DiskArrays
8+
9+
import YAXArrayBase: dimname, dimnames, dimvals, iscontdim, getattributes, getdata, yaxcreate
10+
import YAXArrayBase: YAXArrayBase as YAB
11+
using DataStructures: OrderedDict
912

10-
function dimname(a::RasterDataset, i)
11-
if i == 1
12-
return :Y
13-
elseif i == 2
14-
return :X
15-
elseif i == 3
16-
return :Band
17-
else
18-
error("RasterDataset only has 3 dimensions")
13+
include("archgdaldataset.jl")
14+
15+
function dimname(a::RasterDataset, i)
16+
if i == 1
17+
return :Y
18+
elseif i == 2
19+
return :X
20+
elseif i == 3
21+
return :Band
22+
else
23+
error("RasterDataset only has 3 dimensions")
24+
end
1925
end
20-
end
21-
function dimvals(a::RasterDataset, i)
22-
if i == 1
23-
geo=getgeotransform(a)
24-
latr = range(geo[1],length=width(a), step=geo[2])
25-
elseif i == 2
26-
geo=getgeotransform(a)
27-
range(geo[4],length=height(a), step=geo[6])
28-
elseif i == 3
29-
colnames = map(ib -> getname(getcolorinterp(getband(a,ib))),1:nraster(a))
30-
if !allunique(colnames)
31-
colnames = string.("Band_",1:nraster(a))
26+
function dimvals(a::RasterDataset, i)
27+
if i == 1
28+
geo=getgeotransform(a)
29+
latr = range(geo[1],length=width(a), step=geo[2])
30+
elseif i == 2
31+
geo=getgeotransform(a)
32+
range(geo[4],length=height(a), step=geo[6])
33+
elseif i == 3
34+
colnames = map(ib -> getname(getcolorinterp(getband(a,ib))),1:nraster(a))
35+
if !allunique(colnames)
36+
colnames = string.("Band_",1:nraster(a))
37+
end
38+
colnames
39+
else
40+
error("RasterDataset only has 3 dimensions")
3241
end
33-
colnames
34-
else
35-
error("RasterDataset only has 3 dimensions")
3642
end
37-
end
38-
iscontdim(a::RasterDataset, i) = i < 3 ? true : nraster(a)<8
39-
function getattributes(a::RasterDataset)
40-
globatts = Dict{String,Any}(
41-
"projection_PROJ4"=>AG.toPROJ4(AG.newspatialref(AG.getproj(a))),
42-
"projection_WKT"=>AG.toWKT(AG.newspatialref(AG.getproj(a))),
43-
)
44-
bands = (getbandattributes(AG.getband(a, i)) for i in 1:size(a, 3))
45-
allbands = mergewith(bands...) do a1,a2
46-
isequal(a1,a2) ? a1 : missing
43+
iscontdim(a::RasterDataset, i) = i < 3 ? true : nraster(a)<8
44+
function getattributes(a::RasterDataset)
45+
globatts = Dict{String,Any}(
46+
"projection_PROJ4"=>AG.toPROJ4(AG.newspatialref(AG.getproj(a))),
47+
"projection_WKT"=>AG.toWKT(AG.newspatialref(AG.getproj(a))),
48+
)
49+
bands = (getbandattributes(AG.getband(a, i)) for i in 1:size(a, 3))
50+
allbands = mergewith(bands...) do a1,a2
51+
isequal(a1,a2) ? a1 : missing
52+
end
53+
merge(globatts, allbands)
4754
end
48-
merge(globatts, allbands)
49-
end
5055

5156

52-
function dimname(::AbstractRasterBand, i)
53-
if i == 1
54-
return :Y
55-
elseif i == 2
56-
return :X
57-
else
58-
error("RasterDataset only has 3 dimensions")
57+
function dimname(::AbstractRasterBand, i)
58+
if i == 1
59+
return :Y
60+
elseif i == 2
61+
return :X
62+
else
63+
error("RasterDataset only has 3 dimensions")
64+
end
5965
end
60-
end
61-
function dimvals(b::AbstractRasterBand, i)
62-
geo = getgeotransform(getdataset(b))
63-
if i == 1
64-
range(geo[1],length=width(b), step=geo[2])
65-
elseif i == 2
66-
range(geo[4],length=height(b), step=geo[6])
67-
else
68-
error("RasterDataset only has 3 dimensions")
66+
function dimvals(b::AbstractRasterBand, i)
67+
geo = getgeotransform(getdataset(b))
68+
if i == 1
69+
range(geo[1],length=width(b), step=geo[2])
70+
elseif i == 2
71+
range(geo[4],length=height(b), step=geo[6])
72+
else
73+
error("RasterDataset only has 3 dimensions")
74+
end
75+
end
76+
iscontdim(a::AbstractRasterBand, i) = true
77+
function getattributes(a::AbstractRasterBand)
78+
atts = getattributes(AG.RasterDataset(AG.getdataset(a)))
79+
bandatts = getbandattributes(a)
80+
merge(atts, bandatts)
6981
end
70-
end
71-
iscontdim(a::AbstractRasterBand, i) = true
72-
function getattributes(a::AbstractRasterBand)
73-
atts = getattributes(AG.RasterDataset(AG.getdataset(a)))
74-
bandatts = getbandattributes(a)
75-
merge(atts, bandatts)
76-
end
7782

78-
function insertattifnot!(attrs, val, name, condition)
79-
if !condition(val)
80-
attrs[name] = val
83+
function insertattifnot!(attrs, val, name, condition)
84+
if !condition(val)
85+
attrs[name] = val
86+
end
87+
end
88+
function getbandattributes(a::AbstractRasterBand)
89+
atts = Dict{String,Any}()
90+
catdict = Dict((i-1)=>v for (i,v) in enumerate(AG.getcategorynames(a)))
91+
insertattifnot!(atts, AG.getnodatavalue(a), "missing_value", isnothing)
92+
insertattifnot!(atts, catdict, "labels", isempty)
93+
insertattifnot!(atts, AG.getunittype(a), "units", isempty)
94+
insertattifnot!(atts, AG.getoffset(a), "add_offset", iszero)
95+
insertattifnot!(atts, AG.getscale(a), "scale_factor", x->isequal(x, one(x)))
96+
atts
8197
end
82-
end
83-
function getbandattributes(a::AbstractRasterBand)
84-
atts = Dict{String,Any}()
85-
catdict = Dict((i-1)=>v for (i,v) in enumerate(AG.getcategorynames(a)))
86-
insertattifnot!(atts, AG.getnodatavalue(a), "missing_value", isnothing)
87-
insertattifnot!(atts, catdict, "labels", isempty)
88-
insertattifnot!(atts, AG.getunittype(a), "units", isempty)
89-
insertattifnot!(atts, AG.getoffset(a), "add_offset", iszero)
90-
insertattifnot!(atts, AG.getscale(a), "scale_factor", x->isequal(x, one(x)))
91-
atts
92-
end
9398
end

ext/ArchGDALExt/archgdaldataset.jl

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ function GDALDataset(filename;mode="r")
7070
end
7171
Base.haskey(ds::GDALDataset, k) = in(k, ("X", "Y")) || haskey(ds.bands, k)
7272
#Implement Dataset interface
73-
function get_var_handle(ds::GDALDataset, name)
73+
function YAB.get_var_handle(ds::GDALDataset, name)
7474
if name == "X"
7575
range(ds.trans[1], length = ds.bandsize[1], step = ds.trans[2])
7676
elseif name == "Y"
@@ -81,9 +81,9 @@ function get_var_handle(ds::GDALDataset, name)
8181
end
8282

8383

84-
get_varnames(ds::GDALDataset) = collect(keys(ds.bands))
84+
YAB.get_varnames(ds::GDALDataset) = collect(keys(ds.bands))
8585

86-
function get_var_dims(ds::GDALDataset, d)
86+
function YAB.get_var_dims(ds::GDALDataset, d)
8787
if d === "X"
8888
return ("X",)
8989
elseif d==="Y"
@@ -93,13 +93,13 @@ function get_var_dims(ds::GDALDataset, d)
9393
end
9494
end
9595

96-
get_global_attrs(ds::GDALDataset) = Dict("projection"=>ds.projection)
96+
YAB.get_global_attrs(ds::GDALDataset) = Dict("projection"=>ds.projection)
9797

98-
function get_var_attrs(ds::GDALDataset, name)
98+
function YAB.get_var_attrs(ds::GDALDataset, name)
9999
if name in ("Y", "X")
100100
Dict{String,Any}()
101101
else
102-
merge(ds.bands[name].attrs,get_global_attrs(ds))
102+
merge(ds.bands[name].attrs, YAB.get_global_attrs(ds))
103103
end
104104
end
105105

@@ -135,7 +135,7 @@ function getproj(::Nothing, attrs)
135135
end
136136

137137

138-
function create_dataset(
138+
function YAB.create_dataset(
139139
::Type{<:GDALDataset},
140140
outpath,
141141
gatts,
@@ -152,7 +152,7 @@ function create_dataset(
152152
)
153153
@assert length(dimnames) == 2
154154
proj, trans = if islon(dimnames[1]) && islat(dimnames[2])
155-
#Lets set srs to EPSG:4326
155+
#Lets set the crs to EPSG:4326
156156
proj = AG.importEPSG(4326)
157157
trans = totransform(dimvals[1], dimvals[2])
158158
proj, trans
@@ -216,9 +216,10 @@ allow_missings(::Type{<:GDALDataset}) = false
216216
allow_missings(::GDALDataset) = false
217217

218218
function __init__()
219-
backendlist[:gdal] = GDALDataset
220-
push!(backendregex,r".tif$"=>GDALDataset)
221-
push!(backendregex,r".gtif$"=>GDALDataset)
222-
push!(backendregex,r".tiff$"=>GDALDataset)
223-
push!(backendregex,r".gtiff$"=>GDALDataset)
219+
@info "new driver key :gdal, updating backendlist."
220+
YAB.backendlist[:gdal] = GDALDataset
221+
push!(YAB.backendregex,r".tif$"=>GDALDataset)
222+
push!(YAB.backendregex,r".gtif$"=>GDALDataset)
223+
push!(YAB.backendregex,r".tiff$"=>GDALDataset)
224+
push!(YAB.backendregex,r".gtiff$"=>GDALDataset)
224225
end

ext/NetCDFExt.jl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,9 @@ YAB.allow_missings(::Type{<:NetCDFDataset}) = false
7878
YAB.allow_missings(::NetCDFDataset) = false
7979

8080
function __init__()
81-
YAB.backendlist[:netcdf] = NetCDFDataset
82-
push!(YAB.backendregex,r".nc$"=>NetCDFDataset)
81+
@info "new driver key :netcdf, updating backendlist."
82+
YAB.backendlist[:netcdf] = NetCDFDataset
83+
push!(YAB.backendregex,r".nc$"=>NetCDFDataset)
8384
end
85+
8486
end

ext/ZarrExt.jl

Lines changed: 50 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,64 @@
11
module ZarrExt
2-
using YAXArrayBase
3-
using Zarr: ZArray, ZGroup, zgroup, zcreate,
4-
to_zarrtype, zopen, Compressor
5-
import YAXArrayBase: YAXArrayBase as YAB
6-
export ZarrDataset
2+
using YAXArrayBase
3+
using Zarr: ZArray, ZGroup, zgroup, zcreate, to_zarrtype, zopen, Compressor
4+
import YAXArrayBase: YAXArrayBase as YAB
5+
export ZarrDataset
76

8-
function __init__()
9-
YAXArrayBase.backendlist[:zarr] = ZarrDataset
10-
push!(YAXArrayBase.backendregex, r"(.zarr$)|(.zarr/$)"=>ZarrDataset)
11-
end
7+
function __init__()
8+
@info "new driver key :zarr, updating backendlist."
9+
YAB.backendlist[:zarr] = ZarrDataset
10+
push!(YAB.backendregex, r"(.zarr$)|(.zarr/$)"=>ZarrDataset)
11+
end
1212

13-
struct ZarrDataset
14-
g::ZGroup
15-
end
16-
ZarrDataset(g::String;mode="r") = ZarrDataset(zopen(g,mode,fill_as_missing=false))
13+
struct ZarrDataset
14+
g::ZGroup
15+
end
16+
ZarrDataset(g::String;mode="r") = ZarrDataset(zopen(g,mode,fill_as_missing=false))
1717

18-
YAB.get_var_dims(ds::ZarrDataset,name) = reverse(ds[name].attrs["_ARRAY_DIMENSIONS"])
19-
YAB.get_varnames(ds::ZarrDataset) = collect(keys(ds.g.arrays))
20-
function YAB.get_var_attrs(ds::ZarrDataset, name)
21-
#We add the fill value to the attributes to be consistent with NetCDF
22-
a = ds[name]
23-
if a.metadata.fill_value !== nothing
24-
merge(ds[name].attrs,Dict("_FillValue"=>a.metadata.fill_value))
25-
else
26-
ds[name].attrs
18+
YAB.get_var_dims(ds::ZarrDataset,name) = reverse(ds[name].attrs["_ARRAY_DIMENSIONS"])
19+
YAB.get_varnames(ds::ZarrDataset) = collect(keys(ds.g.arrays))
20+
function YAB.get_var_attrs(ds::ZarrDataset, name)
21+
#We add the fill value to the attributes to be consistent with NetCDF
22+
a = ds[name]
23+
if a.metadata.fill_value !== nothing
24+
merge(ds[name].attrs,Dict("_FillValue"=>a.metadata.fill_value))
25+
else
26+
ds[name].attrs
27+
end
2728
end
28-
end
29-
YAB.get_global_attrs(ds::ZarrDataset) = ds.g.attrs
30-
Base.getindex(ds::ZarrDataset, i) = ds.g[i]
31-
Base.haskey(ds::ZarrDataset,k) = haskey(ds.g,k)
29+
YAB.get_global_attrs(ds::ZarrDataset) = ds.g.attrs
30+
Base.getindex(ds::ZarrDataset, i) = ds.g[i]
31+
Base.haskey(ds::ZarrDataset,k) = haskey(ds.g,k)
3232

33-
# function add_var(p::ZarrDataset, T::Type{>:Missing}, varname, s, dimnames, attr; kwargs...)
34-
# S = Base.nonmissingtype(T)
35-
# add_var(p,S, varname, s, dimnames, attr; fill_value = defaultfillval(S), fill_as_missing=true, kwargs...)
36-
# end
33+
# function add_var(p::ZarrDataset, T::Type{>:Missing}, varname, s, dimnames, attr; kwargs...)
34+
# S = Base.nonmissingtype(T)
35+
# add_var(p,S, varname, s, dimnames, attr; fill_value = defaultfillval(S), fill_as_missing=true, kwargs...)
36+
# end
3737

38-
function YAB.add_var(p::ZarrDataset, T::Type, varname, s, dimnames, attr;
39-
chunksize=s, fill_as_missing=false, kwargs...)
40-
attr2 = merge(attr,Dict("_ARRAY_DIMENSIONS"=>reverse(collect(dimnames))))
41-
fv = get(attr,"_FillValue",get(attr,"missing_value",YAB.defaultfillval(T)))
42-
za = zcreate(T, p.g, varname,s...;fill_value = fv,fill_as_missing,attrs=attr2,chunks=chunksize,kwargs...)
43-
za
44-
end
38+
function YAB.add_var(p::ZarrDataset, T::Type, varname, s, dimnames, attr;
39+
chunksize=s, fill_as_missing=false, kwargs...)
40+
attr2 = merge(attr,Dict("_ARRAY_DIMENSIONS"=>reverse(collect(dimnames))))
41+
fv = get(attr,"_FillValue",get(attr,"missing_value",YAB.defaultfillval(T)))
42+
za = zcreate(T, p.g, varname,s...;fill_value = fv,fill_as_missing,attrs=attr2,chunks=chunksize,kwargs...)
43+
za
44+
end
4545

46-
#Special case for init with Arrays
47-
function YAB.add_var(p::ZarrDataset, a::AbstractArray, varname, dimnames, attr;
48-
kwargs...)
49-
T = to_zarrtype(a)
50-
b = add_var(p,T,varname,size(a),dimnames,attr;kwargs...)
51-
b .= a
52-
a
53-
end
46+
#Special case for init with Arrays
47+
function YAB.add_var(p::ZarrDataset, a::AbstractArray, varname, dimnames, attr;
48+
kwargs...)
49+
T = to_zarrtype(a)
50+
b = add_var(p,T,varname,size(a),dimnames,attr;kwargs...)
51+
b .= a
52+
a
53+
end
5454

55-
YAB.create_empty(::Type{ZarrDataset}, path, gatts=Dict()) = ZarrDataset(zgroup(path, attrs=gatts))
55+
YAB.create_empty(::Type{ZarrDataset}, path, gatts=Dict()) = ZarrDataset(zgroup(path, attrs=gatts))
5656

5757

5858

59-
YAB.allow_parallel_write(::ZarrDataset) = true
60-
YAB.allow_missings(::ZarrDataset) = false
61-
YAB.to_dataset(g::ZGroup; kwargs...) = ZarrDataset(g)
62-
YAB.iscompressed(a::ZArray{<:Any,<:Any,<:Compressor}) = true
59+
YAB.allow_parallel_write(::ZarrDataset) = true
60+
YAB.allow_missings(::ZarrDataset) = false
61+
YAB.to_dataset(g::ZGroup; kwargs...) = ZarrDataset(g)
62+
YAB.iscompressed(a::ZArray{<:Any,<:Any,<:Compressor}) = true
6363

6464
end

0 commit comments

Comments
 (0)