Skip to content

Commit 16cf6d2

Browse files
author
ltokareva
committed
[FEAT] adding custom way tags
1 parent c30254c commit 16cf6d2

File tree

4 files changed

+81
-22
lines changed

4 files changed

+81
-22
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "LightOSM"
22
uuid = "d1922b25-af4e-4ba3-84af-fe9bea896051"
33
authors = ["Jack Chan <jchan2@deloitte.com.au>"]
4-
version = "0.3.0"
4+
version = "0.3.1"
55

66
[deps]
77
DataStructures = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8"

src/graph.jl

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
"""
22
graph_from_object(osm_data_object::Union{XMLDocument,Dict};
3-
network_type::Symbol=:drive,
4-
weight_type::Symbol=:time,
5-
graph_type::Symbol=:static,
6-
precompute_dijkstra_states::Bool=false,
7-
largest_connected_component::Bool=true
8-
)::OSMGraph
3+
network_type::Symbol=:drive,
4+
weight_type::Symbol=:time,
5+
graph_type::Symbol=:static,
6+
precompute_dijkstra_states::Bool=false,
7+
largest_connected_component::Bool=true,
8+
filter_network_type::Bool=true,
9+
tags_filter::Dict{String, Vector{String}}=Dict{String, Vector{String}}()
10+
)::OSMGraph
911
1012
Creates an `OSMGraph` object from download OpenStreetMap network data, use with
1113
`download_osm_network`.
@@ -41,15 +43,18 @@ function graph_from_object(osm_data_object::Union{XMLDocument,Dict};
4143
graph_type::Symbol=:static,
4244
precompute_dijkstra_states::Bool=false,
4345
largest_connected_component::Bool=true,
44-
filter_network_type::Bool=true
46+
filter_network_type::Bool=true,
47+
tags_filter::Dict{String, Vector{String}}=Dict{String, Vector{String}}()
4548
)::OSMGraph
46-
g = init_graph_from_object(osm_data_object, network_type, filter_network_type=filter_network_type)
49+
50+
g = init_graph_from_object(osm_data_object, network_type, tags_filter, filter_network_type=filter_network_type)
4751
add_node_and_edge_mappings!(g)
4852
add_weights!(g, weight_type)
4953
add_graph!(g, graph_type)
5054
# Finding connected components can only be done after LightGraph object has been constructed
5155
largest_connected_component && trim_to_largest_connected_component!(g, g.graph, weight_type, graph_type) # Pass in graph to make type stable
5256
add_node_tags!(g)
57+
!isempty(tags_filter) && add_custom_node_tags!(g, tags_filter)
5358
!(network_type in [:bike, :walk]) && add_indexed_restrictions!(g)
5459

5560
if precompute_dijkstra_states
@@ -95,7 +100,8 @@ function graph_from_file(file_path::String;
95100
graph_type::Symbol=:static,
96101
precompute_dijkstra_states::Bool=false,
97102
largest_connected_component::Bool=true,
98-
filter_network_type::Bool=true
103+
filter_network_type::Bool=true,
104+
tags_filter::Dict{String, Vector{String}}=Dict{String, Vector{String}}()
99105
)::OSMGraph
100106

101107
!isfile(file_path) && throw(ArgumentError("File $file_path does not exist"))
@@ -107,7 +113,8 @@ function graph_from_file(file_path::String;
107113
graph_type=graph_type,
108114
precompute_dijkstra_states=precompute_dijkstra_states,
109115
largest_connected_component=largest_connected_component,
110-
filter_network_type=filter_network_type)
116+
filter_network_type=filter_network_type,
117+
tags_filter=tags_filter)
111118
end
112119

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

268300
"""
269301
adjacent_node(g::OSMGraph, node::T, way::T)::Union{T,Vector{<:T}} where T <: DEFAULT_OSM_ID_TYPE
@@ -292,6 +324,8 @@ function adjacent_node(g::OSMGraph, node::T, way::T)::Union{T,Vector{<:T}} where
292324
end
293325
end
294326

327+
328+
295329
"""
296330
add_indexed_restrictions!(g::OSMGraph{U,T,W}) where {U <: DEFAULT_OSM_INDEX_TYPE, T <: DEFAULT_OSM_ID_TYPE, W <: Real}
297331

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+
tags_filter::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(tags_filter) && (tags = add_custom_way_tags(tags, tags_filter, 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(tags_filter) && (tags = add_custom_way_tags(tags, tags_filter, 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+
tags_filter::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+
tags_filter;
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+
tags_filter::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+
tags_filter;
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, tags_filter, way)
400+
tags_filter_dict = Dict{String, Any}()
401+
for (key, value) in pairs(tags_filter)
402+
!haskey(way, key) && continue
403+
tags_filter_dict[key] = Dict()
404+
for v in value
405+
haskey(way[key], v) && (tags_filter_dict[key][v] = way[key][v])
406+
end
407+
end
408+
tags["tags_filter"] = tags_filter_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)