def truncate_graph_dist(G, source_node, max_distance=1000, weight='length', retain_all=False):
"""
Remove everything further than some network distance from a specified node
in graph.
Parameters
----------
G : networkx multidigraph
source_node : int
the node in the graph from which to measure network distances to other
nodes
max_distance : int
remove every node in the graph greater than this distance from the
source_node
weight : string
how to weight the graph when measuring distance (default 'length' is
how many meters long the edge is)
retain_all : bool
if True, return the entire graph even if it is not connected
Returns
-------
networkx multidigraph
"""
# get the shortest distance between the node and every other node, then
# remove every node further than max_distance away
start_time = time.time()
G = G.copy()
distances = nx.shortest_path_length(G, source=source_node, weight=weight)
distant_nodes = {key:value for key, value in dict(distances).items() if value > max_distance}
G.remove_nodes_from(distant_nodes.keys())
log('Truncated graph by weighted network distance in {:,.2f} seconds'.format(time.time()-start_time))
# remove any isolated nodes and retain only the largest component (if
# retain_all is True)
if not retain_all:
G = remove_isolated_nodes(G)
G = get_largest_component(G)
return G
评论列表
文章目录