1
1
"""
2
2
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
9
11
10
12
Creates an `OSMGraph` object from download OpenStreetMap network data, use with
11
13
`download_osm_network`.
@@ -41,15 +43,18 @@ function graph_from_object(osm_data_object::Union{XMLDocument,Dict};
41
43
graph_type:: Symbol = :static ,
42
44
precompute_dijkstra_states:: Bool = false ,
43
45
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}} ()
45
48
):: 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)
47
51
add_node_and_edge_mappings! (g)
48
52
add_weights! (g, weight_type)
49
53
add_graph! (g, graph_type)
50
54
# Finding connected components can only be done after LightGraph object has been constructed
51
55
largest_connected_component && trim_to_largest_connected_component! (g, g. graph, weight_type, graph_type) # Pass in graph to make type stable
52
56
add_node_tags! (g)
57
+ ! isempty (tags_filter) && add_custom_node_tags! (g, tags_filter)
53
58
! (network_type in [:bike , :walk ]) && add_indexed_restrictions! (g)
54
59
55
60
if precompute_dijkstra_states
@@ -95,7 +100,8 @@ function graph_from_file(file_path::String;
95
100
graph_type:: Symbol = :static ,
96
101
precompute_dijkstra_states:: Bool = false ,
97
102
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}} ()
99
105
):: OSMGraph
100
106
101
107
! isfile (file_path) && throw (ArgumentError (" File $file_path does not exist" ))
@@ -107,7 +113,8 @@ function graph_from_file(file_path::String;
107
113
graph_type= graph_type,
108
114
precompute_dijkstra_states= precompute_dijkstra_states,
109
115
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)
111
118
end
112
119
113
120
"""
@@ -264,6 +271,31 @@ function add_node_tags!(g::OSMGraph)
264
271
push! (g. node_coordinates, [data. location. lat, data. location. lon])
265
272
end
266
273
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
+
267
299
268
300
"""
269
301
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
292
324
end
293
325
end
294
326
327
+
328
+
295
329
"""
296
330
add_indexed_restrictions!(g::OSMGraph{U,T,W}) where {U <: DEFAULT_OSM_INDEX_TYPE, T <: DEFAULT_OSM_ID_TYPE, W <: Real}
297
331
0 commit comments