milt_jpgis_water_visuazlie/main.jl
2025-07-13 20:31:39 +09:00

109 lines
3.3 KiB
Julia

using EzXML
using GLMakie
using ProgressMeter
function get_datasets_objs(root_node::EzXML.Node)
findfirst("/ksj:GI/dataset/ksj:object/ksj:AA01/ksj:OBJ", root_node)
end
struct GmPoint
"PT_00000 or p000000"
id::String
"Latitude N=+"
lat::Float64
"Longitude E=+"
lon::Float64
end
function get_coord(node_gm_point)
node_coords = findall("./jps:GM_Point.position/jps:DirectPosition/DirectPosition.coordinate", node_gm_point)
@assert length(node_coords) == 1
node_coords = first(node_coords)
x_s, y_s = split(node_coords.content)
parse(Float64, x_s), parse(Float64, y_s)
end
function get_points(node_objs)
T_POINT = Tuple{Float64,Float64}
points = Dict{String,T_POINT}()
for node in elements(node_objs)
if node.name != "GM_Point"
continue
end
push!(points, node["id"] => get_coord(node))
end
points
end
struct GmCurve
id::String
pos_array::Vector{Tuple{Float64,Float64}}
end
function get_curves(node_objs)
gm_points = get_points(node_objs)
curves = Dict{String,Vector{Tuple{Float64,Float64}}}()
for node in elements(node_objs)
if node.name != "GM_Curve"
continue
end
points = let
node_segment = findfirst("./jps:GM_Curve.segment", node)
@assert length(elements(node_segment)) == 1
node_points = elements(findfirst("./jps:GM_LineString.controlPoint/jps:GM_PointArray", node_segment |> elements |> first))
map(node_points) do node_point
@assert length(elements(node_point)) == 1
node_pos = elements(node_point) |> first
if node_pos.name == "GM_Position.direct"
x_s, y_s = findfirst("./DirectPosition.coordinate", node_pos).content |> split
parse(Float64, x_s), parse(Float64, y_s)
elseif node_pos.name == "GM_Position.indirect"
idref = findfirst("./GM_PointRef.point", node_pos)["idref"]
gm_points[idref]
else
error("Unexpected GM_Position type $(node_pos)")
end
end
end
push!(curves, node["id"] => points)
end
curves
end
@kwdef struct Gb02
id::String
loc::GmCurve
"RIN"
name::String
end
function get_gb02(node_objs)
gm_curves = get_curves(node_objs)
gb02s = Vector{Gb02}()
for node in elements(node_objs)
if node.name != "GB02"
continue
end
curve_ref = findfirst("./ksj:LOC", node)["idref"]
push!(gb02s, Gb02(id=node["id"], loc=GmCurve(curve_ref, gm_curves[curve_ref]), name=findfirst("./ksj:RIN", node).content))
end
gb02s
end
function plot(gb02s)
fig = Figure(; fonts=(; bold="Noto Sans CJK JP Bold", regular="Noto Sans CJK JP"))
# boundary = ((130.3, 130.7), (33.2, 33.5))
ax = Axis(fig[1, 1], aspect=nothing#= , limits=boundary =#)
@showprogress for (_i, gb02) in enumerate(gb02s)
pos = gb02.loc.pos_array .|> (((x, y),) -> (y, x))
# if !all(pos) do (x, y)
# boundary[1][1] < x < boundary[1][2] && boundary[2][1] < y < boundary[2][2]
# end
# continue
# end
lines!(ax, pos)
text!(ax, last(pos)[1], last(pos)[2]; text=gb02.name)
# display(fig)
end
fig
end