Восстановление узла с максимальной степенью и извлечение его долготы и широты - PullRequest
0 голосов
/ 19 января 2019

Я новичок в osmnx, openstreatmap и nominatim. Я пытаюсь получить узел с наивысшей / максимальной степенью, используя функцию networkx in_degree_centrality. Однако в диктах extended_stats присутствуют только степень_центральности и между_центричностью. Как мне найти этот узел? Нужно ли преобразовывать сеть мест в ориентированный граф, прежде чем я смогу использовать функцию in_degree_centrality в Networkx или osmnx это делает напрямую?

import osmnx as ox, networkx as nx, matplotlib.cm as cm, pandas as pd, numpy as np
place = 'City of Lethbridge, Alberta, Canada'
gdf = ox.gdf_from_place(place)
area = ox.project_gdf(gdf).unary_union.area
G = ox.graph_from_place(place, network_type='drive_service')

# calculate basic and extended network stats, merge them together, and display
stats = ox.basic_stats(G, area=area)
extended_stats = ox.extended_stats(G, ecc=True, bc=True, cc=True)
for key, value in extended_stats.items():
    stats[key] = value
pd.Series(stats)

# unpack dicts into individiual keys:values
stats = ox.basic_stats(G, area=area)
for k, count in stats['streets_per_node_counts'].items():
    stats['int_{}_count'.format(k)] = count
for k, proportion in stats['streets_per_node_proportion'].items():
    stats['int_{}_prop'.format(k)] = proportion

# delete the no longer needed dict elements
del stats['streets_per_node_counts']
del stats['streets_per_node_proportion']

# load as a pandas dataframe
pd.DataFrame(pd.Series(stats)).T

G_projected = ox.project_graph(G)
max_node, max_bc = max(extended_stats['betweenness_centrality'].items(), key=lambda x: x[1])
print(max_node, max_bc)


nc = ['r' if node==max_node else '#336699' for node in G_projected.nodes()]
ns = [50 if node==max_node else 8 for node in G_projected.nodes()]
fig, ax = ox.plot_graph(G_projected, node_size=ns, node_color=nc, node_zorder=2)



G_projected = ox.project_graph(G)
in_degree= in_degree_centrality(G_projected) # computing the in_degree 
max_node_deg, max_in_deg= max(in_degree['in_degree_centrality'])

Узел с максимальным градусом, его NodeId, долготой и широтой.

1 Ответ

0 голосов
/ 23 января 2019

Согласно документации OSMnx , централизованность в градусах не включена в расчет встроенной сетевой статистики. Однако, поскольку OSMnx создает объект NetworkX MultiDiGraph, вы можете вызвать реализацию NetworkX для его вычисления.

Чтобы получить длину по широте, вы просто идентифицируете узел с наивысшей центральностью в градусах, а затем проверяете атрибуты узлов (включая длину по широте) в графическом объекте.

...