做ArcGIS实验做到坐标系这一章,很多人会突然觉得脑子不够用。数据加载进去显示不出来,两个图层明明看着是同一片区域却隔着十万八千里,算面积算出来跟实际差了几个数量级,这些问题几乎都绕不开坐标系。这次实验六的名字就叫"ArcGIS坐标系总结",听起来像是个收尾总结,实际上它是把前面所有实验里"隐含"的那条线单独拎出来摊开讲。我的感受是,坐标系这关过不了,后面的缓冲区分析、叠加分析、栅格计算全都站不住脚,因为你所有的操作对象如果不在同一个"空间参照"下,算出来的东西就是无源之水。
这篇内容我会按自己在实验里实际操作的顺序来讲,先解释坐标系到底在解决什么问题,再把常见坐标系摆在一起比较,接着把ArcGIS里查看、定义、转换的核心操作一步步走通,最后集中说几个最容易翻车的坑和排查思路。不管你是第一次做这个实验的同学,还是工作中被坐标系搞到怀疑人生的从业者,跟着这篇把逻辑理一遍,很多问题当场就能看明白。
1. 坐标系到底解决什么问题:先想明白再动手
1.1 地理坐标系:用经纬度描述位置的规则
地理坐标系(Geographic Coordinate System,GCS)用经纬度来表达一个点在地球表面的位置。经纬度本身是角度单位,经度从本初子午线往东往西各0到180度,纬度从赤道往南北各0到90度。这套系统看起来简单,但它有一个隐含问题:地球并不是一个规则的球体,而是一个赤道鼓起、两极稍扁的椭球体,你要描述"某个点在哪里",必须先规定"你把这颗星球当成什么形状"。
这就引出了椭球体和基准面的概念。椭球体(Ellipsoid/Spheroid)是一个用长半轴和扁率定义的数学模型,用来近似地球形状;基准面(Datum)则在椭球体的基础上,规定了椭球中心、旋转轴方向以及和大地水准面之间的拟合关系。也就是说,同样的经纬度坐标,放在不同的基准面下,对应的物理位置是不同的。举个日常能感受的例子:同一个经纬度值,在WGS84基准面下和在西安80基准面下,实际位置可能相差几十米甚至上百米。这个差异在电子地图上看不出来,但一到了需要精确边界、地籍测量、工程放线的场景,就是天壤之别。
做实验的时候,很多同学看到图层属性里写着一串类似"GCS_WGS_1984"的字符,就以为坐标系都一样,这恰恰是后面所有混乱的起点。地理坐标系只是第一层:它告诉你用什么经纬度规则,但还没有解决"怎么把地球表面画到平面上"的问题。
1.2 投影坐标系:为了让平面计算有意义
投影坐标系(Projected Coordinate System,PCS)是在地理坐标系的基础上,通过某种数学变换,把椭球面上的经纬度换算成平面上的X、Y坐标。为什么要多此一举?因为计算机绘图、测量面积、计算距离、做拓扑分析,都必须在平面直角坐标系下才能快速又合理地进行。你在球面上量两点之间的距离要用大圆公式,但把这一片区域投影到平面之后,直接用勾股定理就能算了,效率完全不同。
常见投影方式包括高斯-克吕格投影(Gauss-Kruger)、横轴墨卡托投影(UTM)、墨卡托投影、兰伯特等角圆锥投影、阿尔伯斯等积圆锥投影等等。每种投影都有自己的"取舍":有的保证角度不变(等角),有的保证面积不变(等积),有的在某个方向上距离变形最小。没有任何一种投影能同时保持角度、面积、距离全部不变,这是数学上已经被证明的结论。所以选择哪种投影坐标系,本质上取决于你要拿数据做什么。
投影坐标系在ArcGIS里通常写作"某某投影坐标系_基于某地理坐标系"的形式,比如"WGS_1984_UTM_Zone_50N",含义就是:底下的地理基准是WGS84,投影方式是UTM第50带,这个坐标系属于北半球。看到这种名字,你能立刻读出三件事:基准面是什么、投影方式是什么、适用于哪个区域。
1.3 椭球体、基准面和坐标系:三层概念别混为一谈
我在实验里给学生讲的时候,喜欢把这三层比作"做衣服"的过程。椭球体是先画一个人的标准体型底模,基准面是把底模往真人身上套、调整到某个地区最合身的那一次"裁剪",坐标系则是最终用尺子量出来的一套标注规则。GCS里面包含了基准面和角度单位,PCS里面包含了GCS、投影方法、线性单位和一堆投影参数。数据属性里那一长串名称,其实已经把这三层信息都压缩进去了。
这三个概念一旦混淆,就会出现下面这些常见错误:有人把"北京54"和"西安80"当成两种投影方式,其实它们是两套不同基准面下的地理坐标系统;有人觉得WGS84只是经纬度坐标系,忽略了它也有对应的UTM投影坐标系;还有人一看到"投影"两个字就以为必须把数据转成平面,结果把本来已经是投影坐标系的图层又强行投影了一遍,数值全乱。
搞清楚这三层的关系之后,ArcGIS里的很多操作逻辑就变得非常顺理成章:定义投影是在告诉软件"这套数据用的是哪套底模和尺子",投影转换是把一套标注规则换算成另一套标注规则的过程。接下来我们看看具体有哪些坐标系可选。
2. 常用坐标系选型:不同场景下的正确选择
2.1 全球层面的 WGS84 与 UTM
WGS84全称World Geodetic System 1984,是全球定位系统(GPS)直接采用的地理坐标系,也是目前国际上应用最广泛、被互联网地图和导航设备默认采用的标准。它的椭球参数是长半轴6378137米,扁率倒数298.257223563。大多数手持GPS设备导出的坐标,默认都是WGS84经纬度。
UTM(Universal Transverse Mercator)投影则是建立在WGS84等基准之上的常用投影体系,它把全球从西经180度开始按每6度一带来划分,共60带,每带中央经线采用比例因子0.9996来减小边缘变形,北半球还有500000米的假东偏移。在ArcGIS里新建要素类的时候,只要选择WGS84地理坐标系或对应的UTM投影带,全球通用的数据基本都能对接上。
这里有一个实操细节值得记下来:如果数据范围是跨带的大尺度区域,比如跨越好几个UTM带,就不建议硬套某个单带投影,而要考虑使用适合大范围的投影方式,或者干脆保留经纬度进行分析。UTM每一带在中央经线附近变形很小,但到了带的边缘,距离变形可能达到千分之一左右,对精度有要求的分析就得小心了。
2.2 国内数据常见的北京54、西安80和CGCS2000
国内数据接触最多的坐标系有三个关键词:北京54、西安80、CGCS2000。
北京54坐标系采用克拉索夫斯基椭球,长半轴6378245米,扁率倒数298.3,始建于上世纪五十年代,是一套参心坐标系(椭球中心与地心不重合)。西安80坐标系采用IAG75椭球,长半轴6378140米,扁率倒数298.257,同样属于参心坐标系,但是椭球定位更符合我国大陆的实际情况。CGCS2000(2000国家大地坐标系)则是地心坐标系,椭球长半轴6378137米,扁率倒数298.257222101,从全国范围看,它和WGS84的差异通常很小,大部分情况下可以忽略,但在高精度应用里仍要按实际需求处理。
从实验和实际工作的角度,我最常给出的建议是:手头的数据若涉及历史图件,先确认它是哪一套基准面,再谈后续分析;新采集的数据尽可能统一到CGCS2000,因为它和GPS/WGS84的兼容性最好;如果在混用北京54和西安80的数据,必须明确做基准面转换,不能直接把坐标数值当成同一套体系来用。北京54和WGS84之间的平面位置差异在中低纬度地区普遍有几十米到上百米,不做转换直接叠加,边界错位一眼就能看出来。
2.3 互联网底图数据里的坐标系偏移现象
第三个需要了解的现实问题是,互联网地图和卫星影像的坐标系并不总是直接对标WGS84。很多商用在线底图由于自身服务策略的原因,会采用经过偏移处理的标准,这导致你在ArcGIS里看到的影像内容,和它标注的坐标系名称之间并不严格对应。具体表现为:把野外采集的GPS点加载到ArcGIS里,叠加在线影像,发现点全部偏到马路对面甚至几百米外。很多同学第一反应是投影搞错了,实际上可能是底图数据的坐标偏移问题。
做实验的时候,我建议尽量使用不依赖在线图源的数据,或者使用带有明确坐标系元数据、并且和原始数据坐标系一致的本地数据,这样能少踩很多莫名其妙的坑。如果实验内容确实需要影像底图,可以把在线底图只当作"参考背景",而不作为精确分析的对象,一切定量计算都用本地矢量数据完成。
3. 实验六的核心操作:查看坐标系、定义投影、坐标转换
3.1 如何快速判断一个图层当前处于什么坐标系
在ArcGIS里查看一个数据的坐标系,方法很简单:右键图层打开"属性"(Properties),切到"源"(Source)选项卡,就能看到完整的坐标系描述。如果是矢量要素类,坐标系信息还会写明线性单位是什么、投影参数有哪些;如果是栅格数据,除了坐标系还会显示像元大小和范围。
我比较常用的是把要素类和栅格都拖进地图,然后到"图层属性→源"里核对三样东西:第一,底下的地理坐标系名称;第二,如果是投影坐标系,投影方法和中央经线、比例因子等参数;第三,单位是不是米。光是"单位"一条,就能筛掉很多问题。比如数据源的线性单位如果显示为"Degree"而你在算面积时却期望得到平方米,结果肯定会差很远。
ArcCatalog里同样可以看到这些信息,而且ArcCatalog更适合批量查看多个数据集的坐标系状况,一边是列表模式,一边在"预览"里看坐标范围。实验里如果给你一批数据让你判断坐标系,最快的办法就是用ArcCatalog或属性面板挨个看,把坐标系名称、基准面、投影类型记录下来,整理成一个小表格。这个表格会成为你后面所有操作的出发点。
3.2 "定义投影"和"投影"的区别:一个改标签,一个做变换
这一步是整个实验里最容易混淆的地方。ArcToolbox里有两个名字极像的工具:一个叫"定义投影"(Define Projection),在"数据管理工具→投影和变换"下;另一个叫"投影"(Project),也在同一个工具集下。它们的区别是本质性的:定义投影只是给数据"贴一个正确的坐标系标签",并不改变数据里任何坐标数值;投影则是把坐标值从一套坐标系真正换算到另一套坐标系,坐标数值会发生变化。
什么时候用定义投影?最常见的情形是:你拿到一份数据,形状位置都对,但它缺少坐标系信息(属性里显示"未知"或"No Spatial Reference"),同时你确定它实际对应哪个坐标系,这时用定义投影把它标回去。另一种情形是数据本身有坐标系信息,但写错了,需要在确认无误的前提下把它改回来。
什么时候用投影(Project)?当你有两套不同坐标系的数据要叠加分析,并且它们是同一物理区域但基准面不同,或者基准面相同但投影方式不同时,就需要用投影工具把其中一个转换到另一个的坐标系下。记住一个判断口诀:坐标值没变只是标签错了→定义投影;坐标值需要换算→投影。把这两个工具搞反,是所有坐标系实验事故中最常见的一种,没有之一。
3.3 矢量数据投影转换的完整操作流程
矢量数据的投影转换,标准操作是用工具箱里的Project工具。具体流程是:打开ArcToolbox→数据管理工具→投影和变换→要素→投影,然后在对话框里选择输入要素,再点输出坐标系旁边的图标选择一个目标坐标系,或者浏览现有数据来直接"导入"它的坐标系。如果两个坐标系属于不同基准面,对话框里会要求选择地理变换方法和参数;如果是相同基准面下的不同投影,则不需要地理变换,直接可以完成换算。
这里要说一下地理变换参数。从WGS84转到CGCS2000,很多情况下可以不选变换或者使用简化参数;但从北京54转到WGS84,或者西安80转到CGCS2000,就必须提供合适的变换方法,比如三参数、七参数、区域拟合等多种方法。参数从哪里来?对于实验教学,通常由老师直接给出一套参数;对于实际生产项目,一般由测绘部门提供覆盖该区域的转换参数。拿不到准确参数却强行转换,结果比不转换还糟,这一点务必记清楚。
做完转换之后,数据会生成一个新的要素类。我建议用"源"选项卡核对一遍新数据的坐标系名称,再用"测量"工具在图上量一段已知距离来验证。如果转换前和转换后测出来的距离差不多,说明整个流程是对的;如果量出来差了一倍或者单位不对,多半是目标坐标系选成了经纬度,或者线性单位没设置对。
3.4 栅格数据的投影转换与重采样
栅格数据和矢量不太一样,因为投影转换会改变像元的位置和形状,必须配合重采样方法才能生成新栅格。ArcGIS里的工具叫做"栅格投影"(Project Raster),在"数据管理工具→投影和变换→栅格"下。界面里除了输入栅格和目标坐标系之外,还会要求选择重采样技术,常见的有最邻近(Nearest Neighbor)、双线性(Bilinear)、三次卷积(Cubic Convolution)三种。
我的经验是,分类数据(如土地利用类型、植被分类)用最邻近,因为它不会在像元之间插值出新的类别值,能保持类别完整;连续型数据(如高程、气温、降雨量)用双线性或三次卷积,得到的表面更平滑。还有一个细节:栅格重投影之后,输出像元大小可能发生变化,需要手动设定目标像元大小,否则ArcGIS会按默认方式算出一个新值,不同软件之间的默认逻辑还不太一样。
投影转换后的栅格还会遇到一个现象:数据范围会比原来大一圈,因为栅格旋转后边缘会出现空白像元,这些像元会被赋予NoData值。在后面的分析中,如果这些空白区域影响到了统计结果,可以考虑先裁剪再分析,或者把范围设置得更紧。这些细节在实验报告里写清楚,是加分项。
3.5 动态投影的坑:看起来对了不等于真的对了
ArcGIS默认开启"动态投影"(On-the-fly Projection),也就是在地图上显示数据时,软件会临时把不同坐标系的数据统一重投影到当前数据框的坐标系下,让你能够叠在一起看。这个功能非常方便,但也带来一个很大的认知陷阱:动态投影只是"显示层面"的转换,它并不改变数据本身的坐标系和坐标值。
做过实验的同学应该见过这种场景:加载不同来源的两份数据,数据框坐标系是WGS84,软件自动把两份数据都动态投影到WGS84经纬度下显示,看起来位置也大致对。于是很多同学就以为"数据已经转换好了",实际上原始数据还是它们各自原来的坐标系,如果直接对它们做空间分析、算面积、量距离,软件会在后台临时重投影,但结果未必符合你的预期。
我一直强调的做法是:在正式分析之前,先把所有参与分析的图层统一到同一个投影坐标系下,并另存为新的数据,确保底层数据真的是同一套坐标系。怎么判断底层数据是否已经统一?右键每个图层看"源"选项卡里写的是什么坐标系,只要两个图层的坐标系描述不完全一致,就别急着开分析工具。动态投影适合快速看图,不适合作为分析依据,这条要刻在脑子里。
4. 实验中最常翻车的场景与完整排查链路
4.1 两个图层明明都是WGS84却对不上位置
这是我在实验里遇到频率最高的问题。一份要素类显示坐标系是WGS84,另一份影像坐标系也是WGS84,但叠加之后点跑到影像边缘,完全对不上。这时候很多人第一反应是"软件坏了",其实大多数情况跟软件无关。
你仔细看两个数据的坐标系,发现一个是"GCS_WGS_1984",另一个是"WGS_1984_Web_Mercator",虽然都带WGS84字样,但前者是地理坐标系(经纬度),后者是投影坐标系(以米为单位的Web墨卡托)。由于Web墨卡托把全球纬度限制在约±85.06度,且经过特殊的球面墨卡托模型处理,坐标数值和真实经纬度有系统性的差异,所以直接叠加必然错位。只要把其中一个数据转换到和另一个一致的坐标系,或者把数据框坐标系设置成一个通用的投影坐标系并让两者都动态投影,问题立刻就能解决。
另一个隐藏原因是基准面虽然同名,但描述文本不同。比如有的数据写"GCS_WGS_1984",有的写成"D_WGS_1984",这通常是同一回事;但如果一个是"GCS_Beijing_1954"却被人为改名为"GCS_WGS_1984"(用定义投影随便改的),那么就算名字一样,实地的位置也不会对齐。这种情况下你得回到数据源确认真实基准,而不是相信标签。
4.2 面积、距离计算结果离谱
实验里经常要做面积统计。某个区域用某种坐标系算出来面积是几千平方千米,换个坐标系算出来变成几十万而且单位变成"平方度"之类的怪东西,这就是目标坐标系选成了经纬度,或者干脆在数据框是地理坐标系的情况下直接用几何计算面积。ArcGIS里如果数据框是GCS(经纬度),几何面积工具返回的单位就不是平方米,而是平方度,数值自然千奇百怪。
解决思路很清晰:分析之前把数据转换到合适的投影坐标系。投影选择上,如果分析区域是全国范围的,用兰伯特等积圆锥或阿尔伯斯等积投影比较合适,因为它们保证面积不变;如果分析区域是某个省或地市,用高斯-克吕格3度带或6度带都可以,但要注意选择离区域最近的中央经线。高斯-克吕格投影不是等积投影,它的面积变形在离中央经线远的地方会变大,跨带分析时误差可能比较明显。
我还见过一个有趣的案例:A同学用高斯-克吕格投影算面积,结果发现比真实值大了将近1%,查了很久才发现是选错了投影带——数据本身落在21带,他却选了23带的坐标系定义,中央经线差了6度,变形值完全不同。所以做面积之前,先查一下数据落在哪个带、对应哪条中央经线,非常有必要。
4.3 数据完全没有坐标系信息
第三种高频翻车场景:拿到的矢量数据在ArcGIS里显示"未知坐标系"(Spatial Reference: Unknown),加载时软件还会给出一个警告,提示缺少空间参考信息。很多同学顺手点了"确定",然后开始在未知坐标系的地图上做分析,最后得到的结果完全没法解释。正确做法是先停下来,搞清楚这份数据本来的坐标系是什么。
判断依据一般有三个来源:第一,数据来源方提供的元数据说明;第二,同类数据的默认坐标系(比如某单位以前的图纸都是西安80);第三,数据自身的坐标范围和单位。比如一个数据的范围X大约是500000到540000,Y大约是3300000到3400000,而且看起来单位是米,大致能推断它可能是某投影带下的高斯-克吕格坐标;如果X范围是100到120、Y范围是20到40,那八成是经纬度。推断出坐标系之后,用"定义投影"工具把它标回去,再加载到地图里和已知地物核对,如果吻合就说明判断正确。
要注意的是,"定义投影"一旦执行,数据的XYZ坐标值本身不会变,它只是给这份数据补上了坐标系标签。如果标签补错了,后面所有的转换都会基于一个错误前提,所以定义投影前最好备份原始数据,并且把推断依据写进实验报告里。
5. 一次完整的实验六实操记录
5.1 实验数据准备
为了把前面的理论串起来,我在这里模拟一份实验六的典型数据组合:一份某市中海拔区域的边界矢量数据(用北京54/高斯-克吕格6度带表示,单位米),一份同区域的遥感影像(用WGS84/UTM投影表示),一批野外采集的GPS点(WGS84经纬度)。实验目标是把三份数据统一到同一个坐标系下,完成面积统计和距离测量。
我把数据命名为模拟项目X的boundary、image、gps_points三个图层。注意,如果你在真实环境里遇到类似数据,先不要急着动手,第一步永远是把三份数据的原始坐标系信息截图存下来,这是实验报告最重要的依据之一。
5.2 分步实验操作记录
第一步,用ArcCatalog或属性面板查看三份数据的坐标系描述,分别记录如下:boundary是Beijing_1954_GK_Zone_21N(北京54基准面、高斯-克吕格21带、北半球);image是WGS_1984_UTM_Zone_50N(WGS84基准面、UTM50带);gps_points是GCS_WGS_1984(WGS84地理坐标系、经纬度)。
第二步,因为gps_points是经纬度,其余两份数据是投影坐标,如果直接把三份数据加进来叠加,靠动态投影虽然能显示,但统一性不足。所以我把boundary作为基准数据,先把它设置成数据框的坐标系,然后把image和gps_points分别转换到boundary的坐标系上。这一步我用Project工具完成:对gps_points定义目标坐标系Beijing_1954_GK_Zone_21N,由于基准面从WGS84变成北京54,需要指定地理变换方法,这里按教学数据给出的区域三参数进行变换。对image,我在输入栅格和目标坐标系之间选择相同的三参数变换,同时把重采样设为双线性,像元大小保持与原始影像一致。
第三步,投影转换完成后,把三份转换后的数据统一加载进地图。在"图层属性→源"里确认三者坐标系完全一致,然后叠加检查:GPS点应当落在边界内,影像底图应该和boundary边界重合,边缘没有大的错位。如果出现超过一两个像元的系统性偏移,就要回头检查地理变换参数是否选择正确。
第四步,在统一坐标系下做两个验证实验:一是用几何计算工具统计boundary的面积,二是用测量工具量取两个GPS点间的距离。将结果与按原始数据分别计算的结果做对比,验证投影转换是否影响了数值。如果面积结果出现异常,检查数据框坐标系是否是投影坐标系,而不是经纬度。这四步做完,实验六的核心内容就基本完整了。整套操作的核心其实只有一句话:先确认数据各自是什么坐标系,再统一目标坐标系,最后在统一坐标系下做分析和验证。
5.3 结果对比与常见偏差速查表
为了写报告方便,我把实验里常见的对比结果整理成一个表格,方便你对照自己的输出结果判断问题出在哪一步。下表列出的是在相同区域、不同坐标系/不同操作下,面积和距离计算结果的典型差异方向:
| 场景 | 计算工具条件 | 结果表现 | 原因 |
|---|---|---|---|
| 数据框为WGS84经纬度 | 直接算面积 | 得到"平方度",数量级异常 | 单位不是米,不能在球面经纬度下直接算平面面积 |
| 数据框为北京54高斯投影 | 投影前计算 | 面积正确 | 单位米,且投影带匹配区域 |
| 数据框投影带选错 | 选成相邻带 | 面积偏大或偏小约0.1%-1% | 高斯-克吕格离中央经线越远变形越大 |
| 北京54数据直接命名WGS84 | 不转换硬叠加 | 位置偏移几十米以上 | 基准面不同,需地理变换参数 |
| 栅格重投影用最邻近 | 对分类数据 | 类别保持,边缘有锯齿 | 重采样不插值 |
| 栅格重投影用三次卷积 | 对高程数据 | 表面平滑,可能改变极值 | 插值产生中间值 |
这张表我建议原样贴进实验报告,再配合每一行的截图说明,基本能一眼看出你确实理解了坐标系的核心逻辑。如果你在实际操作中得到了表中没列出的异常结果,最值得优先检查的两件事是:数据框的坐标系是不是投影坐标系,以及参与分析的数据是否真的已经被转换到了同一坐标系。
6. 做完实验想补充的三点经验
第一个经验是,坐标系实验不像其他实验那样有固定唯一的"标准答案",它更考验你"能不能判断自己当前看到的结果是否合理"。每次操作完,我都习惯给自己提三个问题:单位对不对?范围是不是变了?和已知的参照物对不对得上?三个问题都通过,才敢说转换成功。这三个问题看似简单,但绝大多数坐标系事故,最后都能回溯到其中某一个没答上来。
第二个经验是,养成随手记录坐标系信息的习惯。拿到任何一份数据,先把坐标系描述复制到实验文档里,最好连投影参数也存下来。这个习惯在实验阶段看起来有点多余,等到了做多源数据融合或者处理测绘成果时,你会发现它帮你省下大把排查时间。很多时候,问题不是转换算法不懂,而是从一开始就没人知道某份数据的坐标系到底是谁定义的,元数据缺失是比任何工具错误都要棘手的难题。
第三个经验是,多利用ArcGIS自带的工具文档来学习,而不是死记硬背工具名。把鼠标悬停在一个工具上,看它对参数的解释,尤其是"输入"和"输出"的单位说明,很多困惑其实文档里早就写明白了。坐标系这个主题初学觉得绕,主要是因为概念有嵌套关系,但只要把椭球体、基准面、地理坐标系、投影坐标系这四层在脑子里理顺,配合一次完整的实验操作,之后再遇到更复杂的投影问题,都不过是换个区域、换套参数重复同样流程而已。