asp.net mvc 網(wǎng)站開發(fā)之美網(wǎng)上推廣怎么做
BikeDNA(八)外在分析:OSM 與參考數(shù)據(jù)的比較2
1.數(shù)據(jù)完整性
見鏈接
2.網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)
見鏈接
3.網(wǎng)絡(luò)組件
本節(jié)仔細(xì)研究兩個(gè)數(shù)據(jù)集的網(wǎng)絡(luò)組件特征。
斷開連接的組件不共享任何元素(節(jié)點(diǎn)/邊)。 換句話說,不存在可以從一個(gè)斷開連接的組件通向另一組件的網(wǎng)絡(luò)路徑。 如上所述,大多數(shù)現(xiàn)實(shí)世界的自行車基礎(chǔ)設(shè)施網(wǎng)絡(luò)確實(shí)由許多斷開連接的組件組成(Natera Orozco et al., 2020) 。 然而,當(dāng)兩個(gè)斷開的組件彼此非常接近時(shí),這可能是邊緣缺失或另一個(gè)數(shù)字化錯(cuò)誤的跡象。
方法
為了比較 OSM 和參考數(shù)據(jù)中斷開組件的數(shù)量和模式,將內(nèi)在分析的所有組件結(jié)果并置,并生成兩個(gè)新圖,分別顯示 OSM 和參考數(shù)據(jù)的組件間隙以及組件連接性的差異。
解釋
許多自行車網(wǎng)絡(luò)的分散性使得很難評估斷開的組件是否是由于缺乏數(shù)據(jù)質(zhì)量或缺乏正確連接的自行車基礎(chǔ)設(shè)施而導(dǎo)致的問題。 比較兩個(gè)數(shù)據(jù)集中的斷開組件可以更準(zhǔn)確地評估斷開組件是數(shù)據(jù)問題還是規(guī)劃問題。
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 組件長度分布
所有網(wǎng)絡(luò)組件長度的分布可以在所謂的 Zipf 圖 中可視化,該圖按等級對每個(gè)組件的長度進(jìn)行排序,在左側(cè)顯示最大組件的長度,然后是第二大組件的長度,依此類推,直到 右側(cè)最小組件的長度。 當(dāng) Zipf 圖遵循 雙對數(shù)比例 中的直線時(shí),這意味著找到小的不連續(xù)組件的機(jī)會(huì)比傳統(tǒng)分布的預(yù)期要高得多 (Clauset et al., 2009)。 這可能意味著網(wǎng)絡(luò)沒有合并,只有分段或隨機(jī)添加 (Szell et al., 2022),或者數(shù)據(jù)本身存在許多間隙和拓?fù)溴e(cuò)誤,導(dǎo)致小的斷開組件。
但是,也可能發(fā)生最大的連通分量(圖中最左邊的標(biāo)記,等級為 1 0 0 10^0 100)是明顯的異常值,而圖的其余部分則遵循不同的形狀。 這可能意味著在基礎(chǔ)設(shè)施層面,大部分基礎(chǔ)設(shè)施已連接到一個(gè)大型組件,并且數(shù)據(jù)反映了這一點(diǎn) - 即數(shù)據(jù)在很大程度上沒有受到間隙和缺失鏈接的影響。 自行車網(wǎng)絡(luò)也可能介于兩者之間,有幾個(gè)大型組件作為異常值。
在對同一區(qū)域進(jìn)行比較時(shí),如下所示,如果一個(gè)數(shù)據(jù)集在其最大連通分量中顯示出明顯的異常值,而另一個(gè)數(shù)據(jù)集則沒有,并且如果它也至少同樣大,則通??梢越忉尀?更加完整。
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 和參考網(wǎng)絡(luò)中最大連接組件的疊加
# 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 缺少鏈接
在組件之間潛在缺失鏈接的圖中,將繪制與另一個(gè)組件上的邊的指定距離內(nèi)的所有邊。 斷開的邊緣之間的間隙用標(biāo)記突出顯示。 因此,該地圖突出顯示了邊緣,盡管這些邊緣彼此非常接近,但它們是斷開連接的,因此不可能在邊緣之間的自行車基礎(chǔ)設(shè)施上騎自行車。
# 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 每個(gè)網(wǎng)格單元的組件
下圖顯示了與網(wǎng)格單元相交的組件數(shù)量。 網(wǎng)格單元中的組件數(shù)量過多通常表明網(wǎng)絡(luò)連接較差 - 要么是由于基礎(chǔ)設(shè)施分散,要么是因?yàn)閿?shù)據(jù)質(zhì)量問題。
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 組件連接
在這里,我們可視化每個(gè)單元格可以到達(dá)的單元格數(shù)量之間的差異。 該指標(biāo)是網(wǎng)絡(luò)連接性的粗略衡量標(biāo)準(zhǔn),但具有計(jì)算成本低的優(yōu)點(diǎn),因此能夠快速突出網(wǎng)絡(luò)連接性的明顯差異。
在顯示到達(dá)的細(xì)胞百分比差異的圖中,正值表示使用參考數(shù)據(jù)集的連接性較高,而負(fù)值表示可以從 OSM 數(shù)據(jù)中的特定細(xì)胞到達(dá)更多的細(xì)胞。
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)
? | OSM | GeoDanmark |
---|---|---|
Total infrastructure length (km) | 1,056 | 626 |
Protected bicycle infrastructure density (m/km2) | 5,342 | 2,999 |
Unprotected bicycle infrastructure density (m/km2) | 427 | 455 |
Mixed protection bicycle infrastructure density (m/km2) | 55 | 0 |
Bicycle infrastructure density (m/km2) | 5,825 | 3,454 |
Nodes | 5,016 | 4,125 |
Dangling nodes | 1,828 | 870 |
Nodes per km2 | 28 | 23 |
Dangling nodes per km2 | 10 | 5 |
Overshoots | 8 | 21 |
Undershoots | 18 | 11 |
Components | 356 | 204 |
Length of largest component (km) | 747 | 501 |
Largest component's share of network length | 91% | 80% |
Component gaps | 78 | 52 |
Alpha | 0.11 | 0.10 |
Beta | 1.15 | 1.14 |
Gamma | 0.38 | 0.38 |
5.保存結(jié)果
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