1. 坐标系选不对,后面全白费:先搞懂两类坐标系的本质差别
用ArcGIS做项目,十有八九的第一道坎都卡在坐标系上。要么是图层套上去位置对不上,要么是量出来的面积总觉得不对,再要么是导出数据到别的软件里整个图形漂移得离谱。这些问题说到底,基本都是地理坐标系和投影坐标系没分清楚。
先说最朴素的理解方式。地理坐标系描述的是一颗球,投影坐标系描述的是一张纸。地球是一个近似椭球的不规则球体,我们在上面用经度、纬度来定位任何一点,这就是地理坐标系的底层逻辑。经纬度这东西本质上是一个角度量,单位是度,不是长度。而投影坐标系,是把球面上的经纬度通过某种数学规则展开到平面上,让位置可以用米、千米这些长度单位来描述,这样我们才能量距离、算面积、画正方形。
你可能会问,为什么不能直接用经纬度干活?答案是,角度量没法直接做几何计算。你想算两个点之间有多远,如果输入的是经纬度,算出来的结果单位会非常尴尬,不是度就是弧度,或者需要经过复杂的球面三角公式才能换算出真实距离。这在实际操作中太别扭了。所以方里网的测绘数据、国土调查数据、规划用地图,几乎全部使用投影坐标系,因为它直观、好用、可以当平面几何来处理。
在ArcGIS里打开一个数据的属性,看到坐标系那一栏写的是GCS_WGS_1984、GCS_China_Geographic_Coordinate_System_2000这类名字,那就是地理坐标系。如果写的是WGS_1984_UTM_Zone_50N、CGCS2000_3_Degree_GK_CM_117E、Xian_1980_3_Degree_GK_Zone_38,那就是投影坐标系。
还有一个容易忽略的关键点:国内项目里,地理坐标系最常见的是CGCS2000、WGS84、西安80、北京54这几套。投影坐标系则是在这几个地理坐标系基础上,叠加高斯克吕格投影、UTM投影、兰伯特等角圆锥投影、阿尔伯斯等积圆锥投影等映射方法得到的。很多人一看到坐标系列表里一大堆选项就头晕,但你不需要全都背下来,你只需要搞清楚自己手上的数据是哪套地理基准、用的是什么投影规则就够用了。
一句话总结这两者的关系:投影坐标系是建立在某个地理坐标系之上的,地理坐标系定的是“地球长什么样、原点在哪”,投影坐标系定的是“怎么把球面撕开铺平”。所以,选投影坐标系之前,必须先确认地理坐标系是什么。这个顺序千万别搞反了。
2. ArcGIS里怎么看坐标、定坐标:学会读坐标系的“身份证”
在项目里拿到一批数据,第一步永远是看坐标系。ArcGIS提供了好几个入口,我平时最常用的有两处。
一处是在目录面板里,右键图层查看属性,切换到“源”选项卡,中间会有一块区域专门显示空间参考信息。这里能看到坐标系名称、线性单位、角度单位、中央经线、比例因子、假东偏移量、假北偏移量、基准面名称等一大堆参数。另外一处是在内容列表里,右键图层打开图层属性,同样切到“源”选项卡,看到的是完全一样的空间参考信息。
这里有一个非常实用的判断技巧:如果你的数据显示的坐标值是一堆几百万米量级的数字,比如X大约是500000到800000,Y大约是3000000到6000000,那基本可以断定是投影坐标系,而且很可能就是高斯克吕格投影的某个分带。如果X是117.5、118.2这样的小数,Y是30.1、31.5这样的十位数,那你看到的就是经纬度,也就是地理坐标系。
再补充一个实操经验。很多人不知道,ArcMap底部的坐标显示栏可以临时显示鼠标所在位置的真实坐标。你可以在显示栏上右键,选择“变换到实际单位”,它就会把当前地图文档的坐标系单位显示出来。如果单位是度,说明当前数据框是地理坐标系;如果单位是米,则说明是投影坐标系。
至于“定义投影”这个工具,它的作用就是给一个没有坐标系信息的数据打上坐标系的“身份证”。注意,它只负责“贴标签”,不会改变数据的任何坐标数值。这个工具隐藏在“数据管理工具”->“投影和变换”->“定义投影”里,操作极其简单:选择数据,选择目标坐标系,确定,完事。
但这里有个大坑必须反复提醒:给数据定义错误的坐标系,是所有坐标系错误里最致命的一种。比如明明数据是CGCS2000的经纬度,你手一抖给它定义了WGS1984的UTM投影坐标系,那么数据内部储存的坐标值本身并没有变,只是被错误地解释成了另一套规则。后续做任何投影转换、叠加分析,出来的结果全都会乱,而且这种错误非常隐蔽,表面上ArcGIS可能不报错,只有等你到野外对比检查时才会发现位置差了十万八千里。
所以定义投影前,最好先确认数据是怎么来的。如果是GPS设备导出的,大概率是WGS84经纬度;如果是测绘部门给的,大概率是CGCS2000或西安80的投影成果;如果是从在线地图服务下载的,可能是WGS84 Web墨卡托——EPSG代码3857。拿不准的时候,多问一句数据生产者,比你之后加班排查问题强一百倍。
3. 定义投影和投影转换是一回事吗?这事必须掰扯清楚
ArcGIS里有两个操作长得特别像,一个是“定义投影”,另一个是“投影”工具。很多人把它们混为一谈,实际上它们干的是完全不同的两件事。
“定义投影”刚才说过了,是给没有坐标系的裸数据打标签。它像什么?像给一个孤儿上户口,确定它是谁、从哪来。数据本身的坐标数字一个都不会变。
“投影”工具才是真正做投影转换的。它的作用是,把一个已经具有坐标系信息的数据,从原来的坐标系变换到另一个坐标系。比如把WGS1984地理坐标系的数据转换成WGS1984_UTM_Zone_50N投影坐标系,或者把CGCS2000高斯克吕格3度分带第40带的数据转换成CGCS2000_3_Degree_GK_CM_120E这种按中央经线定义的坐标系。这个工具会在转换过程中实际计算坐标值,使数据落到目标坐标系的位置上。
工具的位置在“数据管理工具”->“投影和变换”->“投影”,这是针对矢量数据的转换工具。栅格数据和它的对应工具是“栅格投影”,也有人习惯叫它“投影栅格”,在工具列表里搜索Project Raster就能找到。
投影转换背后的数学过程听起来复杂,但实际使用时你不需要自己推公式,ArcGIS底层会基于地理坐标系和投影规则自动完成解算。你只需要明确两个信息:输入数据的坐标系是什么,输出数据的坐标系是什么。
这里还有一个容易被忽略的技术细节:原始坐标系和目标坐标系必须共享同一个地理基准,也就是通常说的基准面,才能直接转换。如果基准面不同,比如WGS84和北京54之间互转,ArcGIS会使用默认的转换参数。但在国内高精度项目里,默认参数往往不够精确,需要手动指定七参数或者三参数。这个在哪设置?在“投影”工具的“地理坐标变换”参数里,如果你不选,ArcGIS会自己挑默认变换;如果它挑不到,就会报错提示无法转换。所以如果你发现投影工具灰的、报错,大概率就是两个坐标系之间的基准面转换参数缺失,需要你先在“数据管理工具”->“投影和变换”->“创建自定义地理坐标变换”里把参数填上。
顺带提一个相关的高频需求:CAD数据导入ArcGIS。CAD图纸通常自身带有一套平面坐标系,但导入ArcGIS后往往被识别成“UnknownCoordinateSystem”或者错误地挂上默认坐标系。处理CAD数据时,正确的操作是先根据CAD图纸的已知坐标参考,手动定义坐标系,再用“投影”工具转到项目需要的坐标系。千万别直接拖进ArcMap里就开干,否则后续编辑、量算、叠加全部是错位状态。
4. 动态投影:看着是对的,导出的时候你才知道是真是假
ArcGIS有一个很迷惑人的机制,叫动态投影。通俗解释就是,ArcMap的数据框(Data Frame)有一个自己的坐标系,当图层坐标系和数据框坐标系不一致时,图层不是被强制性物理转换,而是在显示层面被实时投影到数据框的坐标系里。所以屏幕上看起来所有图层都对齐了、位置也都对了,但数据本身的底层坐标其实还是原来的坐标系。
这个机制的好处是:你可以把不同坐标系的数据在同一视图里叠加分析,快速判断空间关系,不需要提前转换。坏处是:很多人误以为显示对了就等于数据对了,一导出、一发布、一分析,就出问题。
举一个非常常见的场景。你导入了一个CGCS2000经纬度的CSV点文件,又导入了一个WGS1984_UTM_Zone_50N的矢量边界,两者在屏幕上完美重合。你觉得没问题,直接把点数据“导出数据”,选的是数据框坐标系,ArcGIS确实会按数据框坐标系帮你做一次转换,结果可能也正确。但如果你没选这个选项,而是直接导出为原始坐标系,那导出的文件坐标值就和显示的完全不一样了,后续给别人的时候就会造成混乱。
再举一个分析层面的坑。你做“缓冲区分析”或者“近邻分析”这类工具时,如果输入图层是地理坐标系经纬度,工具默认的缓冲距离单位就是度。你说我想缓冲500米,结果输个500,出来的范围是500度,直接扩大到整个地球。这就是因为没有把图层转换到投影坐标系,导致分析工具使用了错误的线性单位。
所以要养成一个好习惯:在正式开展空间分析、距离量算、面积计算、叠加裁剪、拓扑检查之前,确认所有图层真的是在同一个投影坐标系下,而不是只在视觉上“看起来在同一个坐标系下”。如果拿不准,右键图层属性看“源”标签,再右键数据框属性看“坐标系”标签,两个一对比就清楚了。
那什么场景下可以靠“动态投影”省事呢?我个人的习惯是:只做纯展示、出图、目视判读时,直接靠动态投影搞定,省时省力。一旦涉及实际分析、数据导出、服务发布、多软件交换,必须老老实实先统一坐标系再开工。
5. 完整实操流程:从拿到裸数据到顺利完成投影转换
这里给一套可以直接“抄作业”的流程,适用场景是:你手上有一批来源不明、坐标系不明确、或者坐标系确定但项目要求另一个坐标系的数据。完整走一遍,基本能覆盖80%的工作需求。
第一,先判断数据现状。右键图层打开属性,看“源”选项卡。如果坐标系显示“未定义”,说明这是裸数据,你要么给它定义坐标系,要么先搞清楚它的真正坐标系是什么再动手。如果坐标系有定义,但单位是度,说明是地理坐标系;单位是米,就是投影坐标系。
第二,如果数据未定义坐标系。打开“数据管理工具”->“投影和变换”->“定义投影”,在输入数据集里选中你的图层,然后在坐标系栏里选好正确的地理坐标系。例如国内点位数据,应优先选GCS_China_Geographic_Coordinate_System_2000,即CGCS2000地理坐标系。确认无误后,点确定。这一步之后,数据就有了合法的坐标系身份。
第三,如果需要投影转换到目标坐标系。打开“数据管理工具”->“投影和变换”->“投影”。输入数据集选刚才定义好坐标系的数据,输出坐标系选你项目要求的坐标系。这里以国内常用为例:如果你面对的是1:1万、1:5000的大比例尺地形图,通常选CGCS2000_3_Degree_GK_CM_XXXE这种按中央经线定义的高斯克吕格投影;如果是1:2.5万到1:50万的中小比例尺图,则常用CGCS2000_3_Degree_GK_Zone_XX这种按分带编号定义的坐标系。中央经线怎么定?以东经120度地区为例,选CGCS2000_3_Degree_GK_CM_120E即可。
第四,如果是整个数据框范围内多图层统一坐标系,更高效的做法是直接设置数据框坐标系,让所有图层自动动态投影显示。操作方法:在内容列表空白处右键->“数据框属性”->“坐标系”->“预定义”->“投影坐标系”->“高斯克吕格”或“UTM”里选择你需要的投影坐标系,确定。这样所有图层在视图内都会按新坐标系实时显示,便于快速判断。但要注意,这只影响显示和分析工具的计算结果,不改变原始数据的存储坐标。
第五,正式转换并验证。对上一步确定了目标坐标系后,再用“投影”工具把需要导出的图层全部转换一遍。转换完成后,加载转换后的数据,重新检查一遍坐标范围和单位是否正常。比如转换前经纬度范围大约在110<E<122、26<N<35,转换后应该变成米制的大数坐标,X方向在500000附近或更大,Y方向在几百万量级,这样的结果才是合理的。
第六,养成检查习惯。最后打开“源”选项卡,再看一遍转换后数据集的坐标系信息是否与目标完全一致。同时抽查几个点的坐标与原始数据进行比对,确保没有换算错误。
这套流程看起来简单,但每一步都有坑。特别是第二步定义投影的坐标系如果选错,后面所有步骤都会错,而这个错误在视觉上不容易发现,因为ArcGIS的动态投影机制会掩盖掉坐标基准之间不同造成的视觉偏差。所以每次定义投影前,都必须先确认数据的来源和真实参考系,不要凭猜。
6. 实操现场实录:用案例走一遍从经纬度CSV到高斯投影的全过程
分享一个我最近实际处理的案例。客户给了一批野外采集的CGCS2000经纬度坐标,格式是CSV表格,包含ID、经度、纬度三个字段,数据量大概两千多个点。客户的需求很明确:把这批点落到当地1:1万标准图幅里,后续要用来做缓冲区分析和面积量算。当地位置大致在东经119°30'、北纬32°附近,所以我一开始就判断最终坐标系应该选CGCS2000_3_Degree_GK_CM_120E,因为这个区域在3度分带下属于第40带,中央经线正好是东经120度,用CM_120E这种定义方式的投影坐标系最合适。
操作步骤记录如下:
第一步,导入数据。在ArcMap里打开“文件”->“添加数据”->“添加XY数据”,选择CSV文件,X字段选经度、Y字段选纬度,坐标系选GCS_China_Geographic_Coordinate_System_2000,确定。这会生成一个临时事件层,这个层还不算真正的要素类,必须先导出成点要素。
第二步,右键事件层->“数据”->“导出数据”,选择“此图层的源数据”,输出要素类命名为points_cgcs2000_ll.shp,坐标系保持原始经纬度,保存到本地。
第三步,打开“数据管理工具”->“投影和变换”->“投影”,输入要素选择points_cgcs2000_ll.shp,输出要素类命名为points_cgcs2000_120E.shp,输出坐标系选择CGCS2000_3_Degree_GK_CM_120E,确定。
转换结果出来后,我特意做了几项检查。打开属性表,添加两个双精度字段,用计算几何功能分别算一下点的X和Y值。东经119°30'附近的点,X应该在500000米左右,稍微偏大,因为东经120度是中央经线,119°30'在它西侧约50公里处,坐标会比500000小一些。北纬32度的点,Y应该在3500000米到3600000米之间。最终检查结果基本吻合。
然后我用“缓冲区分析”工具做一个100米的缓冲区,输入是转换后的投影坐标层,距离单位选“米”,一切正常。如果这一步拿原始经纬度层来做的话,距离单位就只能选“度”,做出来的缓冲区半径根本不对。这就是为什么手工做分析前一定要先处理好坐标系的原因。
我再补充一个现场常踩的坑。有人导出的CSV坐标本身是X即经度、Y即纬度,但也有人拿到的是先纬度后经度的排列,还有一些老式设备导出的是度分秒格式,像119°30′25″这种。这类数据在加进ArcMap之前一定要预处理成十进制度,否则导入后点位置会乱飞。度分秒转十进制度的公式非常简单:度 + 分/60 + 秒/3600。举个例子,119°30′25″= 119 + 30/60 + 25/3600 ≈ 119.5069度。如果数据量大,直接在Excel里用公式批量处理,几分钟搞定。
7. 常见坐标系错误与排查技巧:这些坑我替你踩过了
从事ArcGIS数据处理的这十几年,坐标系相关的报错和异常遇到太多次了。这里挑几个最高频的问题,分别给出排查思路和解决办法。
问题一:两个图层明明坐标数据一样,套在一起却错位。这个大多数是因为两个图层使用了不同的地理坐标系,比如一个是WGS84,一个是CGCS2000,虽然坐标数值很接近,但基准面差异会导致在几十公里的范围内产生几米到几十米的偏移。排查方法:分别查看两个图层的“源”信息,比对坐标系名称和基准面。如果确实不同,把其中一个转换到另一个的地理基准下。国内优先统一到CGCS2000基准。
问题二:点数据导入后跑到非洲西海岸去了。这个非常经典。原因是数据本身是美国某州的平面坐标X/Y,你却按经纬度导入了,ArcGIS把它解释成非洲西海岸的经纬度位置。解决办法:先搞清楚原始数据真实的坐标系,再在“定义投影”里正确设置,然后再用“投影”工具转到经纬度数据框下使用。如果原始数据有投影信息,那直接在导入时选择对应坐标系即可。
问题三:ArcToolbox里的投影工具灰色不可点或者报错。常见原因有几种。一是输入要素类本身没有坐标系信息,工具无法判断转换起点的坐标系,所以置灰不可用。二是输入与输出坐标系之间缺少地理变换参数,工具报“转换参数不存在”。解决办法是先“定义投影”补全输入数据坐标系,再去坐标系属性里勾选“使用指定地理变换参数”,手动输入合适的七参数或三参数。
问题四:ArcMap状态栏显示单位是度,但我也想让它显示米。这是因为数据框坐标系还是地理坐标系。如果你只是希望在显示层面看米制位置,可以在“数据框属性”里把坐标系改成某个投影坐标系,ArcMap会自动把底部状态栏的显示单位同步成米。注意,这只是显示层面的变化,底层数据的坐标仍然不变。
问题五:裁剪、合并、相交等工具执行后,结果坐标范围超出预期。这是典型的坐标系不一致导致的。比如在数据框动态投影模式下,所有图层看着是对齐的,但实际存储坐标系各不相同,执行叠加类工具时,不同的输入图层会先被动态投影到数据框坐标系再计算。如果数据框是地理坐标系,那么很多工具计算出的面积、长度是球面量算结果,跟平面投影坐标系下的结果有差异。所以做这些操作前,务必先把数据统一到同一投影坐标系。
最后再分享一个日常验数据的野路子。拿到一个新数据,不管数据源描述说的是什么坐标系,你先把它拖到ArcMap里,和一幅已经校准过的底图比对一下。如果位置大致正确、但不完全吻合,那大概率是坐标系基准面和底图有细微差异;如果完全对不上,通常是坐标系定义错误或者坐标值本身就不是经纬度。这个“先叠加看一下”的习惯能帮你避免大量因为坐标系错误导致的无效操作。
8. 最后的几点真话:坐标系这件事,值得多花半小时
干这行越久越觉得,坐标系问题看着是小问题,却几乎是所有数据“翻车”事故的根源。很多项目工期延误、成果被退回、位置对不上,根子上都是坐标系没搞对。每次前处理多花半小时确认坐标系、定义正确投影、验证转换结果,能为后面的分析省下不止半天的时间。
我个人建议,每个用ArcGIS做数据处理的人,都该在桌面上放一张常用坐标系速查表:WGS84、CGCS2000、西安80、北京54这几套经典的名称和EPSG编码;高斯克吕格3度带、6度带的中央经线划分规则;UTM分带的命名格式。处理数据前先对照表,确认一次再动手。养成这个习惯之后,坐标系错误发生的概率会直线下降。
还有一个容易忽略的点:备份原始数据。任何投影转换、定义投影操作之前,最好复制一份原始文件放在另一个文件夹里。因为定义投影是不可逆操作,一旦坐标系定义错误,原始的裸数据就被污染了。备份之后,哪怕后面操作错了,随时可以重新开始。
坐标系的理解不需要背公式,核心就是记住两句话:地理坐标系是球面定位,投影坐标系是平面定位;定义投影是贴标签,投影工具才是真转换。把这两点刻在脑子里,ArcGIS坐标系处理这块就算真正入门了。剩下的细节,多在项目里滚几遍自然就熟练了。