信息发布→ 登录 注册 退出

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


相关文章: 百度网盘网页版入口 百度网盘网页版官方登录网址  PPT平滑切换怎么做 PPT炫酷“平滑”切换动画制作教程【必学】  Lar*el如何正确地在控制器和模型之间分配逻辑_Lar*el代码职责分离与架构建议  Yandex搜索引擎官网入口_俄罗斯Yandex免登录一键直达  Golang如何优化内存分配与垃圾回收_Golang内存管理与GC优化实践  如何设置Windows Defender的定时扫描_计划任务实现自动杀毒【安全】  2026年CSGO开箱网站推荐 CSGO开箱平台精选  字由网在线版登录地址 字由网网页版安全入口  J*aScript对象创建方式_J*aScript设计模式应用  动漫岛观看全网网 动漫岛在线正版动漫入口  Excel Power Pivot如何处理XML数据源 构建高级数据模型  如何创建没有密码的Windows本地账户_跳过微软账户登录的技巧【教程】  Win10怎么制作U盘启动盘 Win10系统安装U盘制作教程【详解】  C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图  Win11截图该按哪些键 Win11截屏完整流程解析【教程】  Tabulator表格日期时间排序问题及自定义解决方案  cad怎么合并重叠的线段_cad清理重复重叠线条的操作方法  如何使用纯J*aScript判断Input元素是否在特定类容器内  NVIDIA股价11月重挫12%:下月有望好转 但难回5万亿美元巅峰  J*aScript动态修改指定div内所有a标签样式指南  Yandex免登录网页版地址 Yandex搜索引擎官方访问入口  谷歌google账号注册详细步骤 谷歌账号注册官方教程  如何将HTML表格多行数据保存到Google Sheet  sublime如何只显示或隐藏特定类型文件_sublime侧边栏文件过滤  iwriter统一登录平台 iwrite账号密码登录页面  TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法  Composer如何在生产环境安全地执行composer update  fishbowl官网免费版 fishbowl养鱼网站入口  PDF怎么合并PDF并保持格式_PDF合并文件保持排版教程  composer 和 npm/yarn 在管理依赖方面有什么核心思想差异?  qq游戏免费畅玩入口_qq游戏电脑版快速启动  Win10如何开启蓝牙功能_Windows10找不到蓝牙开关解决方法  抖音极速版最新版本 抖音极速版官方下载地址  uc手机浏览器网页版入口 uc浏览器手机版便捷登录首页  自动化J*a应用中GitHub CLI或REST API的认证与交互  Python vgamepad库按键模拟:正确使用XUSB_BUTTON常量  Word2013如何插入视频和音频媒体_Word2013媒体插入的多媒体支持  快手极速版在线观看 官方网页版登录地址  在FastAPI中利用lifespan与依赖注入高效管理Redis连接池  c++中的std::launder有什么实际用途_c++对象生命周期与指针优化  荒野行动PC版怎么注册_荒野行动PC版账号注册详细流程图文教程  写好的html代码怎么运行出来_运行写好的html代码方法【教程】  c++如何使用chrono库处理时间_c++标准库时间与日期操作  Basecamp怎样用留言钉固定重点_Basecamp用留言钉固定重点【重点标记】  谷歌浏览器无痕模式怎么开 Chrome开启无痕浏览设置方法【教程】  在Runstone环境中高效处理TasteDive API的JSON数据  12306选座如何查看座位示意图_12306座位示意图解读与使用  如何有效阻止外部脚本意外修改内联样式的高度属性  css绝对定位元素脱离父容器怎么办_确保父元素position非static  Golang如何处理RPC请求负载均衡_Golang RPC请求负载均衡策略与实践 

在线客服
服务热线

服务热线

4008988990

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!