
简介面向测绘、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到底是什么CGCS2000China 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°E3度带从1.5°E起算每3度一带带号25到45同样覆盖全国。国家基本比例尺地形图的相关规定是1:2.5万到1:50万一般用6度带1:1万和更大比例尺用3度带。实际工程项目里城市和厂区测量往往直接用3度带甚至自定义中央经线目的就是让测区尽量靠近中央经线减小投影变形。所以拿到一个项目先问清楚甲方要求的是几度带用的什么中央经线坐标是不是带带号。这一步问清楚了后面省一大半事。2.2 中央经线怎么算这个公式建议刻进脑子里。6度带中央经线 6 × 带号 - 33度带中央经线 3 × 带号。反过来知道经度也能估算带号6度带带号 向下取整(经度/6) 13度带带号 四舍五入(经度/3)。列一个我常用的对照表带号类型中央经线适用经度范围约206度带117°E114°E ~ 120°E393度带117°E115.5°E ~ 118.5°E216度带123°E120°E ~ 126°E413度带123°E121.5°E ~ 124.5°E同一个117°E中央经线6度带的带号是203度带的带号是39二者都能用但覆盖范围完全不同。如果选错带平面坐标不会报错但叠加到别的数据上就会错位甚至出现奇怪的旋转。另外投影变形大小和离中央经线的距离平方成正比中央经线附近几乎不变形到了带边缘每公里可能出现几厘米甚至十几厘米的误差。所以高精度项目里宁可老老实实选对应带号也不要偷懒用“全图统一一个中央经线”的野路子。3. prj和xml两种格式结构逐个拆3.1 prj文件WKT格式prj是纯文本文件用记事本就能打开里面存的是WKTWell-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_39False_Easting就变成39500000.0东向坐标是8位数前两位39就是带号。很多数据叠不上的问题根源就在这个参数上明明坐标带了带号却用了不带带号的定义文件或者反过来。Scale_Factor固定为1.0这是高斯-克吕格投影和UTM投影的一个明显区别——UTM的中央经线比例因子是0.9996两者不要混用。Latitude_Of_Origin一般填0表示投影原点纬度为零也就是从赤道开始向北计算纵坐标。3.3 xml文件的结构特点xml格式是ArcGIS导出坐标系定义时的一种序列化形式它把WKT和一组精度控制参数打包在一起。结构大致是这样的?xml version1.0 encodingUTF-8? ProjectedCoordinateSystem xsi:typetypens:ProjectedCoordinateSystem xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:xshttp://www.w3.org/2001/XMLSchema xmlns:typenshttp://www.esri.com/schemas/ArcGIS/10.1 WKTPROJCS[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 XYScale265660134.810606/XYScale ZOrigin-100000/ZOrigin ZScale10000/ZScale MOrigin-100000/MOrigin MScale10000/MScale XYTolerance0.001/XYTolerance ZTolerance0.001/ZTolerance MTolerance0.001/MTolerance HighPrecisiontrue/HighPrecision WKID4547/WKID LatestWKID4547/LatestWKID /ProjectedCoordinateSystemXOrigin、YOrigin、XYScale这些字段不是投影参数而是ArcGIS内部用于控制拓扑容差和存储精度的范围值正常编辑时不需要动它们。手写xml时容易在这些数值上出错所以我的建议是能用prj就用prj只有目标软件明确要求xml格式时才去构造它并且尽量从ArcGIS里导出而不是纯手工敲。4. 实操手写一套可用的CGCS2000坐标定义文件4.1 地理坐标的prjGCS如果数据本身是经纬度比如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 投影坐标的prj6度带和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里的精度参数。祝大家手里的数据都能乖乖叠在一起。本文还有配套的精品资源点击获取