OSMnx应用指南:OpenStreetMap路网数据下载及可视化
本文介绍了使用GeoPackage (GPKG) 数据格式进行路网数据处理和可视化的流程。GeoPackage是一种基于SQLite的地理空间数据存储格式,相比传统的Shapefile (shp) 具有更多优势,如支持SQL查询、高效处理大规模数据等。使用Python的osmnx库可以从OpenStreetMap (OSM) 下载路网数据,并将其保存为GeoPackage格式。通过简单的Pytho
本文可视化用到了GeoPackage(简称GPKG)的数据格式,GeoPackage是一种基于SQLite数据库的地理空间数据存储格式,支持存储矢量数据、栅格数据及相关属性数据。
gpkg较shp的优势
GeoPackage支持通过SQL查询和编程接口进行复杂的数据处理和分析,相比于shp文件的扩展性相对有限,主要依赖于GIS软件的内置功能来处理和分析数据。虽然可以通过编写自定义脚本或程序来处理shp文件,但这种方式通常需要较高的编程技能和对GIS数据结构的深入理解;
在处理大规模数据时,GeoPackage通常表现出更高的数据处理效率。这是因为GeoPackage支持空间索引和数据压缩等高级功能,可以显著减少数据检索和传输的时间;
然而对GeoPackage支持较好的软件包括QGIS、ArcGISpro 等,由于ArcGIS在10.8版本后不再更新,对新的数据格式支持较差,所以本文下载了ArcGISpro3.1.5版本来进行数据处理。
下载链接参考,文中作者下载步骤讲述的比较详细,这里就不再赘述了:ArcGISpro保姆式安装教程,附加安装包,ArcGISpro3.1.5版本安装2023年版本,ArcGIS安装包免费下载,安装教程-CSDN博客
pip安装包
第一步需要安装一下osmnx、networkx等包;
# 使用pip安装osmnx包,该包用于从OpenStreetMap下载空间数据并构建网络图
pip install osmnx
# 安装networkx包,这是一个Python包,用于创建、操作复杂网络的结构、动态和功能
pip install networkx
# 安装folium包,这是一个用于创建交互式地图的Python库,可以与osmnx结合使用来可视化网络图
pip install folium
# 安装matplotlib包,这是一个Python 2D绘图库,它可以生成出版质量级别的图形
pip install matplotlib
# 安装mapclassify包,这是一个用于数据分类的Python库,常用于地图制作中的颜色或符号分级
pip install mapclassify
路网可视化
第一步先进行可视化,三行代码搞定;
完整代码#运行环境 Python 3.11
# 导入osmnx库,该库用于处理OpenStreetMap数据,进行网络构建、分析及可视化。
import osmnx as ox
# 从OpenStreetMap下载广州市的街道网络数据,网络类型设置为驾驶网络并构建为图结构G。
G = ox.graph_from_place("guangzhou, Guangdong, China", network_type="drive")
# 使用osmnx.plot_graph函数绘制图G,并展示广州市驾驶网络的可视化结果。
fig, ax = ox.plot_graph(G)
然后就可以开代理下载OpenStreetMap路网数据了,这里以广州市为例,保存格式为gbkg;
路网下载.gpkg格式
完整代码#运行环境 Python 3.11
import osmnx as ox
# 将地点定义为广州市
place_name = "guangzhou, Guangdong, China"
# 获取广州市的街道网络图
G = ox.graph_from_place(place_name)
# 保存为GeoPackage文件,文件名与数据匹配
ox.save_graph_geopackage(G, filepath="D:/data/GuangZhou_network.gpkg")
就会得到GuangZhou_network.gpkg文件,文件里有一个点数据图层,一个路网数据图层,导入ArcGISpro 就是这个效果;
属性表里包含了包括道路id、名称、车道数、道路类型等一些数据标签,当然也有不全的,且里面大部分路网是双线,需要转单线的话则需要另行处理;
路网批量下载
完整代码#运行环境 Python 3.11
import osmnx as ox
# 定义地点名称列表
places = ["Siming Qu, Xiamen, Fujian, China", "Huli District, Xiamen, Fujian, China"]
# 遍历地点名称,为每个地点获取街道网络图并保存
for place in places:
# 获取街道网络图
G = ox.graph_from_place(place, network_type='drive') # 可以指定network_type为'all'、'drive'、'walk'等
# 去除文件名中的空格和逗号,并替换为下划线
filename = f"D:/data/{place.replace(' ', '_').replace(',', '')}_network.gpkg"
# 保存为GeoPackage文件
ox.save_graph_geopackage(G, filepath=filename)
# 输出已保存的文件名
print(f"已保存 {filename}")
路网另存为osm/svg格式
如果需要保存为.osm或者svg也可以,代码如下;
完整代码#运行环境 Python 3.11
import osmnx as ox
# 将地点定义为为广州市
place_name = "guangzhou, Guangdong, China"
# 获取广州市的街道网络图
# G = ox.graph_from_place(place_name)
# 将街道网络保存为.SVG文件
# fig, ax = ox.plot_graph(G, show=False, save=True, close=True, filepath="E:/data/guangzhou.svg")
import osmnx as ox
# 设置osmnx参数,确保所有道路都是单向处理,并开启控制台日志记录
ox.settings.all_oneway = True
ox.settings.log_console = True
。
# 从OpenStreetMap下载驾驶网络数据,网络类型为驾驶网络
G = ox.graph_from_place("guangzhou, Guangdong, China", network_type="drive", simplify=False)
# 保存下载的街道网络为.osm文件到指定路径。
ox.save_graph_xml(G, filepath="E:/data/piedmont.osm")
文章仅用于分享个人学习成果与个人存档之用,分享知识,如有侵权,请联系作者进行删除。所有信息均基于作者的个人理解和经验,不代表任何官方立场或权威解读。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)