空间坐标是与坐标参照系统(coordinate reference system)相关的,同一空间实体,在不同坐标参照系统中具有不同坐标值。
每个数据集都具有一个坐标系,该坐标系用于将数据集与通用坐标框架(如地图)内的其他地理数据图层集成。通过坐标系可以集成地图内的数据集以及执行各种集成的分析操作,例如叠加来自截然不同的来源和坐标系的数据图层。
对空间数据的操作,不仅要知道空间数据的坐标值,同时也要知道坐标值采用的坐标系统,否则的话,不同数据之间无法进行比较分析。
坐标系可使多个地理数据集使用公用位置进行集成。坐标系是一种用于表示地理要素、影像和观察值位置(例如公用地理框架内的 GPS 位置)的参照系统。
每个坐标系通过以下几方面定义: 测量框架,分为地理(球面坐标从地心开始测量)或平面(地球的坐标投影到二维平面上)两种。
测量单位(通常对于投影坐标系为英尺或米,对于经纬度为十进制度数)。 投影坐标系的地图投影定义。
其他测量系统属性,例如参考椭圆体、基准面和投影参数(诸如一条或多条标准纬线、中央子午线和 x 与 y 方向上可能的位移)。
GIS 中使用两种常用的坐标系类型: 全局坐标系或球坐标系,例如经纬度。这些坐标系通常称为地理坐标系。
基于地图投影的投影坐标系(例如横轴墨卡托投影、亚尔勃斯等积投影或罗宾逊投影),连同众多其他地图投影模型提供了各种将地球的球面地图投影到二维笛卡尔坐标平面的机制。投影坐标系有时称为地图投影。
坐标系(地理坐标系或投影坐标系)为定义真实世界的位置提供了框架。在 ArcGIS 中,坐标系作为将不同数据集中的地理位置自动集成到通用坐标框架中以供显示和分析的方法。
坐标参照系统包括地理坐标系统和投影坐标系统。 地理坐标系统(Geographic Coordinate System,GCS)也称大地坐标系统,用于定义空间实体在地球曲面上的坐标值。 投影坐标系统(Projected Coordinate System,PCS)也称直角坐标系统,用于定义空间实体在地图平面上的坐标值。
地理坐标系统是以经纬度表示空间实体在地球上的位置信息。其中经度是观测点所在子午面(通过地球球心并指向正北的地球剖面)与初始子午面之间的角度;纬度是观测点与地球球心的连线和赤道面之间的角度。 经纬度的定义是把地球看成一个规则的球体(或椭球体),但真实的地球则是一个不规则的椭球体。 由于真实的地球并不是规则的椭球体,没有明确的地球球心位置、正北指向等,因此,为了测量地球上任何一点的经纬度坐标,需要确定一系列参数,这些参数统称为大地测量基准(Datum)。
大地测量基准涉及的参数很多,主要包括: 地球椭球体的几何参数,一般用长半径a(赤道半径)、短半径b(极轴半径)以及扁率f =((a-b)/a)或反扁率(1/f)来定义。 椭球中心的位置及椭球极轴的指向。 初始子午线,一般是以经过格林威治(Greenwich)的子午线为初始子午线。 角度单位,一般是Degree,也有其它单位,如Radian。
为了提高本区域内的测量精度,很多国家和地区都建立了自己的大地测量基准。目前全球有几百种大地测量基准(Datum)。
我们国家使用的Datum包括: Beijing 1954,新中国成立初期我国采用的大地测量基准。 Xian 1980,1980年起我国采用的大地测量基准。 CGCS 2000,我国新的大地测量基准,2008年7月1日启用。 WGS 1984,是GPS所采用的大地测量基准,用于全球大地测量。
地球椭球面是曲面,地图是平面。地球椭球面不能直接展开成平面,只能通过投影方式把地球表面上的点投影到平面或可展开为平面的圆柱面或圆锥面上。 投影坐标系统是以平面直角坐标(x,y)表示地面点与坐标系统原点的距离。
平面直角坐标(x,y)与经纬度坐标(φ,λ )的关系可用两个方程式表示: x = f1(φ,λ) y = f2(φ,λ)
由于平面直角坐标是从地理坐标转换而来,因此,坐标值同样与Datum有关。而我们从arcgis中打开投影坐标系进行直观的观察,可以很轻松的看到,投影坐标系是基于地理坐标系基础上做的转换:
投影有很多种方式,不同的投影构成了不同的投影坐标系统。常用的投影坐标系统包括:
高斯—克吕格投影坐标系统 高斯—克吕格投影是等角横轴切椭圆柱投影,与通用横轴墨卡托投影(UTM投影,等角横轴割椭圆柱投影)之间差异很小。自1952年起,我国将其作为国家大地测量和地形图的基本投影,亦称为主投影。
Albers投影坐标系统 高斯—克吕格投影是分带投影,有6°分带和3°分带两种。1:2.5万至1:50万比例尺的地形图采用6°分带,1:5千至1:1万比例尺地形图采用3°分带。 每个带中间的经线称为中央经线,中央经线和赤道线的交点为坐标原点。
Web墨卡托投影坐标系统 Albers投影即等积割圆锥投影,相割的两条纬线称为标准纬线,中央经线与赤道的交点为坐标原点,标准纬线和中央经线可以是自定义的。Albers等积圆锥投影适用于中纬度沿东西方向伸展地区,如中国全图;
ArcGIS 自动集成坐标系已知的数据集 ArcGIS 中使用的所有地理数据集均已假设具有明确定义的坐标系,通过该坐标系可相对于地球表面定位这些数据集。
如果数据集具有明确定义的坐标系,则 ArcGIS 可将数据动态投影到相应的框架,从而自动将数据集与其他数据集集成,以进行制图、3D 可视化和分析等操作。 如果数据集没有空间参考,则无法轻松地集成它们。需要定义一个空间参考,才能在 ArcGIS 中有效地使用数据。空间参考或坐标系是元数据。它描述了数据已经使用的坐标框架。
坐标参照系统表示是指定义空间数据的坐标参照系统信息,前提是空间数据的坐标参照系统信息是已知的。
有些空间数据的坐标参照系统信息是不公开的或空间数据是经过加密处理的,如百度等Web服务提供的空间数据,这种情况下,无法直接定义空间数据的坐标参照系统信息。
空间参考是为地理数据库中的每个数据集定义坐标系和其他空间属性的一系列参数。 通常,同一个区域(以及同一个地理数据库)中的所有数据集都使用一个公用的空间参考定义。空间参考包括以下几个方面的设置: 坐标系 存储坐标所使用的坐标精度(通常称为坐标分辨率) 处理容差(例如聚类容差) 数据集所覆盖的空间或地图范围(通常称为空间域)
坐标系信息通常从数据源获取,但并非总是如此。如果坐标系未知,当尝试向 ArcMap 添加图层时将收到此警告消息:以下添加的数据源缺少空间参考信息。虽然可以在 ArcMap 中绘制这些数据,但不能投影。
如果数据源具有已定义的坐标系,ArcMap 可将其动态投影到不同的坐标系。如果数据没有已定义的坐标系,则 ArcMap 无法将其动态投影。ArcMap 只会进行绘制。如果更改数据框的坐标系,所有具有坐标系的图层都将被动态投影到新坐标系。如果设置数据框的坐标系,并将具有已知坐标系的数据与具有未知坐标系的数据列在一起,则数据框的坐标系为未知数据的坐标系。
以新的空白地图启动 ArcMap,然后添加具有未知坐标系的数据。数据不能具有已定义的坐标系。对于 shapefile,则不能有 PRJ 文件。
右键单击内容列表中的图层名称,单击属性打开图层属性 对话框,选择源选项卡,然后检查数据的范围。 如果范围框中显示的坐标以十进制度数(例如经度介于 -180 和 +180 之间,纬度介于 -90 和 +90 之间)的形式表示,则需要标识用于数据的地理坐标系(基准面)(如北美洲基准面 (NAD) 1927 或 NAD 1983)。 注: 如果数据具有名为 GCS_Assumed_Geographic_1 的坐标系,则这不是数据的正确坐标系。创建 GCS_Assumed_Geographic_1 坐标系定义的目的是允许 ArcMap 使用具有十进制度数坐标的数据的坐标系进行推测。应该为数据确定正确的地理坐标系。
让我们打开arcmap进行直观的查看,即可看到:
坐标参照系统有多种表示方式,常用的有如下几种: EPSG编码值 WKT文本 proj4字符串
SRID、EPSG CODE和WKID分别属于不同组织、公司制定的标识符; 都是用于标识空间参考系统 庆幸的是:三者对同一空间参照系统的ID是一样 SRID、EPSG和WKID 前言 经常接触坐标系的朋友,应该对这三个词并不陌生,那么,SRID、EPSG和WKID到底是什么呢?他们之间又有什么关系和区别呢?结合一些资料和个人理解对其整理一下。
首先了解一下EPSG是什么?
1、EPSG和EPSG CODE EPSG:European Petroleum Survey Group(欧洲石油调查小组)是一个涉及测地学、测量、制图学与石油勘探相关的科学组织,它成立于1986年,并在2005年重组为OGP(Internation Association of Oil & Gas Producers),该组织发布了一个坐标参照系统的数据集,数据集对全球收录到的坐标参照系统进行了编码。
EPSG其实是一个科学组织,它负责发布并维护坐标参照系统的数据集参数,以及坐标转换描述,该数据集被广泛接受并使用,我们常见的例如EPSG:4326是坐标参考系统中常用的一个坐标系编号(ESPG code);
目前很多软件集成了该数据集,利用编码值就可以获得坐标参照系统信息。
用户可以利用epsg.io网站查找坐标参照系统的EPSG编码值(前提是该坐标参照系统已收录到数据集),或查找EPSG编码值对应的坐标参照系统。 查找Xian 1980 / Gauss-Kruger zone 21的EPSG编码值:
常用坐标参照系统的EPSG编码值(地理坐标系统):
坐标参照系统EPSG编码值WGS 1984地理坐标系统4326Beijing 1954地理坐标系统4214Xian 1980地理坐标系统4610CGCS 2000地理坐标系统4490Web墨卡托投影坐标系统3857Beijing 1954高斯—克吕格投影坐标系统(6°分带,加带号)21413~21423(13带~23带)Beijing 1954高斯—克吕格投影坐标系统(6°分带,不加带号)21453~21463(13带~23带)Xian 1980高斯—克吕格投影坐标系统(6°分带,加带号)2327~2337(13带~23带)Xian 1980高斯—克吕格投影坐标系统(6°分带,不加带号)2338~2348(13带~23带)OGC全称Open Geospatial Consortium,自称是一个非盈利的、国际化的、自愿协商的标准化组织,它的主要目的就是制定与空间信息、基于位置服务相关的标准。这些标准就是OGC的“产品”,而这些标准的用处就在于使不同厂商、不同产品之间可以通过统一的接口进行互操作。
在GIS领域,OGC已经是一个比较“官方”的标准化机构了,它不但包括了ESRI、Google、Oracle等业界强势企业作为其成员,同时还和W3C、ISO、IEEE等协会或组织结成合作伙伴关系。因此,OGC的标准虽然并不带有强制性,但是因为其背景和历史的原因,它所制定的标准天然地具有一定的权威性。 所以,我们也可以看到,很多国内的部门或行业要进行地理空间信息的共享或发布时,言必称OGC标准,就和这个原因有关。但是,事实上我们对OGC和OGC标准并不需要盲目崇拜和迷信,从RESTful服务规范的缺失、KML的空降等可以看出来,OGC还是有一些缺失和不足的地方。
SRID(Spatial Reference System Identifier)就是OGC标准中关于空间参考系统标识码
说到OGC的标准,我们再深入了解一下关于标准中WKT的介绍,这样有助于理解另一个概念——WKID 在OGC标准中有一标准是SFS(OpenGIS® Simple Features Interface Standard)-简单要素标准,其中就包括了我们平时所熟知的WKT、WKB,WKT可以描述的几何对象,也可以描述的空间参考;
WKT描述的几何对象 WKT(Well-known Text)可以通过文本来描述几何对象。下面的例子可以比较快速、直观地说明什么是WKT,参考这篇博文:python+gdal读取WKT字符串转为ploygon,关于即可几何信息的WKT字符。
WKT描述的空间参考 GEOGCS[“GCS_WGS_1984”,DATUM[“D_WGS_1984”,SPHEROID[“WGS_1984”,6378137.0,298.257223563]],PRIMEM[“Greenwich”,0.0],UNIT[“Degree”,0.0174532925199433],AUTHORITY[“EPSG”,4326]]
ArcGIS和WKID
在Arcgis 中关于SpatialReference的一段说明,在Arcgis中通过WKID作为坐标参考系统的标识;所以WKID常用于Arcgis二次开发中。例如WKID=4326表示WGS84地理坐标系;那么我们一起打开一个数据的参考进行查看: 对于一个投影坐标系,比如WGS_1984_UTM_Zone_51N坐标系统,arcgis导出成prj文件,然后将其打开,其WKT描述是这样的: PROJCS[“WGS_1984_UTM_Zone_51N”,GEOGCS[“GCS_WGS_1984”,DATUM[“D_WGS_1984”,SPHEROID[“WGS_1984”,6378137.0,298.257223563]],PRIMEM[“Greenwich”,0.0],UNIT[“Degree”,0.0174532925199433]],PROJECTION[“Transverse_Mercator”],PARAMETER[“False_Easting”,500000.0],PARAMETER[“False_Northing”,0.0],PARAMETER[“Central_Meridian”,123.0],PARAMETER[“Scale_Factor”,0.9996],PARAMETER[“Latitude_Of_Origin”,0.0],UNIT[“Meter”,1.0],AUTHORITY[“EPSG”,32651]]
pyproj是一个用于地理坐标转换的Python包。 pyproj的底层是C/C++开发的proj库。proj库最初是由美国地质调查局(USGS)发布,后来,Frank Warmerdam接管了proj的开发工作。
proj4
proj4是一个专门用于坐标系统转换的库,该库定义了坐标系统所涉及的参数。
proj4字符串是用关键字参数赋值方式构建,所有的关键字参数包含在一个字符串中。与WKT CRS相比,proj4字符串比较简短。 使用proj4库可获得关键字参数及参数值的定义。
proj4主要关键字参数 proj4字符串示例: WGS84地理坐标系统,“+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs” Xian 1980 / Gauss-Kruger CM 123E投影坐标系统, “+proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs”
Albers Equal Area Conic投影坐标系统,“+proj=aea +lat_1=25 +lat_2=47 +lat_0=30 +lon_0=105 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs” WGS 1984 Web Mercator投影坐标系统, “+proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +a=6378137 +b=6378137 +units=m +no_defs”
创建CRS对象
CRS模块提供多个函数用于创建CRS对象,包括: from_epsg(),根据epsg编码值创建。 from_wkt(),根据WKT文本创建。 from_proj4(),根据proj4字符串创建。
坐标转换
pyproj包定义了一个Transformer对象用于坐标转换,该对象可以利用Transformer模块中的from_crs(crs_from,crs_to)函数产生。 from_crs(crs_from,crs_to)函数是根据转换前后的crs产生Transformer对象,crs的表示形式可以是EPSG编码值、WKT文本、proj4字符串、CRS对象等。
Transformer对象的transform(y, x)方法是对输入的坐标值进行转换,并返回新的坐标值。注意:y坐标值是在x坐标值之前,如要改变次序,可以在from_crs()函数中设置 always_xy关键词参数为True。
from pyproj import Transformer transformer1 = Transformer.from_crs(4326,2335,always_xy=True) transformer2 = Transformer.from_crs(4326,2346,always_xy=True) p1 = transformer1.transform(121,31) print(p1) p2 = transformer2.transform(121,31) print(p2)21308973.0352913, 3432693.5199542446) (308973.0352912976, 3432693.5199542446) 加带号和不加带号的高斯克吕格投影坐标比较
from pyproj import CRS from pyproj import Transformer f = open("c:/data/china_Albers.prj","r") crs = CRS.from_wkt(f.read()) transformer = Transformer.from_crs(4326,crs,always_xy=True) (x,y) = transformer.transform(120,30) (x,y)(1426604.5260463268, 3282703.477726704)
坐标转换(WGS84坐标到Albers投影坐标)
坐标转换还可以是不同Datum之间,前提是Datum的转换参数是公开的。如Datum的转换参数未知(如西安80、CGCS2000), 转换得到的结果还是原先的坐标值。
from pyproj import Transformer transformer1 = Transformer.from_crs(4326,4214,always_xy=True) transformer2 = Transformer.from_crs(4326,4610,always_xy=True) transformer3 = Transformer.from_crs(4326,4490,always_xy=True) p1 = transformer1.transform(120,30) print(p1) p2 = transformer2.transform(120,30) print(p2) p3 = transformer3.transform(120,30) print(p3)(119.99934171810312, 29.99998311817792) (120.0, 30.0) (120.0, 30.0) Datum转换(WGS84转北京54、西安80和CGCS2000)
投影坐标转换时,如Datum不一致且Datum之间有转换模型,则同时会进行Datum的转换,如WGS84地理坐标转换北京54的高斯投影坐标。
from pyproj import Transformer transformer1 = Transformer.from_crs(4326,21461,always_xy=True) transformer2 = Transformer.from_crs(4214,21461,always_xy=True) p1 = transformer1.transform(120,30) print(p1) p2 = transformer2.transform(120,30) print(p2)210403.8302269213, 3323946.5604410265) (210469.66890351922, 3323964.539102374) WGS84地理坐标和北京54地理坐标转北京54高斯投影坐标
前面介绍了什么是空间参考,什么是坐标系; 那么我们在实际操作的时候,应该如何判定数据是否一致呢?
除了前面说的,我们可以在arcmap的图层上右键属性的 source里面,查看并核实数据的坐标系,同时也可以在extent的范围进行查看两个数据的上下范围是否一致;
我们可以利用pyproj包的Transformer对象、CRS对象进行地理坐标转换,同时也能利用arcmap进行这些操作,实现简单的不用写代码即可实现这些操作; 那么我们就来简单介绍介绍,arcgis的坐标转换的工具箱:
覆盖与数据集一同存储的坐标系信息(地图投影和基准面)。此工具用于坐标系未知或定义错误的数据集。 所有地理数据集均具有一个用于显示、测量和转换地理数据的坐标系,此坐标系在 ArcGIS 中使用。如果某一数据集的坐标系未知或不正确,您可以使用此工具来指定正确的坐标系。使用此工具前,您必须已获知该数据集的正确坐标系。
用法: 此工具最常见的用途是为具有未知坐标系(即,在数据集属性中坐标系为“未知”)的数据集指定一个已知坐标系。另一个用途是为没有正确定义坐标系(例如,坐标以 UTM 米为单位,而坐标系则定义为地理坐标系)的数据集指定正确的坐标系。 将具有已知坐标系的数据集输入此工具时,此工具将显示警告信息,但仍将成功执行。 地理数据库要素数据集中的所有要素类将使用同一个坐标系。对于地理数据库数据集而言,应在其创建时确定坐标系。数据集包含要素类之后,其坐标系将无法更改。
创建用于 模型构建器 的空间参考。
用法 可使用已设置的坐标系、空间域和精度创建空间参考。要进一步修改输出空间参考的空间域和精度,可使用 XY 值域、Z 值域、M 值域、XY 值域模板和 XY 值域增长百分比参数。 XY 值域模板所在的坐标系不必与空间参考或空间参考模板中所指定的坐标系相同。如果两个坐标系不同,则会对范围进行投影以使其相互匹配。 如果空间参考和空间参考模板参数均已设置,则空间参考参数具有较高的优先级。 此工具的所有参数均为可选设置。如果未指定任何参数,空间参考将被定义为“未知”,而 XY 值域则将采用标准默认设置。 在 模型构建器 中,可使用空间参考参数(如创建要素类、创建要素数据集和创建 XY 事件图层)将此工具的输出用作工具的输入。
投影:将空间数据从一种坐标系投影到另一种坐标系。 如果数据是同一个椭球体的数据,那么我们可以直接对其进行投影转换即可。 但是 如果我们的数据是 需要两个不同平面坐标系数据需要相互转换的话,我们需要先定义一个自定义地理变化,来完成转换操作;然后在进行投影即可,这时候就用到了Create Custom Geographic Transformation这个工具;
注:上述的两个工具是对矢量数据或者 地理数据库中的 feature class进行操作的;
如果需要对栅格数据进行操作,那么我们可以利用 project raster进行操作; 投影栅格:将栅格转换为新的投影。这将创建新的栅格。要应用变换而不创建新文件,请使用扭曲工具。
总结:由于坐标系的知识,本身比较难于理解,小编这里也是根据自己的理解,对EPSG和OGC的标准的 空间参考,以及我们怎么平常做数据处理的时候,如何去区分和判别是否是数据源的问题,进行一个基础应用层面的一个分享,希望对空间参考不太理解的小伙伴提供一个借鉴;
文中如若有错误,可以在下面留言,小编会及时更正。