Skip to content

Commit

Permalink
add methods to get driver shortname from filename extension (#174)
Browse files Browse the repository at this point in the history
* add methods to get Driver from filename extension

* extension driver tweaks

* fix extensiondriver docs

* test extensions()

* test metadataitem
  • Loading branch information
rafaqz authored Mar 7, 2021
1 parent 0e42c2b commit f6f44ca
Show file tree
Hide file tree
Showing 5 changed files with 81 additions and 0 deletions.
37 changes: 37 additions & 0 deletions src/driver.jl
Original file line number Diff line number Diff line change
Expand Up @@ -138,3 +138,40 @@ end

copyfiles(drvname::AbstractString, new::AbstractString, old::AbstractString) =
copyfiles(getdriver(drvname), new, old)

"""
extensions()
Returns a `Dict{String,String}` of all of the file extensions that can be read by GDAL,
with their respective drivers shortname.
"""
function extensions()
extdict = Dict{String,String}()
for i in 1:ndriver()
driver = getdriver(i)
if !(driver.ptr == C_NULL)
# exts is a space-delimited list in a String, so split it
for ext in split(metadataitem(driver, "DMD_EXTENSIONS"))
extdict[".$ext"] = shortname(driver)
end
end
end
return extdict
end

"""
extensiondriver(filename::AbstractString)
Returns a driver shortname that matches the filename extension.
So `extensiondriver("/my/file.tif") == "GTiff"`.
"""
function extensiondriver(filename::AbstractString)
split = splitext(filename)
extensiondict = extensions()
ext = split[2] == "" ? split[1] : split[2]
if !haskey(extensiondict, ext)
throw(ArgumentError("There are no GDAL drivers for the $ext extension"))
end
return extensiondict[ext]
end
17 changes: 17 additions & 0 deletions src/utils.jl
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,23 @@ Fetch metadata. Note that relatively few formats return any metadata.
metadata(obj; domain::AbstractString = "") =
GDAL.gdalgetmetadata(obj.ptr, domain)

"""
metadataitem(obj, name::AbstractString, domain::AbstractString)
Fetch single metadata item.
### Parameters
* `name` the name of the metadata item to fetch.
* `domain` (optional) the domain to fetch for.
### Returns
The metadata item on success, or an empty string on failure.
"""
function metadataitem(obj, name::AbstractString; domain::AbstractString = "")
item = GDAL.gdalgetmetadataitem(obj.ptr, name, domain)
return item === nothing ? "" : item
end

"""
setconfigoption(option::AbstractString, value)
Expand Down
1 change: 1 addition & 0 deletions test/runtests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,6 @@ include("remotefiles.jl")
include("test_geos_operations.jl")
include("test_cookbook_geometry.jl")
include("test_cookbook_projection.jl")
include("test_utils.jl")
end
end
16 changes: 16 additions & 0 deletions test/test_drivers.jl
Original file line number Diff line number Diff line change
Expand Up @@ -72,3 +72,19 @@ end
)
end
end

@testset "Test extensions list" begin
exts = AG.extensions()
@test exts[".tif"] == "GTiff"
@test exts[".grb"] == "GRIB"
@test exts[".geojson"] == "GeoJSON"
end

@testset "Test getting extensiondriver" begin
@test AG.extensiondriver("filename.tif") == "GTiff"
@test AG.extensiondriver(".tif") == "GTiff"
@test AG.extensiondriver("filename.asc") == "AAIGrid"
@test AG.extensiondriver(".asc") == "AAIGrid"
@test_throws ArgumentError AG.extensiondriver(".not_an_extension")
end

10 changes: 10 additions & 0 deletions test/test_utils.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using Test
import GDAL
import ArchGDAL; const AG = ArchGDAL

@testset "metadataitem" begin
driver = AG.getdriver("DERIVED")
@test AG.metadataitem(driver, "DMD_EXTENSIONS") == ""
driver = AG.getdriver("GTiff")
@test AG.metadataitem(driver, "DMD_EXTENSIONS") == "tif tiff"
end

0 comments on commit f6f44ca

Please sign in to comment.