阿艾法知识库 · 每日开源精选 | 2026-08-14
基站选址、机房布点、应急通信车驻点——你以为这是网优的事,其实它本质是一道地理空间题:坡度能不能立塔?离主干道多远?生态红线在哪?居民区密集不密集?把这几层栅格和矢量叠在一起做"是与否"的判断,就是教科书里的用地适宜性分析(Land Eligibility / Site Suitability)。
今天拆的这个项目,是德国于利希研究中心(Forschungszentrum Jülich)开源的 ETHOS.GeoKit——一个纯 Python 的地理空间工具包,专门为"把不同格式、不同分辨率、不同坐标系的栅格和矢量数据,统一塞进一个研究区里做叠加分析"而生。它最出圈的用法,就是给光伏、风电做用地适宜性,被 GLAES、RESKit 这些能源建模工具直接当底层引擎调用,论文还发在了 SoftwareX(2026)。对咱们网优人来说,它的 RegionMask 工作流,几乎可以原样照搬到基站/机房选址。
一句话结论
GeoKit 不是又一个"玩具 GIS",而是经过同行评审、被工业级能源模型依赖的栅格+矢量融合选址引擎。会写 Python 就能用,MIT 协议可商用,且中文圈几乎没人写过——蓝海。
【必看理由】为什么网优人该盯它
① 真·纯 Python + MIT,没有编译门槛
底层是 GDAL,但 GeoKit 把它包成了函数式 Python API。不用自己编译 GDAL、不用写 OGR 样板代码,conda 一行装好就能跑;MIT 协议,商用、改源码都自由。
② 栅格+矢量一把梭,RegionMask 是灵魂
不同格式、不同分辨率、不同坐标系的数据,用 RegionMask 对象统一到一个 ROI(感兴趣区)。CRS 转换、范围裁剪、像元对齐这些最烦的活,它自动替你记账。
③ 选址的方法论"标准答案"
GeoKit 就是为可再生能源用地适宜性而生的,方法论写进了 SoftwareX 2026 同行评审论文,还被 GLAES(全球用地适宜性)、RESKit(资源评估)直接调用。可信度拉满。
④ API 显式到运维都秒懂
indicateFeatures(矢量缓冲成掩膜)、indicateValues(栅格阈值成掩膜)、extractFeatures(提取要素)——缓冲区、阈值、提取全是显式方法,不用啃 GDAL 文档。
⑤ 不止能源——基站选址直接复用
基站/机房选址、应急设施布点,本质都是同一个多准则叠加(MCDA)问题:把坡度、道路、生态红线、居民区、供电距离叠成"能/不能建"的二值图。GeoKit 的工作流可直接套。
一、深读拆解
1.1 它到底解决什么痛点
传统做法:你有 DEM(高程)、坡度图、路网 shp、生态红线 shp、行政区划 shp……格式不一、坐标系不同、像元大小不同。要把它们叠在一起判断"某点能不能建站",你得手动做投影转换、重采样、按范围裁剪、再逐像元做逻辑运算。每一步都容易错,且不可复现。
GeoKit 的核心价值:用 RegionMask(区域掩膜)把"研究区"固化为一个空间上下文对象,所有栅格/矢量都以它为准做对齐和融合。你只管写业务逻辑(坡度<15°、离路 1km 内、避开红线),对齐的脏活它包了。
1.2 核心对象与能力清单
| | |
|---|
| | .load() .indicateFeatures() .indicateValues() .extractFeatures() .rasterize() .vectorize() .intersection() |
| | |
| | loadRaster() createRaster() warp() extractMatrix() |
| | loadVector() extractFeatures() createVector() vectorInfo() |
| | |
支持清单:矢量(Shapefile / GeoPackage / GeoJSON)、栅格(GeoTIFF 等 GDAL 支持的格式)、任意 EPSG 坐标系自动转换、栅格↔矢量互转(rasterize / vectorize)、点处采样(多插值方式)、缓冲区、交集、阈值二值化。文档站 geokit.readthedocs.io 是完整的。
二、运维实战(部署步骤)
2.1 环境准备
GeoKit 依赖 GDAL,强烈建议用 conda-forge 安装,别用 pip 硬装 GDAL(坑多)。Python 3.10+ 环境。
# 推荐:Miniforge 装好 conda 后,一行建环境 conda create -n geokit -c conda-forge geokit conda activate geokit # 验证 python -c "import geokit; print(geokit.__name__)"
2.2 上手:一个基站选址的最小工作流
下面这段就是 GeoKit 的"灵魂"——用 RegionMask 把多准则叠成候选点。把网络运维的约束翻译成代码:坡度够平、离路够近、避开生态红线。
import geokit from geokit.regionmask import RegionMask # 1) 定义研究区(ROI):某地市行政区边界 rm = RegionMask.load("city_boundary.shp") # 2) 约束①:坡度 < 15°(栅格阈值 -> 二值掩膜,1=满足) flat = rm.indicateValues("slope.tif", value=('<', 15)) # 3) 约束②:距主干道 1km 内(矢量缓冲 -> 二值掩膜) near_road = rm.indicateFeatures("roads.shp", buffer=1000) # 4) 约束③:避开生态红线(矢量存在即排除,用 1-掩膜 取反) protected = rm.indicateFeatures("ecozone.shp", buffer=500) no_protected = 1 - protected # 5) 多准则叠加(逐像元与运算) suitable = flat * near_road * no_protected # 6) 二值图转候选面,导出 GeoPackage 交给网优 further 处理 candidates = rm.vectorize(suitable, flat=False, threshold=0.5) geokit.vector.createVector(candidates, output="base_station_candidates.gpkg")再来个"读数据 + 重采样到研究区"的常用片段:
import geokit # 读栅格 / 矢量 dem = geokit.raster.loadRaster("dem.tif") roads = geokit.vector.loadVector("roads.shp") # 把栅格重采样 + 裁剪到指定坐标系与像元大小 dem_warped = geokit.raster.warp( dem, pixelWidth=100, pixelHeight=100, srs="EPSG:32650" ) # 在研究区内提取矢量要素(仅取落在区内的) feats = rm.extractFeatures(roads, where="class='highway'")2.3 常驻:嵌进你自己的选址脚本 / 定时任务
GeoKit 是库不是服务,最适合的做法是:把上面的工作流封成一个 site_suitability.py,入参是"约束配置文件(哪些层、什么阈值、缓冲多大)",出参是候选点 GeoPackage。配合 crontab / 调度平台,每月跑一次更新候选库。
避坑提示:GeoKit 的 indicateValues 的 value 参数支持 ('<', 15) 这类运算符元组,也支持传 lambda 函数做复杂区间;生态红线"排除"用 1 - indicateFeatures(...) 取反最稳,不依赖 invert 参数。
三、部署案例(3 个真实场景)
场景 1 | 光伏电站用地适宜性(GeoKit 原生场景)
约束 = 坡度<8° + 距变电站 5km 内 + 避开农田/生态区 + 年均辐射达标。GLAES 正是用 GeoKit 做全球尺度的可再生能源用地适宜性,输出"哪里能建、建多少"的图层。对咱们的意义:把"光伏配套基站供电"也当成同一类问题。
场景 2 | 基站 / 机房选址
把"站点候选"抽象成用地适宜性问题:约束 = 坡度合适 + 道路可达 + 避开居民区/生态红线 + 供电距离可控 + 与现网站间距达标(防过覆盖)。RegionMask 一键出候选网格,直接喂给网优做进一步 RF 仿真。比在 ArcGIS 里手动叠层省 80% 时间。
场景 3 | 应急通信车驻点规划
汛期/灾害时,准则 = 覆盖重点单位 + 道路可达(保障进场)+ 地势较高避洪。用 RegionMask 把"洪涝风险栅格"取反、叠加"人口/重点单位点密度"、再约束道路缓冲,快速出应急车候选驻点。和本号之前拆的 isolysis(等时圈覆盖)、socialmapper(可达性)是同一思路的不同切口。
四、社区精选(同赛道相关项目)
GLAES(FZJ-IEK3-VSA/glaes)
Geospatial Land Availability for Energy Systems——基于 GeoKit 的用地适宜性工具,直接产出可再生能源可用土地,是 GeoKit 最典型的上层应用。
RESKit(FZJ-IEK3-VSA/reskit)
可再生能源资源评估工具,空间处理层依赖 GeoKit,做风速/辐射的资源yield建模。
rioxarray
栅格 + xarray 的纯 Python 遥感分析库,和 GeoKit 的 raster 模块互补,适合做时序栅格运算。
本号已深读的同赛道(可串起来看)
isolysis(等时圈覆盖)、socialmapper(可达性/选址)、yirgacheffe(栅格+矢量声明式叠加)、pyorps(成本面选线)——它们和 GeoKit 合起来,就是一套"网络运维 GIS 工具箱"。
活跃度引擎(来互动)
💬 评论区提问
你们做选址/覆盖规划,现在是栅格叠加手算还是已经上 ML/AI 了?评论区聊聊踩过的坑。
📦 资料包钩子
留言 「选址」 领本号整理的《GeoKit 基站选址模板脚本》(含约束配置示例 + 候选点导出),直接能跑。
🗳️ 投票即内容(下期写什么由你定)
你最想用 GIS 解决哪类网络运维问题?①基站选址 ②光缆路由走廊 ③应急布点 ④覆盖补盲。投票,票数最高的下期深读。
项目出自 @FZJ-IEK3-VSA(于利希研究中心),论文:Ishmam et al., SoftwareX 2026, DOI 10.1016/j.softx.2026.102870。
项目卡片 | ETHOS.GeoKit(geokit) 协议:MIT | 语言:Python(GDAL 封装) | 发表:SoftwareX 2026 仓库:https://github.com/FZJ-IEK3-VSA/geokit | 文档:https://geokit.readthedocs.io 安装:conda create -n geokit -c conda-forge geokit
*本篇为「阿艾法知识库·每日开源精选」自动深读稿,仅入公众号草稿箱,未群发。转载或引用请注明出处与项目原许可。