新闻中心

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

2025-11-20
浏览次数:
返回列表

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 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)]

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

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

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

小云雀 小云雀

剪映出品的AI视频和图片创作助手

小云雀 1949 查看详情 小云雀

2.1 环境准备与数据获取

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

# 安装所需库
!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()

2.2 提取街道几何信息

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个几何对象示例

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.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函数详解及街道细分与图构建实践的详细内容,更多请关注其它相关文章!


# 这是  # 网站设计推广招聘  # 公司网站排名优化手段  # 贵州营销推广团队  # 网站seo推广近期行情  # seo高手  # 日化专卖店设计营销推广  # seo收录因素  # 营销网站建设与维护  # 刷神马网站优化首页软  # 河南seo网页优化服务  # 构建一个  # python  # 如何做  # 约为  # 提供一个  # 网络图  # 将其  # 精细化  # 转换为  # 插值  # mac  # edge  # node 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 抖音怎么赚钱_抖音创作者变现方法与途径指南  AO3最新镜像入口 Archive of Our Own官方平台访问  想当下一个《2077》?《心之眼》Steam评价升至"多半好评"  Python实现多节点属性重叠度分析教程  如何在CSS中使用visited与link控制链接颜色_visited link伪类配合  C++如何实现异步操作_C++11使用std::future和std::async进行异步编程  如何在更新Composer依赖后自动运行测试_使用post-update-cmd钩子触发PHPUnit  俄罗斯Yandex搜索引擎入口_Yandex官网免登录一键访问  Win10自动更新怎么关闭 Win10永久关闭系统更新的两种方法【终极版】  如何将HTML表格多行数据保存到Google Sheet  GemBox Document HTML转PDF垂直文本渲染问题及解决方案  LINQ to XML为何解析失败? 深入理解C# XDocument的异常处理  Pandas DataFrame 高效批量赋值:告别循环与笛卡尔积误区  Golang如何使用const iota_Go iota常量计数器讲解  Win11怎么查看电脑配置_Win11硬件配置检测工具使用  怎么在mac上运行html代码_mac运行html代码方法【指南】  PDF文件体积过大处理_PDF压缩技巧详解  Go语言中高效处理x-www-form-urlencoded表单数据  解决Bootstrap卡片顶部边距导致背景图下移的问题  实现分段式页面滚动导航:CSS与J*aScript教程  一加 Nord 5 隐私权限异常_一加 Nord 5 系统安全优化  漫蛙2(台版)官方入口地址 漫蛙2(台版)正版漫画网页端  在J*aScript中复现SciPy的B样条拟合与求值:关键考量  2026春节假期票务安排_2026春节放假购票指南  html两个JS只运行一个怎么办_让双JS在html中都运行方法【技巧】  腾讯QQ邮箱官方网站_QQ邮箱网页版在线登录  c++如何使用chrono库处理时间_c++标准库时间与日期操作  windows10怎么查看硬盘序列号_windows10硬盘id查询命令  “音游” × “怪文书” 题材的节奏冒险游戏 《晕晕电波症候群》确定于2026年4月发售!  抖音小游戏合成大西瓜免费秒玩入口链接 抖音小游戏热门合集秒玩网站  在J*a中如何隐藏复杂性_使用门面模式组织对象交互  Golang如何实现容器化日志收集与分析_Golang容器日志收集分析方法  Google翻译怎么语音输入_Google翻译语音输入功能使用与设置方法  整合Supabase认证与Django模型:跨模式迁移的解决方案  蛙漫画网页版全站入口 蛙漫热门作品免费浏览  sublime如何处理大型CSV文件的列对齐_sublime高级表格编辑插件指南  《马克思佩恩3》早期版本曝光 UI设计曾多次调整!  C++如何实现单例模式_C++设计模式之线程安全的单例写法  深入理解J*a链表中的IPosition接口与使用  迅雷下载到U盘速度很慢怎么办_迅雷U盘下载慢优化方法  J*aScript中在Map循环中检测并处理空数组元素  限制HTML日期输入框的日期选择范围  蛙漫安全无毒 官方认证的绿色入口  Django表单提交验证失败后保持字段值不刷新  精准捕获:如何在页面中监听除特定元素外的所有点击事件  Win11文件资源管理器卡顿怎么修 Win11重置资源管理器进程优化响应速度【修复方法】  微博网页版怎么开启两步验证_微博网页版账号安全两步验证设置方法  c++如何实现单例设计模式_c++线程安全的单例模式写法  如何设置Windows Defender的定时扫描_计划任务实现自动杀毒【安全】  使用 Pandas 高效处理 .dat 文件:字符清理与数据计算 

搜索