-
Notifications
You must be signed in to change notification settings - Fork 27
/
tables.jl
49 lines (43 loc) · 1.36 KB
/
tables.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
function Tables.schema(layer::AbstractFeatureLayer)::Nothing
return nothing
end
Tables.istable(::Type{<:AbstractFeatureLayer})::Bool = true
Tables.rowaccess(::Type{<:AbstractFeatureLayer})::Bool = true
function Tables.rows(layer::T)::T where {T<:AbstractFeatureLayer}
return layer
end
function Tables.getcolumn(row::AbstractFeature, i::Int)
if i > nfield(row)
return getgeom(row, i - nfield(row) - 1)
elseif i > 0
return getfield(row, i - 1)
else
return missing
end
end
function Tables.getcolumn(row::AbstractFeature, name::Symbol)
field = getfield(row, name)
if !ismissing(field)
return field
end
geom = getgeom(row, name)
if geom.ptr != C_NULL
return geom
end
return missing
end
function Tables.columnnames(
row::AbstractFeature,
)::NTuple{Int64(nfield(row) + ngeom(row)),Symbol}
geom_names, field_names = schema_names(getfeaturedefn(row))
return (geom_names..., field_names...)
end
function schema_names(featuredefn::IFeatureDefnView)
fielddefns = (getfielddefn(featuredefn, i) for i in 0:nfield(featuredefn)-1)
field_names = (Symbol(getname(fielddefn)) for fielddefn in fielddefns)
geom_names = collect(
Symbol(getname(getgeomdefn(featuredefn, i - 1))) for
i in 1:ngeom(featuredefn)
)
return (geom_names, field_names, featuredefn, fielddefns)
end