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
1012Creates 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)
111118end
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
266273end
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, key) && continue
287+ ! haskey (tags_filter_dict, key) && (tags_filter_dict[key] = Dict ())
288+ for v in value
289+ ! haskey (way. tags[key], v) && continue
290+ ! haskey (tags_filter_dict[key], v) && (tags_filter_dict[key][v] = [])
291+ push! (tags_filter_dict[key][v], way. tags[key][v])
292+ end
293+ end
294+ end
295+ g. nodes[id]. tags = 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
293325end
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
0 commit comments