写QGIS项目的时候,你有没有遇到过这种情况:明明两个图层都是同一个区域的数据,叠加起来却一个在广东一个在河北;明明只是随手画了个范围,用“测量工具”量出来的面积却大得离谱。我刚开始用QGIS时,这些问题基本都踩过一遍。后来才意识到,绝大多数坐标错乱的根源不是软件坏了,而是投影坐标系没选对。这篇是《QGIS快速入门与应用基础》系列的投影篇,重点聊三个最常见的投影类型:高斯-克吕格、UTM、Web墨卡托,以及它们在QGIS里怎么用、怎么选。搞懂这三样,坐标问题基本就解决了一大半。
1. 投影坐标系是地图的“数学底座”
1.1 地理坐标系与投影坐标系,先分清楚
很多新手会把“坐标系”和“投影”混为一谈,其实它们是两层东西。地理坐标系描述地球表面某点在椭球面上的位置,用经纬度表示,单位是度。比如GPS手机直接读出来的经纬度,一般就是WGS84地理坐标系下的坐标。所谓WGS84,是一个全球统一的地心坐标系,它给地球定义一个近似椭球模型,然后用经度、纬度来定位。
投影坐标系则不同,它把三维椭球面上的坐标通过数学方法展平到二维平面上,坐标单位变成米。这样做的原因很实在:你没法用经纬度直接计算面积、距离和角度,因为经度在不同纬度上的实际长度不一样,越靠近两极,同样1度经度对应的地面距离越短。地图要用于工程建设、土地管理、导航定位,就必须有一个平面上的、可计算的坐标系统。
可以把地球比作一个橘子,地理坐标系就是橘子皮上每个点标的经纬度,而投影坐标系就是想办法把橘子皮剥下来、撕一撕、压成一整张平面地图。这个过程必然会有拉伸或撕裂,投影方式不同,压平后的变形规律也不同。所以投影本质上是一套“从椭球面到平面”的数学规则,选择哪种规则,直接影响你后续量算数据的准确性。
1.2 投影选错的真实代价
投影选错不是小事。我见过最典型的场景是:GPS外业采集用的是WGS84经纬度,内业手上的国土数据是CGCS2000高斯投影坐标,两边都没错,但放到同一个QGIS工程里,点位能差出几十米甚至几百米。这时候如果不去检查坐标系,而是手动拖动图层对齐,那就越搞越乱,因为这不是平移误差,而是整个数学底子不同。
另一个高频翻车点是面积量算。有人在Web墨卡托投影下把一个县域范围的shapefile打开,用QGIS的测量工具一量,面积比真实值大了不少。这也不是软件bug,而是Web墨卡托投影在高纬度地区面积变形非常严重。它适合浏览,不适合做精确测量。
还有一类问题是导出文件给同事或其他软件时出现位置漂移。QGIS里显示没问题,因为它会动态投影,但导出时如果CRS设错,输出的文件可能带了一个错误坐标系或者干脆没有坐标系信息。拿到ArcGIS或其他GIS平台里打开,自然就错位了。这个阶段排查起来最费时间,因为错误往往不在当前操作,而在前面某一步导出时埋下的雷。
1.3 等角投影为什么是主力
高斯-克吕格、UTM、Web墨卡托都属于等角投影,也叫正形投影。等角的意思是小范围内任意两条线之间的夹角在投影前后保持不变,所以地图上的方向关系不会失真。对导航、测绘、工程放样来说,方向正确是底线,这是等角投影成为主流的根本原因。
但等角是有代价的:为了保持角度不变,面积就不得不被拉伸。越远离投影的某条基准线或基准点,面积变形越大。不同投影方式的区别,其实就是在选择一个“让哪些区域变形最小”的妥协方案。比如高斯-克吕格把变形控制在中经线附近,墨卡托把变形控制在线段方向而牺牲两极面积,UTM则通过比例因子把变形分配给两侧,换取更大的可用范围。
理解这一点,你就明白为什么没有“最好”的投影,只有“当前场景最合适”的投影。QGIS里做得好的地方是它把投影切换变成了一件非常顺手的事,但前提是你心里得知道现在该选哪一个。
1.4 不要直接拿经纬度去量距离和面积
在实际操作中,我见过不少人导入一份经纬度点数据,然后直接开“字段计算器”计算两点间的欧氏距离,结果是完全没意义的数。因为经纬度是度,度与度之间的地面长度会随着纬度和经度变化,简单套用平面距离公式得到的是“度距离”,不是米。
正确做法是先确定一个适合当前区域的投影坐标系,再用QGIS的“导出要素另存为”功能生成投影坐标数据,之后再做距离、面积计算。如果你的项目CRS已经设置成投影坐标系,QGIS里的测量工具也会按项目CRS进行换算,结果倒是相对合理,但如果你始终用WGS84地理坐标系作为项目CRS,测量工具有时会给出混合结果,界面看着是米,底层换算却不一定符合你的预期。所以最稳妥的方案:先转投影,再算量。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 三种常用投影类型逐项拆解
2.1 高斯-克吕格投影:测绘与自然资源数据的默认选项
高斯-克吕格投影,简称高斯投影,是一种横轴等角切椭圆柱投影。它由德国数学家高斯提出、克吕格完善,所以名字很长。工程上用的是横轴等角割椭圆柱投影的变体,但我这里不做过深的数学推导,重点说参数。
它的基本思路是:用一个椭圆柱横着套在地球上,使椭圆柱面与椭球面上的某一条经线相切,这条经线称为中央经线。投影后,中央经线没有长度变形,离中央经线越远变形越大。为了把变形控制在可接受范围内,高斯投影按经度分带使用,常用6度带和3度带。我国1:2.5万及以上大比例尺地形图、国土调查、自然资源管理数据,普遍采用3度带高斯-克吕格投影。
3度带从东经1度30分起,每隔3度划分一带,带号从1排到120。中央经线就是带号乘3。比如带号40,中央经线就是东经120度,正好覆盖我国东部很多省份。实际在QGIS里,选高斯投影时看到的是类似“CGCS2000 / 3-degree Gauss-Kruger CM 120E”这样的名字,前面的CGCS2000是大地基准,后面的CM 120E表示中央经线是东经120度。
高斯投影还有个重要约定是加假东偏移。为了避免中央经线以西出现负坐标,标准做法是在X坐标上统一加500000米,所以你在国内高斯坐标数据里会看到坐标这一串。Y坐标表示到赤道的距离,北半球为正。做图层叠加时,如果发现两套坐标数值非常接近但整体压不上,可以优先检查是不是中央经线或带号选错了。
2.2 UTM投影:面向全球的通用横轴墨卡托
UTM全称是Universal Transverse Mercator,中文叫通用横轴墨卡托投影。它是为了全球军事和民用测图而设计的一套分带投影方案,与高斯投影同属横轴墨卡托家族,但有两个关键区别。
第一,UTM把全球按经度划分为60个带,每带宽6度,从西经180度起向东编号,当前我国东部主要涉及49带、50带、51带。某个带的中央经线等于带号乘以6再减去183,例如50带的中央经线就是50×6-183=117度?其实按公式50带中央经线是117E。不过不同资料里可能略有差异,实际使用中直接在QGIS里搜EPSG:32650这种代码最不容易出错,U+32650就是UTM Zone 50N对应的CRS。
第二,UTM不是切椭圆柱投影,而是“割”投影。它把中央经线的长度比例因子定为0.9996,也就是中央经线在投影后长度被微微压缩,而带内东西两侧会存在两条长度无变形的割线,这样整个6度带范围内的变形都被均衡地控制在很小范围内。相比高斯投影中央经线无变形但边缘变形大的特点,UTM更适合跨多个经度区域的项目。
在国内自然资源业务里,UTM用得不如高斯多,但是涉及国际合作项目、全球公开数据集、GNSS导航应用时,UTM非常常见。比如很多全球DEM数据、土地利用分类产品,坐标系都直接给WGS84或UTM带号。你在QGIS里看到WGS 84 / UTM Zone 50N这样的名称,配合EPSG:32650检索,可以说非常对症下药。
2.3 Web墨卡托:互联网地图的底层逻辑
Web墨卡托是当前互联网地图当之无愧的事实标准。Google Maps最早采用了这种投影,后来OpenStreetMap、微软、腾讯、高德等在线瓦片底图全部跟进了同一套切片规范,对应EPSG代码是3857,也叫Pseudo-Mercator或Spherical Mercator。
很多人不理解为什么互联网行业不直接用WGS84或者UTM。核心原因在于:Web墨卡托的公式极其简单,它把地球近似为球体,然后直接套用墨卡托投影公式,栅格切片直接用行号和列号定位,计算效率非常高,也便于前端切片缓存和WebGL渲染。它能让整个世界地图显示在一个矩形范围内,东南西北方向一致,非常适合普通用户在线地图浏览。
代价是长距离和面积变形非常夸张。在赤道附近面积变形不大,但到北纬60度左右,面积已经被放大了好几倍。因此如果你在网上看到高纬度国家面积大得吓人,不要以为是数据错了,是投影在“说谎”。在国内项目中,腾讯瓦片这类在线底图之所以能无缝加载到QGIS里,就是因为它严格使用EPSG:3857切片;只要项目CRS设成3857,QGIS里的底图就不会偏。
2.4 高斯-克吕格、UTM、Web墨卡托横向对比
通过上面几个小节,三者的区别应该已经比较清晰了。这里用一张表做横向对照,方便你把几个底层参数记住:
| 投影类型 | 投影性质 | 分带方式 | 典型比例因子 | 常用CRS示例 | 主要用途 |
|---|---|---|---|---|---|
| 高斯-克吕格 | 横轴等角切椭圆柱投影 | 6度带或3度带,国内常用3度带 | 中央经线为1.0 | CGCS2000 / 3-degree Gauss-Kruger CM 120E | 国内测绘、国土、规划、三调数据 |
| UTM | 横轴等角割椭圆柱投影 | 全球60带,每带6度 | 中央经线为0.9996 | WGS 84 / UTM Zone 50N(EPSG:32650) | 全球制图、国际项目、GNSS应用 |
| Web墨卡托 | 球面墨卡托(伪墨卡托) | 全球统一,不分带 | 无统一比例因子,赤道附近变形最小 | EPSG:3857 | 在线瓦片底图、WebGIS、大屏展示 |
从表格能看出来,高斯-克吕格和UTM本质上很接近,都是横轴墨卡托的变体,差别主要在设计目标和分带细节上。Web墨卡托则更激进,它放弃严格椭球模型,换来了全球统一的简单计算,但代价就是不能用来做高精度量测。
3. QGIS里的投影实操流程
3.1 在QGIS中查看和修改图层CRS
打开QGIS后,第一步先确认当前图层是什么坐标系。操作路径是:在图层列表中右键点击图层,选择“属性”,然后切到“源”标签页,最上面就能看到“当前坐标系”的信息。如果你加载的是shp文件,QGIS会读取它自带的.prj文件来识别CRS;如果prj文件缺失,QGIS可能弹窗让你指定坐标系,或者干脆显示“未知”。
“未知”或“错误”的CRS是大量坐标问题的源头。一个最常见场景:别人发给我一份无后缀描述文件的shp,实际数据是CGCS2000高斯投影,但QGIS默认当成WGS84处理,导致图层位置显示完全不对。此时需要右键图层,选择“图层CRS”->“设置图层CRS”,在弹窗中搜索并选择正确的坐标系。
这里必须特别强调:设置图层CRS只是修改QGIS对数据的“解释”,并不会改变坐标值本身。假如数据里的X、Y坐标已经是百万级的高斯投影坐标,你却把它强行解释为WGS84经纬度,结果依然不会出现在正确位置。合理的处理方式是重投影导出,而不是直接改图层CRS。只有当你明确知道数据本身的坐标值对应哪个CRS时,使用“设置图层CRS”才是正确操作。
3.2 项目CRS:控制显示和量算的“总开关”
QGIS项目本身也有一个CRS,跟图层CRS是两码事。项目CRS决定了当前地图画布以什么坐标系进行显示,以及当你执行测量、计算、布局出图时使用什么坐标环境。
默认情况下,新项目CRS是“未定义”,加载第一个图层时,QGIS会自动把项目CRS设置为第一个图层的CRS。如果后边加载了一个CRS不同的图层,QGIS不会在地理位置上拒绝它,而是会自动做“动态投影转换”,把它们显示在同一坐标系下。这个设计很贴心,但也坑过不少人:你看到图层叠加正常,就以为数据本身坐标一致,实际上只是QGIS在后台帮你做了临时投影。
修改项目CRS的方法是:菜单“项目”->“项目属性”->“CRS”,在过滤框输入EPSG代码或名称,选中后确定。也可以直接点击QGIS右下角状态栏里的CRS按钮,快捷切换。建议养成一个好习惯:新建项目后,先把项目CRS固定成你当前业务要用的投影坐标系,不要依赖“跟随图层”的默认行为。这样后续无论加载多少数据,画布坐标系都是稳定的,测量结果也更可控。
3.3 从经纬度CSV生成投影坐标,最常用的一条流程
外业采集或从GPS设备导出的数据,经常是一张CSV表格,里面只有经度、纬度字段。要在QGIS里把它变成一份带投影坐标的shp,操作流程其实很简单,我实践过很多次,整理如下。
首先选择“图层”->“添加图层”->“添加文本数据图层”,在弹窗中选择CSV文件。QGIS会自动识别分隔符,你需要指定X字段为经度列,Y字段为纬度列,同时设置“图层CRS”为WGS84(EPSG:4326)。如果经纬度数据本身已有坐标系,也要如实选择,千万别默认成4326就完事。点击“添加”后,点数据会以点的形式出现在画布上,此时它们还是经纬度坐标。
接下来右键点图层,选择“导出”->“要素另存为”,格式选“ESRI Shapefile”,文件名和保存路径自定。在“CRS”一栏,点击右侧选坐标系图标,搜索目标投影,比如“CGCS2000 / 3-degree Gauss-Kruger CM 120E”或者“WGS 84 / UTM Zone 50N”。确定后生成的新shp文件,坐标就已经是米制的投影坐标了。这个过程就是用QGIS导出shp文件最简单的方法,关键点只有一个:别把导出CRS选错。
如果原始CSV里的经纬度字段是合在一个类似“POINT(120.3 31.2)”的WKT文本里,操作方式也类似,只是需要在“添加文本数据图层”时选择“自定义分隔符”,并在“几何定义”里选择“WKT”。QGIS能直接解析这种语法生成点要素,后续导出重投影步骤完全相同。
3.4 导出shp文件时锁定目标投影
很多人在导出shp文件时,只改了文件名和路径,CRS一栏没仔细看。QGIS默认会使用“图层CRS”作为导出CRS,这在一定场景下没问题,但如果你希望数据被其他软件读取时保持某个特定投影,就必须在导出对话框里主动设置。
以“另存为shp”为例,导出对话框的“CRS”一栏有三种常见选择。“图层CRS”表示沿用原数据坐标系;“项目CRS”表示将数据转换到当前项目坐标系;“选择的CRS”则允许你手动搜索并指定某一个。我常用的做法是:如果我要把数据发给测绘或规划单位配合,我直接选择目标系统要求的坐标系,例如CGCS2000高斯投影,这样打开就能用。
还有一个容易被忽视的问题是.prj文件。shapefile的坐标系信息存放在同名.prj文件里,如果这个文件缺失,很多软件只能猜,甚至干脆把数据当作未知坐标系。所以导出shp后,尽量把.dbf、.shp、.prj等一组文件一起打包,别只发一个.shp。你可以在QGIS里用菜单“处理”->“工具盒”,搜索“Package layers”把多个图层打包成GeoPackage,这种方式会把CRS内嵌到文件里,相对更不容易出错。
3.5 需要自定义高斯-克吕格带怎么办
QGIS内置的CRS非常多,搜索“Gauss-Kruger”能看到一大串,但偶尔也会遇到某个项目要求使用偏门的中央经线,或者你所在领域需要一种没有预设的坐标定义。这时候可以在QGIS中自定义CRS。
路径是“设置”->“自定义坐标参考系统”,在弹窗底部点击加号,在“名称”里填一个便于识别的名字,例如“CGCS2000 / Gauss-Kruger CM 121E”,在“格式”里选择WKT或Proj4,然后输入参数。最常用的Proj4字符串大致是:
text复制+proj=tmerc +lat_0=0 +lon_0=121 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs
解释一下关键参数:+proj=tmerc表示横轴墨卡托投影;+lon_0=121是中央经线;+k=1表示中央经线比例因子为1,这是高斯投影的典型设置;+x_0=500000就是假东偏移;+ellps=GRS80使用GRS80椭球,跟CGCS2000大致匹配。如果你的项目数据基于西安80椭球,需要把+ellps改成EVL J-2之类的椭球定义,实际以原始资料为准。
自定义CRS保存后,它就会出现在CRS选择器的列表里。后续无论导出还是设置项目CRS,都可以直接选用。这样即使面对特别冷门的中央经线需求,也能在QGIS里轻松搞定。
4. 项目选型思路与常见问题排查
4.1 按业务场景选投影,别一个CRS走天下
很多初学者喜欢把所有数据都统一到Web墨卡托EPSG:3857里,因为在线地图底图都是这个坐标系,显示方便。但这个习惯在高精度业务里很危险。我给你一个更实用的选型建议。
如果你是做国内自然资源、国土、规划、房产项目,数据来源是三调或地方测绘成果,优先使用CGCS2000三维高斯投影,具体选哪个带号,要看你项目覆盖范围的主要经度。判断办法很简单:在QGIS里加载数据后,用“缩放至图层”看数据范围,再根据范围中心经度选择匹配的3度带。
如果你是做全球尺度的生态环境分析、国际项目交流,原始数据常用WGS84或UTM,为保证和别人接得上,建议保留WGS84 + UTM分带,不做强制转换。只有在需要出图展示时,才动态切换到Web墨卡托。
如果你只是做一个在线地图浏览项目,准备接腾讯瓦片、OSM底图,那项目CRS直接设成EPSG:3857,数据也尽量重投影成3857,避免每个图层都触发动态转换,拖慢渲染性能。但要记住,公布在3857下的面积值,不是精确面积。
一个容易犯的错误是在一个工程里不分场景地混用多种坐标。比如矢量数据是3857,栅格数据是4326,导出Excel表时又用了WGS84度坐标,最后做统计表时对不上。建议每个项目开始前先口头约定一份“项目坐标系说明”,把投影、基准、单位、保留精度都说清楚,能省掉后面很多扯皮。
4.2 图层错位和坐标异常的排查顺序
坐标错位是最常见也最恼人的问题。我有一个比较固定的排查顺序,按这个顺序走,基本能找到病根。
第一步,先看图层当前的CRS。右键图层,属性->源,观察是不是“未知”或者跟你预期的坐标系不一致。如果显示“未知”,优先找原始资料确认坐标系,然后用“设置图层CRS”补上。
第二步,看图层范围。右键图层,“缩放至图层”。如果点的坐标值落在经纬度范围(比如经度106度、纬度29度)但项目CRS却是投影坐标系,图层会缩到非常小或跑到奇怪位置。如果坐标值本身就是百万级(比如X=5开头、Y=3开头),那大概率是高斯投影或UTM投影数据,这时候用经纬度底图去对照,错位也很正常。
第三步,区分“需要重投影”和“需要设置CRS”。如果数据实际的坐标值是正确的,只是QGIS不认识它,用“设置图层CRS”解决;如果数据本身是经纬度,你要的是投影坐标,用“导出要素另存为”重投影解决。这两者的操作方向不能搞反。
第四步,检查项目CRS。如果所有图层CRS都正确,但图层还是不在预期位置,很可能项目CRS被人改到了某个奇怪的坐标系。把项目CRS改成业务目标投影,看看是否恢复。
第五步,检查导出文件。如果你的shp在其他软件里错位,但QGIS里没问题,请打开shp目录里的.prj文件,确认它写的是哪个坐标系。很多情况下,不是QGIS导出错了,而是你在导出对话框CRS一栏里选错了目标。
4.3 常用EPSG代码速查表
对于高频场景,记几个EPSG代码可以大幅提高操作效率。这里是实际项目中我觉得最常用的几个,建议直接收藏。
| EPSG代码 | CRS名称 | 单位 | 典型用途 |
|---|---|---|---|
| 4326 | WGS 84 | 度 | GPS采集、全球底图原始数据、在线接口返回 |
| 4490 | CGCS2000 | 度 | 国内测绘成果的经纬度表示,三调成果常用 |
| 3857 | WGS 84 / Pseudo-Mercator | 米 | Web瓦片底图、在线地图服务、大屏展示 |
| 32650 | WGS 84 / UTM Zone 50N | 米 | 中国东部等经度范围的UTM投影 |
| 32651 | WGS 84 / UTM Zone 51N | 米 | 中国中西部等经度范围的UTM投影 |
| 示例自定义带 | CGCS2000 / Gauss-Kruger CM 120E | 米 | 国内3度带高斯投影,中央经线120E |
实际使用时,EPSG:32650的覆盖范围是东经117度到123度,大约对应中国东部多个省份区域,而32651覆盖东经123到129度之间。对于高斯投影,由于不同中央经线对应不同EPSG,很难用一个固定代码覆盖全国,所以需要根据项目区域选择。你可以在QGIS的CRS搜索框里直接输入“CGCS2000 3-degree Gauss-Kruger”,按中央经线筛选。
4.4 在线瓦片底图、三调符号库与投影的衔接
最近总有朋友问,QGIS里接入腾讯瓦片或者OSM底图之后,三调符号库加载不上怎么办。这里面的坑其实不在符号素材,而在投影协调。
在线瓦片底图全部基于EPSG:3857切片,所以只要加载这类底图,QGIS项目CRS一般会被自动切到3857。三调数据成果通常是CGCS2000高斯投影坐标,这时候图层会在QGIS里被动态重投影到3857,显示上是可以叠加的。但三调符号库在做符号渲染时,有些样式文件里定义了比例尺和投影环境,如果项目CRS与符号样式预期不一致,可能出图比例尺、文字大小等出现异常。
我的建议是:如果只是预览和检查,项目CRS用3857没关系,底图正常显示更重要。但如果要正式出图、出统计表、做精确量算,把项目CRS切换到三调数据本身的CGCS2000高斯投影,再把底图关掉或通过动态重投影叠加。千万不要直接把三调成果数据“另存为”3857后当作标准成果归档,这会破坏原始坐标信息,后续提交成果时很可能被退回。
还有一个细节是,三调符号库加载前,建议先将符号库文件路径中的中文路径去掉,部分版本会因为编码问题不识别。坐标系这块只要项目CRS与图层CRS协调好,符号库渲染就不会因为投影而错乱。
最后再分享一个我自己用出来的习惯:每次新建QGIS项目,第一件事就是打开“项目-属性-CRS”,把项目CRS固定成当前业务对应的投影坐标系,而不是依赖图层自动带出来的CRS。这样无论后续加载多少份数据,显示结果都稳定,测量工具也不会给出让人迷惑的结果。投影这东西,原理听起来枯燥,但实际干活时就是那几张表、几个EPSG代码。你先记住4326、3857、4490这三个代码,再结合手头数据多试几次,很快就能形成自己的判断。
