
做GIS的人迟早会遇到这么一件事明明是同一套QGIS工程在外业核查的时候手机信号一差在线底图直接白屏现场几个图斑没法核对只能干瞪眼。还有更常见的场景——领导明天要汇报投影仪那台电脑没联网你辛辛苦苦配的工程项目一打开全是灰底整个汇报效果大打折扣。这两件事的解法其实很统一提前把高德地图源加进QGIS并把需要的区域按级别下载成离线瓦片。这篇教程就把在线加载和离线下载两头一起讲透从URL参数到渠道号从添加图层到生成瓦片目录全部按我实际操作过的流程来。适合刚接触QGIS的新手也适合想把手头底图固化到本地的老手参考。1. 为什么要往QGIS里装高德地图源而不是直接截屏1.1 高德图源在QGIS里的三个典型使用场景第一个场景就是外业核查。做自然资源调查、林业普查、农田图斑核查的人最清楚去野外之前必须把工作区域的底图准备得明明白白。高德的影像在城区和乡村清晰度都不错道路标注也比较新比单纯用OSM底图更适合国内项目。把高德影像加载到QGIS里配合自己的矢量图层一起看到现场后的参照价值非常高。第二个场景是内业矢量化。我在做小范围的人工地物勾绘时习惯把高德卫星图作为底图在上面画地块边界或房屋轮廓。高德影像的色调统一并且是GCJ-02坐标在多数国内项目里和采集数据的坐标体系接近勾出来的边界和现场情况吻合度较好。第三个场景是出图展示。汇报用的图纸上底图要干净、信息清晰。相比直接从地图App里截屏QGIS里添加的高德图源可以自由控制比例尺、裁剪范围、叠加透明度还能把北箭头和图例一起出到打印布局里。截屏底图很难做到这个效果。1.2 高德图源与QGIS的适配原理XYZ瓦片到底是什么瓦片就是地图服务端把一整张地图按金字塔形式切成的256x256像素小图片。显示哪一级就加载对应缩放级别下的图片图片的编排规则用“z缩放级别/x列号/y行号”表示。这种组织方式叫XYZ瓦片是QGIS里最常见的在线底图格式。高德地图的瓦片服务也是这套规则。你在QGIS里添加它的地址时不需要下载什么特殊插件只需要填一个带有{z}{x}{y}占位符的URL模板QGIS就会根据当前地图范围自动换成具体的瓦片编号去请求。这里要注意{y}的方向。高德的瓦片原点在左上角y值向下递增这和Google系一致属于XYZ规范。如果填成TMS规范y轴反向加载出来的地图会上下颠倒或者位置错乱。想验证某个瓦片地址是否有效最简单的办法是打开浏览器手动输入一个具体的瓦片URL比如把{z}/{x}/{y}替换成17/45678/23456能直接看到一张图片说明这个地址可用。这个方法在下文排查问题时会反复用到。1.3 自己填URL和装插件哪个方案更稳很多教程会让你先安装QuickMapServices等插件再从插件菜单里勾选高德地图。这条路对新手最友好因为插件里已经把常用图源预置好了点两下就能用。但我实际用下来的感受是插件的图源列表更新有时跟不上高德如果调整了域名或参数插件里的旧地址就会失效而且插件会多占一份系统资源。自己手动填写URL的好处是完全可控。域名能从A主机换到B主机参数能自己改渠道号能按需要加上或去掉失效后排查起来也快。坏处是要记住一些地址套路但这类地址本身不难网上常见的模板整理出来后复制粘贴到填URL的地方就行。我的建议是两种方案都留着插件作为备选手动填写作为主力。如果插件里某个图源挂了手动填写的这条地址仍然能救急。2. 高德地图瓦片URL拆解先把渠道号和参数搞清楚2.1 两张高频可用的高德瓦片地址我目前用得最稳定的是这两条一条道路图一条卫星影像图直接复制到QGIS里即可使用。道路图含路网与地名标注https://webrd0{1-4}.is.autonavi.com/appmaptile?langzh_cnsize1scale1style8x{x}y{y}z{z}卫星影像图无标注纯影像https://webst0{1-4}.is.autonavi.com/appmaptile?style6x{x}y{y}z{z}如果做事时不想手工拼接这个地址可以把webrd01、webrd02、webrd03、webrd04四个子域名都试一遍。子域名的作用是分散请求压力某个子域名在当前网络环境下卡顿换一个往往就顺了。这是排查地图加载慢的常用手段。2.2 高德瓦片参数逐个说清楚顺便讲讲渠道号c04030322001看第一条URL里面有几个参数值得知道含义。langzh_cn是中文size1是标准大小scale1是1倍分辨率style8是带标注的路网样式。不要各版本混用尤其是style参数它直接决定返回的是矢量地图还是影像地图填错了页面显示内容会完全不同。卫星图里style6代表影像源。拿style8配到卫星图上会得到带路网和地名的影像图这也是很常见的一个组合。但如果想要标注又可以随时开关更推荐在QGIS里把道路图叠在影像图上面用图层透明度来控制。这样比重新填一个地址灵活。热词里经常出现的“高德地图渠道号c04030322001”是开放平台里给App标识来源用的一个渠道标识。普通用户访问高德地图网页版和App时服务端通过渠道号识别来自哪个调用方。在QGIS里添加瓦片地址时这个渠道号并不是必填项不加也可以正常出图。那为什么很多人讨论它因为在高德开放平台上注册并申请的Key或渠道号调用配额和频率限制可能不一样在部分工具里加上channelc04030322001后请求行为会更接近高德App客户端有时能减少被限流的情况。实测在QGIS里加不加都能加载区别不大。如果后续下载瓦片时频繁断流可以在URL末尾追加这个参数再试但不要指望它解决所有限制问题它只是一个服务端识别字段。2.3 火星坐标偏移的前因后果叠加矢量数据前先想清楚高德在线底图用的是GCJ-02坐标俗称火星坐标。这是在国内合法地图服务中普遍采用的加密偏移坐标。GPS接收到的原始WGS84坐标和GCJ-02坐标之间存在几十米到几百米不等的偏移各地偏移量不一致。所以你在QGIS里加载高德影像底图再把一个基于WGS84坐标的矢量文件叠上去会看到图层整体“错位”。这未必是操作错误而是两种坐标系本身不一致。处理方式通常有两种一是把矢量数据先进行GCJ-02偏移转换让矢量也站到火星坐标上二是保持矢量不动用带GCJ-02偏移的底图做纯参考不做精确量测。如果只是看看空间位置关系后一种方案最省事。如果要做精确编辑最好是到现场用同样坐标体系的采集数据或者在软件里做一次坐标纠偏。这个点没搞清楚后面瓦片下载完叠加还是会出问题。3. QGIS添加高德地图源的全流程3.1 从数据源管理器新建XYZ图层打开QGIS点击顶部菜单“图层”找到“数据源管理器”也可以直接用快捷键CtrlL。在左侧面板里选择“XYZ Tiles”然后点击“新建”按钮。这时会弹出一个参数填写窗口里面有几个字段需要认真对待。名称随便填一个能识别出来的比如“高德街道图”。URL就填上一节里的完整地址。地址中的{z}{x}{y}占位符必须原样保留一个都不能少。QGIS要靠这三个占位符替换成真实编号。填完点“确定”后在XYZ Tiles列表里会多出一项双击即可加载到图层区。这个操作看起来简单但从我辅导过的同事情况看最容易犯的错是把地址里的webrd0{1-4}当成真的花括号语法给删掉或者把{x}误写成[x]。占位符必须保持QGIS能识别的花括号格式格式错了图层显示就异常。3.2 配置图层的显示范围、缩放级别与请求细节新建XYZ图层时窗口下方有“范围”和“缩放级别”的选项。默认范围是全世界对于只做国内项目的人更高的范围会导致QGIS在未覆盖区域拼命请求无效瓦片。诀窍是把范围设置成“中国”或你工作的区域这样浏览地图时计算量会小很多。最大缩放级别也值得设置。高德瓦片一般在18级左右能达到较高清晰度个别区域到19级。设置得过大缩放时QGIS会一直请求高倍瓦片对网络和磁盘缓存都是负担。我的做法是把最大级别设为19而在实际下载离线数据时再按需限制。加载完成后建议右键图层打开“属性”在“透明度”里可以统一调整整个图层的透明度这个在叠加多个底图时非常有用。缓存设置则可以调节瓦片本地缓存空间默认大小对个人项目基本够用但如果你大面积漫游浏览适当调高能避免重复下载。3.3 添加卫星影像图源并和道路图叠加同样流程再新建一个“高德影像图”URL填卫星影像地址然后加载。这时你会看到影像层在最上方遮挡了道路层这是正常的图层顺序问题。在图层列表中把“高德影像图”往下拖让“高德街道图”位于它上方道路标注就显示在影像之上了。如果想做矢量化参考底图可以把影像层的透明度调到20%到30%这样既能看到高德影像上的地块轮廓又能看到下面矢量图层的编辑状态。我发现这种“上道路、下影像、透明度微调”的组合是目前在QGIS里比较顺手的国内底图方案。补充一句如果你加载后发现影像层颜色偏亮或偏暗不考虑做拉伸可以通过混合模式微调比如给道路层设定“正片叠底”效果会更自然。这类图层属性细节往往比单独换图源更影响最终出图效果。4. 离线瓦片下载与本地目录组织4.1 用“生成XYZ瓦片目录”导出高德瓦片在线图源加载好后离线下载其实不用写复杂脚本QGIS自带的处理工具箱就能完成。按CtrlAltT打开处理工具箱在搜索框里输入“XYZ”会出现“生成XYZ瓦片MBTiles”和“生成XYZ瓦片目录”两个工具中文版QGIS可能显示为“Generate XYZ tiles (MBTiles)”和“Generate XYZ tiles (directory)”。想要一个文件夹里干干净净的瓦片文件就选“生成XYZ瓦片目录”。打开工具后需要做几个选择输入图层选“高德街道图”输出目录填一个准备放瓦片的空白文件夹范围可以从地图画布范围取也可以从某个矢量图层的范围取缩放级别填最小和最大级。我这里通常设置最小级别10最大级别17确认无误后点击运行。这里有个重要提醒下载过程中QGIS会实际发起大量瓦片请求时间取决于范围和级别跨度。如果选了中国全域从10级到17级会非常耗时建议先用小范围测试。跑完一轮正常生成几百张瓦片再扩大到完整范围。4.2 下载级别选择和瓦片数量的粗略估算瓦片数量增长规律是每级放大4倍。以范围跨度为1个经度、南北跨度0.8个纬度的小区域为例在缩放级别17时瓦片数大约1600张到了18级变约3200张到16级则只剩约800张。好多人在这一环高估了磁盘下载到一半才发现C盘满了。我一般按“用途比例尺”来定最高级别。只是为了现场看路网16级足够要核对房屋轮廓和细小路径至少得17级如果还要做局部放大截图那才需要18级。无脑下载到19级时间成本和存储成本都会成倍增加。你要是对区域大小和瓦片数没概念先下载一个16级的测试范围看看文件体积再按4倍增长规律推算17级、18级心里就有底了。4.3 MBTiles单文件导出手机App直接可用如果你不想看到成千上万个小文件处理工具箱里的另一个工具“生成XYZ瓦片MBTiles”会更合适。它把指定范围和级别的瓦片打包进单个.mbtiles文件内部按SQLite数据库方式存储。这类文件在QGIS里可以直接拖入在许多手机离线地图App里也能直接读取。这个方案非常适合外业一个文件拷进手机不用带一堆文件夹传文件也方便。实测下来MBTiles在QGIS中打开速度比大量零散瓦片快。需要注意MBTiles里同样保存有坐标参考和缩放级别信息但如果你的源图层是GCJ-02瓦片导出的MBTiles底图坐标体系也带GCJ-02偏移这在手机野外使用时没有问题因为手机地图和GPS记录一般也会做匹配处理。5. 常见报错与网络请求被限流的排查实录5.1 瓦片空白、403、断流先查这三处最常见的现象是地图加载出空白面或者局部灰块。遇到这种情况第一件事是验证URL本身是否有效。复制URL到浏览器把{z}/{x}/{y}替换成一个真实瓦片号再访问。能打开图片说明地址没问题打不开就要检查填写的URL有没有多出空格、协议是http还是https。403错误基本可以断定被服务器拒绝访问。高德瓦片服务器对请求头有一定要求有时会拒绝常见的匿名请求。虽然QGIS的XYZ图层界面里没有直接填写请求头的地方但是可以通过给URL追加渠道号等方式来模拟更正常的客户端请求。比如原先的地址加一个channelc04030322001,或者把子域名从webrd01换成webrd02都有机会绕过去。断流的情况则表现为瓦片下载到一半突然大量失败进度条开始变慢输出目录里的文件数量不再增长。这种十有八九是请求过于频密触发了服务端的临时限制。QGIS自带工具在高并发请求时没有内置的延时控制这就是为什么会断流。5.2 墨卡托范围与请求频率对下载成败的影响QGIS的“生成XYZ瓦片”默认采用Web墨卡托切片方案这个方案和在线地图的切片规则一致。下载时选的范围如果来自一个WGS84投影的矢量图层QGIS会自动转换到墨卡托切片网格这不会出错但转换过程会增加计算量和请求量。建议在设置范围时直接以当前地图画布为准或者手动选择一个已经在EPSG:3857投影中的范围图层减少不必要的转换。请求频率是另一个可控因素。如果批量下载时被限制有一个务实做法是缩小单次下载的范围和级别跨度把大任务拆成多个小任务分时完成。拆分后配合URL里的渠道号参数成功率会高很多。如果你实在需要高效下载大片区域可以考虑用专门的瓦片下载软件配合QGIS生成的范围文件而不是让QGIS自己去大海捞针式地请求。5.3 实战排查清单整理成速查表我把实际项目中遇到过的瓦片异常和相应处理办法整理成了表格遇到问题可以逐条对照。现象可能原因处理方式图层全白URL中占位符错误或地址不可访问浏览器实测瓦片地址检查{z}{x}{y}写法位置上下颠倒/错位XYZ与TMS的y轴方向混用确保使用XYZ方式不要选TMS图片能加载却很模糊缩放级别最高值设置太低调高图层最大缩放级别到18或19403或请求失败请求头被拒或频率过高追加channel参数、更换子域名、降低并发下载中断且不再增长触发服务端临时限制缩小范围、拆分任务、隔一段时间再跑影像和矢量错位GCJ-02与WGS84坐标体系不同统一坐标体系或仅用底图做视觉参考5.4 关于渠道号和子域名的一点实际体验单独把渠道号拎出来再说一次是因为很多人把它当成万能药。我实测过的结果在QGIS中不添加渠道号也能正常加载和下载低级别瓦片但在大规模下载时添加渠道号的确更稳定。原因我不确定是服务端对渠道号有不同配额还是请求头里的附加参数让请求更像正常客户端总之在下载失败时可以一试。另外是子域名策略。高德的瓦片服务器通常分配了webrd01到webrd04四个子域名有的情况下某个子域名不在你所在网络的优选路由上导致加载缓慢。如果浏览底图时明显卡顿把URL里的0{1-4}改成固定数字比如webrd02有时立竿见影。这种问题与代码无关纯粹是网络通路问题但不能忽视。6. 下载完成后这些善后工作经常被忽略6.1 本地瓦片目录转GeoTIFF或VRT的做法离线瓦片下载完成后一堆/{z}/{x}/{y}.png文件直接使用没问题但如果你想把整片区域合并成一个GeoTIFF方便在CAD或其他GIS软件里打开就需要一点额外操作。QGIS里可以把瓦片目录当作本地栅格图层拖入然后用“栅格工具”里的“合并”功能或者用命令行GDAL工具完成拼接。命令行方式其实更可控。先进入瓦片目录的根目录用gdalbuildvrt把某级所有瓦片生成一个虚拟栅格再用gdal_translate转成GeoTIFF。注意拼接前要确认瓦片的坐标参考是Web墨卡托输出时如果需要再转换到目标投影。整个过程并不复杂但比在图形界面里点选每一个文件要省事得多。6.2 本地瓦片在手机地图软件里的落地方式外业人员通常需要的用法是把离线瓦片放进手机地图软件配合GPS定位现场使用。不同手机地图软件对瓦片的支持不一样但很多都支持“自定义地图源”功能。你只需要把瓦片目录或MBTiles文件放到指定存储路径再在软件里添加一个指向该路径的离线源即可。适用性较强的做法是保留MBTiles文件不要解压直接放入手机地图的导入目录。如果软件要求的是文件夹形式就把瓦片目录按/z/x/y.png结构整体拷贝过去再按对应软件配置格式写一个地图源定义文件。这一块各家软件差异较大但核心都是让软件知道去哪里找瓦片、最高到几级。出门前先查看一张瓦片是否能打开避免到现场才发现目录结构不对。6.3 把离线底图和外业采集结合起来的小经验下载好离线底图之后我通常会在QGIS工程里额外建立一个点图层字段里放“图斑编号、现场情况、照片路径”。到外业现场时开着QGIS移动版或者直接把底图导进手机地图软件现场点一下就能记录信息晚上回到室内再把这些点和照片同步回主工程。这样做比带纸质图纸拍摄照片再回来量化要高效得多。底图离线这件事真正的价值并不是省流量而是让现场不受网络条件约束。做过一次完整准备后后续项目只需要更新局部范围耗费的时间比临时找在线图源少很多。这个思路可以在小范围实测一次然后按自己工作区域逐步积累瓦片库。我个人的操作习惯是每次做新的离线下载前先把范围框选出来用最低级别快速预览确认区域没有偏差后再加高级别正式下载。下载时只跑10到17级不追求无意义的19级高清输出目录固定存放在移动硬盘里按日期命名。这样既能快速交付也不会因为一次失败的请求影响整体进度。踩过几回坑之后你会发现地图源这件事说到底就是一个“URL参数加存储规划”的问题提前想清楚后面基本不会出大岔子。