OSMnx中interpolate_points函数详解及街道细分与图构建实践

OSMnx中interpolate_points函数详解及街道细分与图构建实践

本文详细介绍了osmnx库中`utils_geo.interpolate_points`函数的使用方法,特别是其返回的python生成器类型。我们将学习如何处理生成器输出,并提供一个完整的教程,演示如何利用此函数将现有街道几何体细分为更小的线段,进而构建一个精细化的网络图,以支持更细粒度的空间分析。

1. 理解 osmnx.utils_geo.interpolate_points 函数与Python生成器

osmnx.utils_geo.interpolate_points 函数旨在沿给定的几何对象(如LineString)以指定间隔生成一系列插值点。这在需要对现有几何进行均匀细分或在路径上创建等距标记点时非常有用。

该函数的一个关键特性是其返回值类型:它返回一个Python生成器。生成器是一种特殊的迭代器,它不会一次性在内存中创建并存储所有结果,而是根据请求逐个生成值。这种机制对于处理大量数据时非常高效,因为它能显著节省内存。

然而,对于不熟悉生成器的用户来说,直接打印生成器对象可能会看到类似 的输出,这并非用户期望的点列表。要获取生成器中的所有值,需要对其进行迭代,或者将其显式转换为列表、元组等集合类型。

示例:将生成器转换为列表

import osmnx as oxfrom shapely.geometry import LineString# 示例LineString,从(0,0)到(10,0)line = LineString([(0, 0), (10, 0)])# interpolate_points返回一个生成器,每隔2个单位插值points_generator = ox.utils_geo.interpolate_points(line, 2)print("生成器对象:", points_generator)# 将生成器转换为列表以查看所有点points_list = list(points_generator)print("插值点列表:", points_list)# 预期输出: [(0.0, 0.0), (2.0, 0.0), (4.0, 0.0), (6.0, 0.0), (8.0, 0.0), (10.0, 0.0)]

理解了生成器的特性后,我们就可以将其应用于街道网络的细分。

2. 街道网络精细化划分与图构建实践

本节将提供一个完整的Python工作流程,演示如何使用 osmnx 和 momepy 库,结合 interpolate_points 函数,对街道网络进行细分并构建一个新的、更精细化的图结构。

2.1 环境准备与数据获取

首先,确保安装了所有必要的库。

# 安装所需库!pip install osmnx geopandas momepy networkx matplotlib pandasimport osmnx as oximport pandas as pdimport geopandas as gpdimport momepyimport networkx as nximport matplotlib.pyplot as pltfrom shapely.geometry import LineString # 用于创建LineString对象

接下来,我们从OpenStreetMap获取指定区域的街道网络数据。

# 定义感兴趣的地点place_name = "Macon, Macon County, Illinois, United States"# 生成步行网络图graph = ox.graph_from_place(place_name, network_type="walk")# 绘制原始图fig, ax = ox.plot_graph(graph, bgcolor='w', node_size=0, edge_linewidth=0.5, edge_color='#999999')plt.title("原始街道网络图")plt.show()

2.2 提取街道几何信息

OSMnx图由节点(nodes)和边(edges)组成。为了对街道进行细分,我们需要提取边的几何信息,即LineString对象。

# 将OSMnx图转换为GeoDataFramesnodes, edges = ox.graph_to_gdfs(graph)# 提取边的几何列,并转换为LineString对象列表geometry_list = edges['geometry'].tolist()print(f"原始街道线段数量: {len(geometry_list)}")# print(geometry_list[:3]) # 打印前3个几何对象示例

2.3 对街道进行插值细分

这是核心步骤。我们将遍历每个原始LineString,使用 interpolate_points 函数生成一系列新的插值点,然后利用这些点构建更短的新LineString。

interpolate_points 函数的第二个参数 distance 通常是投影坐标系下的距离单位。由于OpenStreetMap数据通常是经纬度坐标(WGS84),直接使用米作为距离单位会导致不准确。一个常见的做法是先将GeoDataFrame投影到合适的本地投影坐标系(如UTM),以确保距离的精确性。在本例中,为了演示目的,我们使用一个小的经纬度距离 0.0005,它近似对应于某个短距离(例如,在赤道附近,0.0005度纬度大约是55米,0.0005度经度取决于纬度)。

# 定义插值距离(此处为经纬度单位,实际应用建议先进行投影转换)# 例如,0.0005经纬度单位在大约40度纬度时,东西方向约为38米,南北方向约为55米。interpolation_distance = 0.0005new_subdivided_linestrings = [] # 初始化空列表,用于存储新的细分线段for original_line in geometry_list:    # 对每条原始LineString进行插值,获取点生成器    interpolated_points_generator = ox.utils_geo.interpolate_points(original_line, interpolation_distance)    # 将生成器转换为点列表    interpolated_points = list(interpolated_points_generator)    # 从插值点列表创建新的细分LineString    # 每个新的LineString由相邻的两个插值点构成    for i in range(len(interpolated_points)

以上就是OSMnx中interpolate_points函数详解及街道细分与图构建实践的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1381470.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 22:59:22
下一篇 2025年12月14日 22:59:39

相关推荐

发表回复

登录后才能评论
关注微信