阿艾法知识库 · 每日开源精选 | 2026年8月20日
momepy 1.0 深读:纯 Python 给城市做"形态体检",街道连通性直接搬来给传输网做拓扑分析
做网络规划时,最常被忽略的不是设备,而是形态:你的 SPN 汇聚节点到底有几个"单点故障"隐患?乡镇和城区的站点分布是不是一头过密、一头空洞?某个机房到底"服务"了多大一片、该扩容还是该减容?过去这些靠经验、靠手动画圈、靠网管截图。今天聊的这个纯 Python 库 momepy,把"城市形态"变成了一套可量化的指标——而它的街道网络连通性模块,几乎可以原样搬来给你的传输/SPN 拓扑做体检。
一句话定位:momepy = 用 Python 对"空间形态"做定量测量(Urban Morphometrics)的城市形态测量工具箱。BSD-3 许可、纯 Python(基于 GeoPandas / libpysal / networkx)、v1.0.0 于 2026-07-02 发布,最近提交 2026-08-13,仍在活跃迭代,是 PySAL 空间分析家族的正式成员。
【必看理由】为什么网络运维值得盯它一眼
① 纯 Python + BSD-3,pip 即装无商业授权、无黑盒。本体完全建立在 GeoPandas / libpysal / networkx / shapely 之上,没有任何 Rust/C++ 二进制依赖,可放心内网改造、离线裁剪,审计友好。
② 刚发 1.0 里程碑,最"新"的一批2026-07-02 发布 v1.0.0(要求 Python ≥ 3.12),这是它从 2019 年诞生以来的第一个大版本,API 收敛稳定、依赖升级到 GeoPandas 1.x / Shapely 2.x。踩坑有处查、升级有节奏。
③ 街道网络连通性 = 传输网拓扑体检它的 graph 模块能算节点度、介数中心性、环复杂度、网格度、紧密中心性。把 SPN 网元当节点、链路当边,这套指标就是现成的"单点故障排查 / 关键汇聚点定位 / 网格化率评估"工具。
④ 形态要素 + 强度/多样性 = 站点均衡分析Voronoi 服务单元切分 + 密度(intensity)+ 多样性(gini / shannon / simpson),直接对应"覆盖责任区划分、城乡站点分布均衡度、覆盖空洞识别"——扩容减容决策的数据底座。
⑤ 学术背书 + 文档最全JOSS 2019 软件论文(doi:10.21105/joss.01807)+ 官方 docs.momepy.org(ReadTheDocs)+ PySAL 生态 + 大量示例 Notebook。落地门槛低,社区活跃。
一、深读拆解:它到底能干什么
momepy 把"城市形态"拆成一套可计算的指标体系,核心围绕七个维度:尺寸(dimension)、形状(shape)、空间分布(spatial distribution)、强度(intensity)、多样性(diversity)、连通性(connectivity),以及生成这些指标所需的形态要素(elements,如 Voronoi 服务单元)。此外还有连续性图(continuity graph)、街景(streetscape)与数据预处理模块。
1)尺寸 / 形状 —— 量"单体"
momepy.Area 算面积、Volume 算体积、longest_axis_length 算最长轴、street_profile 算街道断面;形状侧有 circular_compactness(紧凑度)、convexity(凸性)、elongation( elongation 伸长率)、rectangularity(矩形度)、fractal_dimension(分形维数)。
2)空间分布 / 强度 / 多样性 —— 量"关系"
分布侧用 orientation、alignment、neighbor_distance 描述要素间的朝向与邻近关系;强度侧用 courtyards、describe_agg 量化密度;多样性侧用 gini、shannon、simpson、theil 度量空间不均衡。
3)连通性 + 形态要素 —— 网络运维的"主菜"
morphological_tessellation 用 Voronoi 把建成区切成"服务单元";gdf_to_nx / nx_to_gdf 在 GeoDataFrame 与图之间互转;连通性侧 node_degree、betweenness_centrality、cyclomatic(环复杂度)、meshedness(网格度)、gamma、COINS 全是现成的网络分析算子。
支持清单(模块 × 代表 API × 运维可类比)
| | |
|---|
| Dimension 尺寸 | Area / Volume / longest_axis_length / street_profile | |
| Shape 形状 | circular_compactness / convexity / elongation / rectangularity / fractal_dimension | |
| Spatial distribution 分布 | orientation / alignment / neighbor_distance / shared_walls | |
| Intensity 强度 | courtyards / describe_agg / describe_reached_agg | |
| Diversity 多样性 | gini / shannon / simpson / theil | |
| Connectivity 连通 | node_degree / betweenness_centrality / cyclomatic / meshedness / gamma / COINS | |
| Elements 要素 | morphological_tessellation / enclosures / generate_blocks | |
| Preprocessing 预处理 | remove_false_nodes / consolidate_intersections / CheckTessellationInput | |
二、运维实战:怎么把它跑起来
1)环境:momepy 1.0 要求 Python ≥ 3.12。它依赖 GeoPandas 1.x / libpysal 4.12+ / networkx 3.4+ / Shapely 2.1+ / NumPy 2。底层地理栈在 Windows/macOS 上用 pip 偶尔要预编译 wheel,强烈建议用 conda 装最稳;内网隔离环境可提前用 conda 打包好离线环境。
2)安装:
# 推荐:conda-forge 一键解决地理栈依赖 conda install -c conda-forge momepy # 或 pip(需先确保 GDAL/GEOS/PROJ 等原生依赖就位) pip install momepy # 需要 OSM 拉数据 / 空间统计 extras 时 pip install "momepy[plus]"
3)上手:三行算出"形态指标"
import momepy import geopandas as gpd import libpysal # 载入示例建筑足迹(Prague Bubeneč 街区) buildings = gpd.read_file(momepy.datasets.get_path("bubenec"), layer="buildings") buildings["area"] = momepy.Area(buildings).series # ① 尺寸:每栋面积 # ② 形态要素:Voronoi 把建成区切成"服务单元" limit = gpd.read_file(momepy.datasets.get_path("bubenec"), layer="limit") tess = momepy.Tessellation(buildings, unique_id="uID", limit=limit).tessellation # ③ 多样性:相邻单元的"面积 Simpson 指数" sw = libpysal.weights.KNN(tess, k=3) # 3 阶邻接空间权重 tess["area_simpson"] = momepy.simpson(tess["area"], sw).series4)主菜:把链路网当图,做连通性体检(把你的 SPN/传输环导出成"一行一条链路"的 GeoDataFrame 即可):
import momepy import geopandas as gpd # 你的链路网:每行一条链路(SPN / 传输环) links = gpd.read_file("spn_links.gpkg") # ① 转成图:节点=网元,边=链路 G = momepy.gdf_to_nx(links, approach="primal") # ② 逐节点算连通性指标 G = momepy.node_degree(G) # 节点度:挂了几条链路(degree=1 即挂接单点) G = momepy.betweenness_centrality(G) # 介数:多少最短路径经过它(关键汇聚点) G = momepy.cyclomatic(G) # 环复杂度:片区里有几个独立环 G = momepy.meshedness(G) # 网格度:0=纯树状,1=全网格 G = momepy.closeness_centrality(G) # 紧密中心性 # ③ 转回 GeoDataFrame,落库 / 上图 nodes, edges = momepy.nx_to_gdf(G)5)常驻:把它封成一个函数,每天/每周扫一遍网元数据,输出"高风险节点清单""网格度偏低片区""覆盖空洞网格",接入你现有的 SPN 分析平台或定时邮件。它本身无服务进程,跑完即走,适合做成离线批处理任务或 Notebook 定时任务。
三、部署案例:三个能直接套的场景
场景一:SPN / 传输环网拓扑体检
把网元导出为点、链路导出为线,gdf_to_nx 转图后批量算节点度与介数。节点度=1 的挂接站、介数 Top5 的汇聚点,就是割接前最该重点排查的"单点故障"隐患。某本地网用类似思路(degree + betweenness)做传输环健康度打分,割接方案评审时间明显缩短。
场景二:乡镇 vs 城区站点分布均衡度
把 BTS/SPN 机房点做 diversity(gini / simpson),gini 高说明分布极不均衡——城区过密、乡镇空洞。再叠加 intensity 算每网格站点密度,直接产出"补盲清单"和"减容候选",规划会一眼看清。
场景三:站点"覆盖责任区"划分
用 morphological_tessellation(或 enclosures)按最近邻把服务区切成单元,每个站点分到一个"责任区",再叠加人口/楼宇,评估"单站服务建筑数/用户数"。扩容还是减容,不再是拍脑袋。
⚠️ 诚实提示:上面是把"城市要素"映射成"网络资产"的类比用法。momepy 原生不吃 SNMP、不算光功率,它提供的是空间形态与网络连通性的"量化引擎"。连通性分析可直接复用;其余场景需要你把网元/链路/站点整理成 GeoDataFrame(点/线/面)再喂进去。
四、社区精选:同赛道值得一起关注的项目
① OSMnx(gboeing/osmnx)从 OpenStreetMap 一键拉取街道网络,是 momepy 连通性分析的最佳"数据源",二者天然互补。做传输网/路网数据底座首选。
② MovingPandas(movingpandas/movingpandas)轨迹/移动数据分析,把 GPS/AIS/巡检车轨迹当对象算速度、停驻、流向。做运维车辆调度与巡检路径分析的绝配。
③ GeoPandas(geopandas/geopandas)momepy 的底层矢量引擎,所有 GeoDataFrame 都靠它。空间分析必装的基石,绕不开。
④ libpysal(pysal/libpysal)空间权重与空间统计底层库,momepy 的 diversity/分布模块都建在它之上。做空间自相关、热点分析的核心依赖。
活跃度引擎:一起把它用起来
💬 评论区聊聊:你家的 SPN/传输拓扑,是只用网管告警被动发现隐患,还是也做"连通性量化体检"?节点度、介数、网格度这三个指标,你最想先跑哪一个?
📦 资料包钩子:留言「momepy」,领《momepy 连通性分析速查表 + 3 个网络运维适配 Notebook》(含链路网→图→指标落库完整代码)。
🗳️ 投票即内容:你最想用 GIS 量哪类网络资产?① 传输环网 ② 基站覆盖 ③ 管线路由 ④ 机房分布。票数最高的下期出专题深读。
📕 小红书回流:同名「阿艾法知识库」小红书搜"momepy",看图文精简版与代码截图。
👤 @真实作者:@martinfleis(Martin Fleischmann,momepy 核心维护者,PySAL 贡献者)。有问题可直接去 GitHub 提 issue。
项目仓库:github.com/pysal/momepy | 文档:docs.momepy.org | 许可:BSD-3-Clause | 引用:Fleischmann, M. (2019) JOSS 4(43):1807, doi:10.21105/joss.01807