
本文详细介绍了osmnx库中`utils_geo.interpolate_points`函数的使用方法,特别是其返回的python生成器类型。我们将学习如何处理生成器输出,并提供一个完整的教程,演示如何利用此函数将现有街道几何体细分为更小的线段,进而构建一个精细化的网络图,以支持更细粒度的空间分析。
osmnx.utils_geo.interpolate_points 函数旨在沿给定的几何对象(如LineString)以指定间隔生成一系列插值点。这在需要对现有几何进行均匀细分或在路径上创建等距标记点时非常有用。
该函数的一个关键特性是其返回值类型:它返回一个Python生成器。生成器是一种特殊的迭代器,它不会一次性在内存中创建并存储所有结果,而是根据请求逐个生成值。这种机制对于处理大量数据时非常高效,因为它能显著节省内存。
然而,对于不熟悉生成器的用户来说,直接打印生成器对象可能会看到类似 <generator object interpolate_points at 0x...> 的输出,这并非用户期望的点列表。要获取生成器中的所有值,需要对其进行迭代,或者将其显式转换为列表、元组等集合类型。
示例:将生成器转换为列表
import osmnx as ox
from 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)]理解了生成器的特性后,我们就可以将其应用于街道网络的细分。
本节将提供一个完整的Python工作流程,演示如何使用 osmnx 和 momepy 库,结合 interpolate_points 函数,对街道网络进行细分并构建一个新的、更精细化的图结构。
首先,确保安装了所有必要的库。
# 安装所需库 !pip install osmnx geopandas momepy networkx matplotlib pandas import osmnx as ox import pandas as pd import geopandas as gpd import momepy import networkx as nx import matplotlib.pyplot as plt from 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()OSMnx图由节点(nodes)和边(edges)组成。为了对街道进行细分,我们需要提取边的几何信息,即LineString对象。
# 将OSMnx图转换为GeoDataFrames
nodes, edges = ox.graph_to_gdfs(graph)
# 提取边的几何列,并转换为LineString对象列表
geometry_list = edges['geometry'].tolist()
print(f"原始街道线段数量: {len(geometry_list)}")
# print(geometry_list[:3]) # 打印前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.0005
new_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函数详解及街道细分与图构建实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号