Skip to content

Commit 1735a47

Browse files
author
ltokareva
committed
[FEAT] adding way tags
1 parent c6b3511 commit 1735a47

File tree

3 files changed

+71
-15
lines changed

3 files changed

+71
-15
lines changed

src/graph.jl

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,17 @@ function graph_from_object(osm_data_object::Union{XMLDocument,Dict};
4141
graph_type::Symbol=:static,
4242
precompute_dijkstra_states::Bool=false,
4343
largest_connected_component::Bool=true,
44-
filter_network_type::Bool=true
44+
filter_network_type::Bool=true,
45+
custom_tags::Dict{String, Vector{String}}=Dict{String, Vector{String}}()
4546
)::OSMGraph
46-
g = init_graph_from_object(osm_data_object, network_type, filter_network_type=filter_network_type)
47+
g = init_graph_from_object(osm_data_object, network_type, custom_tags, filter_network_type=filter_network_type)
4748
add_node_and_edge_mappings!(g)
4849
add_weights!(g, weight_type)
4950
add_graph!(g, graph_type)
5051
# Finding connected components can only be done after LightGraph object has been constructed
5152
largest_connected_component && trim_to_largest_connected_component!(g, g.graph, weight_type, graph_type) # Pass in graph to make type stable
5253
add_node_tags!(g)
54+
!isempty(custom_tags) && add_custom_node_tags!(g, custom_tags)
5355
!(network_type in [:bike, :walk]) && add_indexed_restrictions!(g)
5456

5557
if precompute_dijkstra_states
@@ -95,7 +97,8 @@ function graph_from_file(file_path::String;
9597
graph_type::Symbol=:static,
9698
precompute_dijkstra_states::Bool=false,
9799
largest_connected_component::Bool=true,
98-
filter_network_type::Bool=true
100+
filter_network_type::Bool=true,
101+
custom_tags::Dict{String, Vector{String}}=Dict{String, Vector{String}}()
99102
)::OSMGraph
100103

101104
!isfile(file_path) && throw(ArgumentError("File $file_path does not exist"))
@@ -107,7 +110,8 @@ function graph_from_file(file_path::String;
107110
graph_type=graph_type,
108111
precompute_dijkstra_states=precompute_dijkstra_states,
109112
largest_connected_component=largest_connected_component,
110-
filter_network_type=filter_network_type)
113+
filter_network_type=filter_network_type,
114+
custom_tags=custom_tags)
111115
end
112116

113117
"""
@@ -264,6 +268,31 @@ function add_node_tags!(g::OSMGraph)
264268
push!(g.node_coordinates, [data.location.lat, data.location.lon])
265269
end
266270
end
271+
"""
272+
add_custom_node_tags!(g::OSMGraphcustom_tags::Dict{String, Vector} = Dict{String, String}())
273+
274+
Based on the provided dictionary of custom tags adds them to the node
275+
"""
276+
function add_custom_node_tags!(g::OSMGraph, custom_tags)
277+
for (id, data) in g.nodes
278+
custom_tags_dict = Dict{String, Any}()
279+
ways = g.node_to_way[id]
280+
for way_id in ways
281+
way = g.ways[way_id]
282+
for (key, value) in pairs(custom_tags)
283+
!haskey(way.tags["custom_tags"], key) && continue
284+
!haskey(custom_tags_dict, key) && (custom_tags_dict[key] = Dict())
285+
for v in value
286+
!haskey(way.tags["custom_tags"][key], v) && continue
287+
!haskey(custom_tags_dict[key], v) && (custom_tags_dict[key][v] = [])
288+
push!(custom_tags_dict[key][v], way.tags["custom_tags"][key][v])
289+
end
290+
end
291+
end
292+
g.nodes[id].tags["custom_tags"] = custom_tags_dict
293+
end
294+
end
295+
267296

268297
"""
269298
adjacent_node(g::OSMGraph, node::T, way::T)::Union{T,Vector{<:T}} where T <: DEFAULT_OSM_ID_TYPE
@@ -292,6 +321,8 @@ function adjacent_node(g::OSMGraph, node::T, way::T)::Union{T,Vector{<:T}} where
292321
end
293322
end
294323

324+
325+
295326
"""
296327
add_indexed_restrictions!(g::OSMGraph{U,T,W}) where {U <: DEFAULT_OSM_INDEX_TYPE, T <: DEFAULT_OSM_ID_TYPE, W <: Real}
297328

src/parse.jl

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -198,8 +198,9 @@ end
198198
Parse OpenStreetMap data into `Node`, `Way` and `Restriction` objects.
199199
"""
200200
function parse_osm_network_dict(osm_network_dict::AbstractDict,
201-
network_type::Symbol=:drive;
202-
filter_network_type::Bool=true
201+
network_type::Symbol=:drive,
202+
custom_tags::Dict{String, Vector{String}}=Dict{String, Vector{String}}();
203+
filter_network_type::Bool=true,
203204
)::OSMGraph
204205

205206
U = DEFAULT_OSM_INDEX_TYPE
@@ -217,6 +218,8 @@ function parse_osm_network_dict(osm_network_dict::AbstractDict,
217218
tags["lanes"] = lanes(tags)
218219
tags["oneway"] = is_oneway(tags)
219220
tags["reverseway"] = is_reverseway(tags)
221+
# Check if custom tags need to be added
222+
!isempty(custom_tags) && (tags = add_custom_way_tags(tags, custom_tags, way))
220223
nds = way["nodes"]
221224
union!(highway_nodes, nds)
222225
id = way["id"]
@@ -231,6 +234,8 @@ function parse_osm_network_dict(osm_network_dict::AbstractDict,
231234
tags["maxspeed"] = maxspeed(tags)
232235
tags["oneway"] = is_oneway(tags)
233236
tags["reverseway"] = is_reverseway(tags)
237+
# Check if custom tags need to be added
238+
!isempty(custom_tags) && (tags = add_custom_way_tags(tags, custom_tags, way))
234239
nds = way["nodes"]
235240
union!(highway_nodes, nds)
236241
id = way["id"]
@@ -339,13 +344,15 @@ end
339344
Initialises the OSMGraph object from OpenStreetMap data downloaded in `:xml` or `:osm` format.
340345
"""
341346
function init_graph_from_object(osm_xml_object::XMLDocument,
342-
network_type::Symbol=:drive;
343-
filter_network_type::Bool=true
347+
network_type::Symbol=:drive,
348+
custom_tags::Dict{String, Vector{String}}=Dict{String, Vector{String}}();
349+
filter_network_type::Bool=true,
344350
)::OSMGraph
345351
dict_to_parse = osm_dict_from_xml(osm_xml_object)
346352
return parse_osm_network_dict(
347-
dict_to_parse,
348-
network_type;
353+
dict_to_parse,
354+
network_type,
355+
custom_tags;
349356
filter_network_type=filter_network_type
350357
)
351358
end
@@ -354,13 +361,15 @@ end
354361
Initialises the OSMGraph object from OpenStreetMap data downloaded in `:json` format.
355362
"""
356363
function init_graph_from_object(osm_json_object::AbstractDict,
357-
network_type::Symbol=:drive;
364+
network_type::Symbol=:drive,
365+
custom_tags::Dict{String, Vector{String}}=Dict{String, Vector{String}}();
358366
filter_network_type::Bool=true
359367
)::OSMGraph
360368
dict_to_parse = osm_dict_from_json(osm_json_object)
361369
return parse_osm_network_dict(
362-
dict_to_parse,
363-
network_type;
370+
dict_to_parse,
371+
network_type,
372+
custom_tags;
364373
filter_network_type=filter_network_type
365374
)
366375
end
@@ -385,4 +394,17 @@ function get_id_type(osm_network_dict::AbstractDict)::Type
385394
else
386395
throw(ErrorException("OSM ID type not supported: $(typeof(first_id))"))
387396
end
397+
end
398+
399+
function add_custom_way_tags(tags, custom_tags, way)
400+
custom_tags_dict = Dict{String, Any}()
401+
for (key, value) in pairs(custom_tags)
402+
!haskey(way, key) && continue
403+
custom_tags_dict[key] = Dict()
404+
for v in value
405+
haskey(way[key], v) && (custom_tags_dict[key][v] = way[key][v])
406+
end
407+
end
408+
tags["custom_tags"] = custom_tags_dict
409+
return tags
388410
end

src/types.jl

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,11 @@ struct Way{T <: Union{Integer, String}}
6666
tags::Dict{String,Any}
6767
end
6868
Way(id::T, nodes, tags::Dict{String, Any}) where T <: Union{Integer, String} = Way(id, convert(Vector{T}, nodes), tags)
69-
70-
69+
# # If "all" then we add all.
70+
# # Use true false
71+
# {"vmt_tags" => ["local_road_name", ],
72+
# "dtp_other_tags" => ["rma", ]
73+
# }
7174
"""
7275
EdgePoint{T<:Integer}
7376

0 commit comments

Comments
 (0)