做项目这几年,被问得最多的问题之一就是:怎么把在线底图和遥感影像结合起来用?地图上的位置到底对应哪块真实地表?正好前两天又用QGIS干了一整套活儿——加载天地图当底图,再下载指定区域的哨兵2影像做分析。干脆把完整流程整理出来,这次不藏私,从申请天地图TK密钥到最终导出裁剪好的影像,一步步说清楚。
这套组合拳日常很实用,特别适合测绘遥感、城乡规划、环境监测、农业估产这类经常需要“底图对位置、影像看现状”的场景。无论你是刚接触QGIS的新手,还是已经用ArcGIS习惯的老手,这篇文章都能帮你在半小时内把流程跑通。
1. 为什么是QGIS配天地图这套组合
先说结论,再做细节。我日常做项目管理时,最怕的不是数据算不出来,而是底图不干净、坐标系对不上、数据来源说不清。选QGIS配天地图,恰好能把这三件事一次解决。
1.1 天地图能给你什么
天地图是国家地理信息公共服务平台,面向公众提供地图服务。它不是某个商业公司的私有产品,而是官方背景的公共服务,这一点在项目验收、成果汇报时特别占优势。你不用担心版权纠纷,也不用担心某天在线地图突然变更接口导致你的项目白做。
天地图提供几类常用底图:影像底图(就是卫星照片拼接图,更新频率较高)、矢量底图(边界、道路、地名等要素)、地形晕渲图、全球境界线等。对我们做遥感的人来说,最常用的是影像底图加中文注记层。首页上的影像底图,覆盖范围包括全国,放大到城市级别依然清晰,用作参考底图完全够。
还有一点很重要:天地图服务在国内访问稳定,不需要额外设置。作为起草方案、现场踏勘、数据核对时的底图,它比很多国外在线地图更符合实际国情。
1.2 为什么我推荐在QGIS里干这件事
QGIS是开源跨平台桌面GIS软件,对它最中肯的评价是:小、快、灵。它是免费的,体积比同等功能的商业软件小很多,启动速度快,加载在线瓦片图源更是几分钟的事。没有复杂的许可管理和联网授权,装完即用。
ArcGIS的用户可能不服气:我加载天地图也有专门教程。但实际操作中你会发现,ArcGIS加载在线服务要么装补丁、要么配代理,步骤比QGIS繁琐。QGIS这边新建一个XYZ连接,把天地图的URL粘进去,图层就出来了。整个操作学习成本极低,对初学者非常友好。
再加上QGIS的生态插件丰富,下载遥感影像、波段合成、裁剪导出都能在同一软件里完成,不用在多款软件之间反复切换。对做遥感预处理的人来说,这就省掉了大量格式转换和数据搬运的时间。
1.3 环境准备
先装QGIS。到官网下载长期支持版(目前常用3.28 LTR或者更新的稳定版),安装时一路下一步就行。Windows、macOS、Linux都有对应版本,我这边Windows环境实测最舒服,内存占用约1GB,普通办公电脑也能带得动。
装完以后建议做两件事:在“设置→选项→网络”里确保网络访问正常;然后打开“扩展→管理并安装扩展…”,确认插件库能列出一堆插件,说明环境没问题。后面我们要用到的Semi-Automatic Classification插件,也是从这里装。
2. 天地图在线底图加载流程
这是整篇文章里最容易被卡住的环节,网上一搜“天地图tk”,问的人特别多。所谓tk就是用户的访问密钥(Key),相当于你调用天地图服务的通行证。没有tk,地图服务就拒绝给你返回瓦片。
2.1 获取天地图TK密钥的完整步骤
打开天地图官方网站(tianditu.gov.cn),先在右上角注册账号。注册时需要手机验证,部分地区可能要求实名认证,这一步按提示操作即可。
登录以后找到“开发人员”或“控制台”入口,进入“应用管理”,创建一个新应用。应用类型建议选“浏览器端”,因为QGIS加载在线瓦片本质上就是浏览器请求图片。创建时可能需要填应用名称、应用描述,绑定域名这一栏,如果只是自己本地用,填localhost或者*都可以(视审核要求而定,有的环境填任意域名也能通过)。
提交之后,系统会给你生成一个Key,长度大概在30个字符左右,这就是后面URL里tk=后面的值。注意:这个Key刚申请时可能不是立刻生效,我遇到过等了几小时才正常的,所以如果加载黑屏别急着重新申请,等一会儿再试。
2.2 在QGIS中添加影像底图(XYZ Tiles方法)
拿到tk之后,打开QGIS,在左侧浏览器面板里找到“XYZ Tiles”,右键选择“新建连接”。弹出的窗口里填两项:
- 名称:随意,比如写“天地图影像”
- URL:粘贴下面的模板
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=你的TK点击确定以后,把“天地图影像”拖到画布上,正常情况下影像底图就出来了。这个URL是天地图标准的WMTS服务地址,QGIS会自动把{z}、{y}、{x}替换成当前视野对应的行列号和缩放级别,所以整个加载过程非常顺滑。
如果URL不可用,检查一下tk是不是粘贴完整,或者把t0换成t1、t2试试——天地图提供了多个瓦片子域,作用类似负载均衡,个别子域临时抽风时换一个就能恢复正常。
2.3 叠加中文注记和矢量底图
光有影像底图还不够,地名信息对项目表达很重要。同样的方法,再新建一个XYZ连接,URL换成注记层:
https://t0.tianditu.gov.cn/cia_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cia&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=你的TK这里的关键是把LAYER参数从img换成cia。img是影像,cia是中文注记,vec是矢量线划。有人加载注记层以后发现字体太大或遮挡影像,可以在图层透明度里调整注记层的透明度,或者在渲染属性里做透明度百分比,让影像信息透过来。
我一般会在图层管理器里建一个“天地图组”,把影像底图和注记层放进去。这样在后续加载遥感影像时,组一勾选一放开,整组底图就能统一控制显隐,操作效率提升不少。
2.4 坐标系与偏移的坑:4490、4326、3857怎么选
这是新手最容易懵的地方。天地图的瓦片服务用的是CGCS2000坐标系,对应的EPSG代码是4490,它和WGS84(EPSG:4326)在大多数场景下差别小到可以忽略。QGIS里新建的XYZ图层默认可能被识别成EPSG:3857,也就是Web墨卡托,如果项目本身也是3857,那加载出来一般不会偏移。
但如果你把天地图影像和某个外地下载的矢量数据叠加,发现对不上,大概率就是坐标系不一致。解决办法:右键图层→图层属性→源→设置图层坐标系,把影像底图手动指定为EPSG:4326或EPSG:4490;然后右键图层→导出→另存为,选择目标坐标系,重新导出一次,让影像真正“对齐”到项目坐标系里。
实际项目中我比较推荐的做法是:新建工程时就把工程坐标系设置成你最终出图需要的坐标系,比如做中低纬度区域用UTM投影,做全国尺度用Albers等积投影。在线底图只是参考,QGIS会实时做动态重投影,只要底图的原始坐标系识别正确,显示上基本不会出问题。
3. 下载指定区域遥感影像的完整路径(以Sentinel-2为例)
底图就位后,下一步是拿当前真实验收数据。好多人一说到遥感影像,先想到去买高分辨率商业影像,但日常分析其实免费数据完全够用。以Sentinel-2(哨兵2)为例,它的多光谱成像仪能提供10米空间分辨率的多光谱数据,重访周期5天,完全免费。
3.1 为什么拿哨兵2当示例
哨兵2是欧洲航天局哥白尼计划的对地观测卫星,携带多光谱成像仪,覆盖可见光/近红外/短波红外波段,其中B2蓝、B3绿、B4红、B8近红外这几个波段分辨率是10米。对有植被分析、水体提取、土地利用分类需求的场景来说,10米分辨率在城市和乡村调查中基本够用,免费开放,数据质量也很稳。
更重要的是,哨兵2官网直接提供L2A产品(大气校正后的地表反射率产品)。这意味着我们拿到的数据,已经完成了大气校正这一步,省去很多预处理麻烦。你要做的事情就可以简化为:下载、波段合成、裁剪、导出。
3.2 方案一:在QGIS里直接下载影像(SCP插件方式)
QGIS有个老牌插件叫Semi-Automatic Classification Plugin,简称SCP,它就内置了Sentinel-2数据的下载工具。打开“扩展→管理并安装扩展…”,搜索“Semi-Automatic Classification”,安装成功后,菜单栏会出现一个“SCP”入口。
在SCP面板里找“Download products”,首次使用需要登录一个数据账号。你可以注册一个USGS账号,或者直接用哥白尼数据空间(Copernicus Data Space)的账号,这两个平台都免费。登录后,在面板里设置数据集为Sentinel-2,填好时间范围和最大云量百分比,然后用面板上的画框工具画出要下载的研究区,点击搜索,符合条件的影像就列出来了。
勾选需要下载的产品,点击Download开始下载。这里要注意:SCP下载大体积的L2A产品时速度受网络影响较大,如果下载中断,可以尝试直接在浏览器里下载更稳妥。SCP的优势是下载完的影像带有元数据信息,方便后续直接打开浏览。
3.3 方案二:从官方数据平台手动下载再拖进QGIS(最稳定的方法)
如果SCP下载不稳,或者你不想登录插件,直接打开浏览器访问哥白尼数据空间或USGS EarthExplorer,同样可以按区域和时间筛选哨兵2影像。
我的习惯是先在QGIS里打开天地图,找到目标区域,用“工具→临时草图”快速画一个面状范围,记录它的经纬度边界。然后打开哥白尼数据空间,在地图上框选同样范围,或者直接填经纬度坐标范围,设置时间、云量<20%,搜索产品列表。
下载时选择L2A产品,通常每个产品是一个压缩包,解压后里面包含很多波段文件(B01、B02、B03、B04、B08等,格式是JPEG2000,后缀为.jp2)。把这些jp2文件直接拖进QGIS窗口就能加载。文件较多时建议建个文件夹统一管理,文件名本身已经带有波段信息,按名字选择即可。
3.4 波段合成:真彩色与假彩色
单个波段加载进来默认是灰度图,看起来就是黑白照片。要合成真彩色,需要把B4(红)、B3(绿)、B2(蓝)三个波段按顺序合在一起。
QGIS里最简单的合成方式是“虚拟光栅”。在菜单“栅格→其他→构建虚拟光栅(Build Virtual Raster)”里,按顺序添加B4、B3、B2这三个文件,设置输出文件名,点击运行。生成的虚拟栅格会自动以RGB方式显示出一张彩色遥感影像。
想显示成假彩色(比如植被检测用),就把输入顺序换成B8(近红外)、B4(红)、B3(绿)。这样植被会因为近红外反射极强而显示成亮红色,水体和裸地颜色差异也会非常明显。日常项目里我经常用假彩色来快速识别植被覆盖范围和异常区域。
如果合成后你看不到彩色,而是显示成三波段灰度,那就在图层属性→符号系统里,把渲染类型改成“多波段彩色”,并正确指定红、绿、蓝各自对应的波段号。
3.5 按指定区域裁剪并导出
影像下载好了,波段合成也做了,最后才是“下载指定区域遥感影像”的核心操作——裁剪出我们真正需要的那一块,并导出成一个干净的GeoTIFF。
先准备裁剪范围。如果是某个行政区,直接导入已有的行政边界shp文件;如果没有边界,可以新建一个临时矢量图层,用“描绘”工具在画布上沿着天地图底图描绘出目标范围。这里注意,临时矢量图层要选择适当坐标系,最好和最终导出影像的坐标系一致。
然后打开“栅格→提取→按掩膜图层裁剪栅格(Clip Raster by Mask Layer)”,输入图层选虚拟栅格合成后的影像,掩膜图层选刚才的矢量面,输出文件路径填一个GeoTIFF文件名,点击运行。几秒钟后,指定区域的遥感影像就裁剪好了。
如果你还嫌10米影像在某些应用里不够精细,可以对导出的影像做重采样,或者叠加天地图影像底图做目视解译。真正常用的做法是裁剪后再做一次栅格转换,“栅格→转换→转换(Translate)”,设置输出类型为Byte,应用0到255的拉伸系数,把原本16位浮点的大体积影像压缩成8位RGB的普通图片,方便在其他软件里直接读取和汇报展示。
4. 常见问题排查手册
实际操作中,问题永远比教程多。我按踩坑频率排一个常见问题表格,你照着排查基本能解决大部分异常。
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 天地图图层黑屏/白屏,不出图 | TK密钥无效或未生效 | 检查URL里tk是否完整,Ctrl+R刷新画布,稍等或换t0/t1/t2子域 |
| 天地图只出部分瓦片,其余空白 | 网络不稳定导致瓦片下载失败 | 放大缩小画布触发重新加载,或清理瓦片缓存(设置→选项→网络资) |
| 影像底图加载出来但注记层没有 | 注记层URL的LAYER参数写错 | 确保是cia而不是img,检查URL参数大小写 |
| 影像与天地图底图位置对不上 | 坐标系不一致 | 检查图层CRS,统一到EPSG:4326或项目坐标系,必要时导出重投影 |
| SCP插件搜索不到影像 | 账号未登录或时间范围设置太窄 | 检查登录状态,扩大时间范围,关闭云量筛选再搜索 |
| SCP下载一直停在0%或中断 | 网络连接不稳定,服务端限速 | 改用官方数据平台浏览器手动下载 |
| 波段合成后显示全灰或全黑 | 渲染类型不对或数据值范围未拉伸 | 在多波段彩色渲染里重新指定波段顺序,并把对比度拉伸设为“拉伸到当前数据集” |
| 裁剪时报错“Input layer has no CRS” | 待裁剪图层缺少坐标系定义 | 先右键图层属性设置正确的CRS,再执行裁剪 |
| 导出后影像非常大,加载卡顿 | 16位浮点数据未压缩 | 用Translate转换为Byte类型,输出压缩为GeoTIFF(LZW),体积能缩小5到10倍 |
针对黑屏问题多说一句。天地图Key正式启用后,有时加载第一次会黑屏,但缩放到其他级别它自己又会刷新出来。这多半是客户端瓦片缓存调度的问题,在图层上右键刷新或者重新缩放就能触发瓦片重取。QGIS的缓存清理路径在“设置→选项→网络→缓存设置”,有强迫症的话,定期清理缓存也能减少怪问题。
另外,天地图在线底图属于影像瓦片,做大范围打印输出时清晰度不如原始影像数据。如果项目要求极高清出图,记得把在线底图定位成“参考”,把哨兵2或者更高分辨率影像定位成“数据源”,两者分工才科学。
5. 一些实战心得和扩展玩法
流程跑通了,该上点实战心得。这些经验不是教程里会写的,但恰恰能帮你少走大段弯路。
5.1 图层组织与项目模板保存
我每次新建一个遥感项目,都会先建一个“01_底图”组,把天地图影像、中文注记放进去;再建一个“02_影像”组,放哨兵2合成后的影像和裁剪结果;再建一个“03_辅助”组,放研究区面、采样点、参考线等。
看似简单的图层分组,实际能节省大量重复劳动。尤其是同一区域可能需要反复下载、反复出图的项目,图层顺序一旦确定,每次只需替换影像数据,底图和标注位置都不用动。配置好后,用菜单“项目→另存为模板”,把这个结构保存为模板。下次新项目直接从这里起步。
5.2 从裁剪影像到NDVI计算
影像裁剪完之后,千万别止步于“看一眼”。用栅格计算器做一个植被指数,整个数据才有分析价值。
在QGIS菜单“栅格→栅格计算器”里,输入公式:
("NIR" - "RED") / ("NIR" + "RED")其中NIR是近红外波段(B8),RED是红光波段(B4)。生成的结果就是归一化植被指数,范围在-1到1之间,正值越高说明植被越茂盛,负值多为水体或裸地。这个指数在农作物长势监测、森林覆盖评估、环境调查里应用极广,而且从你下载的同一景影像里直接做,不需要额外找其他数据。
原理也很简单:健康的绿色植被对红光吸收强、对近红外反射强,所以近红外减红光再除以两者之和,就能把植被信号突显出来。对使用了L2A级地表反射率产品来说,这个计算是可以直接做的,不涉及大气校正问题。
5.3 最后一个小技巧:CSV坐标点快速落图
出图汇报时经常需要把经纬度点位标在底图上。以前我会一个一个手动添加,后来发现QGIS里可以直接导入CSV文本:
在浏览器面板右键“分层设色”,选择“添加矢量图层”,文件类型选“CSV”,设置X字段为经度、Y字段为纬度,坐标系选EPSG:4326,点击添加,所有点就一次性显示在天地图上了。
这个技巧配合天地图底图和哨兵2影像,做现场踏勘前的“室内预判”效率极高。比如你要跑几十个外业点位,先在室内把点位全部落到天地图上,再叠加哨兵2影像看周围地物特征,提前规划路线,到了现场直接按顺序采样,能省下大半天时间。
我个人在实际操作中的体会是:工具本身没有高下,关键是流程能不能跑通、数据能不能反复用。QGIS加载天地图、下载哨兵2影像这条链路,我用了大概两年,从最初的三四小时摸索到现在的十几分钟出结果,熟能生巧。建议你今天就拿自己熟悉的区域试一遍,跑通一次,后面就是复制粘贴的事了。