OSM数据集下载(基于osmnx)
基于osmnx库下载地理数据集
·
一、简介
OpenStreetMap(OSM)是一个开源地理信息系统(GIS)项目,旨在创建和提供自由、可自由编辑的地理数据和地图。OSM 的核心理念是协作、开放和免费。以下是关于 OpenStreetMap 的简介:
- 地理数据协作:OSM 是一个由志愿者创建和维护的地理数据项目。志愿者可以添加、编辑和更新地理数据,包括道路、建筑、地形、水体、地理特征等。
- 开放数据:OSM 的数据是开放的,可通过免费许可协议获取和使用。这意味着你可以在几乎所有项目中使用这些数据,包括商业、非营利和个人用途。
- 免费编辑:任何人都可以在 OSM 上注册账户,免费编辑地理数据。这使得协作和更新数据变得容易,并且帮助不断完善地图。
- 多种数据类型:OSM 包括各种类型的地理数据,包括道路、路径、铁路、河流、湖泊、建筑物、商店、餐馆等。这使得 OSM 在不同领域的应用广泛。
- 多语言支持:OSM 是一个国际性项目,支持多种语言和地区的地理数据编辑和标注。
- 地图制图:OSM 数据可以用于创建定制地图,应用程序和导航系统。许多地图应用程序和服务使用 OSM 数据来提供地图和导航功能。
- GIS分析:OSM 数据也用于各种地理信息系统分析,包括交通规划、地理定位、地理空间分析等。
- 社区驱动:OSM 社区是一个活跃的全球社区,包括开发者、地理信息爱好者和专业人士。社区成员协作以确保数据质量和项目的持续发展。
osmnx提供了以下方法来检索地理数据:
- graph_from_place:通过指定地点的名称(如城市名、州名、国家名等)来检索网络图数据。
G = ox.graph_from_place("New York City, USA", network_type="all")
- graph_from_point:通过指定一个地理坐标点(经度和纬度)和一个半径来检索网络图数据。
G = ox.graph_from_point((40.7128, -74.0060), distance=1000, network_type="all")
- graph_from_bbox:通过指定一个经纬度范围(边界框)来检索网络图数据。
G = ox.graph_from_bbox(north, south, east, west, network_type="all")
- graph_from_address:通过指定一个具体地址来检索网络图数据。这可以用于获取地址所在地的道路网络图。
G = ox.graph_from_address("1600 Amphitheatre Parkway, Mountain View, CA", network_type="all")
- graph_from_xml:通过解析 OpenStreetMap XML 文件来检索网络图数据。
G = ox.graph_from_xml("your_osm_data.xml")
除了上述的ox.graph_from_,osmnx还支持 ox.features_from_,返回一个 GeoDataFrame 数据结构。
注意:需要科学上网
二、数据获取
导入包
import geopandas as gpd
import osmnx as ox
import networkx as nx
from sqlalchemy import create_engine, text
获取道路图
# 获取上海市边界
engine = create_engine(f'postgresql://postgres:123@localhost:5432/case_shanghai')
sql = 'select * from "city_boundary1"'
city = gpd.read_postgis(text(sql), engine.connect(), geom_col='geometry')
engine.dispose()
# 从ShapeFile中加载任务区的多边形,然后下载其边界框内的网络,然后剪切位于该地点边界多边形之外的所有节点
polygon = city["geometry"][0]
G = ox.graph_from_polygon(polygon, network_type="drive", simplify=True)
# 绘制网络
fig, ax = ox.plot_graph(G, node_size=0, edge_color="w", edge_linewidth=0.2)
# 突出显示所有平行(多条)边缘
ec = ["gray" if k == 0 or u == v else "r" for u, v, k in G.edges(keys=True)]
fig, ax = ox.plot_graph(
G, node_color="w", node_edgecolor="k", node_size=50, edge_color=ec, edge_linewidth=3
)
# 突出显示先前任务区网络中的所有单向边缘
ec = ["r" if data["oneway"] else "w" for u, v, key, data in G.edges(keys=True, data=True)]
fig, ax = ox.plot_graph(G, node_size=0, edge_color=ec, edge_linewidth=1.5, edge_alpha=0.7)
简化网络拓扑结构,合并交叉路口
# 获取投影
G_proj = ox.project_graph(G)
# 获取合并交叉点的GeoSeries
# 15m的间隔-需要根据当地实际情况修改
G2 = ox.consolidate_intersections(G_proj, rebuild_graph=True, tolerance=15, dead_ends=False)
fig, ax = ox.plot_graph(G2, node_color="r")
# 转GeoDataFrame格式
gdf = ox.graph_to_gdfs(G, edges=True, nodes=False)
gdf.reset_index().plot(figsize=(15,15))
获取建筑足迹
tags = {"building": True}
gdf = ox.features_from_polygon(polygon, tags)
gdf.plot(figsize=(15,15))
获取水系
tags = {"waterway": True}
gdf = ox.features_from_polygon(polygon, tags)
gdf.plot(figsize=(15,15))
获取铁路
tags = {"railway": True}
gdf = ox.features_from_polygon(polygon, tags)
gdf.plot(figsize=(15,15))
三、参考
OSMnx 1.7.0 documentation:官方使用文档(https://osmnx.readthedocs.io/en/stable/#)
示例:osmnx-examples(https://github.com/gboeing/osmnx-examples)

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)