场景
QGIS 里挂天地图底图,画面全空。F12 或者 QGIS 的网络日志里刷一片 403,响应体是:
{"code":301013,"msg":"权限类型错误"}天地图控制台里 key 明明状态正常、配额也没用完,换一个浏览器端 key 试,时好时坏。
问题不在 key 的额度,在 key 的类型和 QGIS 发出的 User-Agent 对不上。
前置:这道拦截是分层的
天地图前面挡了一道华为云 CloudWAF,校验按顺序来。2026-10-13 我用 curl 复现过前两层(不需要有效 key):
| 请求情况 | 状态码 | 返回内容 |
|---|---|---|
URL 里不带tk | 418 | CloudWAF 的 HTML 页,标题「访问被拦截!」 |
tk是乱填的一串 | 403 | {"code":301001,"msg":"非法key","resolve":"请到API控制台重新申请Key"} |
tk合法但 UA 与 key 类型不匹配 | 403 | {"code":301013,"msg":"权限类型错误"} |
前两行我分别换过浏览器 UA、补过 Referer 头,返回内容一字未变。也就是说301013 只有在你 key 合法的前提下才会出现——先确认不是 418 和 301001,再往下看,能省很多弯路。这两层和 UA 无关的细节在上篇《QGIS 加载天地图出现灰色影像:层级参数 l 与 z 的坑》。
根因:两种 key 要求的 UA 是反着的
天地图创建应用时要选 key 类型,控制台里的下拉框:浏览器端 / 服务端。这两种 key 允许的 User-Agent(浏览器标识,告诉服务器请求来自什么软件)规则相反。
浏览器端 key 要求 Mozilla 系 UA。它本来就是给网页用的,校验的是 Referer 域名白名单,UA 必须是正常浏览器那一类。用 curl 的默认 UA 打它会报
301012,补 Referer 也没用。服务端 key 禁用 Mozilla 系 UA。它给后端程序用,看到 Mozilla 开头反而认为你在伪装浏览器。
而 QGIS 的默认 UA 是这样的:
Mozilla/5.0 (...) QGIS/34000/Windows ...开头带Mozilla/5.0。于是同一个默认 UA,配浏览器端 key 刚好能过,配服务端 key 必返 403 + 301013。这就是"换个 key 时好时坏"的原因——你换的是类型,不是额度。
解法一:清空 QGIS 的 UA 设置(推荐)
改一次永久生效,服务端 key 立刻能用。
设置 → 选项 → 高级 → 找到 network/user-agent
双击这一行把值清空,注意是清成空字符串,不是删除整行。清空后 QGIS 发出的 UA 变成QGIS/34000/...,不再以 Mozilla 开头,服务端 key 直接 200。
这条链路在 QGIS 源码里读得到,qgsnetworkaccessmanager.cpp中的settingsUserAgent就是取这个设置项的地方:填了自定义值就按你填的走,留空才走默认逻辑。
验证方法:清空后重新加载图层,或者直接看 QGIS 日志/抓包里的请求头User-Agent是否已不以Mozilla开头。
解法二:URL 换回浏览器端 key
不想动全局设置的话,把tk=换成浏览器端 key,UA 保持 QGIS 默认即可,零配置。
https://t0.tianditu.gov.cn/DataServer?T=img_w&x={x}&y={y}&l={z}&tk=浏览器端key两种类型怎么选:个人日常看图、请求量不大,浏览器端 key 省事;团队内网、批量出图、脚本里跑,服务端 key 配清空 UA。
这里顺便提醒,l={z}是层级参数的官方写法,写成z={z}会返回 HTTP 200 的灰色占位图,即"能加载但没影像",那是另一类问题,见上篇。
解法三:走 WMTS 标准入口
最省心的一条。天地图的标准 WMTS 服务入口不校验 User-Agent,两种 key 都能用。
QGIS 里在 Browser 面板 → WCS/WMTS → 新建连接,URL 只需要:
https://t0.tianditu.gov.cn/img_w/wmts?tk=你的keyQGIS 会自己去 GetCapabilities 把图层、行列号补齐。手写完整瓦片模板是这样,注意层级参数叫TILEMATRIX,LAYER后面是不带_w的img:
https://t0.tianditu.gov.cn/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=你的key图层代号四个:img_w影像、vec_w矢量、cia_w影像注记、cva_w矢量注记。底图和注记是两条地址,挂两层才有地名。
排查顺序
| 症状 | 状态码 | 先查什么 | 改哪里 |
|---|---|---|---|
| 完全空、日志 418 | 418 | URL 有没有tk | 补上 key |
| 403 + 非法key | 403 / 301001 | key 本身 | 控制台重新申请 |
| 403 + 权限类型错误 | 403 / 301013 | key 类型与 UA | 清空 UA,或换浏览器端 key,或走 WMTS |
| 一片灰、写着"无影像" | 200 | 层级参数名 | z={z}改回l={z} |
三条解法按优先级:先走 WMTS 入口(不改设置也不受 UA 约束)→ 需要 XYZ 就用浏览器端 key → 必须用服务端 key 时清空network/user-agent。
另外,如果偶发解析不到瓦片,t0~t7这几个子域可以换一个试试,属于 DNS 层面的事,和本文的权限问题无关。
测试环境 QGIS 3.40.1(Windows),418 / 301001 两层返回码复现于 2026-10-13。