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%20Saving%20a%20Network%20to%20a%20File%0A%0A%20%20%20%20Save%20a%20%60cityseer%60%20prepared%20%60networkx%60%20graph%20to%20a%20file.%0A%0A%20%20%20%20To%20save%20a%20graph%20or%20to%20visualise%20it%20from%20QGIS%2C%20convert%20it%20to%20a%20%60GeoDataFrame%60%20and%20save%20it%20using%20%60geopandas%60.%0A%0A%20%20%20%20First%2C%20let's%20create%20a%20simple%20OSM%20graph%20from%20a%20bounding%20box%2C%20using%20the%20same%20approach%20as%20before.%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%20from%20cityseer.tools%20import%20io%0A%20%20%20%20from%20shapely%20import%20geometry%0A%0A%20%20%20%20poly_wgs%20%3D%20geometry.box(%0A%20%20%20%20%20%20%20%20-0.14115725966109327%2C%0A%20%20%20%20%20%20%20%2051.509220662095714%2C%0A%20%20%20%20%20%20%20%20-0.12676440185383622%2C%0A%20%20%20%20%20%20%20%2051.51820111033659%2C%0A%20%20%20%20)%0A%20%20%20%20G%20%3D%20io.osm_graph_from_poly(poly_wgs)%0A%20%20%20%20print(G)%0A%20%20%20%20return%20G%2C%20io%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%60geopandas_from_nx%60%5D(https%3A%2F%2Fcityseer.benchmarkurbanism.com%2Ftools%2Fio%23geopandas-from-nx)%20function%20to%20convert%20the%20%60networkx%60%20dataset%20into%20a%20%60geopandas%60%20LineString%20%60GeoDataFrame%60.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(G%2C%20io)%3A%0A%20%20%20%20streets_gpd%20%3D%20io.geopandas_from_nx(G)%0A%20%20%20%20streets_gpd.head()%0A%20%20%20%20return%20(streets_gpd%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%20Since%20this%20is%20now%20a%20%60geopandas%60%20%60GeoDataFrame%60%2C%20you%20can%20use%20it%20accordingly.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(streets_gpd)%3A%0A%20%20%20%20streets_gpd.plot()%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%60geopandas%60%20can%20then%20save%20the%20file%20to%20disk%2C%20after%20which%20it%20can%20be%20accessed%20and%20edited%20from%20an%20application%20such%20as%20QGIS.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(streets_gpd)%3A%0A%20%20%20%20from%20pathlib%20import%20Path%0A%0A%20%20%20%20out_dir%20%3D%20Path(%22temp%22)%0A%20%20%20%20out_dir.mkdir(exist_ok%3DTrue)%0A%20%20%20%20streets_gpd.to_file(%0A%20%20%20%20%20%20%20%20out_dir%20%2F%20%22save_streets_demo.gpkg%22%2C%0A%20%20%20%20%20%20%20%20driver%3D%22GPKG%22%2C%0A%20%20%20%20)%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%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%20This%20notebook%20demonstrated%20how%20to%20convert%20a%20%60cityseer%60-prepared%20%60networkx%60%20graph%20into%20a%20%60geopandas%60%20GeoDataFrame%20using%20%60geopandas_from_nx%60%2C%20and%20then%20save%20it%20to%20disk%20as%20a%20GeoPackage%20file.%20This%20workflow%20is%20useful%20for%20exporting%20networks%20for%20inspection%20in%20GIS%20applications%20such%20as%20QGIS%20or%20for%20sharing%20datasets%20with%20collaborators.%0A%0A%20%20%20%20When%20working%20with%20the%20high-level%20%5B%60CityNetwork%60%5D(https%3A%2F%2Fcityseer.benchmarkurbanism.com%2Fapi%2Fnetwork)%20class%2C%20networks%20and%20computed%20metrics%20can%20instead%20be%20persisted%20with%20its%20%60save%60%20method%20and%20restored%20with%20%60CityNetwork.load%60.%20To%20continue%20into%20analysis%2C%20hand%20the%20prepared%20graph%20to%20the%20high-level%20API%20with%20%5B%60CityNetwork.from_nx%60%5D(https%3A%2F%2Fcityseer.benchmarkurbanism.com%2Fapi%2Fnetwork%23from_nx)%2C%20which%20builds%20the%20dual%20network%20and%20exposes%20the%20centrality%20and%20land-use%20methods.%0A%0A%20%20%20%20**Next%20steps%3A**%20For%20analysis%2C%20see%20%5BNetwork%20Centrality%5D(https%3A%2F%2Fcityseer.benchmarkurbanism.com%2Fexamples%2Fcentrality)%20or%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
79e4676c033723f69c02c4421101d210