RustGIS:纯 Rust 重写的桌面 GIS,一个原生程序干完制图与地理分析

这是什么

RustGIS(仓库 opengeos/RustGIS)是一个用纯 Rust 从零重写的桌面 GIS,定位是「快速、免费、开源的制图与地理空间数据分析工具」。它不是给 QGIS 套个壳,也不是每个功能调一次 Python;而是一个原生单文件程序,自带 GPU 绘制,Windows / macOS / Linux 上同一套代码,同时还能编译成 WebAssembly 直接在浏览器里跑。

一句话概括它的野心:把「安装一个 GIS」这件事变成「打开一个程序」。没有运行时依赖、没有后台服务器、没有 Python 环境地狱。项目 2026 年 10 月 10 日建仓,几周内冲上 1.2k Star,Apache-2.0 协议,官网 rustgis.app,在线版在 web.rustgis.app。

它解决什么问题

传统桌面 GIS(QGIS、ArcGIS)功能强大,但代价是:几百 MB 到几个 GB 的安装包、庞大的插件生态带来的兼容性负担、脚本能力与图形界面割裂(想批量处理还得另外学 PyQGIS 或 arcpy)。而各类在线地图工具虽然轻,数据却默认上传到别人的服务器,隐私和离线场景都很尴尬。

RustGIS 想同时拿掉这两头的痛点:

  • 体量与启动:一个原生程序,GPU 绘制,无运行时、无服务器,启动就是秒开。
  • 跨平台一致:桌面三平台 + WebAssembly 浏览器版,是同一份引擎代码,而不是三套实现。
  • 本地优先:文件读写都在本机,除非你主动请求,不会上传任何东西;联网只发生在你选择的操作里(底图、插件、AI 模型)。
  • 一切皆命令:界面上每一个按钮背后都是一个带 id 的命令,可以脚本化、可在笔记本里链式调用、也可以让 AI 助手替你执行。
  • 可扩展:内置 1000+ 个 GeoLibre 与 Whitebox 工具(地形、水文、LiDAR、遥感),外加沙箱化的 WebAssembly 插件,可新增命令、工具和功能区标签页。

核心特性一览

能力说明
矢量数据GeoJSON、CSV、Shapefile;GeoPackage、GeoParquet、FlatGeobuf 提供器;支持 SQL WHERE 子句筛选
栅格数据任意像素类型的 GeoTIFF 与 COG,实时重投影,拉伸 / RGB / 分类 / 山体阴影着色
制图图层、符号系统、标注、相机、底图;属性表与地图选中状态双向同步
投影与地球3D 地球、Equal Earth、Robinson、极地预设,或任意 EPSG 代码
分析工具画廊、运行历史、引导式工作流、ModelBuilder,1000+ 地理处理工具
瓦片XYZ/TMS/WMS、Mapbox 矢量瓦片、MapLibre 样式,内置瓦片缓存
AI 助手聊天式智能体,通过命令操作地图,每一步改动都可撤销
接口形态桌面应用、浏览器应用、命令行、Python 包、MCP 服务器

怎么做到的:分层架构

RustGIS 的代码组织成一个严格分层的 crate 结构:每一层只依赖它下面的层,越往上抽象越高。这套「单向依赖」是它能同时支撑桌面、浏览器、CLI 和 Python 的关键——上层的界面可以换,底层的引擎不动。

层Crate职责
L0rustgis-geom坐标、范围、Web 墨卡托、测地距离/面积、比例尺
L1rustgis-data要素与强类型属性;矢量与栅格格式读写、坐标系
L2rustgis-map / rustgis-analysis图层、符号、标注、相机、底图;基于 geo 的地理处理
L2rustgis-tiles网络地图瓦片:XYZ/TMS/WMS、MVT、MapLibre 样式、瓦片缓存
L3rustgis-render基于 tiny-skia 的渲染器、标注排布、PNG 导出、字体
L3rustgis-plugins沙箱化 WebAssembly 插件与插件注册表
L3rustgis-geolibreGeoLibre 工具套件,作为地理处理工具接入
L4rustgis-engine会话、撤销、命令注册表、示例工程
L5rustgis-assistantAI 助手:通过命令操作地图的聊天智能体
L6rustgis-ui-egui基于 egui 的功能区前端(可替换)
appsrustgis / rustgis-cli / rustgis-web桌面、命令行、浏览器(WebAssembly)

几个值得注意的技术决策:

  • 渲染用 tiny-skia:纯 Rust 的 2D 渲染库,不依赖系统 Cairo/Skia,这也是它能干净地跑在各平台和 WASM 里的原因之一。
  • 界面用 egui:即时模式 GUI,且前端被刻意做成「可替换」的一层,说明作者为将来换 UI 框架留了余地。
  • 命令注册表是中枢:引擎里维护一张「命令 id → 行为」的表,界面、CLI、Python、AI 助手全部走同一张表,因此任何界面上的操作天生就能被脚本化和自动化。
  • 插件跑在 WASM 沙箱:第三方扩展以 WebAssembly 形式加载,天然隔离,不会因为一个插件拖垮整个应用。

怎么用

1. 下载即用的桌面版

到 Releases 下载对应平台的安装包,装上打开即可,自带 World Atlas 示例工程。只想试用可以直接开 web.rustgis.app,零安装。

2. 从源码构建(需要 Rust 1.90+)

cargo run --release -p rustgis                       # 打开桌面应用 + World Atlas 示例
cargo run --release -p rustgis -- data.geojson       # 直接打开数据或 .rgis 工程文件

3. 命令行:功能区的每个动作都是命令

rustgis-cli commands                                 # 列出所有命令 id 与参数
rustgis-cli render countries.geojson map.png --basemap ocean
rustgis-cli run --sample \
  --cmd 'gp.run={"tool":"countPoints","params":{"polygons":"Countries","points":"Cities"}}' \
  --cmd 'layer.symbology={"layer":"Countries_Summarize","type":"graduated","field":"point_count"}' \
  --cmd 'share.exportMap={"path":"out.png","dpi":192}' --save atlas.rgis
rustgis-cli ask --sample "Which 5 countries have the largest GDP?"

4. Python:同一个引擎,进程内调用

pip install rustgis
import rustgis
s = rustgis.Session(sample=True)
s.run("gp.run", tool="buffer", params={"input": "Cities", "distance": 100})
s.to_png("map.png")
gdf = s.layer("Cities_Buffer").to_geopandas()

注意这里不是起一个子进程再传文件,而是把同一个 Rust 引擎在进程内绑定给 Python,所以能直接拿 GeoDataFrame、直接在 Jupyter 里渲染地图。官方还提供了 Colab 上手笔记本。

5. 作为 MCP 服务器接进 AI 编码助手

claude mcp add rustgis -- rustgis-cli mcp --sample

这样 Claude Code 等支持 MCP 的助手就能直接驱动 RustGIS 做地理处理,把「自然语言 → GIS 操作」接进你的工作流。

适合谁 / 值不值得关注

如果你需要经常做矢量/栅格处理,又受不了重量级 GIS 的启动和安装成本;或者你想要一个能脚本化、能被 AI 驱动、还能跑在浏览器里的地理处理引擎——RustGIS 值得放进收藏夹。它的定位不是「干掉 QGIS」,而是把 GIS 的引擎内核用现代语言重做一遍,然后以桌面、CLI、Python、MCP 多种形态暴露出来。

当然要提醒:这是一个刚起步、迭代很快的项目,1.2k Star 的热度也意味着功能还在快速补齐,生产环境下建议先拿它做探索性分析和批处理,关键工作流仍留一份成熟工具兜底。

项目地址:github.com/opengeos/RustGIS | 官网:rustgis.app | 在线版:web.rustgis.app | 插件注册表:plugins.rustgis.app

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享