1. 上班摸鱼新姿势:让 OpenClaw 在 QGIS 里替你干 GIS 的活
先说清楚这篇要解决什么问题。OpenClaw 是一个支持 MCP(模型上下文协议)的智能体客户端,它能通过统一 API 通道调用大模型,再借助 MCP 插件去驱动外部工具。TaoToken 在这里扮演的角色是统一 Key 和 API 通道——你不需要在 OpenClaw 里分别配置多家模型的地址和密钥,一个 Key 走同一个入口就行。QGIS 是开源桌面 GIS,PostGIS 是 PostgreSQL 的空间扩展。把这三样串起来,你就能在 QGIS 里用自然语言触发空间查询,结果自动落到 PostGIS 里,全程不用手点菜单。
适合谁看:已经装了 QGIS、手头有 PostGIS 库、想试试用对话方式跑空间分析的 GIS 从业者或数据工程方向的学生。我试过在午休时间把一条“找出某区域内所有学校 500 米缓冲范围内的道路”的链路跑通,从发指令到结果落库大概两分钟,剩下的时间你可以去接杯水。
核心检索词先摆出来:OpenClaw 接入 TaoToken 统一 Key/API 通道,通过 MCP 注册 QGIS 和 PostGIS 服务,在 QGIS 中触发空间查询,在 PostGIS 中验证结果落库。下面按“配置骨架 → 服务注册 → 触发查询 → 验证落库 → 排错”的顺序走,每一步都给可复制的命令和参数。
2. TaoToken 前置:拿 Key、配通道、装 OpenClaw
2.1 为什么需要统一通道
OpenClaw 本身不绑定某一家模型。你可以在它的配置里指定 base_url 和 api_key,让它去调模型。如果你同时想用不同模型做不同任务,传统做法是每个模型配一套地址和密钥,改来改去容易乱。TaoToken 的做法是给你一个统一入口,OpenClaw 只认这一个 base_url 和一个 Key,后面换模型只改模型名,不改通道配置。
官网入口在这里:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。API 地址是 https://taotoken.net/api ,注意这个地址后面不加 UTM 参数,配置里直接写这个。
2.2 拿 Key 的步骤
打开控制台页面,登录后进 API Keys 管理,创建一个新 Key。建议按用途命名,比如openclaw-gis,方便后面在 OpenClaw 配置里对应。创建完复制出来,只显示一次。
控制台地址(带 deep link):https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=console
API Keys 页面:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=api-keys
2.3 OpenClaw 安装与基础配置
OpenClaw 的安装方式按你所用版本走,这里不展开安装教程,重点给配置骨架。假设你已经装好,找到它的配置文件目录,通常在~/.openclaw/下。新建或编辑config.yaml:
# ~/.openclaw/config.yaml provider: name: taotoken base_url: "https://taotoken.net/api" api_key: "sk-你的Key" model: "claude-sonnet-4-20250514" # 按需替换模型名 mcp: servers: - name: qgis command: "python" args: ["-m", "mcp_qgis.server"] env: QGIS_PREFIX_PATH: "/usr" - name: postgis command: "python" args: ["-m", "mcp_postgis.server"] env: PG_HOST: "localhost" PG_PORT: "5432" PG_DB: "gisdb" PG_USER: "gisuser" PG_PASSWORD: "gispass"这段骨架的关键点:provider段只写一个 base_url 和一个 Key,模型名单独一行,换模型不动通道。mcp.servers段注册两个服务,QGIS 和 PostGIS 各一个。QGIS 的QGIS_PREFIX_PATH指向你的 QGIS 安装前缀,Linux 下常见是/usr,Windows 下类似C:\OSGeo4W。PostGIS 的环境变量按你实际库填。
注意:api_key 不要提交到公开仓库。建议用环境变量注入,比如
api_key: "${TAOTOKEN_KEY}",然后在 shell 里 export。
2.4 模型对话入口
如果你只想先验证 Key 通不通,不急着配 MCP,可以直接用模型对话页面发一条消息试试。地址:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=chat 。能正常回话说明 Key 和通道没问题,再往下配 MCP。
3. 可复制配置:MCP 服务注册与 QGIS/PostGIS 对接
3.1 MCP 服务注册片段
上面 config.yaml 里的 mcp 段是骨架,实际能不能跑起来取决于两个 MCP server 是否装好。以 Python 版为例,先装依赖:
pip install mcp mcp-qgis mcp-postgis psycopg2-binary如果你用的 MCP server 包名不同,按实际包名替换。装完后单独测一下 QGIS 的 MCP server 能不能启动:
python -m mcp_qgis.server --help能打印帮助说明入口没问题。PostGIS 的也测一下:
python -m mcp_postgis.server --help3.2 QGIS 侧配置
QGIS 的 MCP server 需要能找到 QGIS 的 Python 环境。如果你用的是系统 Python,确保QGIS_PREFIX_PATH指向正确。Linux 下可以这样验证:
echo $QGIS_PREFIX_PATH ls $QGIS_PREFIX_PATH/share/qgis/python/plugins能看到 plugins 目录说明路径对。Windows 下在 OpenClaw 的 env 里写C:\OSGeo4W\apps\qgis这类路径。
3.3 PostGIS 侧配置
PostGIS 的 MCP server 通过 psycopg2 连库。先在 psql 里确认库和扩展都在:
-- 在 psql 里执行 CREATE EXTENSION IF NOT EXISTS postgis; SELECT PostGIS_Version();能返回版本号说明 PostGIS 扩展已启用。然后确认你的用户有建表和写数据的权限。MCP server 的环境变量里PG_DB填你的库名,PG_USER和PG_PASSWORD填有权限的账号。
3.4 启动 OpenClaw 并加载 MCP
配置写好后启动 OpenClaw:
openclaw start --config ~/.openclaw/config.yaml启动日志里应该能看到两个 MCP server 注册成功的提示,类似mcp server qgis registered和mcp server postgis registered。如果某个 server 启动失败,日志里会有 stderr 输出,按报错去查。
4. 验证请求:在 QGIS 触发一次空间查询并落库 PostGIS
4.1 准备测试数据
先在 PostGIS 里建一张测试表,放几个点代表学校:
CREATE TABLE schools ( id SERIAL PRIMARY KEY, name TEXT, geom GEOMETRY(Point, 4326) ); INSERT INTO schools (name, geom) VALUES ('第一中学', ST_SetSRID(ST_MakePoint(116.40, 39.90), 4326)), ('第二中学', ST_SetSRID(ST_MakePoint(116.42, 39.91), 4326));再建一张道路表:
CREATE TABLE roads ( id SERIAL PRIMARY KEY, name TEXT, geom GEOMETRY(LineString, 4326) ); INSERT INTO roads (name, geom) VALUES ('主干道A', ST_SetSRID(ST_MakeLine(ST_MakePoint(116.39, 39.89), ST_MakePoint(116.43, 39.92)), 4326));4.2 在 OpenClaw 里发指令
启动 OpenClaw 的交互界面,发一条自然语言指令:
用 QGIS 的 buffer 能力,对 schools 表里所有点做 500 米缓冲,然后和 roads 表做 intersect,把结果写入新表 school_road_500m。OpenClaw 会先调 QGIS 的 MCP 服务做 buffer 和 intersect,再调 PostGIS 的 MCP 服务把结果写库。整个过程你不需要打开 QGIS 界面。
4.3 验证结果落库
回到 psql 查新表:
SELECT id, name, ST_AsText(geom) FROM school_road_500m;如果能看到记录,说明从对话到 GIS 数据的链路通了。再确认一下几何类型和 SRID:
SELECT ST_SRID(geom), GeometryType(geom) FROM school_road_500m LIMIT 1;SRID 应该是 4326,类型是你 intersect 后的结果类型。
4.4 在 QGIS 里可视化确认
打开 QGIS,添加 PostGIS 图层,连到你的库,把school_road_500m拖进来。能看到缓冲和道路相交的图形,说明整条链路不仅数据落库了,空间关系也对。
5. 本篇常见错排查
5.1 MCP server 启动失败
最常见的是 Python 环境不对。QGIS 的 MCP server 依赖 QGIS 自带的 Python,如果你用系统 Python 装包,可能找不到 QGIS 模块。解决办法是在 OpenClaw 的 env 里把PYTHONPATH指向 QGIS 的 python 目录,或者直接用 QGIS 自带的 python 解释器路径作为 command。
5.2 PostGIS 连接被拒
报错could not connect to server时,先确认 PostgreSQL 在跑:
pg_isready -h localhost -p 5432再看pg_hba.conf里是否允许你的用户从 localhost 连接。MCP server 的环境变量里密码如果含特殊字符,注意转义。
5.3 空间查询结果为空
如果school_road_500m表建了但没数据,多半是 SRID 不一致。buffer 和 intersect 要求两个几何的 SRID 相同。用ST_SRID查一下 schools 和 roads 的 SRID,不一致就先ST_Transform统一。
5.4 OpenClaw 调模型超时
如果指令发出去很久没反应,先看模型对话页面能不能正常回话。能回话说明 Key 没问题,问题在 MCP 调用链。把 OpenClaw 日志级别调到 debug,看是卡在 QGIS 还是 PostGIS 那一步。
5.5 权限问题导致写库失败
MCP server 用的数据库账号需要有目标表的 INSERT 权限。如果报permission denied,在 psql 里授权:
GRANT INSERT, SELECT ON school_road_500m TO gisuser;6. 长期跑 GIS 链路,用 Coding Plan 更省心
如果你只是偶尔跑一两条空间查询,按上面的配置走就够了。但如果你打算把 OpenClaw 加 GIS 这条链路长期用起来,比如每天批量处理空间数据、定时跑缓冲区分析、或者把 MCP 能力接进自己的 Agent 流程,那按量计费的 Key 管理起来会比较碎。Coding Plan 适合这种长期编码和 Agent 场景,通道和 Key 的管理方式更集中。
Coding Plan 入口:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=coding-plan
接入文档在这里,MCP 注册和 provider 配置的细节都可以对照查:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=doc
如果你用的是 Claude Code 那套 Anthropic 风格的接入方式,对应页面在:https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=claudecodeanthropic
最后给一个实用技巧:把常用的空间查询指令存成 OpenClaw 的快捷指令模板,比如“对 {表名} 做 {距离} 米缓冲并和 {目标表} 相交,结果写 {输出表}”,下次改参数就行,不用每次重新描述。这样摸鱼的时候连指令都不用现想。