mcpField
R
rust-wasm-geo

rust-wasm-geo

github.com/fixmyberlin开发043 次安装1 天前更新
代码仓库

关于 rust-wasm-geo

rust-wasm-geo 是为 Web 应用中高负载地理空间任务提供 Rust 与 WebAssembly 技术指导的技能。内容涵盖 crate 选择、WASM 边界和应用集成,并建议小型或交互式任务继续使用 JavaScript 几何处理。

主要功能

  1. 01判断何时采用 Rust/WASM
  2. 02地理空间 crate 选择
  3. 03WASM 与 JavaScript 边界模式
  4. 04Vite 和应用集成指导
  5. 05坐标与 SSR 约束

适用场景

  1. 01为大型数据集构建空间索引
  2. 02实现路径规划或等时圈计算
  3. 03将重复几何运算移出主线程

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/fixmyberlin/fixmyskills --skill rust-wasm-geo

安装后在 Claude Code 中输入/rust-wasm-geo确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
crates-and-packages.md
tanstack-start-integration.md
vite-spa-integration.md

详细介绍

Rust / WASM 地理计算

默认技术栈上下文:tech-stack 技能。本技能仅涵盖 Rust/WASM 地理计算。

适用场景

  • Turf 或 JS 几何运算太慢(先进行性能分析——主线程阻塞 > 约 100ms)
  • OSM 解析、地图模型构建、等时圈、空间索引、图路由
  • 数千个要素、重复几何运算,或大规模多边形布尔运算
  • 添加或审查 wasm-pack crate、wasm.ts 边界或 Vite WASM 插件

小型 GeoJSON 上的单要素运算,以及原型开发期间交互式编辑的即时反馈,仍使用 Turf(JS)。

Turf 与 Rust/WASM 对比

继续使用 Turf(JS)添加 Rust/WASM
小型 GeoJSON 上的单要素运算数千个要素、重复运算或图路由
交互式编辑的即时反馈OSM 解析、地图模型构建、等时圈、空间索引
原型开发主线程阻塞 > 约 100ms(先进行性能分析)

对大型数组进行批量几何运算(不包括路由/OSM):使用 geoarrow-wasm,而不是自行实现。

crate 选择(快速参考)

需求crate
几何 / GeoJSONgeo、geojson
空间索引rstar
道路路由fast_paths
图算法petgraph
OSM → 图osm-reader(a-b-street 分支)
将轨迹吸附到道路route-snapper-graph
多边形布尔运算i_overlay(参见 a-b-street/utils)
等高线 / 等值线contour
序列化地图模型bincode + serde
矢量文件 I/Oflatgeobuf、geozero

各 crate 的用法说明和 WASM 依赖版本:crates-and-packages.md。

项目结构

每个应用使用一个 crate,并根据其计算内容命名(geo-isochrone、route-buffer 等)。

app/
├── wasm/
│   └── geo-isochrone/          # Rust crate (wasm-pack output → pkg/)
│       ├── Cargo.toml
│       └── src/
│           ├── lib.rs          # #[wasm_bindgen] surface only
│           └── isochrone.rs    # pure geo logic
└── src/
    └── features/isochrone/
        ├── wasm.ts             # sole JS import of pkg — React never imports pkg directly
        └── useIsochrone.ts     # React hook / Query wrapper
  • lib.rs = #[wasm_bindgen] 导出;内部模块 = 纯地理计算逻辑(无需 WASM 即可测试)。
  • JS 边界: 在 wasm.ts 中封装导出项。传递 GeoJSON 字符串或 bincode Uint8Array,而不是手工构造的 JS 对象。
  • 状态拆分: 持久计算状态放在 Rust 中;UI 状态放在 React 中(Zustand / URL / 本地 useState)。

WASM 技术栈(Cargo)

Crate作用
wasm-bindgenJS ↔ Rust 边界
serde-wasm-bindgen跨边界序列化/反序列化
wasm-bindgen-futures异步导出
console_error_panic_hook在开发者工具中显示易读的 panic
getrandom with features = ["js"]浏览器中的随机数生成
web-timeWASM 中的时间

构建: wasm-pack(--target web)、vite-plugin-wasm、目标平台 wasm32-unknown-unknown。

参考配置:a-b-street/ltn、a-b-street/15m、a-b-street/utils。

遇到问题时查阅文档: wasm-bindgen book、docs.rs 上的 geo。

应用集成

应用类型指南
Vite SPA(无 Start)vite-spa-integration.md
TanStack Starttanstack-start-integration.md

两者均适用:仅从 wasm.ts 动态导入 WASM;共享模块中绝不在顶层 import .wasm,以免在服务器上加载。

不可妥协的规则

主题规则
React 导入组件/钩子仅导入 wasm.ts — 绝不导入 pkg/ 或原始 .wasm
边界类型GeoJSON 使用 string 或 bincode Uint8Array;解析后在 JS 端使用 Zod 验证
坐标WGS84,所有 API 边界均使用 [lng, lat]
服务端模块*.server.ts、服务端加载器或 createServerFn 处理程序中不得初始化 WASM
SSRWASM 仅在客户端运行;水合后延迟初始化(路由 ssr 参见 Start 指南)
Turf 回退对于小型/交互式路径,保留 Turf,直到性能分析证明需要 WASM

相关技能

主题技能
Map React API、图层、事件react-map-gl
加载器、搜索参数、Querytanstack-router-conventions
路由 SSR、Start 布局、服务端tanstack-start-conventions
地图工具周边的客户端 UI 状态zustand-state-management
useEffect / 地图监听器react-dev

评论

支持 Markdown