OSMnx:节点之间的角度
OSMnx: angle between nodes
正如我在标题中提到的,我需要找到节点之间的角度。我有一个节点列表,其中包含路线节点的 ID。我考虑过使用 'x' 和 'y' 坐标以某种方式进行操作,但我没有得出任何结论。
另外,有人告诉我要使用 'bearings',但我又一次真的不知道如何使用它,因此我没有得到正确的结果。
(我正在使用 Networkx 和 OSMnx)
是id_src和id_dst两个连续节点的id:
G.edges[(id_src, id_dst, 0)]['bearing']
导入 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]))
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
在图中是相邻的)。这给每条边一个绝对方位角属性,即北与目的节点之间的角度(从源节点开始)。
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 度。
正如我在标题中提到的,我需要找到节点之间的角度。我有一个节点列表,其中包含路线节点的 ID。我考虑过使用 'x' 和 'y' 坐标以某种方式进行操作,但我没有得出任何结论。 另外,有人告诉我要使用 'bearings',但我又一次真的不知道如何使用它,因此我没有得到正确的结果。
(我正在使用 Networkx 和 OSMnx)
是id_src和id_dst两个连续节点的id:
G.edges[(id_src, id_dst, 0)]['bearing']
导入 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]))
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
在图中是相邻的)。这给每条边一个绝对方位角属性,即北与目的节点之间的角度(从源节点开始)。
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 度。