简介:面向测绘、GIS与国土规划相关工作者的CGCS2000坐标系定义文件合集。CGCS2000是我国现行国家大地坐标系,基于WGS84椭球参数并兼顾中国地壳运动特征,配套资料聚焦地理坐标与高斯投影坐标两种表达方式,覆盖3度带与6度带的完整分带定义。压缩包共130个文件,含65个prj投影文件与65个xml元数据文件:prj便于ArcGIS、SuperMap等软件快速识别坐标系参数,xml则记录椭球、投影类型等结构化定义,两者互为补充,既满足主流平台直接引用,也便于二次开发与参数解读;整体仅70KB,轻量实用。目前已有6467人学习下载,是测绘与GIS学习者常用的参考包。文件按分带命名清爽,可直接导入主流平台,省去手动输入参数与查找带号的时间,既能支撑坐标转换、数据入库、制图出图等实际任务,也适合用来理解高斯投影分带与坐标基准统一的基本概念。 做GIS和测绘的朋友,应该都遇到过这种场景:甲方发来一批数据,打开一看坐标不是跑海里就是叠到一起,查图层的空间参考信息,发现要么没有定义,要么定义得模棱两可。查来查去,最后基本都会落到CGCS2000坐标系上。CGCS2000是国家目前统一采用的大地坐标系,不管是新采集的测绘成果,还是国土、规划、交通这些行业的数据,现在都要求向它对齐。但“统一到CGCS2000”这句话说起来简单,实操里牵扯的东西不少——地理坐标、投影坐标、3度带、6度带,还有prj和xml两种坐标系定义文件。这篇文章我就把这一整套东西掰开揉碎讲一遍,把我实际用到过的文件内容、各种坑和判断方法都放出来,做测绘、做GIS的,或者被各种数据折磨过的人,应该都用得上。
1. 先把概念理清楚:CGCS2000、地理坐标和投影坐标
1.1 CGCS2000到底是什么
CGCS2000(China Geodetic Coordinate System 2000)就是中国2000国家大地坐标系。它的参考椭球叫CGCS2000椭球,长半轴6378137米,扁率1/298.257222101,这几个数和WGS84椭球几乎一样,所以不少人直接把它当WGS84用。在小比例尺出图或者精度要求不高的场景下,这么干问题不大,但在高精度测量、变形监测、工程控制网这类场景里,两者之间的差异不能忽略。需要特别强调,CGCS2000和WGS84并不是同一个基准,坐标差值从几厘米到几米都可能出现,具体要看区域和框架历元,不能想当然地认为“值差不多就能直接互转”。
还有一个容易混淆的概念:CGCS2000是坐标系,1985国家高程基准是高程系统,二者解决的是“平面位置”和“高程”两个不同维度的问题。实际项目里经常说“CGCS2000坐标、1985高程”,意思是平面用前者,高程用后者,不要搞成二选一。
1.2 地理坐标和投影坐标怎么区分
地理坐标就是经纬度,单位是度,直接描述地球表面位置。投影坐标是把球面摊到平面上的结果,单位是米。拿到一份数据先别急着叠图,先看坐标列大概是几位:如果是121.23、30.11这种带小数点的,基本就是经纬度;如果是7位、8位甚至更大的整数,就是投影坐标。
这里要提醒一个容易翻车的点:很多人以为投影坐标系只是在地理坐标系上加一层投影参数,这个理解方向没错,但在文件结构上,投影坐标系的WKT里会完整嵌入地理坐标系。也就是说,一个投影坐标prj文件里能同时看到GEOGCS和PROJECTION两段,编辑时千万别把嵌套关系搞坏,否则软件很容易把文件识别成无效定义。
2. 3度带和6度带:中央经线这么算,带号这么选
2.1 分带逻辑和适用场景
高斯-克吕格投影为了控制长度变形,按经度把地球切成一条条6度或3度的带。6度带从零子午线开始,每6度一带,带号13到23覆盖了我国大部分区域(中央经线75°E到135°E);3度带从1.5°E起算,每3度一带,带号25到45,同样覆盖全国。
国家基本比例尺地形图的相关规定是:1:2.5万到1:50万一般用6度带,1:1万和更大比例尺用3度带。实际工程项目里,城市和厂区测量往往直接用3度带甚至自定义中央经线,目的就是让测区尽量靠近中央经线,减小投影变形。所以拿到一个项目先问清楚:甲方要求的是几度带,用的什么中央经线,坐标是不是带带号。这一步问清楚了,后面省一大半事。
2.2 中央经线怎么算
这个公式建议刻进脑子里。6度带:中央经线 = 6 × 带号 - 3;3度带:中央经线 = 3 × 带号。反过来,知道经度也能估算带号:6度带带号 = 向下取整(经度/6) + 1,3度带带号 = 四舍五入(经度/3)。
列一个我常用的对照表:
| 带号 | 类型 | 中央经线 | 适用经度范围(约) |
|---|---|---|---|
| 20 | 6度带 | 117°E | 114°E ~ 120°E |
| 39 | 3度带 | 117°E | 115.5°E ~ 118.5°E |
| 21 | 6度带 | 123°E | 120°E ~ 126°E |
| 41 | 3度带 | 123°E | 121.5°E ~ 124.5°E |
同一个117°E中央经线,6度带的带号是20,3度带的带号是39,二者都能用,但覆盖范围完全不同。如果选错带,平面坐标不会报错,但叠加到别的数据上就会错位甚至出现奇怪的旋转。另外,投影变形大小和离中央经线的距离平方成正比,中央经线附近几乎不变形,到了带边缘,每公里可能出现几厘米甚至十几厘米的误差。所以高精度项目里,宁可老老实实选对应带号,也不要偷懒用“全图统一一个中央经线”的野路子。
3. prj和xml两种格式,结构逐个拆
3.1 prj文件(WKT格式)
prj是纯文本文件,用记事本就能打开,里面存的是WKT(Well-Known Text)坐标系定义。ArcGIS里每个带空间参考的矢量数据旁边,基本都会放一个同名.prj文件,它就是数据的“坐标系身份证”。一个完整的CGCS2000投影坐标prj长这样:
PROJCS["CGCS2000_3_Degree_GK_CM_117E",GEOGCS["GCS_China_Geodetic_Coordinate_System_2000",DATUM["D_China_2000",SPHEROID["CGCS2000",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Gauss_Kruger"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",117.0],PARAMETER["Scale_Factor",1.0],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]看着一大串,其实拆开就几层。最外层PROJCS表示这是一个投影坐标系,里面的GEOGCS定义了地理坐标系,PROJECTION声明投影方式是Gauss_Kruger(高斯-克吕格),后面跟着一串PARAMETER投影参数,UNIT表示单位是米。
3.2 各字段含义和常见变体
在WKT的一堆字段里,最要紧的是False_Easting和Central_Meridian。
False_Easting是东偏移量,直接决定坐标值长什么样。用CGCS2000_3_Degree_GK_CM_117E这套定义时,False_Easting是500000.0,意味着东向坐标是6位数(不含带号);如果换成CGCS2000_3_Degree_GK_Zone_39,False_Easting就变成39500000.0,东向坐标是8位数,前两位39就是带号。很多数据叠不上的问题,根源就在这个参数上:明明坐标带了带号,却用了不带带号的定义文件,或者反过来。
Scale_Factor固定为1.0,这是高斯-克吕格投影和UTM投影的一个明显区别——UTM的中央经线比例因子是0.9996,两者不要混用。Latitude_Of_Origin一般填0,表示投影原点纬度为零,也就是从赤道开始向北计算纵坐标。
3.3 xml文件的结构特点
xml格式是ArcGIS导出坐标系定义时的一种序列化形式,它把WKT和一组精度控制参数打包在一起。结构大致是这样的:
<?xml version="1.0" encoding="UTF-8"?> <ProjectedCoordinateSystem xsi:type="typens:ProjectedCoordinateSystem" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:typens="http://www.esri.com/schemas/ArcGIS/10.1"> <WKT>PROJCS["CGCS2000_3_Degree_GK_CM_117E",GEOGCS["GCS_China_Geodetic_Coordinate_System_2000",DATUM["D_China_2000",SPHEROID["CGCS2000",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Gauss_Kruger"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",117.0],PARAMETER["Scale_Factor",1.0],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]</WKT> <XOrigin>-39973416.1312</XOrigin> <YOrigin>-39973416.1312</YOrigin> <XYScale>265660134.810606</XYScale> <ZOrigin>-100000</ZOrigin> <ZScale>10000</ZScale> <MOrigin>-100000</MOrigin> <MScale>10000</MScale> <XYTolerance>0.001</XYTolerance> <ZTolerance>0.001</ZTolerance> <MTolerance>0.001</MTolerance> <HighPrecision>true</HighPrecision> <WKID>4547</WKID> <LatestWKID>4547</LatestWKID> </ProjectedCoordinateSystem>XOrigin、YOrigin、XYScale这些字段不是投影参数,而是ArcGIS内部用于控制拓扑容差和存储精度的范围值,正常编辑时不需要动它们。手写xml时容易在这些数值上出错,所以我的建议是:能用prj就用prj,只有目标软件明确要求xml格式时才去构造它,并且尽量从ArcGIS里导出,而不是纯手工敲。
4. 实操:手写一套可用的CGCS2000坐标定义文件
4.1 地理坐标的prj(GCS)
如果数据本身是经纬度,比如GPS采集的原始csv要转shp,先给它定义地理坐标,再投影到平面。地理坐标的prj是最基础的一份:
GEOGCS["GCS_China_Geodetic_Coordinate_System_2000",DATUM["D_China_2000",SPHEROID["CGCS2000",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]这份文件的WKT不长,但完整表达了CGCS2000地理坐标系的所有要素:基准面、椭球、本初子午线、单位。实际使用中,如果这份prj和数据放在同一个目录且同名,ArcGIS会自动识别。
4.2 投影坐标的prj(6度带和3度带)
以中央经线117°E为例。6度带带号20的prj,坐标带带号形式(Y坐标8位):
PROJCS["CGCS2000_GK_Zone_20",GEOGCS["GCS_China_Geodetic_Coordinate_System_2000",DATUM["D_China_2000",SPHEROID["CGCS2000",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Gauss_Kruger"],PARAMETER["False_Easting",20500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",117.0],PARAMETER["Scale_Factor",1.0],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]3度带带号39的prj,同样中央经线117°E,坐标带带号形式:
PROJCS["CGCS2000_3_Degree_GK_Zone_39",GEOGCS["GCS_China_Geodetic_Coordinate_System_2000",DATUM["D_China_2000",SPHEROID["CGCS2000",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Gauss_Kruger"],PARAMETER["False_Easting",39500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",117.0],PARAMETER["Scale_Factor",1.0],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]不用带号、直接用中央经线命名的版本,就是把False_Easting改成500000.0,文件名改成CGCS2000_3_Degree_GK_CM_117E。需要其它带号时,先按2.2的公式算出中央经线,再按“带号×1000000 + 500000”算出False_Easting就行。
4.3 xml文件手写与导入导出的操作路径
xml文件可以直接用文本编辑器改,但有几个地方要特别注意。首先,文件头声明的encoding是UTF-8,保存时就必须用UTF-8编码,不能用记事本默认的ANSI,否则就会触发“Invalid XML”之类的解析错误。其次,XML标签区分大小写,ProjectedCoordinateSystem不能写成小写,标签必须闭合。手写xml时,最省事的做法是复制一份现成的,改WKT里的Central_Meridian和False_Easting即可,不要从头开始敲。
在ArcGIS里操作时,不需要手动建prj或xml。数据上右键,选择属性->源->空间参考,点“选择”可以找内置的CGCS2000各带定义;点“导入”可以直接读取已有的prj或xml文件。更规范的做法是用ArcToolbox里的“定义投影”工具,输入数据后选坐标系,可以导入文件,也可以直接粘贴WKT文本。在QGIS里,图层右键->图层属性->信息/源可以查看CRS;如果需要自定义,在设置->自定义CRS里粘贴WKT,起个名字就能长期使用。
5. 常见问题与排查技巧实录
5.1 xml文件浏览器打不开,是不是文件坏了
浏览器打开xml文件时,页面显示“This XML file does not appear to have any style information associated with the document...”或者“浏览器无法正确渲染这个XML文件,因为它缺少样式表(XSLT)关联”,这其实是浏览器在提示你:该XML没有绑定XSLT样式表。坐标系定义文件本来就不面向网页展示,出现这个提示完全正常,文件本身没有坏。
要看xml内容,用VS Code、Notepad++或者XML Notepad打开即可,不要再用浏览器验证一个不面向网页的xml。实际解析xml时,常见的报错还有两类:一类是编码问题,文件头声明UTF-8但实际是ANSI存盘;另一类是标签结构不闭合,改WKT时不小心删了尖括号。遇到这类问题,先看报错行号,再到对应行检查尖括号配对和大小写。
5.2 数据坐标偏了或叠不上,怎么快速判断
先看Y坐标位数。坐标值是6位数(比如500000),说明没有带带号,用CM命名的prj;是8位数(比如39500000),说明带了带号,用Zone命名的prj。如果数据明明应该在项目范围内,却整体偏到几百公里之外,十有八九是把带号当非带号,或者反过来。
另外,注意区分WGS84和CGCS2000。如果数据本身是WGS84经纬度,却定义了CGCS2000投影坐标,可能会产生几米到几十米的偏移,小比例尺下看不出来,但大比例尺底图上一对比就露馅。快速判断方法:在ArcGIS里把图层坐标系临时切到WGS84,如果经纬度显示在正确范围,说明数据坐标本身没问题,是定义选错了。
5.3 中央经线选错长了什么样
投影坐标系里Central_Meridian填错,数据不会报错,但会和底图呈一个角度旋转错位,而且越远离中央经线越明显。常见错误是把117度写成117.5度,或者把3度带和6度带的定义文件弄混。分辨方法很简单:因为3度带和6度带覆盖范围不同,如果图斑在某些区域对得上、某些区域对不上,并且有旋转趋势,优先怀疑中央经线或带号错了。
我在工作中习惯把每个项目的带号直接写进prj文件名,例如CGCS2000_3GK_Zone39_117E.prj,这样分发数据、归档和复核都省事。文件名一定要自解释,避免三个月后自己都认不出这是哪个带。
5.4 prj文件保存时的编码和命名细节
prj文件是纯文本,理论上有记事本就能编辑。不过我发现,某些CAD插件或旧版GIS软件对带BOM的UTF-8识别不好,建议统一保存为UTF-8无BOM格式。文件名不要带空格,不要带中文,尽量用字母、数字和下划线。xml也是同样的要求,命名空间、标签闭合、大小写都不能含糊。
另外,prj文件命名要能自解释。我的习惯是把“CGCS2000”、“3Degree或6Degree”、“Zone或CM”、“中央经线”四要素都写进文件名,比如:
CGCS2000_3GK_CM_117E.prj CGCS2000_6GK_Zone20.prj这样在使用时,哪怕不看文件内容,从文件名也能判断是几度带、哪个带、坐标是否带带号,能少走很多弯路。
这几年和CGCS2000打交道踩过不少坑,最大的体会是:坐标系规范本身不复杂,复杂的永远是数据来源和人的习惯。拿到数据第一件事不是急着投影,而是先问清楚原始数据是什么坐标系、用的几度带、坐标是否带带号,然后再套对应的定义文件。最后再分享一个小技巧:如果你经常要在不同软件之间拷贝坐标系定义,prj的通用性远好于xml,能导prj就导prj;遇到必须提供xml的对接方,再用ArcGIS的导出功能生成,不要手搓xml里的精度参数。祝大家手里的数据都能乖乖叠在一起。
本文还有配套的精品资源,点击获取