☰
QGIS实战:多源数据接入、格式转换、标注与符号化全流程
2026/10/2 19:40:28 网站建设 项目流程

QGIS 这个工具,我最早是拿它当"应急看图软件"用的,后来项目里数据源越来越杂——有同事扔过来的 SHP,有从业务系统导出的带经纬度的 CSV,有遥感影像 GeoTIFF,还有一堆 NetCDF 格式的气象网格文件,我才真正把它当成主力桌面 GIS 在用。一圈折腾下来,最核心的几件事其实就四个:把各种数据源接进来、把数据格式互换到对方能用的那个、给要素加上能看懂的标注、再用符号化把一张"能看"的图变成"能读"的图。这篇就按我平时的实际顺序来写,不搞教科书那套从坐标系理论讲起,先把活儿干出来,遇到坑再回头补原理。适合刚装完 QGIS 不知道从哪下手的人,也适合已经会拖文件但一遇到乱码、坐标错位、导出丢字段就卡壳的人。

1. 开工前先想清楚:QGIS 在你这套流程里站什么位置

1.1 我为什么没有一上来就选商业软件

先说个很实际的判断。GIS 桌面工具大致分两类,一类是重度工程化的商业套件,功能全但授权贵、部署重、脚本化能力受限制;另一类是 QGIS 这种开源桌面端,功能覆盖度已经很接近前者,但胜在可以随便装、随便试、随便写脚本自动化。我选它的原因不复杂:项目里数据加工环节多、格式换来换去,需要能反复试错而不心疼授权,同时又要能把重复操作脚本化。

具体到能力上,QGIS 底层用的是 GDAL/OGR 这套读写库,这一点的意义比表面看起来大得多。GDAL/OGR 基本覆盖了市面上绝大多数矢量和栅格格式,所以你不用为每种格式单独找工具——同一个界面里,SHP、GeoJSON、GeoPackage、KML、DXF、GeoTIFF、JPEG2000、NetCDF 都是同一套打开逻辑。这带来的直接好处是:数据源的接入方式和数据格式的转换方式高度统一,学会了打开一种,剩下的都是换个菜单的事。

另外它的处理工具箱(Processing Toolbox)把大量算法做成了可批处理、可写进模型的积木块,还支持从 Python 控制台调用。这一点在你需要处理几百个文件的时候会救命。我个人的经验是:单个文件手工点,超过二十个就写脚本或者用批处理界面,别硬点。

1.2 先把"图层"和"工程"这两个概念理顺

新手最容易混的就是"图层"和"工程"。简单说,工程是一个容器文件(现在默认存成 .qgz),它记录了你这张图里加载了哪些数据、每个数据怎么符号化、怎么标注、视图停在哪个范围、打印布局长什么样;图层是工程里的一条数据引用,它本身不复制数据,只是指向磁盘上或数据库里的那份文件。

这个区分非常重要,因为它决定了两件事。第一,工程文件很小,几 KB 到几百 KB,里面没有数据,所以你把工程拷给别人,别人没数据照样打不开。第二,工程里保存的是路径引用,如果你把数据挪了位置,再打开工程就会看到一排红叉。所以我习惯在工程属性里把路径设成"相对路径",并且让工程文件和数据放在同一个目录树下,整个文件夹一起拷走,走到哪都能开。

还有一个细节:QGIS 默认会记住你上次打开的图层和窗口状态。如果你只是想快速看一眼某个文件,直接用"添加图层"而不保存工程就行,不用每次都建工程。

2. 安装与首选项:把地基打稳再动手

2.1 版本怎么选,装哪个包

QGIS 的发布节奏是双轨的:一路是长期支持版(LTR),大概一年一个大版本,只收修 bug 的补丁,稳定;另一路是最新功能版,功能多但偶尔会有小毛病。我的建议很直接——生产环境一律用 LTR,尝鲜可以用功能版,但别把它当主力。

安装包方面,各平台都有官方独立安装包,Windows 上还有一个 OSGeo4W 的包管理器模式。独立安装包适合独立使用的人,OSGeo4W 适合需要同时管理 GDAL、GRASS、SAGA 这些依赖的人。我平时用独立包,因为依赖它都打包好了,出问题的概率低。

注意:安装路径别带中文和空格,尤其别放在桌面那种路径里。GDAL 相关的命令行工具对非 ASCII 路径的处理偶尔会出问题,我踩过一次,排查了两小时才发现是路径里的中文字符。

安装完先别急着导数据,做三件事:把语言改成中文、把默认编码改成 UTF-8、把临时目录挪到大一点的盘。语言设置在"设置 → 选项 → 通用"里,勾选"覆盖系统语言"选简体中文,然后重启。编码这项在后面处理 CSV 和 SHP 属性表时会反复用到。

2.2 几个我每次装完必改的默认参数

默认参数不是不能用,但有几个改完能省很多事。

  • 渲染质量:默认是"低"或"中",大图看起来发虚。改成"高",代价是刷新慢一点,但出图质量差别肉眼可见。
  • 图层拖入自动加载:确认打开,这样直接拖文件进画布就能加载,效率高很多。
  • 属性表默认显示格式:关掉科学计数法,避免坐标字段显示成 1.2e+06 这种看不懂的东西。
  • 数据源编码:默认设成 UTF-8,配合后面 CSV 的导入设置,中文乱码能少一大半。

参数这些改动都存进用户配置里,一次性做完,以后升级版本基本保留。

3. 打开各种数据源:矢量、栅格、数据库、网格文件

3.1 矢量数据源:SHP、GeoJSON、KML、CSV 怎么接

矢量数据最简单的路径是直接拖文件进画布,或者走"图层 → 添加图层 → 添加矢量图层"。在对话框里选文件时,注意底部的"编码"下拉框,如果打开后属性表中文是乱码,回来改这里就行。

SHP 是老牌格式,但限制不少,我在实际使用中总结了几条:字段名最多 10 个字符、单个文件大小理论 2GB、字段数量和字段长度都有限制、还必须凑齐 .shp/.shx/.dbf/.prj 这一套才算完整。如果对方只给了 .shp,属性表基本是空的,坐标系也丢了。所以现在我自己内部流转默认用GeoPackage(.gpkg),单文件、无字段名限制、支持空间索引、支持多图层,SHP 只在对外交付、对方明确要求时才用。

GeoJSON 是文本格式,好在能直接看、能进版本管理,坏在文件大了之后解析慢,而且坐标精度写全了会让文件膨胀得厉害。KML 主要用于和地图类应用对接,QGIS 能直接读,但注意 KMZ 是压缩包,虽然也能读,读之前最好解压,不然属性结构有时会丢。

CSV 这一类最容易被当成"不是 GIS 数据"而忽略。其实只要里面有经纬度两列,加进来就是一个点图层。操作路径是"图层 → 添加图层 → 添加分隔文本图层",然后在对话框里指定 X 字段(经度)和 Y 字段(纬度),关键是几何图形定义那里要把"无几何图形"改成"点坐标",再指定坐标系。经纬度的话选 EPSG:4326,如果是投影坐标就得选对应的 EPSG 代码。

提示:CSV 里经纬度写反是高频事故。判断方法很简单,加载后看范围,如果点全跑到南极或者非洲西边的海里,基本就是 X/Y 填反了。不用重新导,删掉图层重新加一次,把字段对调就行。

还有一种情况是 CSV 里已经有 WKT 格式的几何列(比如POINT(116.4 39.9))。这种可以直接在导入对话框里选"已知文本(WKT)"作为几何定义,QGIS 会自己解析,比手动指定 XY 省事。

3.2 栅格与网格数据:影像、DEM、NetCDF

栅格走"图层 → 添加图层 → 添加栅格图层",GeoTIFF、IMG、JPEG2000 基本拖进来就行。有一类数据需要特别注意:没有坐标信息的普通图片。QGIS 会问你坐标系,随便选一个会得到位置错乱的结果。正确做法是先确认这张图对应的实际坐标系,或者干脆给它做地理配准(栅格 → 配准工具),丢几个地面控制点上去。

NetCDF(.nc)这类气象、海洋领域常见的网格文件,走 GDAL 的 NetCDF 驱动读进来。它和普通影像的区别在于:一个 .nc 文件里通常有多个变量(温度、湿度、风速……)和多个时间步。添加的时候 QGIS 会弹一个"选择子数据集"的界面,把所有变量和时间片列出来,你要勾选具体要哪个。这一点很多人第一次遇到会懵,以为文件坏了,其实是让你选。

NC 数据加进来之后,符号化建议用单波段伪彩色,配一个合适的色带,然后开"插值"渲染,不然格点之间是硬边,看起来一格格很难看。

3.3 数据库和空间表:GeoPackage、PostGIS 怎么接

数据库这一块,最常见的两种是 GeoPackage 和 PostGIS。

GeoPackage 本质上是 SQLite 加了一套空间扩展规范,文件就是单个 .gpkg。打开方式和矢量文件一样,拖进去后在"添加矢量图层"对话框里会展开成一个树状结构,里面可能有多个图层,勾你需要的。它的优势我前面提过,这里补一点:它支持真正的空间索引,几十万点的图层在它里面平移缩放,比在 SHP 里流畅不少。

PostGIS 走的是网络连接,路径是"图层 → 添加图层 → 添加 PostGIS 图层"或者直接用左侧浏览器面板。新建连接需要主机、端口、数据库名、用户名密码。连接上之后能看到 schema 和表,双击加进工程。数据库的好处是多人共享、并发编辑、可以写 SQL 做复杂查询,缺点是依赖服务端,网络一断就全没了。

浏览器面板是我强烈建议用起来的一个地方。它把文件系统、GeoPackage、数据库、Web 服务都做成统一树状结构,双击即加载,比反复开对话框快得多。养成用它的习惯之后,日常加载效率能翻一倍。

4. 数据格式转换:手工导出、批处理和坐标系处理

4.1 右键"导出"能解决八成需求

最常见的转换场景就是"把 SHP 转成 GeoPackage"或者"把一堆图层合并成一个"。最快的方式是右键图层 → 导出 → 要素另存为。这里面有几项必须看清楚:

  • 格式:下拉选目标格式,选完下方会出现对应的参数,比如 GeoPackage 要选图层名,SHP 要选编码。
  • 文件名称:注意扩展名要跟格式一致,选错了格式但扩展名没改,写出来的文件会打不开。
  • 坐标系(CRS):默认是图层自己的 CRS。如果你要换投影,在这里改。
  • 编码:转成 SHP 时,中文要选 GBK 或 UTF-8,选错了对方打开就是乱码。
  • 保存所选要素:如果图层上做了筛选,可以只导出筛选后的部分。

这里有个坑我踩过:导出 SHP 时字段名会自动截断到 10 个字符,而且如果原字段名里带中文或特殊符号,转完可能变成一堆下划线。这不是 bug,是格式本身的限制。遇到这种需求,我一般会先在 GeoPackage 里把字段名改成英文短名,再转 SHP 交付。

4.2 用处理工具箱做批量转换

单个文件右键导出没问题,但如果手上有四十个 SHP 要转 GeoPackage,一个一个点就是浪费生命。这时候用处理工具箱(Processing Toolbox)里的 GDAL 工具,重点是它的批处理界面:右键某个算法 → 以批处理方式执行,界面会变成表格,每行一次执行,可以把文件路径一列直接粘贴进去。

常用到的几个算法:

需求算法关键参数
矢量格式互转转换格式(ogr2ogr 封装)目标格式、目标 CRS、编码
栅格格式互转转换格式(gdal_translate 封装)输出格式、压缩方式、波段选择
栅格重投影/裁剪投影(gdalwarp 封装)目标 CRS、重采样方法、裁剪范围
合并多个矢量合并矢量图层输入图层列表、目标格式
修复无效几何修复几何容差、是否保留属性

重采样方法的选择有讲究:连续数据(高程、温度)用双线性或三次卷积,类别数据(土地利用类型、掩膜)一定用最近邻,否则会出现本来不存在的类别值。这个细节不注意,栅格一重投影分类就多了几个莫名其妙的类。

4.3 坐标系转换:别在最后一步翻车

坐标系这块,概念上分两大类:地理坐标系(经纬度,单位是度)和投影坐标系(平面,单位是米)。它们的标识符都是 EPSG 代码,比如 EPSG:4326 是常见的经纬度基准,各种高斯投影、Web 墨卡托都有自己的代码。

转换的逻辑是:数据本身带一个 CRS,你指定一个目标 CRS,工具负责做数学变换。矢量的转换在导出对话框或处理算法里指定目标 CRS;栅格同理,但因为栅格要重新采样,所以必须顺带选重采样方法。

注意:如果两个图层的 CRS 不一致,QGIS 默认会做"即时投影"(on-the-fly reprojection),也就是在显示时临时把它们对齐。这看起来一切正常,但转换出来的数据其实还是原坐标系。所以做面积、长度计算之前,一定要确认图层的实际 CRS 是不是你要算的那个投影系,用经纬度算面积是典型的错误操作。

工程本身的 CRS 在右下角状态栏能看到,点一下就能改。它只影响显示和新建图层,不会改动已有数据的坐标系。

5. 添加标注:让地图自己把信息说出来

5.1 从"单一标注"开始,五分钟就有结果

标注的入口在图层属性 → 标注。默认是"无标注",切到"单一标注"就能选一个字段作为标注内容。常用的开关有这么几个:字体和大小、颜色、缓冲区(给文字加一圈底色描边,压在底图上也能看清)、放置位置(点上、线中、面内)、旋转(跟随线要素方向)。

我一般的起点配置是:字体选一个无衬线体、大小跟随地图单位或用固定毫米、缓冲区开 1 毫米白色描边、放置位置按要素类型选。这套组合在绝大多数底图上都能看清,不用反复调。

文本的排版细节里有两个值得单独说。一个是"文本缓冲",它是在字形外圈画一圈,不是背景框,所以文字下方是透明的圆角形状,比矩形背景好看很多。另一个是"避让"(Obstacles),可以指定某些图层的要素不参与标注——这主要是防止你把面要素当成障碍物把点标注全挤走。

5.2 表达式标注:多字段拼接和数值格式化

单字段标注在字段名很丑的时候很尴尬,比如 SHAPE_AREA、POP_2024 这种。这时候切到表达式构建器(旁边那个 ε 图标),用表达式拼出人看的文字。

几条我常用的写法:

-- 拼接两个字段,中间加分隔符 "名称" || ' / ' || "编号" -- 数值保留两位小数再拼接 "名称" || ' (' || round("面积", 2) || ' km²)' -- 条件判断,没值时显示"未知" coalesce("备注", '未知') -- 长文本自动换行,每 10 个字符断一次 wordwrap("描述", 10) -- 数字加千分位分隔 format_number("人口", 0)

coalesce这个函数值得单独记住:它返回参数列表里第一个非空值,用它来处理属性表里的空缺特别省事,不用写一堆 if。

还有一个进阶用法是按条件切换标注内容。比如在比例尺较大时标注全名,缩小时只标注编号,这要靠"使用规则定义"来实现,规则里还能同时控制字体大小和可见性。

5.3 标注冲突和性能:图一复杂就卡怎么办

标注一多,重叠和卡顿是两个绕不开的问题。

重叠的处理在标注引擎设置里,有三个策略:允许重叠(最快,但最乱)、不放置(最干净,但会丢标注)、自动避让(效果和速度折中)。我的做法是给每个图层设一个优先级,重要的图层优先级高,次要图层设"不放置",让它们主动让位。

性能方面,几万点的图层如果每个点都要重新计算标注排布,每次缩放都会卡。缓解手段有几个:打开"渲染缓存"、把不参与标注的字段设成"不在属性表中加载"(源设置里)、给要素类设置比例尺依赖可见性——小比例尺下干脆不显示这个图层。

5.4 从"能看"到"好读":标注的排版习惯

标注不是为了把数据倾倒出来,是为了让人一眼抓住重点。几条我自己的习惯:标注文字尽量短,长名称用换行或缩写;重要图层用加粗或稍大字号,次要图层降低不透明度;同一个图层里不要同时用三种以上字号;缓冲区颜色跟着底图明暗走,浅底用白描边,深底用黑描边。这些小调整加起来,同样的图,观感差别能有一档。

6. 符号化:把属性信息变成视觉语言

6.1 单一符号、分类和分级,选哪个

符号化的入口在图层属性的"符号化"页,顶上有个下拉框,选项很多,但真正日常用的就三类。

单一符号是给所有要素用同一个样式,适合只有位置信息、没有分类意义的图层。配置项有填充色、描边、不透明度、符号大小、旋转。

分类(Categorized)是按某个字段的不同取值分别配色,适合土地利用类型、道路等级、行政区这种离散字段。选完之后点"分类"按钮,它会扫描字段把唯一值列出来,然后你逐个给颜色或者在色带里点随机。

分级(Graduated)是按某个数值字段分区间配色,适合人口密度、降雨量、高程这种连续量。这里面有个关键选择就是分级模式和分级数。

分级模式适用场景说明
等间隔数据分布均匀区间宽度一样,分布不均时大部分要素会挤在一两级
分位数想让各级要素数量接近每级要素数大致相同,但区间宽度会很不均匀
自然断点数据有天然聚集用统计方法找"断崖",一般最贴合实际,计算稍慢
标准差看偏离均值的程度适合做异常分析,不适合做常规地图

我默认用自然断点配 5 级,除非数据有明显的均匀特征。分位数在数据高度偏斜时很好用,但它会让区间边界变成很奇怪的数字,出图时要在图例里说明你是按数量分的。

6.2 符号图层和效果:让图和图之间能区分开

QGIS 的符号不是一个整体,而是符号图层叠加起来的。比如一个面符号可以是"简单填充 + 线图案填充 + 轮廓描边"三层叠出来的花纹效果;一个点符号可以是"圆 + 内圈小圆"组成的靶心。理解了这一层,很多看着很高级的效果其实就是叠出来的。

描边里有两个常被忽略的单位选项:毫米和地图单位。用地图单位的话,缩放时线宽跟着变,视觉上宽度恒定,适合做等宽地图;用毫米的话,缩放时线宽固定,适合出图和打印。选哪个取决于你的目的。

透明度分整体不透明度和符号图层各自的不透明度。做叠加分析图的时候,我通常给面要素设 60% 到 70% 的填充不透明度,这样下层的地形或影像能透出来,比纯色块信息量大得多。

**符号级别(Symbol levels)**是个容易被忽略但很实用的功能。多条道路交叉时,如果不设符号级别,绘制顺序是按要素在数据里的顺序来的,就会出现某条小路压在主路上的情况。设了级别之后,你可以规定主路永远画在上层,交叉路口看起来就正常了。

6.3 规则驱动和数据定义覆盖,把逻辑写进样式里

**规则驱动(Rule-based)**是把符号化逻辑用条件表达式写出来,一条规则一行,可以随时开关。比如:

-- 主干道:宽度大于 20 且等级为一级 "等级" = '一级' AND "宽度" > 20 -- 次干道 "等级" = '二级' -- 其他 ELSE

每条规则可以给不同的颜色、宽度、甚至不同的符号类型。规则还能嵌套,做"同一图层里按多个属性组合出十几种样式"的场景特别合适。

**数据定义覆盖(Data-defined override)**是另一个维度的能力:它让符号的某个参数由字段值决定。比如线的宽度由一个"流量"字段直接驱动,颜色由"负荷"字段驱动。设置方式是点参数旁边那个小图标 → 选"编辑",然后写表达式。这个功能做数据驱动的可视化非常省事,不用手工分几十级。

有一个组合用法我经常用:按字段值直接给颜色。在填充颜色的数据定义里选"编辑",然后选一个存了颜色值的字段(形如#FF6600),整张图的配色就能跟着数据走,改数据即改图,不用回 QGIS 点。

6.4 出图:从画布到打印布局

做完符号化,最后一步一般是出图。走"工程 → 新建打印布局",里面加地图框、图例、比例尺、指北针、标题文字。地图框有个"锁定图层"的选项,可以做出"主图用一种样式,插图换另一种样式"的效果。

导出的时候注意DPI,屏显用 96,打印用 300,网络发布用 150 左右。分辨率和 DPI 是两回事,DPI 决定打印密度,分辨率决定像素数,两个都设对了图才清晰。

7. 常见问题与排查:我踩过的那些坑

7.1 打开和显示类问题速查

现象可能原因处理办法
打开后一片空白视图范围不对右键图层 → 缩放到图层
图层是灰色打不开缺少配套文件(如 SHP 的 .shx/.dbf)补齐整套文件
点跑到海里/南极XY 字段填反或 CRS 选错重新导入并改字段顺序和 CRS
属性表中文全是问号编码不对重新导入时指定 GBK 或 UTF-8
图层突然不见了比例尺依赖可见性被打开检查渲染设置里的最小/最大比例
CSV 加载后无字段分隔符识别错误手动指定分隔符为逗号或分号

7.2 乱码和字段截断这两件事

乱码的根源基本只有一个:读写两端编码不一致。SHP 的编码信息存在 .cpg 文件里,没有 .cpg 就需要手动猜。稳妥做法是导入时试 UTF-8 和 GBK 两个,哪个正常用哪个;导出时明确指定编码,别依赖默认值。

字段截断只发生在 SHP 上,字段名上限 10 字符,而且不能有中文和部分特殊符号。避免方式是把 SHP 当交付格式而不是工作格式,中间过程全用 GeoPackage。交付前先做一次字段名压缩,用英文缩写加注释表,比事后出乱码好处理。

7.3 卡顿和大数据量的处理

图层超过十万要素的时候,平移都开始卡。我做过的几件有效的事:给矢量建立空间索引(GeoPackage 自带,SHP 可以生成 .qix 文件,可以在"矢量 → 创建空间索引"里做);把栅格建金字塔(概视图),大图缩小浏览时读低分辨率层级,速度差出一个数量级;关掉不需要的实时投影;把属性表中用不到的字段在源设置里勾掉"加载"。

还有个小技巧:做临时分析时,用"内存图层"或者"临时草稿图层"而不是落盘,速度会快很多,分析完再导出成正式文件。

7.4 几何问题:不能算面积、不能做叠加

有时候你对一个图层做相交、裁剪,工具报错说几何无效。这不是工具坏了,是数据里存在自相交、重复点、环方向错误这类问题。处理路径是"矢量 → 几何工具 → 修复几何",先跑一遍,再去做后续分析。我一般会在所有面图层进入分析流程之前都先过一遍这个工具,省的半路报错再回头找原因。

注意:修复几何可能会改变要素形状,虽然改动通常极小,但如果你的分析对形状精度要求高(比如面积精确统计),修复后要重新核对关键字段。

8. 把零散操作沉淀成能复用的东西

QGIS 有个很值得用的能力:把重复流程做成图形模型(Graphical Modeler)。比如你每周都要做一遍"导入 CSV → 转坐标系 → 空间连接 → 导出 GeoPackage"这套动作,就在处理工具箱里新建一个模型,把四步拖进去连起来,以后每次只填输入路径,一次运行全跑完。

更进阶一点的是 Python 控制台。QGIS 内置了 Python 环境,处理算法可以用processing.run()调用,图层可以用iface对象操作。写十几行代码批量处理几百个文件,比手工点快得多,而且以后能复用。我自己常用的模式是:把"遍历文件夹、识别扩展名、调用算法、写日志"固定成模板,每次只改算法和参数。

最后再说一个不太起眼但很省事的习惯:随工程一起保存一个 README 文本和一份字段说明表。地理数据项目最怕的是半年后自己都忘了某个字段什么含义、某个图层是从哪个原始文件加工来的。把加工链路和字段字典记下来,和 .qgz 放在一起,换台机器或者换个人接手,打开就能继续干。这个习惯我坚持了几年,救过我不止一次。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询