import%20marimo%0A%0A__generated_with%20%3D%20%220.23.13%22%0Aapp%20%3D%20marimo.App()%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%0A%20%20%20%20return%20(mo%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20Network%20Centrality%20from%20OSM%20Data%0A%0A%20%20%20%20This%20notebook%20demonstrates%20how%20to%20calculate%20metric%20(shortest-path)%20distance%20centralities%20for%20a%20network%20loaded%20from%20OpenStreetMap%20(OSM)%20data.%20We%20will%20create%20a%20network%20from%20a%20buffered%20point%2C%20compute%20centrality%20measures%2C%20and%20visualise%20the%20results.%0A%0A%20%20%20%20The%20%5B%60CityNetwork.from_osm%60%5D(https%3A%2F%2Fcityseer.benchmarkurbanism.com%2Fapi%2Fnetwork%23from_osm)%20constructor%20wraps%20the%20download%2C%20cleaning%2C%20and%20dual%20graph%20conversion%20behind%20a%20single%20call.%20For%20control%20over%20the%20intermediate%20steps%2C%20see%20the%20%5Bnetwork%20preparation%20recipes%5D(https%3A%2F%2Fcityseer.benchmarkurbanism.com%2Fexamples%2Fnetworks).%0A%0A%20%20%20%20Network%20data%20%C2%A9%20%5BOpenStreetMap%5D(https%3A%2F%2Fwww.openstreetmap.org%2Fcopyright)%20contributors%2C%20available%20under%20the%20Open%20Database%20Licence.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20from%20cityseer.network%20import%20CityNetwork%0A%20%20%20%20from%20cityseer.tools%20import%20io%0A%0A%20%20%20%20return%20CityNetwork%2C%20io%2C%20plt%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Define%20the%20network%20extents.%20For%20example%2C%20from%20a%20relation%20id%2C%20bounding%20box%2C%20buffered%20point%2C%20or%20for%20extents%20defined%20from%20a%20loaded%20file.%20This%20example%20uses%20a%20buffered%20point.%0A%0A%20%20%20%20%60from_osm%60%20fetches%20and%20automatically%20simplifies%20the%20network.%20Using%20a%20simplified%20representation%20is%20recommended%2C%20otherwise%20centrality%20measures%20will%20be%20distorted%20for%20%22messier%22%20portions%20of%20the%20network.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(CityNetwork%2C%20io)%3A%0A%20%20%20%20lng%2C%20lat%20%3D%20-0.13396079424572427%2C%2051.51371088849723%0A%20%20%20%20buffer%20%3D%201500%0A%20%20%20%20poly_wgs%2C%20_epsg_code%20%3D%20io.buffered_point_poly(lng%2C%20lat%2C%20buffer)%0A%20%20%20%20cn%20%3D%20CityNetwork.from_osm(poly_wgs)%0A%20%20%20%20return%20(cn%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Use%20the%20%5B%60centrality_shortest%60%5D(https%3A%2F%2Fcityseer.benchmarkurbanism.com%2Fapi%2Fnetwork%23centrality_shortest)%20method%20to%20calculate%20shortest%20metric%20distance%20centralities.%20By%20default%20it%20computes%20a%20single%20harmonic%20closeness%20and%20a%20single%20betweenness%3B%20here%20the%20%60closeness%60%20expression%20dictionary%20and%20%60postprocess%60%20are%20used%20to%20additionally%20derive%20the%20Hillier%20normalisation%2C%20which%20requires%20the%20%60density%60%20and%20%60farness%60%20components.%0A%0A%20%20%20%20%3E%20Use%20angular%20centralities%20with%20caution%20on%20automatically%20cleaned%20OSM%20networks%2C%20preferably%20only%20after%20visual%20inspection%20and%20manual%20cleaning.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(cn)%3A%0A%20%20%20%20distances%20%3D%20%5B500%2C%201000%5D%0A%20%20%20%20cn.centrality_shortest(%0A%20%20%20%20%20%20%20%20distances%3Ddistances%2C%0A%20%20%20%20%20%20%20%20closeness%3D%7B%22density%22%3A%20%221%22%2C%20%22farness%22%3A%20%22c%22%2C%20%22harmonic%22%3A%20%221%2Fc%22%7D%2C%0A%20%20%20%20%20%20%20%20postprocess%3D%7B%22hillier%22%3A%20%22density**2%20%2F%20farness%22%7D%2C%0A%20%20%20%20)%0A%20%20%20%20nodes_gdf_1%20%3D%20cn.to_geopandas()%0A%20%20%20%20nodes_gdf_1.head()%0A%20%20%20%20return%20(nodes_gdf_1%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Exploring%20the%20results%0A%0A%20%20%20%20The%20centrality%20method%20adds%20new%20columns%20following%20the%20naming%20convention%20%60cc_%7Bcentrality%7D_%7Bdistance%7D%60.%20Inspect%20the%20columns%20and%20summary%20statistics%20to%20understand%20the%20distribution%20of%20values.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(nodes_gdf_1)%3A%0A%20%20%20%20nodes_gdf_1.columns%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(nodes_gdf_1)%3A%0A%20%20%20%20nodes_gdf_1%5B%22cc_hillier_500%22%5D.describe()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Visualising%20centrality%0A%0A%20%20%20%20Visualise%20the%20results%20using%20the%20%60geopandas%60%20%60.plot()%60%20method.%20The%20first%20plot%20shows%20Hillier%20closeness%20at%20500m%20and%20the%20second%20shows%20betweenness%20at%201000m.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(nodes_gdf_1%2C%20plt)%3A%0A%20%20%20%20_fig%2C%20_ax%20%3D%20plt.subplots(1%2C%201%2C%20figsize%3D(7%2C%207)%2C%20dpi%3D150)%0A%20%20%20%20_g%20%3D%20nodes_gdf_1.copy()%0A%20%20%20%20_g%5B%22_r%22%5D%20%3D%20_g%5B%22cc_hillier_500%22%5D.rank(pct%3DTrue)%0A%20%20%20%20_g%20%3D%20_g.sort_values(%22_r%22)%20%20%23%20strongest%20drawn%20last%2C%20on%20top%0A%20%20%20%20_g.plot(ax%3D_ax%2C%20color%3Dplt.get_cmap(%22OrRd%22)(_g%5B%22_r%22%5D)%2C%20linewidth%3D0.15%20%2B%202.25%20*%20_g%5B%22_r%22%5D)%0A%20%20%20%20_ax.set_title(%22Hillier%20closeness%2C%20500%20m%22%2C%20loc%3D%22left%22)%0A%20%20%20%20_ax.set_axis_off()%0A%20%20%20%20_fig.tight_layout()%0A%20%20%20%20_fig%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(nodes_gdf_1%2C%20plt)%3A%0A%20%20%20%20_fig%2C%20_ax%20%3D%20plt.subplots(1%2C%201%2C%20figsize%3D(7%2C%207)%2C%20dpi%3D150)%0A%20%20%20%20_g%20%3D%20nodes_gdf_1.copy()%0A%20%20%20%20_g%5B%22_r%22%5D%20%3D%20_g%5B%22cc_betweenness_1000%22%5D.rank(pct%3DTrue)%0A%20%20%20%20_g%20%3D%20_g.sort_values(%22_r%22)%20%20%23%20strongest%20drawn%20last%2C%20on%20top%0A%20%20%20%20_g.plot(ax%3D_ax%2C%20color%3Dplt.get_cmap(%22OrRd%22)(_g%5B%22_r%22%5D)%2C%20linewidth%3D0.15%20%2B%202.25%20*%20_g%5B%22_r%22%5D)%0A%20%20%20%20_ax.set_title(%22Betweenness%2C%201000%20m%22%2C%20loc%3D%22left%22)%0A%20%20%20%20_ax.set_axis_off()%0A%20%20%20%20_fig.tight_layout()%0A%20%20%20%20_fig%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Betweenness%20highlights%20the%20streets%20that%20carry%20the%20most%20through-traffic%20potential.%20Notice%20how%20major%20roads%20and%20bridges%20tend%20to%20score%20highest%2C%20as%20they%20serve%20as%20critical%20links%20in%20the%20network.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Conclusion%0A%0A%20%20%20%20This%20notebook%20demonstrated%20how%20to%20compute%20metric%20distance%20centralities%20for%20a%20network%20loaded%20directly%20from%20OpenStreetMap%20through%20%60CityNetwork.from_osm%60%2C%20using%20a%20buffered%20point%20to%20define%20the%20area%20of%20interest.%20Closeness%20and%20betweenness%20centralities%20were%20computed%20and%20visualised%20at%20500m%20and%201000m%20thresholds.%0A%0A%20%20%20%20**Next%20steps%3A**%20To%20add%20public%20transport%20data%2C%20see%20%5BGTFS%20Centrality%5D(https%3A%2F%2Fcityseer.benchmarkurbanism.com%2Fexamples%2Fcentrality%2Fcentrality-metro).%20For%20accessibility%20metrics%2C%20see%20%5BAccessibility%5D(https%3A%2F%2Fcityseer.benchmarkurbanism.com%2Fexamples%2Faccessibility).%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
9229629471666dbdc7ab69b8d4380159