做GIS这么多年,我几乎每隔几天就会遇到有人抱着ArcGIS来问:两个图层明明范围一样,为什么叠加不到一起?点位显示跑到太平洋里去了?面积算出来大得离谱?这些看着玄乎的故障,十有八九都出在同一个地方——地理坐标系和投影坐标系没搞明白,或者投影转换操作搞错了对象。ArcGIS里坐标系相关的坑,说多不多,说少不少,但每一脚踩下去都挺疼。这篇东西我不打算写成教科书,就按我在项目里摸爬滚打的经验,把地理坐标系与投影坐标系的核心区别、ArcGIS里怎么正确做投影转换、以及那些最常见的翻车现场一次说清楚。
1. 地理坐标系与投影坐标系,本质上在解决两个不同的问题
1.1 地理坐标系:把地球当成一个大椭球,位置用经纬度表达
地理坐标系(Geographic Coordinate System,GCS)解决的是"在三维球面上怎么描述一个位置"的问题。地球不是完美球体,而是一个赤道略鼓、两极稍扁的椭球体,所以任何一套地理坐标系都要先定义一个参考椭球体,再定义基准面、本初子午线和角度单位。我们平时说的"经度、纬度",本质上是角度,不是长度。东经120度、北纬30度,说的是从本初子午线和赤道面转过了多少度,而不是在地球上量了多少米。
这个区别看着简单,却是无数人栽跟头的根源。比如你拿到一份中国范围的数据,范围显示大概是73°E到135°E、18°N到54°N,那这基本就是一份地理坐标系数据。ArcGIS里常见的CGCS2000、WGS84、Xian 1980、Beijing 1954,指的都是地理坐标系。它们的核心差异在于所选椭球体、基准面和坐标原点不同,所以同一个物理位置在不同地理坐标系下的经纬度数值是有差别的。
1.2 投影坐标系:球面摊平成平面,必然产生变形
投影坐标系(Projected Coordinate System,PCS)解决的是"怎么把三维球面上的位置画到二维平面上"的问题。因为屏幕、纸张、CAD图纸都是平的,而地球是曲的,于是就有了各种数学投影方法:把球面"切开""展开"或"投影"到平面上。这里有个绕不开的结论——任何把球面变平面的过程都会产生变形,区别只是变什么和变多大。
常见的投影变形分三类:长度变形、面积变形、角度变形。不同投影方法就是在这三者之间做取舍。比如墨卡托投影保角度,但面积变形巨大,所以高纬度的格陵兰在图上看着比非洲还大;等积圆锥投影保面积,但形状可能被拉歪。理解了这一点,你就会明白为什么不能用一套投影坐标系应对所有场景——没有"最好"的投影,只有"最适合当前分析目的"的投影。
投影坐标系的结构可以理解成:地理坐标系 + 投影方法 + 一组投影参数。ArcGIS里打开任何一个投影坐标系的属性,你会看到它底层基于哪个GCS,比如"WGS_1984_UTM_Zone_50N"基于GCS_WGS_1984,再加上UTM投影方法、中央经线、假东偏移等参数。
1.3 坐标系"身份证":WKID和名称里藏的关键信息
在ArcGIS里,每一种坐标系和地理坐标系都有一个唯一的WKID(Well-Known ID)。这是坐标系圈子里的"身份证号",比名称更可靠。有些图层名称相近,但WKID不同,实际空间参考就是两码事。
| 坐标系 | WKID | 类型 | 常见用途 |
|---|---|---|---|
| GCS_WGS_1984 | 4326 | 地理坐标系 | GPS原始数据、在线底图底层 |
| WGS_1984_Web_Mercator_Auxiliary_Sphere | 3857 | 投影坐标系 | 网络地图切片、WebGIS底图 |
| GCS_China_Geodetic_Coordinate_System_2000 | 4490 | 地理坐标系 | 国家2000大地坐标系下的经纬度数据 |
| WGS_1984_UTM_Zone_50N | 32650 | 投影坐标系 | 中国中东部地区大比例尺制图、野外测量 |
看一个数据是什么坐标系,优先看WKID和名称,不要凭文件名猜。项目里最常见的事故就是文件名写着"2024年土地利用_2000坐标",打开一看,坐标系是WGS84。这种情况我后面会详细说怎么排查和补救。
2. ArcGIS里坐标系存在哪,怎么确认数据的"真实身份"
2.1 数据框/地图坐标系与源数据坐标系是两套系统
ArcGIS里有个非常容易混淆的点——地图文档(ArcMap里的mxd,ArcGIS Pro里的地图)有自己的坐标系,数据本身也有自己的坐标系,它俩不是一回事。
数据框(ArcMap)或地图属性(Pro)里的坐标系,是在你打开工程时设置的一个"显示坐标系"。ArcMap默认的数据框坐标系可能根据第一个添加的图层自动变化,Pro的地图也有类似机制。这个坐标系只影响显示,不会改动任何源数据。ArcGIS在做显示时,会根据源数据的坐标系和显示坐标系实时动态投影,这就是"on-the-fly projection"。
很多人误以为自己在地图属性里改了坐标系,数据就转换了,于是兴高采烈地把成果发给别人,结果对方打开发现坐标没变。记住一句话:改显示坐标系,只是换了一副眼镜看数据;真正改变数据坐标,必须用转换工具改源数据。
2.2 查看矢量与栅格数据的坐标系信息
在ArcMap里,加载图层后右键打开图层属性,切到"源"选项卡,能看到"空间参考"信息;在ArcGIS Pro里,同样右键图层选择属性,或者用目录窗格查看。栅格数据也一样,但栅格数据经常出现坐标系未定义的情况,尤其是从某些软件导出的影像、从无人机处理软件拿到的正射影像,经常只有范围没有空间参考。
还有一个容易被忽略的地方:Shapefile的坐标系信息存在同名的.prj文件里。如果这个文件丢了,ArcGIS就会认为数据没有坐标系。而GDB要素类和多数栅格格式的坐标系信息是内嵌在数据里的,不容易丢。这解释了为什么同一个Shapefile换了台电脑后,图层突然叠不上了——大概率是prj文件没跟着走。
2.3 "定义投影"和"投影"是两码事,改错了代价很大
这是使用ArcGIS坐标系功能时最要命的分岔路。ArcToolbox里有两个名字相似、用途完全不同的工具:
- Define Projection(定义投影):只给数据"贴标签",声明它是什么坐标系,不改变任何坐标数值。说白了,数据本身没有任何几何变化,只是告诉ArcGIS"我是谁"。
- Project(投影):真正把坐标值从A坐标系换算成B坐标系,会改变每个点的坐标数值。
举个例子:一份数据实际是WGS84经纬度,但因为某种原因没有定义坐标系。你先用Define Projection把它声明为GCS_WGS_1984,这时数据不会动,只是能正确显示了。然后再用Project把这份数据从GCS_WGS_1984转到CGCS2000 3度带投影坐标系,这才叫投影转换。
反过来,如果数据明明已经有坐标系了,你还去用Define Projection强行改成另一个坐标系,那就是"指鹿为马",坐标值不变,身份标签却变了,结果是数据整体偏移几百米甚至几千公里,而且很难察觉。我见过一个事故,某单位把CGCS2000数据用Define Projection定义成了WGS84,结果整份数据在全国范围内偏移了大约80到100米,排查了半个月才发现是这里出了问题。
2.4 无坐标系数据怎么判断"本来面目"
遇到没有坐标系的矢量数据,先别急着定义,先去判断它原本是什么坐标系。我的经验是分三步:
第一步看数据范围。打开图层属性里的"源"选项卡,看范围数值。如果经度在-180到180之间、纬度在-90到90之间,那它大概率是地理坐标系;如果数值是八位数的横坐标(比如500000开头)和四位数纵坐标,那基本是投影坐标系。
第二步看坐标量级和单位。高斯-克吕格投影下,中国地区的X坐标通常是六位或八位(带号+500公里假东偏移),Y坐标是四到七位的米值;UTM投影下,北半球地区的纵坐标通常是四到七位米值,中央经线附近横坐标接近500000。
第三步查来源。如果数据是从在线地图下载的,大概率是Web墨卡托(3857);如果从GPS导出,基本是WGS84经纬度;如果从测绘部门拿的,十有八九是CGCS2000或地方独立坐标系。拿到数据的第一时间就确认坐标系,能省掉后面一整套麻烦。
3. 投影转换实操:从动态显示到真正改变数据
3.1 数据框动态投影:多数场景下的"快速救场"
如果你只是想把两份数据临时叠在一起看个大概,不强求输出数据本身被转换,那么动态投影是最快的方式。ArcMap里右键数据框打开属性,选"坐标系";ArcGIS Pro里右键地图图层打开地图属性,同样在坐标系页签里设置。把显示坐标系设成你想要的目标坐标系,ArcGIS会自动对加载进来的所有图层做实时投影。
动态投影的好处是无损、不改数据、快;坏处也很明显:它只是显示层面的临时变换,导出地图或者用分析工具时,底层数据坐标系依然是原来的。而且当数据跨带、跨范围比较远的时候,动态投影的精度会受到一定影响,一些复杂地理变换的动态效果也不如预先转好的数据稳定。所以我的习惯是:临时看图用动态投影,正式出图或交付数据前,一定要用工具做真实的投影转换。
3.2 Project工具:矢量数据真正转换
真正的矢量投影转换,用Project工具。
在ArcMap里的位置是Data Management Tools → Projections and Transformations → Feature → Project;ArcGIS Pro里直接在搜索框输入Project就能找到。工具有四个关键参数:
- 输入数据集:即你要转换的图层。
- 输出数据集:转换后的新数据位置和名称。建议输出到新的路径或新名字,别直接覆盖原文件。
- 输出坐标系:选目标坐标系。如果目标坐标系与源坐标系基准面不同,需要单独选"地理(基准面)变换"。
- 地理变换(可选):当输入和输出坐标系采用不同基准面时,ArcGIS会要求你指定从A基准面到B基准面的变换方法,比如三参数、七参数,或者ArcGIS内置的已知转换公式。
举个例子,把一份GCS_WGS_1984的数据转到WGS_1984_UTM_Zone_50N。因为输入输出都基于WGS84这个基准面,所以不需要选地理变换,Project工具会直接做"先保持经纬度不变,再用UTM投影公式算平面坐标"的操作。但如果要把Beijing 1954的数据转到CGCS2000,由于基准面变了,你就必须选择或创建一个地理变换方法,否则坐标转换结果可能误差巨大。
选择地理变换时,能选到ArcGIS内置的推荐方法就直接选;没有内置方法时,需要根据控制点数据手动创建。这里强烈建议:高精度项目不要依赖默认参数,要使用当地测绘部门公布的转换参数。
3.3 栅格数据的投影转换:Project Raster的取舍
栅格数据和矢量数据的投影转换逻辑完全不同。矢量转投影时,只要把每个点的X、Y坐标重新算一遍就完事;但栅格是由规则像元组成的,转投影后原始像元网格会被拉伸、旋转、变形,必须重新采样到新的网格上。所以ArcGIS里栅格投影转换用的是Project Raster(ArcMap里是Data Management Tools → Projections and Transformations → Raster → Project Raster),它会让你选重采样方法。
三个常用重采样方法怎么选?最近邻法适合土地利用、植被分类这类类别型数据,因为它不会生成新类别值,能保持原始像元值不"污染";双线性插值适合高程、气温、降水这类连续表面,平滑且能处理中间值;三次卷积插值精度最高但计算量大,适合要求高精度的大比例尺DEM。实际项目里,我见过有人不管什么数据都默认用双线性,结果把土地利用分类数据搞出一堆"半类半类"的像元值,后续统计直接崩。
另外,投影后的栅格数据像元大小会改变,你需要在Project Raster里设置输出像元大小。不设置时ArcGIS会根据输入栅格自动估算,但如果有精度要求,建议根据目标比例尺明确指定,比如1:50000比例尺下DEM常见的10米、30米像元。
3.4 批量转换多个图层的高效套路
项目里经常遇到几十个图层需要统一坐标系,一个个转会疯。批量处理有两条路。
ArcMap的Data Management Tools → Projections and Transformations → Feature下有一个Batch Project工具,可以一次输入多个要素类,统一设置输出坐标系和地理变换,批量产出。ArcGIS Pro里同样有批量操作,也可以用模型构建器(ModelBuilder)搭建一个"循环要素类 → Project → 输出"的模型,把一类图层全部处理掉。
更灵活的当然是arcpy脚本。一个最简单的批量投影Python代码长这样:
import arcpy input_folder = r"D:\data\原始数据" output_folder = r"D:\data\转换后数据" target_sr = arcpy.SpatialReference(4490) # CGCS2000地理坐标系 # 如果基准面变了,可以指定地理变换,比如 arcpy.CreateCustomGeoTransformation(...) arcpy.env.workspace = input_folder fc_list = arcpy.ListFeatureClasses() for fc in fc_list: out_fc = output_folder + "\\" + fc.replace(".shp", "_GCS2000.shp") print("正在转换:", fc) arcpy.Project_management(fc, out_fc, target_sr)批量处理最容易踩的坑是其中混了没有坐标系或坐标系标错的数据。脚本跑一半报错还算好的,可怕的是脚本运行成功,但某些数据因为坐标系定义错误被"硬算"到了错误位置,而你根本没发现。所以批量转换前,先花十分钟把源数据的坐标系信息全部检查一遍,宁可慢,不可错。
3.5 自定义投影坐标系的参数设置思路
有些项目用的是地方独立坐标系,在标准坐标系列表里找不到,需要自己创建。ArcMap里在数据框属性或工具输出坐标系里选"新建";Pro里在坐标系选择窗口的"投影坐标系"下点"新建投影坐标系"。
创建时要设置的关键参数包括:
- 投影方法:国内最常用的是高斯-克吕格(Gauss Kruger),网上很多叫法不同,ArcGIS里通常表现为Transverse Mercator(横轴墨卡托),高斯-克吕格本质上是横轴等角切圆柱投影的一种。
- 地理坐标系(基准面):选你地方坐标系基于哪个椭球体,国内常见CGCS2000、Xian 1980、Beijing 1954。
- 中央经线:根据项目区域中心的经度设置,比如某项目在青岛附近,经度约120.3°,就可设120°E。
- 假东偏移/假北偏移:高斯-克吕格在中国东半球使用时的假东偏移通常设为500000米,目的是让中央经线以西的坐标值也是正数。
- 起始纬度(latitude of origin):一般设0。
自定义坐标系没有现成参考可查,验证方法很关键。找一个已知控制点,把当地坐标和已知坐标对比,误差在允许范围内再投入使用。
4. 投影参数选择背后的数学逻辑:为什么不能随便选
4.1 椭球体与基准面:同一个经纬度可能差几百米
前面说坐标系是"身份证",现在补充一下为什么不同地理坐标系之间的转换没那么简单。
椭球体是一个数学上对地球形状的近似,不同国家、不同时期采用了不同椭球体,椭球的长半轴、短半轴、扁率各不相同。基准面则是椭球体与真实地球之间的一个"装配关系"——椭球体的中心、旋转轴怎么对准地球,是经过大地测量确定的。
这就导致一个结果:同样是"东经120度、北纬30度",在CGCS2000、Xian 1980、Beijing 1954、WGS84里对应的物理位置并不完全相同,偏差从几十米到几百米不等。所以在不同基准面之间做投影转换时,光用数学公式计算不够,还得加一个"地理变换参数",比如三参数(仅平移)或七参数(三个平移、三个旋转、一个尺度变化)。
高精度项目做跨基准面转换,最靠谱的办法是找当地测绘主管部门公布的标准转换参数,或者用公共控制点自己解算七参数。ArcGIS里可以用Create Custom Geographic Transformation工具来创建自定义变换,本质就是往里填这些参数。
4.2 中央经线、标准纬线与变形分布
投影坐标系里的参数不是摆设,它们决定了变形在空间上怎么分布。
高斯-克吕格投影是横轴等角圆柱投影,中央经线附近变形最小,离中央经线越远变形越大。为了控制变形,中国采用分带投影:6度带用于1:25000及更小比例尺,3度带用于1:10000及更大比例尺。6度带中央经线计算公式是(带号×6) - 3,比如中央经线120°E属于20带;3度带中央经线就是带号×3,比如中央经线120°E属于40带。
UTM投影也是6度带,但中央经线处的长度系数是0.9996,相当于故意把中央经线附近的长度缩小了0.04%,用来均衡整带内的变形分布,使得带边缘的变形也不会太大。
选择投影时,如果项目区域跨多个带,就要考虑是分区转换还是使用一个整带覆盖。如果只是一个小县城的项目,结果你选了6度带数据又跑到了带外几百公里处,变形会明显增大,这种情况下3度带甚至自定义中央经线更合适。
4.3 为什么不能用经纬度直接算面积和距离
这个坑在项目的面积统计里特别常见。数据明明是地理坐标系,有人却在字段计算器里算面积,结果数值完全不对。原因很简单:经纬度是角度单位,1度经度的实际距离在不同纬度上完全不同——赤道附近约111公里,纬度60度的地方只有约55公里。你用一个角度差值直接当距离算,怎么可能得到真实的平方米?
所以,任何涉及面积、距离、长度的计算,第一步是把数据投影到合适的投影坐标系,第二步再计算。ArcGIS里矢量数据的Calculate Geometry工具在数据框或图层没做投影时,面积选项往往不可用,这就是在提醒你坐标系没到位。常规做法是先把数据用Project转到当地合适的投影坐标系(比如CGCS2000 3度带高斯-克吕格投影),再在字段计算器里用几何属性算面积。
4.4 选投影坐标系的一般策略
不同分析目的不同投影选择。我把常用的选型思路整理一下:
| 分析/制图情境 | 推荐坐标系 | 理由 |
|---|---|---|
| 全国范围面积统计 | Albers等积圆锥投影 | 保面积,适合资源分布统计 |
| 全国或大区域制图 | Lambert等角圆锥投影 | 保角度,适合气象、航空图 |
| 省级或地市大比例尺 | 高斯-克吕格3度或6度带 | 中央经线附近变形小 |
| 小范围高精度工程 | 地方独立坐标系或自定义中央经线的GK投影 | 变形最小,贴合GNSS测量成果 |
| WebGIS发布、在线底图 | WGS84 Web Mercator (3857) | 在线平台通用标准 |
| 全球气候/海洋类分析 | 等距圆柱或Robinson投影按需 | 看具体分析目标 |
核心原则就一句话:面积分析选等积投影,方向/形状分析选等角投影,距离分析选等距投影。选之前先想清楚这个项目最终要交付什么结论。
5. 高频实战问题排查:从叠不上到坐标飞到海上
5.1 两个图层叠不上:完整排查链路
这是所有坐标系问题里出现频率最高的一种。遇到两个图层叠不上,别急着用移动工具硬凑,按下面链路排查:
第一步,逐图层查看属性里的空间参考信息,记录WKID。不要看文件名,文件名写“2000”不代表数据真是2000。
第二步,查看图层的范围。在属性源选项卡里看Extent,判断这个范围是经纬度量级还是平面坐标量级。如果数据名称写着“CGCS2000”,范围却是-180到180,那它实际是经纬度数据,只是缺了或写错了坐标系信息。
第三步,判断哪个图层是"对的"。通常以公开底图或高精度控制点为准,或者以数据来源更可靠的图层为基准。
第四步,分情况处理:如果图层没有坐标系但实际是经纬度,使用Define Projection定义成正确的GCS;如果图层有坐标系但标错了,也用Define Projection改回正确值;如果两个数据基准面不同,比如一个WGS84一个CGCS2000,用Project转换到统一坐标系;如果一个是经纬度一个是投影坐标,那就统一转成投影坐标后再叠。
第五步,重新缩放至图层,目视检查关键地物是否对齐,再叠加在线底图验证。
5.2 经纬度表格导入后位置不对
拿着一份Excel表格,里面是经纬度坐标,导入ArcGIS后发现点位跑到了海里或者非洲,多半是三个问题。
第一个问题是单位。表格里如果是度分秒而不是十进制度,直接当成小数导入,点位会差十几甚至几十公里。处理办法是先做格式转换,公式是十进制度=度+分/60+秒/3600。比如"120°30'30""转成十进制是120.508333。
第二个问题是X、Y顺序反了。添加XY数据时,X字段填经度,Y字段填纬度。有人习惯把数据列成"纬度、经度",结果刚好填反,点位就从中国跑到了太平洋甚至南极。添加之前先看一眼表格列名,别想当然。
第三个问题是导入时坐标系选错。添加XY数据时必须指定输入坐标的坐标系,通常选GCS_WGS_1984。如果表格里的经纬度基于CGCS2000,就要选CGCS2000地理坐标系。选错了整个点集都会系统性偏移。
ArcGIS Pro里用Add XY Data或者从工具箱Toolbox的工具添加;ArcMap里则是右键"添加XY数据"或使用Make XY Event Layer工具。完成后记得把临时事件层导出成持久数据,否则关闭工程后点位就消失了。
5.3 CAD数据错位与单位问题
CAD(DWG/DXF)数据导入ArcGIS后错位,是很常见的协作问题。CAD图纸里的坐标值一般是平面坐标,但它没有像Shapefile那样的标准坐标系标签,完全靠导入后人工指定。
常见情况是:CAD图纸用的是地方独立坐标,但ArcGIS里没有对应的坐标系定义;或者CAD画图时以毫米为单位(1单位=1毫米),但ArcGIS默认按米解析,导致数据整整小了1000倍,图形消失或错位。
解决思路:CAD图纸导入前先确认绘图单位;然后在ArcGIS里给CAD数据定义一个与图纸比例相匹配的显示单位;最后如果不能确定原始坐标系统,用地理配准(Georeferencing)工具把CAD里的控制点与已知底图对齐。注意地理配准只是"对齐显示",不会改变CAD数据底层的坐标值,如果后续要做数据分析,还是要用真正的转换工具把CAD数据转成要素类并正确定义坐标系。
5.4 在线底图与本地数据对不齐:Web Mercator的坑
在线底图把无数人坑过。大厂出品的在线地图,切片底图通常使用WGS_1984_Web_Mercator_Auxiliary_Sphere(WKID 3857)。如果你本地数据是CGCS2000或者地方独立坐标系,直接叠上去就会出现几十到几百米的偏移。
还有一种情况更隐蔽:本地数据本身是WGS84经纬度,但加载进ArcGIS后底图依然偏移。这通常是因为在线底图数据源本身经过了坐标偏移加密。这种情况在项目里相当棘手,我的经验是:使用不带偏移的公开底图服务,或者使用单位自己发布的地图服务,尽量不要拿第三方在线底图做高精度空间分析的底图。
如果是投影坐标系差异导致的对不齐,直接把本地数据用Project转到3857,再叠加底图验证。但要注意,3857是为Web显示设计的,不适合做面积、距离量测,正式分析前还是要转回当地投影坐标系。
5.5 转换后数据漂移几十米:动态投影与七参数的问题
如果你做完投影转换后发现数据整体偏移了几十米,而且不同区域偏移量还不一样,那基本可以断定是地理变换参数没选对。
最典型的场景是Beijing 1954或Xian 1980转换到CGCS2000。很多ArcGIS版本内置了一些常用转换公式,但默认参数是为大范围粗精度场景设计的,对某些区域可能不适用。此时你需要创建自定义地理变换:
- 在ArcMap里打开"自定义→自定义地理变换"(Pro里搜索Create Custom Geographic Transformation)。
- 选择输入、输出的地理坐标系。
- 方法选择三参数或七参数。
- 填入由控制点解算或从测绘部门获得的参数值。
- 在Project工具的"地理变换"下拉框里,选用你刚创建的这个变换。
没有可靠参数时怎么办?退而求其次的办法是选择ArcGIS推荐的"先转WGS84再转目标坐标系"的链式变换,精度通常比不指定变换好。但最终交付前一定要用控制点实测校验。
6. 落到项目里的经验红线
6.1 新数据入库前,坐标系管理的基本规范
我在团队里一直强调几条红线:第一,任何新拿到的数据,入库前先确认坐标系,缺了就用Define Projection补上,绝不带着"未定义"的标签进库;第二,任何投影转换都要输出到新文件,不在原数据上直接覆盖,防止转错后没法回滚;第三,目录和文件命名带上坐标系信息,比如"_GCS2000_3deg_GK_CM120E",人员流动了、时间过久了也不会混乱。
有人觉得这些规范麻烦,实际上它救过我好多次。有一次同事交付了一份"坐标已转好"的数据,结果对方加载后位置完全不对,靠着文件名里的坐标系标识,我们五分钟就定位到是跨带转换时中央经线选错了。
6.2 Shapefile丢失.prj文件的补救
Shapefile的坐标系信息在.prj文件里,如果只复制了.shp,没复制.prj,数据就变成"无身份"了。更恼火的是,有些压缩包软件或邮件系统会过滤掉.prj这种不知名的扩展名,传输后文件还在,坐标系信息没了。
补救方法看运气:如果源项目工程文件还在,重新打开可以读到坐标系信息;如果数据有配套的.shp.xml元数据文件,里面可能记录了空间参考;如果都没有,就按前面第2.4节的方法,根据范围、精度和来源推测并定义。从此以后,我的习惯是打包Shapefile时用压缩包整体打包,不裸传单个文件,GDB数据交付时也整体复制,绝不单独拷要素类。
6.3 项目协作中的坐标系口径统一
最后说一点项目管理的经验。一个项目多人协作时,坐标系口径不统一是灾难性的。项目启动第一天就应当在技术文档里写明全流程统一使用哪个坐标系、哪个带号、哪个投影参数,最好连WKT定义都附上。
比如某项目统一规定:分析用坐标系为CGCS2000 / 3-degree Gauss-Kruger CM 120E,所有来自其他坐标系的数据必须用Project转换到该坐标系,并记录转换方法和参数。图斑面积统计必须在投影坐标下进行,禁止直接统计经纬度数据。有了这层约定,后面无论谁接手数据,都不用猜。
我在实际项目里的体会是,坐标系问题十有八九不是技术门槛,而是操作习惯和管理规范的问题。ArcGIS把工具都摆在那儿了,Google一下就能知道Project和Define Projection的区别,但真正让你少加班、少返工的,是每次拿到数据时多花三十秒确认坐标系,每次转换前多想一步基准面是否一致,每次交付前再核对一遍空间参考。把坐标系当成数据的一部分来管理,而不是一个可有可无的属性,这比记住所有工具参数都重要。