【问题标题】:OSMnx: angle between nodesOSMnx:节点之间的角度
【发布时间】:2020-09-04 21:48:20
【问题描述】:

正如我在标题中提到的,我需要找到节点之间的角度。我有一个节点列表,其中包含路由节点的 ID。我曾考虑过使用“x”和“y”坐标以某种方式做到这一点,但我没有得出任何结论。 另外,有人告诉我使用“轴承”,但我又不知道如何使用它,因此我没有得到正确的结果。

(我正在使用 Networkx 和 OSMnx)

分别是id_src和id_dst两个连续节点的id:

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

【问题讨论】:

    标签: python nodes networkx edges osmnx


    【解决方案1】:

    导入 OSMnx

    import osmnx as ox
    

    导入墨尔本的图表

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

    从图表中创建 nodesedges 地理数据框

    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')
    

    将系列与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
    

    【讨论】:

    • 所以现在我已经尝试过了,但是我应该怎么做才能获得两个特定节点之间的角度? (对不起,我不擅长这个)。
    • 对于初学者来说,两个节点之间永远不能有角度。您将需要 3 条线,即计算角度的两条线。您可以拥有的是每个边缘的轴承(一个角度,因为设置了参考线)。这就是我的代码所做的,分配每个边缘的方位并将其放入数据框中。该数据帧中的每一行代表一条边,u 和 v 代表它的末端节点。所以连续你有一个边缘的 osm id,它的 2 个端节点和轴承。这就是你想要的。我的代码也是这样做的。
    • 为了计算任意 2 个节点之间的方位角(可能不一定是边的末端节点),您可以定义一个新函数并使用它。
    • OSMNx 包中使用的计算参考这里。 github.com/gboeing/osmnx/blob/master/osmnx/utils_geo.py
    【解决方案2】:

    如果角度是指方位角,则可以使用add_edge_bearings 函数获取每条边的方位角(即,如果uv 相邻,则从节点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 度。

    【讨论】:

      猜你喜欢
      • 2020-08-27
      • 1970-01-01
      • 2019-11-03
      • 2016-09-09
      • 1970-01-01
      • 2022-06-16
      • 2018-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多