首页 > 解决方案 > osmnx 返回....意外...轴承

问题描述

我正在尝试查找给定城市中沿特定方位运行的所有街道,我正在建立这些边缘的列表,如下所示:

G = ox.graph_from_place('Milpitas, CA')
G = ox.add_edge_bearings(ox.get_undirected(G))
sixtydegrees = []
uninteresting = []
for u, v, k, data in G.edges(keys=True, data=True):
    if np.isnan(data['bearing']):
        uninteresting.append((u, v, k))
    else:
         b = round(data['bearing'])
         if (b == 60 or b == 240):
             sixtydegrees.append((u, v, k))
         else:
             uninteresting.append((u, v, k))
G.remove_edges_from(G.edges - uninteresting)

然而,这会产生像下面这样的边缘,其中包括沿着多个轴承的多个段。虽然起始节点和结束节点彼此相距 60º,但边由 4 段组成,其中没有一条沿 60º 延伸。这是一条穿过公园的假想线,连接沿 60º 的起点和终点节点。

在此处输入图像描述

osmnx.bearing.add_edge_bearings 是(通过设计)对源节点到目标节点之间角度的简单计算。

真正找到街道,这可能意味着如上所述的街道部分,考虑到 OSM 数据的组织方式,沿着给定的方位,我是否必须遍历 xy 对并计算每个方位?还是我缺少另一个更优雅的解决方案?

标签: osmnx

解决方案


这是我的工作,想知道是否有更好的方法。

for u, v, k, data in G.edges(keys=True, data=True):
    # iterate over edges
    if v==u:
        # loops don't have meaningful bearings
        uninteresting.append((u, v, k))
    else:
        lons, lats = data['geometry'].xy
        lat1 = None
        lon1 = None
        hit = False
        for lon, lat in zip(lons, lats):
            if lat1:
                b = round(ox.bearing.get_bearing((lat1, lon1),  (lat, lon)))
                d = round(ox.distance.great_circle_vec(lat1, lon1, lat, lon))
                if d > 250: #ignore segments shorter than 250m
                    hit = hit or (59 <= b <= 61)
            lat1 = lat
            lon1 = lon
        if hit:
            sixtydegrees.append((u, v, k))
        else:
            uninteresting.append((u, v, k))

推荐阅读