引言:传统GIS工具的"失忆症"困境
你是否遇到过这样的场景?
在GIS软件中,你先让系统"计算某区域的缓冲区",接着问"这个缓冲区内有多少个学校"。传统工具会一脸茫然------因为它根本不记得上一步做了什么。每一次操作都是孤立的,没有上下文,没有记忆,没有连贯性。
这就像和一个患有短期失忆症的人对话:你刚说完的话,他转头就忘。
GeoAI Universal Platform 要解决的,正是这个问题。我们不是在做另一个GIS工具集,而是在构建一个有记忆、能推理、会学习的地理智能体。

一、为什么需要Agent架构?
1.1 传统GIS的三大痛点
痛点1:无状态操作
javascript
// 传统方式:每次调用都是独立的
const buffer = turf.buffer(polygon, 5, {units: 'kilometers'});
const schools = findSchoolsWithin(buffer); // 需要手动传递上一步结果
痛点2:缺乏语义理解
用户说"帮我看看这个小区周边5公里的医疗资源",传统系统无法理解"周边"、"医疗资源"这些自然语言概念,必须拆解成精确的技术参数。
痛点3:工具孤岛
缓冲区分析、空间查询、路径规划......每个功能都是独立的模块,无法协同工作。用户需要自己编排流程。
1.2 Agent架构的核心价值
Agent(智能体)不是简单的"自动化工具",而是具备以下能力的智能系统:
- 记忆能力:记住历史操作和上下文
- 推理能力:理解用户意图,自主分解任务
- 工具协作:动态组合多个GIS工具完成复杂任务
- 学习能力:从交互中优化策略
这正是 GeoAI Universal Platform 的设计哲学。
二、GeoAI的Agent记忆系统设计
2.1 双层记忆架构
我们的核心创新在于双层记忆系统:
┌─────────────────────────────────────┐
│ Agent Memory (agent-memory.db) │ ← 会话级记忆
│ - 对话历史 │
│ - 中间结果缓存 │
│ - 用户偏好 │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ Tool Registry (registry.db) │ ← 工具级记忆
│ - 可用工具元数据 │
│ - 工具能力描述 │
│ - 插件动态注册 │
└─────────────────────────────────────┘
2.2 registry.db:让工具"自我介绍"
传统GIS库的问题是:工具不会"说话"。你不知道 turf.buffer 能做什么、需要什么参数、返回什么结果。
在 GeoAI 中,每个工具都有完整的元数据描述:
typescript
// src/core/ToolRegistry.ts
interface ToolMetadata {
name: string;
description: string; // 自然语言描述,LLM可理解
parameters: Parameter[]; // 参数 schema
returns: ReturnType; // 返回值类型
category: 'analysis' | 'query' | 'visualization';
}
当用户问"我想做个缓冲区分析"时,LLM 可以查询 registry.db,找到合适的工具,并自动生成调用代码。
关键实现:
typescript
// 工具注册示例
registry.register({
name: 'buffer',
description: 'Create a buffer zone around a geometry',
parameters: [
{ name: 'geometry', type: 'Feature', required: true },
{ name: 'distance', type: 'number', required: true },
{ name: 'units', type: 'string', default: 'kilometers' }
],
execute: async (params) => {
return turf.buffer(params.geometry, params.distance, {
units: params.units
});
}
});
这样,LLM 不再是"盲调"函数,而是基于完整元数据进行智能选择。
2.3 agent-memory.db:会话的"长期记忆"
如果说 registry.db 是工具的"身份证",那么 agent-memory.db 就是对话的"日记本"。
存储内容:
- 完整的对话历史(用户输入 + AI回复)
- 每步操作的中间结果(如缓冲区几何对象)
- 用户的偏好设置(如默认单位、坐标系)
- 任务执行的状态追踪
技术实现亮点:
typescript
// 自定义 Buffer 示例:plugins/custom-buffer-example
class CustomMemoryBuffer implements MemoryBuffer {
async save(context: ConversationContext): Promise<void> {
// 持久化到 SQLite
await db.execute(
'INSERT INTO memory_sessions (session_id, context_data) VALUES (?, ?)',
[context.sessionId, JSON.stringify(context)]
);
}
async load(sessionId: string): Promise<ConversationContext> {
// 恢复上下文,实现"断点续聊"
const row = await db.get('SELECT * FROM memory_sessions WHERE session_id = ?', [sessionId]);
return JSON.parse(row.context_data);
}
}
实际效果:
用户:计算北京市朝阳区的5公里缓冲区
AI:✅ 已完成,缓冲区面积 78.5 km²
用户:这个区域内有多少个公园?
AI:🔍 正在查询... 找到 23 个公园
用户:把结果保存为GeoJSON
AI:💾 已保存到 /exports/parks_in_buffer.geojson
注意:第二句话中,AI 自动理解 "这个区域"指的是上一步的缓冲区,无需用户重复说明。这就是记忆的力量。
三、LangChain集成:让LLM成为"大脑"
3.1 为什么选择LangChain?
GeoAI 采用 LangChain 作为LLM编排框架,原因有三:
- 成熟的Agent模式:ReAct、Plan-and-Execute等现成策略
- 工具调用标准化:统一的 Tool Interface
- 记忆管理抽象:支持多种 Memory Backend
3.2 核心架构
typescript
// src/llm/LlmProviderFactory.ts
class LlmProviderFactory {
static createAgent(config: LLMConfig): GeoAgent {
const llm = this.createLLM(config.provider, config.apiKey);
const tools = this.loadToolsFromRegistry();
const memory = new SQLiteMemoryBuffer('agent-memory.db');
return new GeoAgent({
llm,
tools,
memory,
strategy: 'react' // ReAct推理策略
});
}
}
ReAct策略的工作流程:
Thought: 用户想查询缓冲区内的学校,我需要先获取缓冲区几何
Action: load_memory(key="last_buffer")
Observation: { type: "Polygon", coordinates: [...] }
Thought: 现在我有了缓冲区,可以用空间查询工具找学校
Action: spatial_query(geometry=buffer, filter="type=school")
Observation: [{ name: "北京一中", location: [...] }, ...]
Thought: 找到了12所学校,可以回答用户了
Final Answer: 缓冲区内共有12所学校,包括北京一中、北京二中等...
这种思考-行动-观察的循环,让AI能够自主分解复杂任务,而不是依赖硬编码的流程。
3.3 多模型适配
通过 llm-configs 目录的配置化管理,平台支持无缝切换不同LLM提供商:
json
// data/llm-configs/openai.json
{
"provider": "openai",
"model": "gpt-4-turbo",
"apiKey": "${OPENAI_API_KEY}",
"temperature": 0.7
}
json
// data/llm-configs/qwen.json
{
"provider": "qwen",
"model": "qwen-max",
"apiKey": "${QWEN_API_KEY}",
"temperature": 0.7
}
只需修改配置,即可在不同模型间切换,无需改动业务代码。
四、插件化生态:开放的力量
4.1 插件系统设计
GeoAI 的核心竞争力之一是插件化架构。第三方开发者可以通过标准接口扩展平台能力。
插件结构:
my-custom-plugin/
├── manifest.json # 插件元数据
├── tools/
│ └── custom-analysis.ts # 自定义工具
├── package.json
└── README.md
manifest.json 示例:
json
{
"name": "custom-spatial-analysis",
"version": "1.0.0",
"description": "Custom spatial analysis tools",
"tools": [
{
"name": "viewshed_analysis",
"description": "Perform viewshed analysis from a point",
"entry": "tools/custom-analysis.ts"
}
]
}
4.2 动态加载机制
typescript
// src/server/services/PluginScanner.ts
class PluginScanner {
async scanPlugins(directory: string): Promise<Plugin[]> {
const plugins = await fs.readdir(directory);
return Promise.all(plugins.map(async (pluginName) => {
const manifest = await this.loadManifest(`${directory}/${pluginName}`);
const validator = new PluginValidator(manifest);
if (validator.isValid()) {
await this.registry.register(manifest);
return manifest;
}
}));
}
}
插件在启动时自动扫描、验证、注册,无需重启服务。这为生态建设提供了无限可能。
五、真实场景演示
场景:城市规划辅助决策
用户需求:
"帮我分析一下海淀区中关村大街沿线500米范围内的教育资源分布,并生成可视化报告"
传统方式:
- 手动绘制中关村大街线要素
- 调用缓冲区工具生成500米缓冲带
- 导出缓冲区范围
- 在另一系统中查询教育资源POI
- 手动统计各类学校数量
- 用制图软件生成图表
- 编写分析报告
耗时:2-3小时
GeoAI Agent方式:
用户:帮我分析一下海淀区中关村大街沿线500米范围内的教育资源分布,并生成可视化报告
AI:
📍 步骤1:获取中关村大街几何数据
✅ 已从OpenStreetMap提取
📍 步骤2:生成500米缓冲区
✅ 缓冲区面积 2.3 km²
📍 步骤3:查询范围内教育机构
✅ 找到:
- 小学:8所
- 中学:5所
- 大学:3所(含北京大学、中国人民大学)
- 培训机构:23家
📍 步骤4:生成可视化报告
✅ 已生成:
- 分布热力图:/reports/heatmap.png
- 统计图表:/reports/statistics.pdf
- GeoJSON数据:/exports/education_pois.geojson
📊 分析结论:
该区域教育资源丰富,但分布不均。北部以高等教育为主,
南部基础教育密集。建议在中部增加幼儿园配套...
耗时:30秒
这就是Agent架构带来的效率革命。
六、技术栈总览
GeoAI Universal Platform 采用现代化技术栈:
- 核心语言:TypeScript(类型安全)
- 后端框架:Express.js
- GIS引擎:Turf.js(前端)、PostGIS(后端)
- LLM框架:LangChain
- 构建工具:Rollup
- 数据库:SQLite(轻量级持久化)
- 前端:Vue 3 + Vite
完整源码:https://gitee.com/rzcgis/geo-ai-universal-platform
结语:GIS智能化的未来
GeoAI Universal Platform 不仅仅是一个工具库,它是一个范式转移:
- 从命令式操作 → 声明式意图
- 从孤立工具 → 协作智能体
- 从专业门槛 → 自然语言交互
- 从封闭系统 → 开放生态
我们相信,未来的GIS不再是少数专家的专属工具,而是每个人都能使用的智能助手。就像智能手机让摄影大众化一样,Agent架构将让空间分析大众化。
邀请你加入这场变革:
🌟 Star项目:https://gitee.com/rzcgis/geo-ai-universal-platform
📖 阅读文档:查看 /docs 目录了解架构设计
🔧 贡献代码:欢迎提交PR,共同完善插件生态
💬 交流讨论:在Issues中提出你的想法