坐标系(Coordinate System)的概念为:
简单的说,有了坐标系,我们才能够用一个或多个“坐标值”来表达和确定空间位置。没有坐标系,坐标值就无从谈起,也就无法描述空间位置。
在ArcGIS中,或者说在GIS中,我们遇到的坐标系一般有两种:
重要的事情说三遍:
尽管投影是介绍坐标系的一个绕不开的重要内容。但是,首先,此文是围绕坐标系展开的。其次,说三遍是为了强调投影和坐标系的本质区别。坐标系是数据或地图的属性,而投影是坐标系的属性。一个数据或一张地图一定有坐标系,而一个坐标系可以有投影也可以没投影。只有投影坐标系才有投影,地理坐标系是没有投影的。
因此,一个数据或一张地图亦是可以有投影也可以没投影的。当然,非要较真,把具有地理坐标系的数据显示在平面地图上肯定也有一个投影的过程。严格来讲:我们只能说“数据或地图的坐标系”和“坐标系的投影”,而不能说“数据或地图的投影”。
也许是大家平时都比较随意,尽管都是知道二者的区别的,但是却在很多想说坐标系的时候就随口说成了投影。因此,当你说“数据的投影”和“投影转换”时,可以考虑下你是不是想说“数据的坐标系”和“坐标系转换”。
先抬出重要的总结:地理坐标系经过投影后变成投影坐标系,投影坐标系因此由地理坐标系和投影组成,投影坐标系必然包括有一个地理坐标系。图1概括了两种坐标系的联系:
图1 ArcGIS中“地理坐标系(GCS)”与“投影坐标系(PCS)”的联系
WKID: 32650Authority: EPSG
Projection:Transverse_Mercator
False_Easting:500000.0
False_Northing:0.0
Central_Meridian:117.0
Scale_Factor:0.9996
Latitude_Of_Origin:0.0
Linear Unit: Meter(1.0)
GeographicCoordinate System: GCS_WGS_1984
Angular Unit:Degree (0.0174532925199433)
Prime Meridian:Greenwich (0.0)
Datum: D_WGS_1984
Spheroid: WGS_1984
Semimajor Axis: 6378137.0
Semiminor Axis: 6356752.314245179
Inverse Flattening: 298.257223563
地理坐标系由三个参数来定义:角度单位(Angular Unit)、本初子午线(Prime Meridian)和大地测量系统(Datum)。
地理坐标系“GCS_WGS_1984”使用的角度单位为“度(Degree)”,0.0174532925199433这个数字等于“π/180”,使用的本初子午线为0.0度经线,即格林威治皇家天文台(Greenwich)所在位置的经线,使用的大地测量系统则为“D_WGS_1984”。
地理坐标系的最重要的参数是“大地测量系统(Datum)”,而大地测量系统的最重要的参数是“椭球(Spheroid)”。椭球相同,大地测量系统不一定相同,因为原点(origin)和方位(orientation)可以不同。想象一下,同一个椭球,首先可以固定在三维空间中的任意一个点,并且在固定于某点后还能以三个自由度任意地旋转其方位(朝向)。
当然,具体国家或地区在选择大地测量系统时,总是选择与这一国家或地区的地面最吻合的大地测量系统,而不是拍脑袋随便选的。我们拿到的境内的许多数据使用的都是“D_Xian_1980”大地测量系统。
事实上,投影坐标系“WGS_1984_UTM_Zone_50N”这个名称中的“WGS_1984”指出了其地理坐标系为“GCS_WGS_1984”,而“UTM_Zone_50N”则指出了其投影。
“UTM_Zone_50N”这个名称指出,其投影方法是“通用横轴墨卡托(Universal Transverse Mercator,UTM)”,其投影带为北半球第50带,这个“Zone_50N”的“中央经线(Central Meridian)”正是117.0度,在“Transverse_Mercator”的参数中得到了体现。举一反三,“Xian_1980_GK_CM_117E”这个坐标系使用的地理坐标系为“GCS_Xian_1980”,而投影名称“GK_CM_117E”指出其使用以东经117度为中央经线的“高斯-克吕格(Gauss-Kruger,GK)”投影。投影的另一个重要参数是“东偏(False Easting)”。
有些投影会在X坐标值前加上投影带号,比如:“Xian_1980_GK_Zone_20”的“false_easting”参数为20500000.0,其中20为投影带号,而“Xian_1980_GK_CM_117E”的“false_easting”参数为500000.0,尽管它们的中央经线都为东经117度。
在ArcGIS中,有三个概念容易混淆(另外半个最后揭晓),需要特别进行区分:
1)数据的真实坐标系,简称为“真实坐标系”;
2)数据属性所标称的坐标系,简称为“属性坐标系”;
3)ArcMap/ArcScene中Layers的坐标系,简称为“地图坐标系”。
假如用一个Point Shapefile数据来记录国科大雁栖湖校区图书馆的位置。如果使用经纬坐标(116.679267,40.408265)来记录此位置,那么数据的真实坐标系就是地理坐标系GCS_WGS_1984,如果使用平面坐标(472786.066803,4473121.59882)来记录此位置,那么数据的真实坐标系就是投影坐标系WGS_1984_UTM_Zone_50N。
数据的真实坐标系是什么,可以通过以下方式进行验证。在ArcMap中加载这一个Point Shapefile数据,打开其属性表(Attribute Table),右击任意已有或新建的数值类型为Double(或Float)的Filed进行“CalculateGeometry”运算,如果数据的真实坐标系为地理坐标系GCS_WGS_1984,那么计算的“X Coordinate of Point”就为116.679267(图2),如果数据的真实坐标系为投影坐标系WGS_1984_UTM_Zone_50N,那么X坐标值就为472786.066803。
图2 使用“Calculate Geometry”检查Point Shapefile数据的“真实坐标系”
对于栅格数据,也有方法判断其真实坐标系。通常,栅格分辨率数值很小的是地理坐标系,栅格分辨率的数值很大则为投影坐标系。以经常使用的SRTM DEM栅格数据为例。
因此,如果使用投影坐标系,让81.4520173这个数值作为这个纬度位置的SRTM DEM数据的分辨率是合理的选择。81.4520173是0.00083333333的接近10万倍(图3),因此分辨率(Cell Size)是判断栅格数据的坐标系是地理坐标系还是投影坐标系的重要依据。
当然,大尺度的全球栅格数据在地理坐标系下其分辨率数值可以很大,比如1度,而小区域的栅格数据在投影坐标系其分辨率数值也可以很小,比如1米。
图3 同一个栅格数据在“地理坐标系”和“投影坐标系”下的分辨率数值相差巨大
数据属性所标称的坐标系是指数据文件的属性所标称的坐标系。一般来说,我们有两个入口来查看数据属性所标称的坐标系:一种是在Catalog里面右击该数据文件打开Properties,Shapefile文件可直接在Properties中查看或者修改“XY Coordinate System”,Raster文件可以通过Edit(编辑)“SpatialReference”来打开“XY Coordinate System”进行查看或者修改。
另一入口是当把数据加载进ArcMap或ArcScene后,在此数据的Layer Properties的“Source”标签中查看。第二个入口只能查看而不能修改属性坐标系。图4为分别在Shapefile Properties和Layer Properties中查看国科大雁栖湖校区图书馆PointShapefile数据的属性坐标系。
图4 在Shapefile Properties和Layer Properties中查看Point Shapefile数据的“属性坐标系”
这里要特别强调的是:数据的真实坐标系和属性坐标系可以不同,当二者不同时就出现错误。
类似的,数据的真实坐标系为地理坐标系GCS_WGS_1984,而属性坐标系为地理坐标系GCS_Xian_1980,或真实坐标系为投影坐标系WGS_1984_UTM_Zone_50N,而属性坐标系为投影坐标系WGS_1984_UTM_Zone_49N,也都是错误的。
只要二者不统一,就是错误的。在数据处理过程中,误将属性坐标系改动,造成属性坐标系与真实坐标系不符合,是ArcGIS操作的常见错误。使数据的属性坐标系和真实坐标系吻合,是进行所有数据处理和分析的必要前提。
同样以国科大雁栖湖校区图书馆的Point Shapefile数据为示例说明真实坐标系和属性坐标系不吻合的情况。如果PointShapefile数据的真实坐标系为地理坐标系GCS_WGS_1984,而将属性坐标系设置为投影坐标系WGS_1984_UTM_Zone_50N,图书馆点就会跑到赤道附近的印度尼西亚去(图5)。
相反,如果Point Shapefile数据的真实坐标系为投影坐标系WGS_1984_UTM_Zone_50N,而属性坐标系为地理坐标系GCS_WGS_1984,图书馆点则会“跑出地球”。因为系统会认为此点的经纬度为(472786.066803,4473121.59882),地球上的点的经纬度值最大为180度,最小为-180度,因而这两个经纬度值远远超过了180度的最大值。
图5 数据的“属性坐标系”与“真实坐标系”不吻合导致的点位错误
为何在实际操作中我们一般都不必检查数据的属性坐标系是否与真实坐标系吻合呢?这是因为在大多数时候,我们拿到的数据不但有属性坐标系并且还与真实坐标系是吻合的。一般来说,有两个明显的迹象可以判断数据的属性坐标系是不对的。一个是将数据加载到ArcMap里面后报错;另外一个是数据加载到ArcMap里面后尽管没报错,但是位置明显不对。比如上面的例子,位于国科大的点跑到印度尼西亚去了。
具体来讲,投影坐标系“Asia_Lambert_Conformal_Conic”中的坐标值有负值,而负值超出了地理坐标系“GCS_WGS_1984”的范围(正值)。以下叙述,如无特别说明,都隐含数据属性坐标系与真实坐标系吻合的假设,并以“数据坐标系”统称。
图6 数据的“属性坐标系”与“真实坐标系”不吻合导致的“inconsistentextent”错误信息
ArcMap/ArcScene中Layers的坐标系是指当我们把若干矢量数据或栅格数据加载进ArcMap或ArcScene里面组成“Layers”的时候,这个Layers的坐标系。“地图坐标系”在ArcMap中可以通过右击“Layers”打开“Data Frame Properties”后在“Coordinate System”标签中查看或者修改(图7),在ArcScene中可以通过右击“Scene Layers”打开“Scene Properties”后在“Coordinate System”标签中查看或者修改。
图7 在ArcMap中查看或者修改Layers的“地图坐标系”
可以想象,一个Layers可以包括多个数据Layer,这些数据Layer的坐标系也可以各不相同。因此,Layers的地图坐标系可以不同于各Layer的数据坐标系。可以选择Layers中的某一Layer的数据坐标系作为地图坐标系,也可以选择其他任意坐标系,只要这个坐标系的覆盖范围能覆盖所有Layer数据的范围。当在ArcMap中加载多个数据Layer时,系统会自动将第一个加载进来的有坐标系的数据的坐标系作为Layers的地图坐标系。为了使所有具有不同坐标系的数据Layer都在同一地图坐标系下进行显示等操作,当某个Layer的数据坐标系与Layers的地图坐标系不同时,系统会自动用一定的算法将数据坐标系(的坐标值)临时转换为地图坐标系(的坐标值)。这种临时的坐标系转换,并不改变每个数据本身的坐标系。
当数据在与其坐标系不同的地图中显示时,会出现“变形”。这种变形是由“临时的坐标系转换”引起的。图9为使用地理坐标系“GCS_WGS_1984”作为Layers的地图坐标系的情况。可以看出,相较使用“国科大20.tif”的数据坐标系(投影坐标系“WGS_1984_Web_Mercator”)作为地图坐标系,使用地理坐标系“GCS_WGS_1984”作为地图坐标系使得“国科大20.tif”这一栅格Layer的变形明显,其轮廓(覆盖范围)在东西经度方向上被拉长了,在南北维度方向则被压缩了。如果不希望某个Layer出现变形,那么就使用该Layer的数据坐标系作为Layers的地图坐标系。
图8 使用投影坐标系“WGS_1984_Web_Mercator”作为Layers的“地图坐标系”
图9 使用地理坐标系“GCS_WGS_1984”作为Layers的“地图坐标系”造成显示“变形”
如果地图坐标系与数据坐标系差别很大,数据显示的变形也会很大。图10为使用投影坐标系“WGS_1984_UTM_Zone_49N”作为地图坐标系的情况,图11为将“国科大20.tif”Layer的右上角放大后的情况。可以看出,“国科大20.tif”这一栅格Layer的变形明显,整体轮廓和每个栅格都“倾斜”了一个角度。
尽管投影坐标系“WGS_1984_UTM_Zone_49N”和 “WGS_1984_UTM_Zone_50N”二者都与“国科大20.tif”这一栅格Layer的数据坐标系“WGS_1984_Web_Mercator”不同。但是,试验可以发现,使用“WGS_1984_UTM_Zone_50N”作为地图坐标系的时候,“国科大20.tif”的变形不会这么明显。原因之一是,坐标系“WGS_1984_UTM_Zone_49N”中投影带的中央经线为111度,而坐标系“WGS_1984_UTM_Zone_50N”中投影带的中央经线为117度,后者的投影带与“国科大20.tif”的范围更符合。选择“WGS_1984_Web_Mercator”和“WGS_1984_UTM_Zone_50N”,都会使“国科大20.tif”在投影中的变形更小。
图10 使用投影坐标系“WGS_1984_UTM_Zone_49N”作为“地图坐标系”造成栅格Layer轮廓“倾斜”
图11 使用投影坐标系“WGS_1984_UTM_Zone_49N”作为“地图坐标系”造成每个栅格“倾斜”变形
当然,有时在地图显示中,出于合理或者美观的需要,这种“变形”是需要的。例如,我们拿到的行政边界矢量数据的坐标系是地理坐标系“GCS_Krasovsky_1940”。我们可以就使用地理坐标系“GCS_Krasovsky_1940”作为Layers的地图坐标系(图12),但是这样的显示和图9类似地使数据在东西方向被“拉长”。使用地理坐标系作为地图坐标系,显示出来的数据与我们在多数时候看到的全国地图的“形状”有差异。当我们换为使用投影坐标系“Asia_Lambert_Conformal_Conic”作为Layers的地图坐标系时,显示出来的数据就与我们在多数时候看到的全国地图的“形状”相仿了(图13)。如果数据经常需要在不同于自身坐标系的地图中显示,可使用“坐标系转换”让这种在显示中的临时性坐标系转换变成永久性的,也即改变数据本身的坐标系,这是下一节中将提到的。对于栅格数据,如图10和图11这种情况,坐标系转换后的数据在目标坐标系中显示时轮廓可能还是“倾斜”的,但数据坐标系变成目标坐标系后的新数据的每个栅格在目标坐标系中将不再“倾斜”(见3.3节)。
图12 使用地理坐标系“GCS_Krasovsky_1940”作为“地图坐标系”显示行政边界数据
图13 使用投影坐标系“Asia_Lambert_Conformal_Conic”作为“地图坐标系”显示行政边界数据
地图坐标系的重要性还体现在:在地图中编辑要素时,如果需要输入坐标值,那么此坐标值是相对于地图坐标系的。例如,在坐标系为“Asia_Lambert_Conformal_Conic”的地图中编辑坐标系为“GCS_WGS_1984”的Point Shapefile,增加点所需输入的坐标值就不能再是该点的经纬度,而是该经纬度在坐标系“Asia_Lambert_Conformal_Conic”中对应的坐标值(图14)。
也许你已经注意到,图13的地图坐标系是投影坐标系,但窗口右下角显示的坐标单位是度而不是米。类似的,图9的地图坐标系是地理坐标系,但窗口右下角显示的坐标单位是米而不是度。这个疑问就引出了那“半个概念”:“地图显示单位”。之所以称为“半个”是因为严格来说这不算一个可以与真实坐标系、属性坐标系和地图坐标系等并列的“概念”。
地图显示单位可以在Layers的Properties中的“General”标签中进行设置(图15)。地图单位由地图坐标系决定,地图显示单位可以与地图单位相同,也可以与地图单位不同。
图14 在地图坐标系为“Asia_Lambert_Conformal_Conic”的地图中编辑数据坐标系不同的点数据
图15 使用与“地图单位”相同的单位(Meters)作为“地图显示单位”
在理解清楚了以上“三个半容易混淆的概念”的基础上,以下四类常用的坐标系操作就很好理解与熟悉了。
3.1 坐标系选择、新建与编辑
坐标系的其他操作都会涉及到选择、新建与编辑等,这些操作可在打开的数据或地图等的“Properties”窗口中的“Coordinate System”或“XY Coordinate System”标签中进行(图16)。
图16 坐标系选择、新建与编辑等操作的入口
用户可以从“Favorites”、“Geographic Coordinate System”、“ProjectedCoordinate System”和“Layers”等文件夹中选择坐标系,或使用“Import”导入其他数据的坐标系。“Layers”文件夹只有当ArcMap或ArcScene中的Layers加载有数据(Layer)时才会显示出来,而在ArcCatalog中操作则不会出现。另外,使用“Clear”可以清除数据或地图的坐标系。
用户也可以根据需要新建坐标系。图17为新建投影坐标系(ProjectedCoordinate System)的操作窗口。在这一操作窗口中,用户需要设置投影坐标系的名称(Name)、投影(Projection)、单位(Linear Unit)和地理坐标系(Geographic Coordinate System)等参数。
图17 新建投影坐标系(Projected Coordinate System)的操作窗口
右击任意已有坐标系,点击“Copyand Modify”,可对已有坐标系进行编辑。坐标系编辑的操作窗口与坐标系新建的操作窗口类似。对于投影坐标系的编辑,用户也需要编辑投影坐标系的名称、投影、单位和地理坐标系等参数。
3.2 坐标系定义
坐标系定义是指定义数据的属性坐标系。也即,将与数据的真实坐标系相同的坐标系赋予给数据的属性。坐标系定义可以通过两种方式来实现:一是如图2所示,在Catalog里面访问该数据的Properties进行修改(定义);二是使用ArcToolbox ->Projections and Transformations -> Define Project工具(图18)。
如果该数据已有属性坐标系,数据输入处会出现警告符号,警告用户已有属性坐标系将被覆盖。这两种坐标系定义方式的区别是:如果数据在ArcMap或ArcScene中打开(被锁定)后,那么就不能在Catalog中改变数据的坐标系了,但是仍然可以利用ArcToolbox中的Define Project工具来定义数据的坐标系,除非这一数据同时也在另外的ArcMap、ArcScene或ArcCatalog中被打开使用。
图18 使用ArcToolbox中“DefineProject”工具进行坐标系定义
另外,个人以为,“Define Project”工具的名称使用“Define Coordinate System”更为贴切。因为这个工具是定义坐标系(Coordinate System),而不是定义投影(Project)。有意思的是,“Define Project”工具窗口中“坐标系的输入框”的名称是“CoordinateSystem”,而不是“Project”(图18)。因此,为何ESRI会使用“Define Project”这个工具名,颇令人费解。
3.3 坐标系转换
坐标系转换是指转换数据的真实坐标系。坐标系转换的前提是数据的属性坐标系与数据的真实坐标系吻合。矢量数据的坐标系转换通过ArcToolbox -> Projections and Transformations -> Project工具来实现(图19),栅格数据的坐标系转换通过ArcToolbox -> Projectionsand Transformations -> Raster -> Project Raster工具来实现(图20)。
图19 使用ArcToolbox中“Project”工具进行矢量数据的坐标系转换
图20 使用ArcToolbox中“ProjectRaster”工具进行栅格数据的坐标系转换
在选择好输入数据,并定义好输出数据及其坐标系后,用户有可能被要求定义“Geographic Transformation”。这个“Geographic Transformation”被用于两个不同地理坐标系(大地测量系统)之间的转换。只有当输入坐标系和输出坐标系拥有不同的大地测量系统时,这个输入才被要求。在某些情况下,系统会从已有的“Geographic Transformation”中根据输入和输出坐标系自动选择出合理的“Geographic Transformation”(图20),而某些情况下则需要用户从已有的“Geographic Transformation”中进行选择(图19)。
坐标系转换包括了两种过程:
1)大地测量系统(地理坐标系)转换
2)投影(或反投影)
例如,将地理坐标系“GCS_WGS_1984”转换为投影坐标系“Xian_1980_GK_CM_117E”包括了两个过程:分别是一个将大地测量系统“D_WGS_1984”转换为大地测量系统“D_Xian_1980”的过程和一个将地理坐标系“GCS_Xian_1980”投影为投影坐标系“Xian_1980_GK_CM_117E”的过程。再例如,将投影坐标系“WGS_1984_Web_Mercator”转换为投影坐标系“WGS_1984_UTM_Zone_50N”包括了三个过程:分别是一个将投影坐标系“WGS_1984_Web_Mercator”转为地理坐标系“GCS_WGS_1984_Major_Auxiliary_Sphere”的过程(反投影),一个将大地测量系统“D_WGS_1984_Major_Auxiliary_Sphere”转换为大地测量系统“GCS_WGS_1984”的过程和一个将地理坐标系“GCS_WGS_1984”投影为投影坐标系“WGS_1984_UTM_Zone_50N”的过程。
栅格数据的坐标系转换与矢量数据的坐标系转换的一个重要不同是:栅格数据的坐标系转换需要设置栅格分辨率(图21)。如果是投影坐标系之间或地理坐标系之间的转换,系统一般会默认分辨率数值不变,如果是地理坐标系与投影坐标系之间的转换,系统会自动估计出一个合理的分辨率数值。例如第2节中提到的81.4520173米对应于0.00083333333度,也即地理坐标系中的0.00083333333度对应于投影坐标系中的81.4520173米。由于这里的转换是对数据的真实坐标系的永久性转换,和在地图显示中的“临时性坐标转换”不同,栅格数据的坐标系转换不但使栅格数据的分辨率数值改变,也使新数据在目标坐标系中显示时其每个栅格不再“倾斜”,尽管其整体轮廓可能还是“倾斜”的(图21)。
图21 使用“Project Raster”工具进行栅格数据的坐标系转换时需要设置栅格分辨率
同样,个人以为,“Project”和“Project Raster”的工具名用“Transfer ”替代“Project”也许更为贴切。因为这两个工具做的工作是坐标系转换(Transfer),而不是投影(Project)。另外,ESRI将用于栅格数据坐标系转换的工具命名为“Project Raster”,却不将用于矢量数据坐标系转换的工具命名为类似对应的“Project Feature”,不知有何考虑。
因此,ArcGIS中坐标系定义和转换的工具名称(包括Define Project、Project和Project Raster)可能对用户使用工具和理解坐标系的有关概念有一定误导。
3.4 坐标系猜测
坐标系猜测是指猜测数据的真实坐标系,并且把数据的属性坐标系设置为真实坐标系。这在不知道数据的坐标系或数据的属性坐标系是错误的时候是需要的。比如,给你若干点的坐标值,但是不告诉你这些坐标值是在什么坐标系下的坐标值。在这种情况下,最好的方式是向数据的提供方询问数据的真实坐标系是什么。
如果不得不猜测数据的真实坐标系,其基本原理是根据数据的坐标值特征来猜测。经验将会很重要。如果数据的坐标值看起来像是经纬度数值,那么认为其真实坐标系为地理坐标系“GCS_WGS_1984”将不会带来很大误差。如果数据的坐标值是地面长度(通常数值很大),那么可以基本认为其真实坐标系为投影坐标系。如果知道该数据大概的空间范围,可以找出该空间范围内的坐标系正确的任一“参考数据”,将其与属性坐标系未知的“目标数据”加载于同一地图中,并将地图坐标系设置为你怀疑的投影坐标系。
1)使所有数据都有坐标系定义,也即使所有数据都有属性坐标系;
2)保证所有数据的坐标系都是正确的,也即使所有数据的属性坐标系都与其真实坐标系吻合;
3)统一所有数据的坐标系,利用坐标系转换实现。并且,这种统一的坐标系一般宜为投影坐标系,因为只有在投影坐标系下才能正确地进行距离、长度、面积、坡度等度量的计算。当然,有时我们做大尺度的工作,比如进行全球尺度的显示或分析时,一般就用地理坐标系,不用投影坐标系。