1. 为什么要在ArcMap里接天地图,而不是继续用离线底图
做GIS这行的,底图这件事几乎绕不开。我见过太多人电脑里存着一堆从各种渠道搞来的影像切片,几个T的硬盘塞得满满当当,结果每次出图前还要花半小时找哪份是最新的、哪份坐标系对得上。更麻烦的是,项目换一个区域,底图就得重新找一遍。这种工作方式在十年前还能忍,现在真的没必要了。
天地图作为国内权威的地理信息公共服务平台,提供了地形图、矢量底图、影像底图、全球境界四大类在线服务,全部基于WMTS(Web Map Tile Service)标准发布。这意味着只要你的ArcMap能发WMTS请求,就能直接把这些底图当图层用,不用下载、不用拼接、不用管更新。你打开的就是最新的,官方维护的,坐标系标准统一的。
但问题来了——ArcMap原生对WMTS的支持并不像ArcGIS Pro那么直观。Pro里直接有个"添加数据"→"WMTS服务"的入口,填个URL就完事。ArcMap呢?你得绕一下,通过GIS服务器→添加WMTS服务器的路径来操作。这个差异让很多从Pro转回ArcMap的人第一次操作时直接懵掉。
这篇文章要解决的就是这件事:在ArcMap 10.x系列(包括10.2、10.8这些常见版本)中,把天地图的四类服务稳定地加进来,并且解决坐标系、Key验证、图层顺序这些实际出图时会遇到的坑。适合已经有ArcMap基础操作能力、但没折腾过在线地图服务的同行,也适合那些被"返回code: 301001 / 非法key"折磨过的朋友。
我自己的使用场景是国土空间规划和用地报批,出图频率高,底图切换频繁。下面这套方法是我在多个项目里反复验证过的,不是网上那种抄来抄去的步骤,每一步都带上了我踩过的坑和对应的解法。
2. 动手之前必须搞清楚的三个前置条件
2.1 天地图Key的申请与"非法key"的真实原因
很多人卡在第一步:Key。天地图的服务不是完全匿名开放的,你需要一个Key才能调用。申请入口在天地图官网的"控制台"里,注册账号后创建一个应用,选择"浏览器端"类型,就能拿到一串字符。
但这里有个高频坑:你拿到的Key在浏览器里测试正常,放到ArcMap里就报301001非法key。我一开始也以为是Key的问题,反复重新申请了好几个,结果都一样。后来才搞明白,301001这个错误码在天地图的体系里,绝大多数情况不是Key本身无效,而是请求的Referer头或者IP白名单不匹配。
天地图的Key可以绑定"域名白名单"或"IP白名单"。浏览器端调用时,Referer是网页地址,容易匹配。但ArcMap发WMTS请求时,Referer是空的或者是一个本地路径,如果你的Key绑定了域名白名单,自然就被拒了。
提示:申请Key时,如果只是自己本机ArcMap用,建议选择"服务端"类型或者不绑定白名单(如果选项允许),这样ArcMap的请求不会被Referer拦截。如果必须绑定,把本机公网IP加进去。
还有一个细节:天地图的Key有配额限制。免费Key每天的调用次数是有限的,个人出图完全够用,但如果你拿去做批量切片或者高频刷新,可能会被限流。我一般会在Key的管理页面看一眼当日剩余量,心里有数。
2.2 ArcMap版本对WMTS的支持差异
不是所有ArcMap版本对WMTS的支持都一样。我实测下来:
| ArcMap版本 | WMTS支持情况 | 备注 |
|---|---|---|
| 10.2 | 基本可用 | 界面较老,部分参数需要手动填 |
| 10.4 | 稳定 | 推荐的最低版本 |
| 10.6 | 稳定 | 对坐标系识别更准 |
| 10.8 | 稳定 | 目前最推荐的版本 |
10.2虽然能用,但它在解析WMTS的Capabilities文档时偶尔会漏掉某些图层,尤其是"全球境界"这种带注记的图层。如果你还在用10.2,建议至少升到10.4。我自己主力是10.8,下面演示也以10.8为准,10.2的差异我会单独标出来。
另外,ArcMap是32位程序,内存上限就那么大。加载在线影像底图时,如果缩放级别拉得太大,切片请求量会暴增,ArcMap容易卡死。这不是天地图的问题,是ArcMap本身的限制。解决办法后面会讲。
2.3 网络环境与坐标系的基本认知
天地图的服务地址是公开的,但你的网络得能正常访问。这个不用多说,能打开天地图官网就行。
坐标系这块要提前说清楚,因为后面加图层时会遇到。天地图提供的WMTS服务,默认的切片矩阵集是基于经纬度投影的(EPSG:4326),也就是我们常说的地理坐标系。而很多做规划的人习惯用Web墨卡托(EPSG:3857)或者高斯克吕格投影(如CGCS2000 3度带)。
ArcMap加载WMTS时,如果当前数据框的坐标系和服务的切片矩阵集不一致,ArcMap会尝试动态投影。动态投影在矢量上没问题,但在栅格切片上会导致重采样模糊。所以我的建议是:加载天地图底图时,把数据框坐标系设成WGS84地理坐标系,出图前再根据需要投影。这样底图最清晰。
3. 一步步把天地图四类服务接进ArcMap
3.1 找到正确的WMTS服务地址
天地图的WMTS服务地址是有规律的,四类服务对应四个不同的URL。这些地址在天地图官网的"服务"→"地图API"页面里能查到,但藏得比较深。我直接列出来,省得你去找:
- 矢量底图:
http://t{0-7}.tianditu.gov.cn/vec_c/wmts?tk=你的KEY - 影像底图:
http://t{0-7}.tianditu.gov.cn/img_c/wmts?tk=你的KEY - 地形底图:
http://t{0-7}.tianditu.gov.cn/ter_c/wmts?tk=你的KEY - 全球境界:
http://t{0-7}.tianditu.gov.cn/cva_c/wmts?tk=你的KEY
注意{0-7}是负载均衡的服务器编号,你可以随便选一个,比如t0。tk=后面跟你的Key。
还有一个注记图层,很多人会忽略。矢量和影像底图本身不带地名标注,你需要额外加载注记服务:
- 矢量注记:
http://t{0-7}.tianditu.gov.cn/cva_c/wmts?tk=你的KEY - 影像注记:
http://t{0-7}.tianditu.gov.cn/cia_c/wmts?tk=你的KEY
等等,这里有个容易混淆的地方:cva_c既是"全球境界"又是"矢量注记"?不是的。天地图的命名规则里:
vec= 矢量底图img= 影像底图ter= 地形底图cva= 中文矢量注记cia= 中文影像注记eva= 英文矢量注记eia= 英文影像注记
而"全球境界"实际上是cva的一部分,它包含了国界、省界这些境界线。所以你在ArcMap里加载cva_c,得到的就是带境界和注记的图层。
注意:网上有些教程把"全球境界"单独列一个地址,其实用的还是
cva_c。别被绕晕了。
3.2 在ArcMap中添加WMTS服务器的完整操作
打开ArcMap,别急着点"添加数据"。正确的路径是:
- 打开ArcCatalog窗口(或者ArcMap右侧的Catalog面板)。
- 展开GIS Servers节点。
- 双击Add WMTS Server。
- 在弹出的对话框里,URL栏粘贴你的WMTS地址,比如
http://t0.tianditu.gov.cn/vec_c/wmts?tk=你的KEY。 - 点Get Layers,如果Key和网络都没问题,会列出该服务下的所有图层。
- 选中你要的图层(比如
vec),点OK。
这时候ArcCatalog里会出现一个WMTS连接。把它拖到ArcMap的地图框里,底图就加载进来了。
10.2版本的用户注意:10.2的Add WMTS Server对话框可能没有"Get Layers"按钮,你需要手动填图层名。矢量底图的图层名是vec,影像是img,地形是ter,注记是cva。填完直接OK,也能加载。
我第一次操作时犯了个错:把URL里的?tk=后面的Key复制时多带了一个空格,结果一直报错。这种低级错误排查起来很费时间,建议粘贴后检查一遍。
3.3 图层顺序与注记叠加的正确姿势
底图加载进来后,你会发现矢量底图没有地名,影像底图也没有。这时候需要把注记图层叠上去。
正确的图层顺序(从下到上):
- 影像底图或矢量底图(最底层)
- 注记图层(中间层)
- 你的业务数据(最上层)
在ArcMap的内容列表里,直接拖动调整顺序就行。但有个细节:注记图层的背景必须是透明的。天地图的注记服务本身返回的是带透明通道的PNG,正常情况下叠加后不会遮挡底图。如果你发现注记把底图盖住了,检查一下是不是加载了错误的图层,或者数据框的背景色设成了白色。
我一般会把底图和注记分组,命名成"天地图底图",这样图层多了以后不会乱。分组方法:在内容列表里按住Ctrl选中多个图层,右键→Group。
3.4 坐标系设置与动态投影的取舍
前面提过,天地图的切片矩阵集是EPSG:4326。加载后,右键数据框→属性→坐标系,确认当前是WGS84。如果不是,手动设成Geographic Coordinate Systems → World → WGS 1984。
如果你需要出图用投影坐标系,比如CGCS2000 3度带,有两种做法:
做法一:数据框保持WGS84,出图时在布局视图里正常出,ArcMap会自动处理。缺点是底图在投影后的显示会有轻微变形,但出图精度影响不大。
做法二:把数据框设成目标投影,让ArcMap动态投影底图。缺点是底图会变模糊,因为切片被重采样了。
我的选择是做法一。底图清晰度对出图效果影响很大,尤其是影像底图。投影变形在出图比例尺下肉眼几乎看不出来。
4. 那些让你抓狂的报错与性能问题
4.1 301001非法key的排查链路
这个错误我遇到过三次,每次原因都不一样。下面是我总结的排查顺序:
第一步:确认Key本身有效。把WMTS地址直接粘贴到浏览器地址栏,把{0-7}换成t0,回车。如果返回一串XML,说明Key没问题。如果返回错误信息,Key可能过期或被封。
第二步:检查Key的白名单设置。登录天地图控制台,看这个Key绑定了什么。如果是域名白名单,ArcMap的请求大概率被拒。改成IP白名单,把本机公网IP加进去。或者干脆新建一个不绑白名单的Key专门给ArcMap用。
第三步:检查URL拼接。?tk=前面不能有空格,Key后面不能有多余字符。我见过有人把&写成&的,那是HTML转义,在ArcMap里不认。
第四步:检查网络代理。如果你在公司内网,可能有代理服务器拦截了请求。这个得找IT确认。
提示:天地图的Key在控制台里可以设置"有效期"。默认可能是永久,但如果你设了短期,过期后就会报301001。我一般设永久,省事。
4.2 加载慢、卡顿、切片不显示的优化
ArcMap加载在线底图卡顿,核心原因是切片请求量太大。每次你平移或缩放,ArcMap都会向服务器请求新的切片。如果缩放级别跨度大,请求量会指数级增长。
我的优化经验:
- 限制最大缩放级别。天地图的服务一般支持到18级左右。在ArcMap里,不要没事就拉到最大级别。出图够用就行,一般1:2000到1:50000的图,12-15级足够了。
- 关闭"地图缓存"的自动更新。ArcMap有个地图缓存机制,会在本地存一份切片。这本来是好事,但如果缓存目录设在机械硬盘上,反而拖慢速度。把缓存目录设到SSD上。
- 不要在布局视图里频繁缩放。布局视图的渲染比数据视图慢,每次缩放都会重新请求切片。先在数据视图里调好范围,再切到布局视图出图。
- 用"暂停绘制"功能。ArcMap有个"Pause Drawing"按钮,调整图层时先暂停,调完再恢复,能省很多请求。
还有一个偏方:如果你只需要某个固定范围的底图,可以先用ArcMap的"导出地图"功能把底图导出成TIFF,然后作为离线栅格加载。这样出图时就不依赖网络了。缺点是失去了在线更新的优势,适合项目后期定稿阶段。
4.3 影像底图与矢量底图的切换策略
做规划的人经常需要在影像和矢量之间切换。我的做法是两个都加载,用图层可见性控制。
具体操作:把影像底图和矢量底图都加到地图里,放在同一个组里。出图时,根据需要在内容列表里勾选或取消勾选。这样不用反复去ArcCatalog里拖图层,效率高很多。
但要注意:两个底图同时可见时,ArcMap会同时请求两套切片,性能会下降。所以切换时记得把不需要的那个取消勾选,而不是让它留在那里。
另外,影像底图在放大到17级以上时,天地图的影像会变得模糊,因为分辨率到极限了。这时候可以切到矢量底图,矢量底图在高级别下依然清晰,因为它是矢量渲染的。
5. 出图环节的实用技巧与常见误区
5.1 出图时底图不显示或显示不全
这个问题在布局视图里特别常见。原因通常是数据框的范围和底图的服务范围不匹配。天地图的服务覆盖全国,但如果你数据框的范围跑到了国外,底图就空白了。
解决办法:在数据视图里先把范围缩放到你的研究区,确认底图正常显示,再切到布局视图。如果布局视图里底图还是不全,检查数据框的"裁剪选项"是不是设成了"裁剪到形状",改成"裁剪到数据框"。
还有一个原因:出图分辨率设得太高。比如你设了600 DPI,ArcMap会请求更高精度的切片,但天地图的服务可能不支持那么高的级别,导致空白。一般出图用300 DPI就够了,打印A3幅面完全够清晰。
5.2 注记压盖业务数据的处理
注记图层叠在底图上,但你的业务数据(比如用地规划图斑)如果也在同一区域,注记可能会压住图斑的标注。这时候需要调整注记的透明度或者图层顺序。
我的做法是:把注记图层放在业务数据下面。这样业务数据的标注在最上层,注记在中间,底图在最下层。但这样注记会被业务数据遮挡,如果业务数据是半透明的,注记还能透出来。
如果业务数据不透明,那就只能牺牲注记,或者把注记的透明度调到50%左右,让它不那么抢眼。ArcMap里调整图层透明度:右键图层→属性→显示→透明度。
5.3 全球境界图层的特殊用法
"全球境界"这个图层,很多人不知道怎么用。其实它主要包含国界、省界、地级市界这些线划。做全国尺度的图时,直接叠加在影像底图上,能清楚看到行政边界。
但要注意:全球境界的线划比较粗,在小比例尺下好看,大比例尺下会显得突兀。我做市级规划时一般不用它,用自己整理的行政区划矢量更合适。做省级或全国尺度的示意图时,它很方便。
另外,全球境界图层和注记图层是分开的。如果你只要境界线不要注记,可以在加载cva_c后,在图层属性里把注记的标注关掉,只保留线划。具体操作:右键图层→属性→标注→取消"标注此图层中的要素"。
6. 从ArcMap迁移到ArcGIS Pro时的注意事项
虽然这篇主要讲ArcMap,但我知道很多人正在或准备转到Pro。Pro里加载天地图简单得多,直接"添加数据"→"WMTS服务",填URL就行。但有几个坑要提前知道:
第一,Pro的WMTS连接是存在工程里的。你换一个工程,得重新加。ArcMap是存在ArcCatalog里的,全局可用。Pro里如果想复用,可以把WMTS连接发布到Portal,或者用Python脚本批量加。
第二,Pro对Key的白名单更敏感。因为Pro的请求头跟ArcMap不一样,有些在ArcMap里能用的Key,在Pro里会报301001。解决办法一样:检查白名单设置。
第三,Pro的渲染性能比ArcMap好很多。同样加载天地图影像,Pro的缩放和平移流畅得多。如果你机器配置还行,强烈建议转Pro。ArcMap毕竟是32位程序,内存限制摆在那里。
我现在的做法是:日常出图用Pro,但一些老项目还在ArcMap里维护,所以两边的天地图配置都保留着。Key用同一个,白名单设成IP,两边都能用。
7. 我这些年用天地图底图的一些个人体会
天地图的底图质量这几年提升很明显,尤其是影像底图,很多地区的分辨率已经能到0.5米级别,做1:2000的规划图完全够用。矢量底图的地名注记也比较规范,不像某些商业地图那样花哨。
但有一个问题始终存在:天地图的更新频率不如商业地图。一些新建的道路、小区,在天地图上可能还是旧影像。所以做现状分析时,我一般会结合最新的卫星影像或者实地调查数据,不能完全依赖天地图。
另外,天地图的Key配额对个人用户来说够用,但如果你是团队使用,建议申请多个Key轮换,避免单Key被限流。我见过一个团队十几个人共用一个Key,结果下午高峰期频繁报错,后来每人一个Key就没事了。
最后说一个细节:天地图的WMTS服务地址里,t{0-7}这个负载均衡,其实可以固定用t0。我试过轮换,速度差异不明显。固定一个反而好排查问题,因为你知道请求发到了哪台服务器。
这套方法我在多个项目里用了好几年,从10.2到10.8都验证过。核心就是三点:Key的白名单设对、坐标系设成WGS84、图层顺序别搞反。剩下的就是熟练度问题。第一次操作可能会觉得步骤多,做两遍就顺了。