BikeDNA(八)外在分析:OSM 与参考数据的比较2

BikeDNA(八)外在分析:OSM 与参考数据的比较2

1.数据完整性

见链接

2.网络拓扑结构

见链接

3.网络组件

本节仔细研究两个数据集的网络组件特征。

断开连接的组件不共享任何元素(节点/边)。 换句话说,不存在可以从一个断开连接的组件通向另一组件的网络路径。 如上所述,大多数现实世界的自行车基础设施网络确实由许多断开连接的组件组成(Natera Orozco et al., 2020) 。 然而,当两个断开的组件彼此非常接近时,这可能是边缘缺失或另一个数字化错误的迹象。

方法

为了比较 OSM 和参考数据中断开组件的数量和模式,将内在分析的所有组件结果并置,并生成两个新图,分别显示 OSM 和参考数据的组件间隙以及组件连接性的差异。

解释

许多自行车网络的分散性使得很难评估断开的组件是否是由于缺乏数据质量或缺乏正确连接的自行车基础设施而导致的问题。 比较两个数据集中的断开组件可以更准确地评估断开组件是数据问题还是规划问题。


3.1 断开的组件

print(f"The OSM network in the study area consists of {osm_intrinsic_results['component_analysis']['component_count']} disconnected components."
)
print(f"The {reference_name} network in the study area consists of {ref_intrinsic_results['component_analysis']['component_count']} disconnected components."
)
The OSM network in the study area consists of 356 disconnected components.
The GeoDanmark network in the study area consists of 204 disconnected components.
plot_func.plot_saved_maps([osm_results_static_maps_fp + "all_components_osm",ref_results_static_maps_fp + "all_components_reference",]
)

在这里插入图片描述

3.2 组件长度分布

所有网络组件长度的分布可以在所谓的 Zipf 图 中可视化,该图按等级对每个组件的长度进行排序,在左侧显示最大组件的长度,然后是第二大组件的长度,依此类推,直到 右侧最小组件的长度。 当 Zipf 图遵循 双对数比例 中的直线时,这意味着找到小的不连续组件的机会比传统分布的预期要高得多 (Clauset et al., 2009)。 这可能意味着网络没有合并,只有分段或随机添加 (Szell et al., 2022),或者数据本身存在许多间隙和拓扑错误,导致小的断开组件。

但是,也可能发生最大的连通分量(图中最左边的标记,等级为 1 0 0 10^0 100)是明显的异常值,而图的其余部分则遵循不同的形状。 这可能意味着在基础设施层面,大部分基础设施已连接到一个大型组件,并且数据反映了这一点 - 即数据在很大程度上没有受到间隙和缺失链接的影响。 自行车网络也可能介于两者之间,有几个大型组件作为异常值。

在对同一区域进行比较时,如下所示,如果一个数据集在其最大连通分量中显示出明显的异常值,而另一个数据集则没有,并且如果它也至少同样大,则通常可以解释为 更加完整。

plot_func.plot_saved_maps([osm_results_plots_fp + "component_length_distribution_osm",ref_results_plots_fp + "component_length_distribution_reference",],figsize=pdict["fsmap"]
)

在这里插入图片描述

3.3 最大连通分量

# Read largest cc
osm_largest_cc = gpd.read_file(osm_results_data_fp + "largest_connected_component.gpkg")
ref_largest_cc = gpd.read_file(ref_results_data_fp + "largest_connected_component.gpkg")print(f"The largest connected component in the OSM network contains {osm_intrinsic_results['component_analysis']['largest_cc_pct_size']:.2f}% of the network length."
)
print(f"The largest connected component in the {reference_name} network contains {ref_intrinsic_results['component_analysis']['largest_cc_pct_size']:.2f}% of the network length."
)
The largest connected component in the OSM network contains 91.47% of the network length.
The largest connected component in the GeoDanmark network contains 80.04% of the network length.
plot_func.plot_saved_maps([osm_results_static_maps_fp + "largest_conn_comp_osm",ref_results_static_maps_fp + "largest_conn_comp_reference",]
)

在这里插入图片描述

OSM 和参考网络中最大连接组件的叠加

# Plotset_renderer(renderer_map)
fig, ax = plt.subplots(1, figsize=pdict["fsmap"])osm_largest_cc.plot(ax=ax, linewidth=3.5, color=pdict["osm_base"], label="OSM")
ref_largest_cc.plot(ax=ax, linewidth=1.25, color=pdict["ref_base"], label=reference_name)ax.set_title(f" {area_name}: largest connected components")
ax.set_axis_off()
ax.legend()
cx.add_basemap(ax=ax, crs=study_crs, source=cx_tile_2)plot_func.save_fig(fig, compare_results_static_maps_fp + "largest_cc_overlay_compare")

在这里插入图片描述

# Plot again for potential report titlepageset_renderer(renderer_map)
fig, ax = plt.subplots(1, figsize=pdict["fsmap"])osm_largest_cc.plot(ax=ax, linewidth=3, color=pdict["osm_base"], label="OSM")
ref_largest_cc.plot(ax=ax, linewidth=1, color=pdict["ref_base"], label=reference_name)
ax.set_axis_off()plot_func.save_fig(fig, compare_results_static_maps_fp + "titleimage",plot_res="high")
plt.close()

3.4 缺少链接

在组件之间潜在缺失链接的图中,将绘制与另一个组件上的边的指定距离内的所有边。 断开的边缘之间的间隙用标记突出显示。 因此,该地图突出显示了边缘,尽管这些边缘彼此非常接近,但它们是断开连接的,因此不可能在边缘之间的自行车基础设施上骑自行车。

# DEFINE MAX BUFFER DISTANCE BETWEEN COMPONENTS CONSIDERED A GAP/MISSING LINK
component_min_distance = 10assert isinstance(component_min_distance, int) or isinstance(component_min_distance, float
), print("Setting must be integer or float value!")
# Read results with component gapsosm_cg_edge_ids = pd.read_csv(osm_results_data_fp + f"component_gaps_edges_{component_min_distance}.csv"
)["edge_id"].to_list()
osm_component_gaps_edges = osm_edges_simplified.loc[osm_edges_simplified.edge_id.isin(osm_cg_edge_ids)
]ref_cg_edge_ids = pd.read_csv(ref_results_data_fp + f"component_gaps_edges_{component_min_distance}.csv"
)["edge_id"].to_list()
ref_component_gaps_edges = ref_edges_simplified.loc[ref_edges_simplified.edge_id.isin(ref_cg_edge_ids)
]osm_component_gaps = gpd.read_file(osm_results_data_fp + f"component_gaps_centroids_{component_min_distance}.gpkg"
)
ref_component_gaps = gpd.read_file(ref_results_data_fp + f"component_gaps_centroids_{component_min_distance}.gpkg"
)
# Interactive plot of adjacent componentsfeature_groups = []if len(osm_component_gaps_edges) > 0:# Feature groups for OSMosm_edges_simplified_folium = plot_func.make_edgefeaturegroup(gdf=osm_edges_simplified,mycolor=pdict["osm_base"],myweight=pdict["line_base"],nametag="OSM network",show_edges=True,)osm_component_gaps_edges_folium = plot_func.make_edgefeaturegroup(gdf=osm_component_gaps_edges,mycolor=pdict["osm_emp"],myweight=pdict["line_emp"],nametag="OSM: Adjacent disconnected edges",show_edges=True,)osm_component_gaps_folium = plot_func.make_markerfeaturegroup(gdf=osm_component_gaps, nametag="OSM: Component gaps", show_markers=True)feature_groups.extend([osm_edges_simplified_folium,osm_component_gaps_edges_folium,osm_component_gaps_folium,])# Feature groups for reference
if len(ref_component_gaps_edges) > 0:ref_edges_simplified_folium = plot_func.make_edgefeaturegroup(gdf=ref_edges_simplified,mycolor=pdict["ref_base"],myweight=pdict["line_base"],nametag=f"{reference_name} network",show_edges=True,)ref_component_gaps_edges_folium = plot_func.make_edgefeaturegroup(gdf=ref_component_gaps_edges,mycolor=pdict["ref_emp"],myweight=pdict["line_emp"],nametag=f"{reference_name}: Adjacent disconnected edges",show_edges=True,)ref_component_gaps_folium = plot_func.make_markerfeaturegroup(gdf=ref_component_gaps, nametag=f"{reference_name}: Component gaps", show_markers=True)feature_groups.extend([ref_edges_simplified_folium,ref_component_gaps_edges_folium,ref_component_gaps_folium,])m = plot_func.make_foliumplot(feature_groups=feature_groups,layers_dict=folium_layers,center_gdf=osm_nodes_simplified,center_crs=osm_nodes_simplified.crs,
)bounds = plot_func.compute_folium_bounds(osm_nodes_simplified)
m.fit_bounds(bounds)
m.save(compare_results_inter_maps_fp + "component_gaps_compare.html")display(m)

在这里插入图片描述

print("Interactive map saved at " + compare_results_inter_maps_fp.lstrip("../") + "component_gaps_compare.html")
Interactive map saved at results/COMPARE/cph_geodk/maps_interactive/component_gaps_compare.html

3.5 每个网格单元的组件

下图显示了与网格单元相交的组件数量。 网格单元中的组件数量过多通常表明网络连接较差 - 要么是由于基础设施分散,要么是因为数据质量问题。

plot_func.plot_saved_maps([osm_results_static_maps_fp + "number_of_components_in_grid_cells_osm",ref_results_static_maps_fp + "number_of_components_in_grid_cells_reference",]
)

在这里插入图片描述

3.6 组件连接

在这里,我们可视化每个单元格可以到达的单元格数量之间的差异。 该指标是网络连接性的粗略衡量标准,但具有计算成本低的优点,因此能够快速突出网络连接性的明显差异。

在显示到达的细胞百分比差异的图中,正值表示使用参考数据集的连接性较高,而负值表示可以从 OSM 数据中的特定细胞到达更多的细胞。

plot_func.plot_saved_maps([osm_results_static_maps_fp + "percent_cells_reachable_grid_osm",ref_results_static_maps_fp + "percent_cells_reachable_grid_reference",]
)

在这里插入图片描述

# Compute difference in cell reach percentage (where data for both OSM and REF is available)grid["cell_reach_pct_diff"] = (grid["cells_reached_ref_pct"] - grid["cells_reached_osm_pct"]
)
# Plotset_renderer(renderer_map)# norm color bar
cbnorm_diff = colors.Normalize(vmin=-100, vmax=100)fig, ax = plt.subplots(1, figsize=pdict["fsmap"])
from mpl_toolkits.axes_grid1 import make_axes_locatable
divider = make_axes_locatable(ax)
cax = divider.append_axes("right", size="3.5%", pad="1%")grid.plot(cax=cax,ax=ax,alpha=pdict["alpha_grid"],column="cell_reach_pct_diff",cmap=pdict["diff"],legend=True,norm=cbnorm_diff,
)# Add no data patches
grid[grid["cell_reach_pct_diff"].isnull()].plot(cax=cax,ax=ax,facecolor=pdict["nodata_face"],edgecolor=pdict["nodata_edge"],linewidth= pdict["line_nodata"],hatch=pdict["nodata_hatch"],alpha=pdict["alpha_nodata"],
)# osm_edges_simplified.plot(ax=ax, color=pdict["osm_base"], alpha=1,linewidth=2)
# ref_edges_simplified.plot(ax=ax, color=pdict["ref_base"], alpha=1,linewidth=1)ax.legend(handles=[nodata_patch], loc="upper right")ax.set_title(f"{area_name}: {reference_name} difference to OSM in percent of cells reached"
)
ax.set_axis_off()
cx.add_basemap(ax=ax, crs=study_crs, source=cx_tile_2)plot_func.save_fig(fig, compare_results_static_maps_fp + "percent_cell_reached_diff_compare")

在这里插入图片描述

4.概括

# Load results from intrinsic
osm_intrinsic_df = pd.read_csv(osm_results_data_fp + "intrinsic_summary_results.csv",index_col=0,names=["OSM"],header=0,
)ref_intrinsic_df = pd.read_csv(ref_results_data_fp + "intrinsic_summary_results.csv",index_col=0,names=[reference_name],header=0,
)# Drop rows from OSM results not available for reference
osm_intrinsic_df.drop(["Incompatible tag combinations", "Missing intersection nodes"],axis=0,inplace=True,
)# Save new results
osm_intrinsic_df.at["Alpha", "OSM"] = osm_alpha
osm_intrinsic_df.at["Beta", "OSM"] = osm_beta
osm_intrinsic_df.at["Gamma", "OSM"] = osm_gammaref_intrinsic_df.at["Alpha", reference_name] = ref_alpha
ref_intrinsic_df.at["Beta", reference_name] = ref_beta
ref_intrinsic_df.at["Gamma", reference_name] = ref_gamma# Combine
extrinsic_df = osm_intrinsic_df.join(ref_intrinsic_df)
assert len(extrinsic_df) == len(osm_intrinsic_df) == len(ref_intrinsic_df)
extrinsic_df.style.pipe(format_extrinsic_style)
Extrinsic Quality Comparison
 OSMGeoDanmark
Total infrastructure length (km)1,056626
Protected bicycle infrastructure density (m/km2)5,3422,999
Unprotected bicycle infrastructure density (m/km2)427455
Mixed protection bicycle infrastructure density (m/km2)550
Bicycle infrastructure density (m/km2)5,8253,454
Nodes5,0164,125
Dangling nodes1,828870
Nodes per km22823
Dangling nodes per km2105
Overshoots821
Undershoots1811
Components356204
Length of largest component (km)747501
Largest component's share of network length91%80%
Component gaps7852
Alpha0.110.10
Beta1.151.14
Gamma0.380.38

5.保存结果

extrinsic_df.to_csv(compare_results_data_fp + "extrinsic_summary_results.csv", index=True
)with open(compare_results_data_fp + f"grid_results_extrinsic.pickle", "wb"
) as f:pickle.dump(grid, f)

from time import strftime
print("Time of analysis: " + strftime("%a, %d %b %Y %H:%M:%S"))
Time of analysis: Mon, 18 Dec 2023 20:25:24

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/623227.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

庆祝一年的成长

本文字数:2288;估计阅读时间:6 分钟 作者:ClickHouse Team 审校:庄晓东(魏庄) 本文在公众号【ClickHouseInc】首发 随着今年即将结束,我们想要向您表达衷心的感谢,感谢您…

cad二次开发autolisp(一)

文章目录 一、概述1.1 简介1.2 打开编辑器1.3 调试页面 二、数据类型三、函数3.1 用户函数 四、语句4.1 常规语句4.2 流程控制语句 五、图元操作5.1 定义5.2 图元选择5.3 图元属性列表 一、概述 1.1 简介 简介:cad 二次开发语言,后缀名*.lsp适用于编写…

排序算法7----归并排序(C语言)

1、基本思想 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。 将无序的序列分解到单个元素,然后将有序的子序列合并,得到完全有序的序列:即先使每个子序列有序,再使子序列段…

React16源码: React中的异步调度scheduler模块以及时间片源码实现

React Scheduler 1 ) 概述 react当中的异步调度,称为 React Scheduler发布成单独的一个 npm 包就叫做 scheduler这个包它做了什么? A. 首先它维护时间片B. 然后模拟 requestIdleCallback 这个API 因为现在浏览器的支持不是特别的多所以在浏览当中只是去…

使用scipy处理图片——旋转任意角度

大纲 载入图片左旋转30度,且重新调整图片大小右旋转30度,且重新调整图片大小左旋转135度,保持图片大小不变右旋转135度,保持图片大小不变 在《使用numpy处理图片——90度旋转》中,我们使用numpy提供的方法,…

命令行登录Mysql的详细讲解

目录 前言1. 本地登录2. 远程登录3. 拓展 前言 对于命令行登录Mysql一般都是用mysql -u root -p 但对于如何远程登陆,一直其他的参数还是有些盲区,对此总结科普 对于登录过程中出现的问题,可看我之前的文章: 服务器 出现ERROR …

【矩阵快速幂】封装类及测试用例及样例

作者推荐 视频算法专题 通俗的说&#xff0c;就是矩阵的乘方。 封装类 核心代码 class CMat { public:// 矩阵乘法static vector<vector<long long>> multiply(const vector<vector<long long>>& a, const vector<vector<long long>…

Python 面向对象之元类

Python 面向对象之元类 【一】一切皆对象 【1】元类 元类&#xff08;metaclass&#xff09;是Python中用于创建类的类。在Python中&#xff0c;类是对象&#xff0c;而元类就是类的类它们控制类的创建过程&#xff0c;允许你定制类的行为Python中内置的默认元类是type我们用…

Rust-语句和表达式

if-else Rust中if-else表达式的作用是实现条件分支。if-else表达式的构成方式为&#xff1a;以if关键字开头&#xff0c;后面跟上条件表达式&#xff0c;后续是结果语句块&#xff0c;最后是可选的else块。条件表达式的类型必须是bool。 if-else结构还可以当表达式使用 loop …

如何用LLM和自有知识库搭建智能agent?

用LangChain建立知识库&#xff0c;文末中也推荐其他方案。 项目源码&#xff1a;ChatPDF实现 LangChain Indexes使用 对加载的内容进行索引&#xff0c;在indexes中提供了一些功能&#xff1a; Document Loaders&#xff0c;加载文档Text Splitters&#xff0c;文档切分V…

开发实践5_后台管理^/ 分_页器

以下学习 朔宁夫 开发课 。&#xff08;Python&#xff09; 一 基本使用 创建超级用户 terminal // python manage.py createsuperuser 访问地址 //Log in | Django site adminhttp://127.0.0.1:8000/admin/login/?next/admin/ superuserr login django自带admin功能。其…

一文读懂「Prompt Engineering」提示词工程

在了解提示过程之前&#xff0c;先了解一下什么是提示prompt&#xff0c;见最后附录部分 一、什么是Prompt Engingering&#xff1f; 提示工程&#xff08;Prompt Engingering&#xff09;&#xff0c;也被称为上下文提示&#xff08;In-Context Prompting&#xff09;&#x…

Django项目中的默认文件都有什么用

manager.py&#xff1a; 是django用于管理本项目的命令行工具&#xff0c;之后进行站点运行&#xff0c;数据库自动生成等都是通过本文件完成。 djangoStudy/__init__.py&#xff1a; 告诉python该目录是一个python包&#xff0c;暂无内容&#xff0c;后期一些工具的初始化可…

【数据库】间隙锁Gap Lock

什么是间隙锁 间隙锁&#xff08;Gap Lock&#xff09;&#xff1a;间隙锁是&#xff08;RR级别下&#xff09;一个在索引记录之间的间隙上的锁&#xff0c;可以是两个索引记录之间&#xff0c;也可能是第一个索引记录之前或最后一个索引之后的空间。间隙锁&#xff08;Gap Lo…

Github登录时,要二次验证.Github 2FA登录问题

2023下半年, Github登录时,要二次验证. 点击“Enable 2FA now”跳到2FA验证界面。 点setup key是到secret串。 这里有一个可以不用app的验证方法。填入secret串,运行后,会得到验证码. https://blog.csdn.net/dejavu_980323/article/details/132318107 按照这个文章,得到验证…

分布式任务调度平台XXL-JOB使用(二)

说明&#xff1a;之前总结过在CentOS系统里使用XXL-JOB。但在代码开发阶段&#xff0c;我们有时需要在本地环境测试定时任务代码&#xff0c;本文介绍如何在Windows系统使用XXL-JOB。 下载 &#xff08;1&#xff09;下载代码&#xff0c;解压打开 首先&#xff0c;去Github…

在Android原生项目中 创建 Flutter模块

前言 应用场景&#xff1a;在已有的Android原生项目中&#xff0c;引入Flutter模块&#xff0c;摸索了两天&#xff0c;终于给整出来了&#xff1b; 如果是新项目&#xff0c;最好直接创建Flutter项目&#xff0c;然后在Fluter的 android / ios目录中&#xff0c;写原生代码&…

深思熟虑可能性模型介绍与使用

深思熟虑可能性模型介绍与使用 如何联系我 作者&#xff1a;鲁伟林 邮箱&#xff1a;thinking_fioa163.com或vlinyes163.com 版权声明&#xff1a;文章和记录为个人所有&#xff0c;如果转载或个人学习&#xff0c;需注明出处&#xff0c;不得用于商业盈利行为。 背景 20…

[牛客周赛复盘] 牛客周赛 Round 28 20240114

[牛客周赛复盘] 牛客周赛 Round 28 20240114 总结A\B1. 题目描述2. 思路分析3. 代码实现 小红的炸砖块1. 题目描述2. 思路分析3. 代码实现 小红统计区间&#xff08;easy&#xff09;1. 题目描述2. 思路分析3. 代码实现 小红的好数组1. 题目描述2. 思路分析3. 代码实现 小红统…

PPT插件-大珩助手-保留原素材的位置和大小一键替换

保留原素材的位置和大小一键替换 若勾选了一键替换&#xff0c;对于从素材库插入的图形&#xff0c;可以使得它的位置、大小与幻灯片中选中的形状一致 软件介绍 PPT大珩助手是一款全新设计的Office PPT插件&#xff0c;它是一款功能强大且实用的PPT辅助工具&#xff0c;支持W…