Skip to content

Commit ea3fd15

Browse files
authored
Merge pull request #8 from JuliaGeo/feat/metadata
Add metadata passthrough
2 parents d214e8c + c0027af commit ea3fd15

File tree

3 files changed

+34
-3
lines changed

3 files changed

+34
-3
lines changed

src/io.jl

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,32 @@ function write(path, t; geocolumns=GeoInterface.geometrycolumns(t), crs=GeoInter
1414
dcrs = Dict("crs" => GeoFormatTypes.val(jcrs))
1515
end
1616
ct = Tables.columntable(t)
17-
colmetadata = Dict{Symbol,Vector{Pair{String,String}}}()
17+
metadata = DataAPI.metadata(t)
18+
if !isnothing(metadata)
19+
metadata = (k=>string(v) for (k,v) in pairs(metadata))
20+
end
21+
colmetadata = Dict{Symbol,Dict{String,String}}()
22+
tcolmetadata = DataAPI.colmetadata(t)
23+
if !isnothing(tcolmetadata)
24+
for (k, v) in pairs(tcolmetadata)
25+
colmetadata[k] = Dict(k=>string(v) for (k, v) in pairs(v))
26+
end
27+
end
1828
for column in geocolumns
1929
column in Tables.columnnames(t) || error("Geometry column $column not found in table")
2030
data = Tables.getcolumn(t, column)
2131
T = nonmissingtype(Tables.columntype(t, column))
2232
GeoInterface.isgeometry(T) || error("Geometry in $column must support the GeoInterface")
2333
ct = merge(ct, NamedTuple{(column,)}((Wrapper.(Ref(encoding), data),)))
2434

25-
colmetadata[column] = ["ARROW:extension:metadata" => JSON3.write(dcrs)]
35+
geometa = Dict("ARROW:extension:metadata" => JSON3.write(dcrs))
36+
if haskey(colmetadata, column)
37+
merge!(colmetadata[column], geometa)
38+
else
39+
colmetadata[column] = geometa
40+
end
2641
end
27-
Arrow.write(path, ct; colmetadata, kwargs...)
42+
Arrow.write(path, ct; metadata, colmetadata, kwargs...)
2843
end
2944

3045
"""

src/type.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ GeoInterface.isgeometry(::Type{<:Geometry}) = true
1616
GeoInterface.ncoord(_, ::Geometry{X,D}) where {X,D} = D
1717
GeoInterface.getcoord(::PointTrait, g::Geometry, i) = Base.getindex(g.geom, i)
1818
GeoInterface.getcoord(::PointTrait, g::Geometry{X,D,T,<:GeoFormatTypes.MixedFormat}, i) where {X,D,T} = getcoord(PointTrait(), g.geom, i)
19+
GeoInterface.x(t::PointTrait, g::Geometry) = getcoord(t, g, 1)
20+
GeoInterface.y(t::PointTrait, g::Geometry) = getcoord(t, g, 2)
21+
# GeoInterface.z(t::PointTrait, g::Geometry) = getcoord(t, g, 3) # TODO Fix!
22+
GeoInterface.m(t::PointTrait, g::Geometry) = getcoord(t, g, 4)
1923
GeoInterface.geomtrait(::Geometry{X}) where {X} = X()
2024
GeoInterface.ngeom(_, g::Geometry) = length(g.geom)
2125
GeoInterface.ngeom(t, g::Geometry{X,D,T,<:GeoFormatTypes.MixedFormat}) where {X,D,T} = ngeom(t, g.geom)

test/runtests.jl

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ using Test
66
using GeoFormatTypes
77
using DataFrames
88
using Extents
9+
using DataAPI
910

1011
mkpath(joinpath(@__DIR__, "data/write"))
1112

@@ -111,4 +112,15 @@ mkpath(joinpath(@__DIR__, "data/write"))
111112
dfn = GeoArrow.read("simple.arrow")
112113
@test GeoInterface.isgeometry(dfn.geometry[1])
113114
end
115+
@testset "Metadata" begin
116+
df = DataFrame(a=1, geometry=[(1.,2.)])
117+
DataAPI.metadata!(df, "author", "test")
118+
DataAPI.colmetadata!(df, :a, "description", "A normal column")
119+
DataAPI.colmetadata!(df, :geometry, "description", "A point geometry")
120+
GeoArrow.write("metadata.arrow", df)
121+
dfn = GeoArrow.read("metadata.arrow")
122+
@test DataAPI.metadata(dfn)["author"] == "test"
123+
@test DataAPI.colmetadata(dfn)[:a]["description"] == "A normal column"
124+
@test DataAPI.colmetadata(dfn)[:geometry]["description"] == "A point geometry"
125+
end
114126
end

0 commit comments

Comments
 (0)