OSMnx:节点之间的角度

1 投票
2 回答
1027 浏览
提问于 2025-06-18 04:12

在标题中我提到,我需要找到节点之间的角度。我有一个节点列表,里面是一个路线的节点ID。我想过用“x”和“y”坐标来计算角度,但一直没有找到合适的方法。

还有人告诉我可以用“方位角”,但我也不知道怎么用,所以得不到正确的结果。

(我正在使用Networkx和OSMnx)

假设id_src和id_dst是两个连续节点的ID:

G.edges[(id_src, id_dst, 0)]['bearing']

相关问题:

  • 暂无相关问题
暂无标签

2 个回答

2

如果你说的“角度”是指方位角,那么你可以使用add_edge_bearings这个函数来获取每条边的方位角(也就是说,从节点u到节点v,前提是uv在图中是相邻的)。这个函数会给每条边添加一个绝对方位角属性,也就是从起始节点出发,北方和目标节点之间的角度。

import osmnx as ox
ox.config(use_cache=True, log_console=True)
G = ox.graph_from_place('Piedmont, California, USA', network_type='drive')
G = ox.add_edge_bearings(G)
gdf_edges = ox.graph_to_gdfs(G, nodes=False)
gdf_edges[['u', 'v', 'bearing']].head(1)
# returns 53090322 53090323 140.383

在这个例子中,我们可以看到,从节点53090322到节点53090323的方位角是140.4度。

2

导入OSMnx库

import osmnx as ox

导入墨尔本的地图数据

address_name='Melbourne'
G=ox.graph_from_address(address_name, distance=50)

从地图数据中创建nodes(节点)和edges(边)的地理数据框

nodes, edges = ox.graph_to_gdfs(G, nodes=True, edges=True)

计算边的方向,并把这些方向放进一个pandas系列中

import pandas as pd
G = ox.add_edge_bearings(G)
bearings = pd.Series([data['bearing'] for u, v, k, data in G.edges(keys=True, data=True)], name='bearing')

把这个系列和edges地理数据框合并,这样就能在同一个edges地理数据框中看到边的方向

edges = pd.concat([edges, bearings], axis=1)

示例:

print('Bearing between nodes '+str(edges['u'][0])+' and '+str(edges['v'][0])+' is '+str(edges['bearing'][0]))

节点6167413263和节点6167441066之间的方向是69.48

你可以使用下面的函数来计算任意两个节点之间的方向,虽然这个计算结果和实际的方向不完全一致,但还是相当准确的。

def bearing(G,node1,node2):
    import math
    node1lat = nodes.at[node1, 'y']
    node1lon = nodes.at[node1, 'x']
    node2lat = nodes.at[node2, 'y']
    node2lon = nodes.at[node2, 'x']
    londiff = node2lon - node1lon 
    print('londiff: '+str(londiff))
    latdiff = node2lat - node1lat
    print('latdiff: '+str(latdiff))
    if latdiff > 0 and londiff > 0: # Quadrant1
        bearing = 90.0 - math.degrees(math.atan2(latdiff,londiff))
    elif latdiff < 0 and londiff > 0: #Qaudrant2
        bearing = 90.0 - math.degrees(math.atan2(latdiff,londiff))
    elif latdiff < 0 and londiff < 0: #Qaudrant3
        bearing = 90.0 - math.degrees(math.atan2(latdiff,londiff))
    elif latdiff > 0 and londiff < 0: #Qaudrant4
        bearing = 450.0 - math.degrees(math.atan2(latdiff,londiff))

    return bearing

撰写回答