2024-05-28 20:44:30 发布
网友
正如我在标题中提到的,我需要找到节点之间的角度。我有一个带有路由节点ID的节点列表。我曾想过用“x”和“y”坐标来做,但我没有得出任何结论。 另外,我也被告知使用“轴承”,但我也不知道如何使用它,因此我没有得到正确的结果
(我正在使用Networkx和OSMnx)
id_src和id_dst表示两个连续节点的id:
G.edges[(id_src, id_dst, 0)]['bearing']
如果角度是指方向角,则可以使用add_edge_bearings函数获取每条边的方向角(即,如果u和v在图形中相邻,则从节点u到节点v)。这将为每条边提供一个绝对方向角属性,即北向和目标节点之间的角度(从源节点)
u
v
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的bearing为140.4度
导入OSMnx
import osmnx as ox
导入墨尔本的图表
address_name='Melbourne' G=ox.graph_from_address(address_name, distance=50)
从图形中创建nodes和edgesgeodataframes
nodes
edges
nodes, edges = ox.graph_to_gdfs(G, nodes=True, edges=True)
计算边缘轴承,并将其制作成系列
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')
将序列与edgesgeodataframe连接起来,使边方向角位于同一edgesgeodataframe中
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]))
Bearing between nodes 6167413263 and 6167441066 is 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
如果角度是指方向角,则可以使用add_edge_bearings函数获取每条边的方向角(即,如果
u
和v
在图形中相邻,则从节点u
到节点v
)。这将为每条边提供一个绝对方向角属性,即北向和目标节点之间的角度(从源节点)在本例中,我们可以看到从节点53090322到节点53090323的bearing为140.4度
导入OSMnx
导入墨尔本的图表
从图形中创建
nodes
和edges
geodataframes计算边缘轴承,并将其制作成系列
将序列与
edges
geodataframe连接起来,使边方向角位于同一edges
geodataframe中例如:
Bearing between nodes 6167413263 and 6167441066 is 69.48
您可以使用以下函数计算任意两个节点之间的方向角,尽管它与计算的方向角不完全匹配,但相当准确
相关问题 更多 >
编程相关推荐