osmnx - 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 对并计算每个方位?还是我缺少另一个更优雅的解决方案?
解决方案
这是我的工作,想知道是否有更好的方法。
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))
推荐阅读
- embedded - 解码执行跟踪
- java - Java - Apache Beam:使用“UCS2-LE BOM”编码从 GCS 读取文件
- php - 单击提交按钮时如何保留表单输入?
- python - 是什么导致 [*a] 过度分配?
- java - 在 JavaConsole 中获取 SonarQube 分析结果
- ionic-framework - Ionic 5 - 如何替换默认图标和闪屏图像并生成资源
- android - 升级到 android 3.6.1 apk 后无法在设备上安装
- java - 为什么 isIn 条件在 MyBatis 中不起作用
- python - 如何使用 pandas 和 openpyxl 不断更新特定列中的空行
- amazon-cognito - aws cognito 在单个 api 调用中获取 jwt 令牌