yeesian / ArchGDAL.jl

A high level API for GDAL - Geospatial Data Abstraction Library
https://yeesian.github.io/ArchGDAL.jl/stable/
Other
141 stars 27 forks source link

OFSTJSON not implemented in getfield #341

Closed alex-s-gardner closed 1 year ago

alex-s-gardner commented 1 year ago

catalog = ArchGDAL.read("https://its-live-data.s3.amazonaws.com/datacubes/catalog_v02.json") layer = ArchGDAL.getlayer(catalog, 0)

Layer: catalog_v02 Geometry 0 (): [wkbPolygon], POLYGON ((-76.411339...), ... Field 0 (fill-opacity): [OFTReal], 0.9848664555858357, ... Field 1 (fill): [OFTString], red, red, red, red, red, red, red, red, ... Field 2 (roi_percent_coverage): [OFTReal], 1.5133544414164224, ... Error showing value of type ArchGDAL.IFeatureLayer: ERROR: OFSTJSON not implemented in getfield, please report an issue to https://github.com/yeesian/ArchGDAL.jl/issues Stacktrace: [1] error(s::String) @ Base ./error.jl:35 [2] getfield(feature::ArchGDAL.Feature, i::Int64) @ ArchGDAL ~/.julia/packages/ArchGDAL/Po27z/src/ogr/feature.jl:480 [3] show(io::IOContext{Base.TTY}, layer::ArchGDAL.IFeatureLayer) @ ArchGDAL ~/.julia/packages/ArchGDAL/Po27z/src/base/display.jl:158 [4] show(io::IOContext{Base.TTY}, #unused#::MIME{Symbol("text/plain")}, x::ArchGDAL.IFeatureLayer) @ Base.Multimedia ./multimedia.jl:47 [5] (::REPL.var"#43#44"{REPL.REPLDisplay{REPL.LineEditREPL}, MIME{Symbol("text/plain")}, Base.RefValue{Any}})(io::Any) @ REPL /Applications/Julia-1.8.app/Contents/Resources/julia/share/julia/stdlib/v1.8/REPL/src/REPL.jl:267 [6] with_repl_linfo(f::Any, repl::REPL.LineEditREPL) @ REPL /Applications/Julia-1.8.app/Contents/Resources/julia/share/julia/stdlib/v1.8/REPL/src/REPL.jl:521 [7] display(d::REPL.REPLDisplay, mime::MIME{Symbol("text/plain")}, x::Any) @ REPL /Applications/Julia-1.8.app/Contents/Resources/julia/share/julia/stdlib/v1.8/REPL/src/REPL.jl:260 [8] display(d::REPL.REPLDisplay, x::Any) @ REPL /Applications/Julia-1.8.app/Contents/Resources/julia/share/julia/stdlib/v1.8/REPL/src/REPL.jl:272 [9] display(x::Any) @ Base.Multimedia ./multimedia.jl:328 [10] #invokelatest#2 @ ./essentials.jl:729 [inlined] [11] invokelatest @ ./essentials.jl:726 [inlined] [12] print_response(errio::IO, response::Any, show_value::Bool, have_color::Bool, specialdisplay::Union{Nothing, AbstractDisplay}) @ REPL /Applications/Julia-1.8.app/Contents/Resources/julia/share/julia/stdlib/v1.8/REPL/src/REPL.jl:296 [13] (::REPL.var"#45#46"{REPL.LineEditREPL, Pair{Any, Bool}, Bool, Bool})(io::Any) @ REPL /Applications/Julia-1.8.app/Contents/Resources/julia/share/julia/stdlib/v1.8/REPL/src/REPL.jl:278 [14] with_repl_linfo(f::Any, repl::REPL.LineEditREPL) @ REPL /Applications/Julia-1.8.app/Contents/Resources/julia/share/julia/stdlib/v1.8/REPL/src/REPL.jl:521 [15] print_response(repl::REPL.AbstractREPL, response::Any, show_value::Bool, have_color::Bool) @ REPL /Applications/Julia-1.8.app/Contents/Resources/julia/share/julia/stdlib/v1.8/REPL/src/REPL.jl:276 [16] (::REPL.var"#do_respond#66"{Bool, Bool, REPL.var"#77#87"{REPL.LineEditREPL, REPL.REPLHistoryProvider}, REPL.LineEditREPL, REPL.LineEdit.Prompt})(s::REPL.LineEdit.MIState, buf::Any, ok::Bool) @ REPL /Applications/Julia-1.8.app/Contents/Resources/julia/share/julia/stdlib/v1.8/REPL/src/REPL.jl:857 [17] (::VSCodeServer.var"#98#101"{REPL.var"#do_respond#66"{Bool, Bool, REPL.var"#77#87"{REPL.LineEditREPL, REPL.REPLHistoryProvider}, REPL.LineEditREPL, REPL.LineEdit.Prompt}})(mi::REPL.LineEdit.MIState, buf::IOBuffer, ok::Bool) @ VSCodeServer ~/.vscode/extensions/julialang.language-julia-1.38.2/scripts/packages/VSCodeServer/src/repl.jl:122 [18] #invokelatest#2 @ ./essentials.jl:729 [inlined] [19] invokelatest @ ./essentials.jl:726 [inlined] [20] run_interface(terminal::REPL.Terminals.TextTerminal, m::REPL.LineEdit.ModalInterface, s::REPL.LineEdit.MIState) @ REPL.LineEdit /Applications/Julia-1.8.app/Contents/Resources/julia/share/julia/stdlib/v1.8/REPL/src/LineEdit.jl:2510 [21] run_frontend(repl::REPL.LineEditREPL, backend::REPL.REPLBackendRef) @ REPL /Applications/Julia-1.8.app/Contents/Resources/julia/share/julia/stdlib/v1.8/REPL/src/REPL.jl:1248 [22] (::REPL.var"#49#54"{REPL.LineEditREPL, REPL.REPLBackendRef})() @ REPL ./task.jl:484

caused by: KeyError: key ArchGDAL.OFSTJSON not found Stacktrace: [1] getindex(h::Dict{ArchGDAL.OGRFieldType, Function}, key::ArchGDAL.OGRFieldSubType) @ Base ./dict.jl:498 [2] getfield(feature::ArchGDAL.Feature, i::Int64) @ ArchGDAL ~/.julia/packages/ArchGDAL/Po27z/src/ogr/feature.jl:476 [3] show(io::IOContext{Base.TTY}, layer::ArchGDAL.IFeatureLayer) @ ArchGDAL ~/.julia/packages/ArchGDAL/Po27z/src/base/display.jl:158 [4] show(io::IOContext{Base.TTY}, #unused#::MIME{Symbol("text/plain")}, x::ArchGDAL.IFeatureLayer) @ Base.Multimedia ./multimedia.jl:47 [5] (::REPL.var"#43#44"{REPL.REPLDisplay{REPL.LineEditREPL}, MIME{Symbol("text/plain")}, Base.RefValue{Any}})(io::Any) @ REPL /Applications/Julia-1.8.app/Contents/Resources/julia/share/julia/stdlib/v1.8/REPL/src/REPL.jl:267 [6] with_repl_linfo(f::Any, repl::REPL.LineEditREPL) @ REPL /Applications/Julia-1.8.app/Contents/Resources/julia/share/julia/stdlib/v1.8/REPL/src/REPL.jl:521 [7] display(d::REPL.REPLDisplay, mime::MIME{Symbol("text/plain")}, x::Any) @ REPL /Applications/Julia-1.8.app/Contents/Resources/julia/share/julia/stdlib/v1.8/REPL/src/REPL.jl:260 [8] display(d::REPL.REPLDisplay, x::Any) @ REPL /Applications/Julia-1.8.app/Contents/Resources/julia/share/julia/stdlib/v1.8/REPL/src/REPL.jl:272 [9] display(x::Any) @ Base.Multimedia ./multimedia.jl:328 [10] #invokelatest#2 @ ./essentials.jl:729 [inlined] [11] invokelatest @ ./essentials.jl:726 [inlined] [12] print_response(errio::IO, response::Any, show_value::Bool, have_color::Bool, specialdisplay::Union{Nothing, AbstractDisplay}) @ REPL /Applications/Julia-1.8.app/Contents/Resources/julia/share/julia/stdlib/v1.8/REPL/src/REPL.jl:296 [13] (::REPL.var"#45#46"{REPL.LineEditREPL, Pair{Any, Bool}, Bool, Bool})(io::Any) @ REPL /Applications/Julia-1.8.app/Contents/Resources/julia/share/julia/stdlib/v1.8/REPL/src/REPL.jl:278 [14] with_repl_linfo(f::Any, repl::REPL.LineEditREPL) @ REPL /Applications/Julia-1.8.app/Contents/Resources/julia/share/julia/stdlib/v1.8/REPL/src/REPL.jl:521 [15] print_response(repl::REPL.AbstractREPL, response::Any, show_value::Bool, have_color::Bool) @ REPL /Applications/Julia-1.8.app/Contents/Resources/julia/share/julia/stdlib/v1.8/REPL/src/REPL.jl:276 [16] (::REPL.var"#do_respond#66"{Bool, Bool, REPL.var"#77#87"{REPL.LineEditREPL, REPL.REPLHistoryProvider}, REPL.LineEditREPL, REPL.LineEdit.Prompt})(s::REPL.LineEdit.MIState, buf::Any, ok::Bool) @ REPL /Applications/Julia-1.8.app/Contents/Resources/julia/share/julia/stdlib/v1.8/REPL/src/REPL.jl:857 [17] (::VSCodeServer.var"#98#101"{REPL.var"#do_respond#66"{Bool, Bool, REPL.var"#77#87"{REPL.LineEditREPL, REPL.REPLHistoryProvider}, REPL.LineEditREPL, REPL.LineEdit.Prompt}})(mi::REPL.LineEdit.MIState, buf::IOBuffer, ok::Bool) @ VSCodeServer ~/.vscode/extensions/julialang.language-julia-1.38.2/scripts/packages/VSCodeServer/src/repl.jl:122 [18] #invokelatest#2 @ ./essentials.jl:729 [inlined] [19] invokelatest @ ./essentials.jl:726 [inlined] [20] run_interface(terminal::REPL.Terminals.TextTerminal, m::REPL.LineEdit.ModalInterface, s::REPL.LineEdit.MIState) @ REPL.LineEdit /Applications/Julia-1.8.app/Contents/Resources/julia/share/julia/stdlib/v1.8/REPL/src/LineEdit.jl:2510 [21] run_frontend(repl::REPL.LineEditREPL, backend::REPL.REPLBackendRef) @ REPL /Applications/Julia-1.8.app/Contents/Resources/julia/share/julia/stdlib/v1.8/REPL/src/REPL.jl:1248 [22] (::REPL.var"#49#54"{REPL.LineEditREPL, REPL.REPLBackendRef})() @ REPL ./task.jl:484

yeesian commented 1 year ago

Adding a link to https://github.com/OSGeo/gdal/issues/3882 for reference

yeesian commented 1 year ago

Thank you for filing this issue!

I've attempted a fix in #342 (basically reading JSON fields as string without any additional processing):

julia> catalog = ArchGDAL.read("https://its-live-data.s3.amazonaws.com/datacubes/catalog_v02.json")
GDAL Dataset (Driver: GeoJSON/GeoJSON)
File(s):

Number of feature layers: 1
  Layer 0: catalog_v02 (wkbPolygon)

julia> layer = ArchGDAL.getlayer(catalog, 0)
Layer: catalog_v02
  Geometry 0 (): [wkbPolygon], POLYGON ((-76.411339...), ...
     Field 0 (fill-opacity): [OFTReal], 0.9848664555858357, ...
     Field 1 (fill): [OFTString], red, red, red, red, red, red, red, red, ...
     Field 2 (roi_percent_coverage): [OFTReal], 1.5133544414164224, ...
     Field 3 (geometry_epsg): [OFSTJSON], { "type": "Polygon",..., ...
     Field 4 (datacube_exist): [OFTInteger], 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
...
 Number of Fields: 7
alex-s-gardner commented 1 year ago

Fantastic, thanks!