ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

QGIS自定义地方独立坐标系转换:从WKT参数到高斯投影实战

QGIS自定义地方独立坐标系转换:从WKT参数到高斯投影实战 1. 为什么地方独立坐标系转换总让人头疼在QGIS里做坐标系转换最常规的操作无非是Crs对话框里选一个现成的坐标系然后勾选重投影图层完事。但如果你和我一样手里拿到的数据是某个县城的地方独立坐标系成果或者设计院发过来的施工图用的是xx市2000坐标系——这时候打开坐标系选择器翻遍所有列表都找不到你想要的坐标系统。更麻烦的是软件提供的所有预设坐标系里没有哪个能直接对应你的地方参数于是如何把自定义参数填进去就成了一道必答题。这个需求在实际项目里非常高频。比如你手上有一批国土空间规划的CAD成果坐标系标注为XX县2010地方坐标系中央经线是当地经度还带了几百公里的加常数又比如测绘单位交付的土地勘测定界图用的是基于CGCS2000椭球、经过高斯投影但加了自定义东向偏移量的独立坐标系。想在QGIS里叠加天地图影像、加载其他部门的基础地理数据第一道门槛就是把坐标系统一到同一个基准面上。这里要先把一个容易混淆的概念拆清楚。QGIS里谈坐标系转换通常指两种场景一种是不同地理坐标系之间的转换比如WGS84和CGCS2000之间这种转换一般依赖七参数或网格改正模型另一种是地理坐标系到投影坐标系的转换即从经纬度坐标换算成平面坐标这是通过投影算法完成的。地方独立坐标系这件事通常是椭球定义和投影参数两方面的自定义叠加——有时候是椭球就不同典型的是基于克拉索夫斯基椭球或自定义椭球的地方坐标系有时候椭球用的是CGCS2000但投影中央经线、加常数完全自定义。搞清楚自己属于哪种后面填参数才不会乱。对于不熟悉基础测绘概念的读者我简单类比一下。坐标系就像一套全球快递地址系统WGS84相当于全球通用的街道门牌而地方独立坐标系相当于某个园区内部的编号。园区内部编号用起来方便但你出了园区想跟外界通信就必须知道园区在哪个城市、园区大门朝哪开——这就是转换参数要解决的事。QGIS允许填自定义参数本质上就是允许你手动告诉它这个园区在哪、每个编号对应哪个街道而不是依赖预设地址簿。从网络热词里也能看出来大家普遍关心没有自定义参数栏?这个问题。注意到这个问题的朋友其实不是找不到入口而是没找到正确的操作路径。QGIS确实没有像ArcGIS那样把自定义坐标系统放在一个显眼的独立按钮里而是把自定义能力藏在了坐标系选择器的自定义标签页中。这个交互设计让很多人绕了远路我见过不少人在设置菜单和插件库里来回找最后才发现入口就在眼前。下面我会把这个流程逐步拆开讲清楚。2. 坐标系转换的底层逻辑从椭球到投影的数学链条在做任何参数填写之前值得花点时间把坐标系转换的底层链条顺一遍。因为如果你不理解椭球、投影、加常数这些概念是怎么协作的那么即使我把参数界面填好的截图发给你换个参数你依然不会填。2.1 椭球是几何基础投影是摊平方式地理坐标系的核心是一个旋转椭球体地球表面上的点用经纬度表示时实际上是在这个椭球面上的坐标。WGS84有它自己的椭球参数CGCS2000也有自己的椭球参数两者的长短半轴有微小差异。地方独立坐标系如果基于自定义椭球那么定义它的关键参数就是长半轴a、扁率f或者扁率倒数。在QGIS自定义坐标系界面里这些参数会以WKTWell-Known Text格式呈现例如SPHEROID[Xian80,6378140.0,298.257]这一段的意思是这个椭球叫Xian80长半轴6378140米扁率倒数298.257。西安80坐标系用的就是这一组椭球参数。如果你的独立坐标系是基于北京54那椭球参数应该写成克拉索夫斯基参数SPHEROID[Krasovsky,6378245.0,298.3]对应1984克拉索夫斯基椭球。很多地方坐标系的地方之处恰恰就在这个椭球参数是自定义的——有的城市为了减小投影变形采用了经过优化调整的椭球参数。但多数情况下地方坐标系的地面控制网成果是基于国家坐标系的椭球重新平差得来的椭球参数仍沿用国家坐标系。2.2 高斯投影的三重自定义参数投影过程决定了椭球面上的经纬度如何换算成平面直角坐标。我国常用的投影方式是高斯基-克吕格投影即高斯-克吕格投影简称高斯投影。在一个标准的高斯投影定义里有几个关键参数会直接影响平面坐标的结果中央经线Central_Meridian投影带中心的那条经线所有平面坐标都以此为基准计算。中央经线选择不同同一地理位置的平面坐标可以差出去几百公里。坐标东偏移False_Easting为了避免中央经线以西出现负坐标通常会给Y坐标即东方向坐标加上一个常数一般取500000米但地方坐标系中这个偏移量可能是任意整数比如考虑到中央经线位置后取整或取特定值。坐标北偏移False_Northing同理给X坐标加上固定偏移。某些地方坐标系为保证区域内所有坐标为正会人为设定较大的北偏移量。比例因子Scale_Factor一般情况下取1.0。但在一些高精度工程独立坐标系中为了让投影变形均匀分布在测区内会设置一个接近1但不等于1的比例因子比如0.9999。这个参数如果没理解到位填错了整体坐标会按比例缩放而且是那种很难一眼看出来的错误。QGIS在处理坐标转换时底层对接的是PROJ库——这是全球GIS软件事实上的坐标引擎标准几乎所有主流GIS软件都调用它。PROJ支持非常灵活的坐标操作算子包括通过七参数转换基准面定义任意椭球定义任意投影参数等。QGIS的自定义坐标系界面其实就是把PROJ的能力做了一层封装。这也是为什么QGIS虽然交互设计朴素但坐标系方面功能上限极高——只有你填得对不对没有它算不出来的。2.3 地理坐标系转换基准面不同才需要七参数这里必须澄清一个高频误区。如果你手里数据是地方独立坐标系但它的平面成果是在CGCS2000椭球下通过独立投影参数算出来的那么转换到WGS84或CGCS2000经纬度其实不需要七参数只要确定投影参数反转回经纬度再从CGCS2000转换到WGS84即可——CGCS2000和WGS84之间的差异极小在某些精度要求下甚至可以近似忽略。但如果你手里的地方坐标系是基于北京54椭球的坐标成果而底图是WGS84那两套椭球基准面之间存在系统性差异就需要七参数来校正。七参数的获取通常靠已知点求解。也就是在两个坐标系下都有坐标的控制点用至少三个最好更多公共点解算平移、旋转、缩放参数。这类参数一般由测绘单位提供或者在测绘成果说明书中直接给出。QGIS里填自定义坐标系时WKT文本中会有这样一段TOWGS84[dx,dy,dz,rx,ry,rz,scale]这七个数字就是基准面转换参数。如果你的地方坐标系没有现成的七参数通常的做法是在控制网覆盖范围内找两个以上已知WGS84坐标的控制点用坐标差反算一个简单平移参数三参数模式或者用专业软件解算七参数。这个工作往往在转换之前就要完成是整套流程的前置条件。当你理解了这三层——椭球定义、投影定义、基准面转换参数——再回头看QGIS的自定义坐标系界面你会发现它其实一点都不神秘界面上每一行代码都对应上面某一个数学环节。把这些问题想清楚操作层面就只是对着抄的事了。3. QGIS中自定义坐标系的完整操作链路从上面的原理落实到软件操作我会一条路走到底把从零开始添加坐标系、应用转换、验证结果的完整步骤写出来。这里以最常见的基于CGCS2000、高斯投影、自定义中央经线与加常数的地方坐标系为例。如果你的情况是基于北京54或西安80椭球操作过程完全相同只是椭球参数段替换一下。3.1 第一步打开项目的坐标系设置与CRS选择器先把你的矢量数据加载到QGIS里无论是shapefile还是GeoPackage都可以。然后查看图层的当前坐标系方法是右键图层选择属性在源选项卡里看坐标参考系字段。如果图层本身没有定义坐标系QGIS会提示未知CRS你需要先正确指定它的原始坐标系否则后边的重投影无从谈起。正确指定后接下来是给目标坐标系做准备。在QGIS主界面右下角的状态栏里会显示当前项目的坐标系点击它可以打开项目属性对话框的坐标系选项卡。但如果你需要对某个具体图层做转换更直接的方式是右键图层选择导出、另存为然后在弹出的对话框中修改目标坐标系——这种方式的优点是可以同时设置输出文件的路径和格式一步到位得到转换后的新文件。不管从哪个入口进入最后都会到达同一个坐标参考系选择器对话框。这个对话框顶部有筛选框下面有几个过滤选项比如按名称、按ID过滤再有就是最近使用、以及最关键的自定义标签页。很多人在这一步犯迷糊搜索西安80能搜到一堆预设项搜索XX市2000却什么都搜不到于是便以为QGIS不支持地方坐标系。实际上你要做的正是从自定义这个标签页进去手动创建新坐标系。3.2 第二步在自定义标签页中编写WKT参数点击自定义标签页可以看到一个文本编辑区域、一个名称输入框以及保存按钮。QGIS支持在文本框中直接写入完整的WKT字符串。对于我们的场景最小可用的WKT大致如下以CGCS2000椭球、高斯投影六度带、中央经线120度为例假设已知七参数可忽略PROJCS[自定义_120E_6度带, GEOGCS[CGCS2000, DATUM[China_2000, SPHEROID[CGCS2000,6378137.0,298.257222101], AUTHORITY[EPSG,1043]], PRIMEM[Greenwich,0], UNIT[degree,0.0174532925199433]], PROJECTION[Transverse_Mercator], PARAMETER[latitude_of_origin,0], PARAMETER[central_meridian,120], PARAMETER[scale_factor,1], PARAMETER[false_easting,500000], PARAMETER[false_northing,0], UNIT[metre,1]]这个WKT的结构可以逐行拆开看PROJCS说明这是一个投影坐标系Projected Coordinate System。GEOGCS节点里定义了地理坐标系即椭球、基准面、角度单位。CGCS2000的椭球参数采用IAG GRS 1980椭球即长半轴6378137米。PROJECTION指明投影方式是Transverse_Mercator即高斯-克吕格投影横轴墨卡托投影。四个PARAMETER分别是起始纬度、中央经线、比例因子、东偏移、北偏移。如果地方坐标系有自定义比例因子把这行的1改成0.9999之类的值即可。UNIT定义坐标的单位为米。如果你手头的坐标系是基于西安80椭球的只需要把SPHEROID行替换为SPHEROID[Xian80,6378140.0,298.257]如果你需要填七参数则需要在GEOGCS层中加入一行TOWGS84[dx,dy,dz,rx,ry,rz,ds]把七个数值按实际参数替换进去。保存前务必检查数字单位和正负号这是最容易出错的地方。3.3 第三步保存坐标系并应用到图层转换在自定义标签页写好后在名称输入框起一个容易识别的名称比如XX县2000独立坐标系_CM120点击保存。此时这个自定义坐标系会出现在坐标参考系选择器的列表中名字一般带有USER:CRS前缀标识。以后每次打开QGIS这个自定义坐标系都会保留不需要重新编写——它就存在QGIS用户的CRS配置文件中。接下来回到图层转换这一步。右键需要转换的图层选择导出、另存为。在目标坐标参考系旁边点击选择按钮在坐标系选择器中切到自定义标签页或直接在搜索框输入USER:CRS就能看到你刚创建的坐标系选中它。设置输出格式比如GeoPackage或shapefile和输出路径点击确定。QGIS会立刻重投影并生成新文件。转换完成后把新文件加载到QGIS中和天地图或其他底图叠加理论上位置就会正确套合。如果偏差在合理范围内说明参数填写正确流程结束如果偏差很大就需要回到参数里找问题这一部分我放到后面专门讲。3.4 补充方案没有现成七参数时怎么办很多读者在实际操作中会遇到更棘手的情况——手上只有地方独立坐标系的平面成果但没有官方提供的七参数。这时可以做一个简便近似如果地方坐标系本身基于CGCS2000椭球、只是投影参数自定义那把它转回经纬度后再用CGCS2000加载底图不需要七参数也能套准到厘米级以内。这个方法在叠加天地图影像时尤其好用因为天地图本身就在CGCS2000基准下误差通常小于1米。如果地方坐标系基于北京54椭球而底图是WGS84或CGCS2000那就必须找到转换参数。一个比较可行的替代方案是先获取当地测绘部门发布的北京54转CGCS2000的转换参数这些在各省市的测绘地理信息成果服务平台上通常能找到区域性的转换模型或网格文件。QGIS也支持加载网格改正文件如NTv2格式在写入自定义WKT时通过EXTENSION节点或直接在转换设置里指定网格文件。不过这个操作相对进阶建议先在官方文档里确认格式支持情况。4. 转换结果验证与误差排查的实操心得参数填完、转换跑通其实只完成了70%的工作。剩下30%在于验证转换结果是否可靠以及出了误差时能不能定位到原因。我在多个项目里踩过的坑大多集中在这一环节所以这一部分的经验希望你能重视。4.1 用已知控制点建立标准答案最直接的验证方式是找到至少一个推荐两三个在地方独立坐标系下有精确坐标的控制点同时知道它在CGCS2000或WGS84下的经纬度坐标。这样的点在测绘成果报告里通常以控制点成果表的形式出现。实际操作中我会把这些点的两套坐标都记在记事本里转换完成后用QGIS的坐标捕捉工具点开转换后的图层对应位置对比坐标值和已知值是否一致。如果转换后平面坐标和已知值相差小于0.5米对于大比例尺叠加参考来说基本可接受如果相差超过1米甚至几十米优先检查WKT中的三个参数椭球是否选对、中央经线是否填错、加常数是否正确。这三个参数造成的误差都有明显特征——椭球选错会导致系统性偏移加轻微旋转中央经线填错时东西方向通常差数公里加常数写错整个图幅平移一个固定值。为了让你更好对比我把常见错误和表现形式的对应关系整理成一个表错误类型误差表现排查方向椭球参数写错整体偏移几米到几十米随位置变化核对椭球长短半轴数值中央经线偏1度平面坐标东西方向相差约几十公里重新对照测绘成果的中央经线记载东偏移写错全部点位统一平移固定距离检查false_easting数值是否等于成果上的加常数比例因子写错坐标值在离中央经线越远处偏差越大核对投影参数表中的比例因子定义七参数符号反了整体偏差几米到十几米方向规律复杂检查TOWGS84参数正负约定还有一种隐蔽的情况地方坐标系采用的是抵偿高程面设计即把椭球高程面抬高或降低来抵消高程归算引起的长度变形。这种情况下椭球参数需要做特殊调整通常是改变长半轴a或者通过自定义投影的偏移来实现。这种设计在水利工程和公路项目中比较常见如果确认项目采用了抵偿高程面方案WKT中的椭球长半轴就不再是标准值而是经过换算后的数值。这类参数直接找设计单位要最省事自己推算非常容易出错。4.2 套合底图验证的整体趋势在拿不到正式控制点成果表的场景下一个快速有效的验证方法是加载天地图卫星影像把转换后的矢量数据叠加上去目视检查地物轮廓是否与影像套合。如果整体轮廓一致、只在个别位置有米级偏移通常说明参数正确但缺少七参数校正如果整体被旋转、扭曲或者大范围偏移说明投影参数定义有硬伤。这里有个代表性场景某项目需要用历史勘测定界数据地方独立坐标系套合最新影像做变化检测。因为没有可用的公共点我先按标准CGCS2000中央经线参数转换结果影像和矢量整体套合良好但每个地块边缘都有约2-5米的系统性偏移方向全部朝同一方位。后来找到当地测绘部门发布的区域转换网格文件在QGIS的PROJ设置中挂载后偏移直接收敛到0.3米以内。所以如果条件允许优先去自然资源主管部门官网检索是否有区域网格转换文件远比自行摸索七参数靠谱。4.3 毫米级还是米级精度预期要合理最后想专门说一个容易被忽视的问题。QGIS自定义坐标系转换的精度上限取决于输入参数的精度。如果你的地方独立坐标系采用的是以GPS静态测量建立的控制网那么网内部精度可以达到厘米级但如果你只是从纸质图上数字化来的坐标那精度原本就是米级转换再精准也没有意义。在项目汇报中一定要根据数据源精度设置合理的转换结果精度预期避免在无意义的精度问题上反复折腾。实际操作中我还发现一个高性价比的习惯每次完成自定义坐标系创建后把WKT文本和来源说明写在一个小文件里放到项目目录的metadata文件夹中。几个月后重新打开这个项目你很可能想不起来这个坐标系当时是谁定义的、参数从哪里来的。留个备注能让你或者接手项目的同事少踩一次同一块石头。5. 自定义坐标系在使用中的两个高频场景扩展文章写到这里基本原理和主流程已经讲透了。但结合网络热词里QGIS加载天地图的搜索热度还有两个实际场景值得专门提一下它们本质上都是在自定义坐标系框架下的应用变体。5.1 地方独立坐标系图层叠加天地图影像天地图发布的WMTS服务默认是在CGCS2000地理坐标系下经纬度发布通过QGIS的XYZ Tiles或者天地图插件加载时项目的显示坐标系通常被设置成CGCS2000。如果你要叠加一份地方独立坐标系的矢量数据有两种做法。第一种做法最简单把地方独立坐标系矢量数据导出为CGCS2000坐标系的成果文件在导出时选目标坐标系为CGCS2000 / 经纬度或CGCS2000 / 高斯投影某带然后配上合适的投影。QGIS会自动做投影转换转换逻辑完全取决于你自定义WKT的正确性。第二种做法是在项目设置中直接把项目坐标系切换为地方独立坐标系同时加载天地图服务——QGIS会实时将天地图的经纬度瓦片重投影到项目坐标系下。这种做法适合全程都在地方坐标系里作业的场景但需要保证项目坐标系定义正确且包含基准面转换参数否则天地图影像和矢量数据之间可能出现错位。实际经验是如果只是用来出图、目视判读第一种做法更省心因为输出成果是标准坐标系交换给任何GIS平台都兼容如果需要在地方坐标系下持续采集和编辑数据第二种做法能避免每次编辑都在两个坐标系间来回换算对工作效率提升明显。两种方案没有绝对优劣取决于你的项目交付要求。5.2 坐标系定义缺失时的逆推思路还有一个常见痛点你收到的数据文件本身没有内嵌坐标系信息比如从CAD导出的DXF经常不带投影定义但文件头或者元数据里注明了本成果采用XX县2015独立坐标系中央经线117度Y坐标加常数500km。这种情况你不需要猜参数——先按标注参数在QGIS里把坐标系定义出来然后加载一个已知正确坐标系的参考图层比如天地图或已知范围数据通过目视套合微调参数。例如DXF数据中的某个村庄点位和天地图影像中的同名地物相距约两三公里你可以反推是不是中央经线填错了半度。具体做法是先按标注的117度中央经线定义坐标系并重投影量出目标点和实际位置的偏差距离根据高斯投影中经度偏差和平面距离的对应关系大约1度经差在纬度30度附近对应水平距离约96公里换算一下就能判断出是否存在整度或半度的中央经线偏差。这个方法虽然不能替代正式控制点验证但在数据应急处理时非常实用。6. 常见报错与兜底方案QGIS自定义坐标系操作中还有一类问题跟写代码报错类似——你填的参数不合法界面会弹提示或静默产生错误结果。这里整理几个高频现象和对应的兜底思路。6.1 无效的CRS定义提示如果WKT文本中有括号不匹配、参数名称拼写错误、或者漏了必要的逗号QGIS会直接拒绝保存并提示无效定义。遇到这种问题不要慌把WKT逐行检查一遍重点核对符号和单位。平时多加练习把几个常用模板保存在文本文件里不至于每次现写现错。如果你是从ArcGIS或其他软件复制WKT文本过来注意检查逗号是全角还是半角——全角逗号是QGIS最常见的外来文本错误源之一。6.2 转换完成但成果载入后显示空白这种情况通常不是因为坐标系没写对而是转换后数据的坐标值超出了合理范围比如出现百万级乃至十亿级的巨大坐标。如果坐标系定义时中央经线填成120度但实际数据是用其他中央经线计算的转换后所有点都会跑到非常远的位置。修复方法是回到原点先确认图层原始坐标系是否被正确声明再检查WKT参数和原数据的对应关系。还有一种可能是原始数据带有的椭球参数和WKT中的椭球参数差异巨大导致变换后坐标值溢出显示范围。建议在转换前先用一个点做测试避免整个数据集转换出错后再回头排查。6.3 检查QGIS版本差异QGIS 3.x系列各小版本之间坐标系选择的交互细节略有差异。比如3.10之前版本的自定义标签页为文本输入框3.16之后增加了坐标运算器的可视化配置界面通过动态CRS窗口操作3.28 LTR版本界面进一步优化。如果你参照的教程是基于旧版界面不一致是正常现象不要误以为功能被删除了。我习惯用QGIS 3.28 LTR长期支持版它的坐标系选择器中自定义标签页清晰稳定适合生产环境大量转换操作。7. 暂存一个实用模板库文章最后我把自己在工作流中沉淀的几组常用自定义WKT模板分享出来方便大家直接复制修改。注意这些模板里的中央经线和加常数只是示例务必替换为你项目的实际值。模板一基于CGCS2000椭球的任意中央经线高斯投影PROJCS[CGCS2000_3Degree_CM105, GEOGCS[CGCS2000, DATUM[China_2000, SPHEROID[CGCS2000,6378137.0,298.257222101]], PRIMEM[Greenwich,0], UNIT[degree,0.0174532925199433]], PROJECTION[Transverse_Mercator], PARAMETER[latitude_of_origin,0], PARAMETER[central_meridian,105], PARAMETER[scale_factor,1], PARAMETER[false_easting,500000], PARAMETER[false_northing,0], UNIT[metre,1]]模板二基于西安80椭球、自定义加常数的地方坐标系PROJCS[Xian80_CM117_FE500000, GEOGCS[Xian80, DATUM[Xian_1980, SPHEROID[Xian80,6378140.0,298.257]], PRIMEM[Greenwich,0], UNIT[degree,0.0174532925199433]], PROJECTION[Transverse_Mercator], PARAMETER[latitude_of_origin,0], PARAMETER[central_meridian,117], PARAMETER[scale_factor,1], PARAMETER[false_easting,500000], PARAMETER[false_northing,0], UNIT[metre,1]]模板三带七参数基准面转换的WKT示意PROJCS[CGCS2000_CM120_7PARA, GEOGCS[CGCS2000, DATUM[China_2000, SPHEROID[CGCS2000,6378137.0,298.257222101], TOWGS84[-2.2,1.8,-3.6,0.1,-0.2,0.3,1.5]], PRIMEM[Greenwich,0], UNIT[degree,0.0174532925199433]], PROJECTION[Transverse_Mercator], PARAMETER[latitude_of_origin,0], PARAMETER[central_meridian,120], PARAMETER[scale_factor,1], PARAMETER[false_easting,500000], PARAMETER[false_northing,0], UNIT[metre,1]]这三个模板覆盖了最常见的三类情况。模板三中的TOWGS84数值仅为演示格式切勿直接用于生产。根据我的个人经验真正要把地方独立坐标系转换这件事做利索重点不在软件操作本身而在前期把坐标系来源搞清楚。拿到一批数据先问三个问题它基于什么椭球采用什么投影参数有没有基准面转换参数答得上这三问QGIS里填自定义参数就是照着抄答不上来哪怕把界面玩出花结果也不会对。希望这篇文章能帮你把坐标系这层窗户纸捅破下次再遇见地方坐标系项目能底气十足地开干。
返回列表