空间参考¶
我们用 协调 ,以一定精度精确定位地图上特定位置的数字元组。但是仅仅知道坐标是不够的,你需要知道如何解释它们。
A 空间参考 (SRS)将一组坐标映射到地球上相应的真实位置。
例如,给定地球上某个位置的坐标:
(-121.5, 36.8, 2000.0)
这些数字没有意义,除非你知道如何使用它们。所以结合一些参考信息:
Coordinate System Type: Geographic
Units: Degrees
Horizontal datum: WGS84
Vertical datum: EGM96
现在您可以精确地计算出点在地球上的位置,它相对于其他点的位置,以及如何将其转换为其他表示。
SRS的部件¶
A 空间参考 或 SRS ,包含:
坐标系类型¶
OSGerath支持三种基本坐标系类型:
地理的 -一个完整的地球,椭球体模型。坐标是球面角 度 (经度和纬度)。示例包括WGS84和NAD83。 (Learn more )
预计 -局部坐标系将地球的一个有限区域“投影”成一个二维笛卡尔(x,y)平面。示例包括UTM、美国国家飞机和墨卡托。 (Learn more )
ECEF -整个地球,笛卡尔系统。ecef=以地球为中心的固定地球;它是一个三维笛卡尔系统(x,y,z),原点(0,0,0)位于地球中心;x轴与lat/long相交(0,0),y轴与lat/long相交(0,-90),z轴与北极相交。ECEF是本机系统,OSGerath在其中呈现图形。 (Learn more )
水平基准面¶
A 资料 是进行地理空间测量的参考点(或一组点)。地球上相同的位置可能有不同的坐标,这取决于使用的基准。有两类数据:
A 水平基准面 测量地球上的位置。由于地球不是一个完美的球体,甚至不是一个完美的椭球体,因此通常设计特定的基准来近似于特定区域的地球形状。常用基准包括 WGS84 和 NAD863 在北美,以及 ERT899 在欧洲。
垂直基准面¶
A 垂直基准 测量高程。有几种垂直基准;Osgerath支架 大地测量学 (基于椭球)和 大地水准面 (基于地球周围的一组高程点样本)。
Osgerath内置以下垂直基准:
大地测量-默认值;osgerath使用水平基准椭球作为参考
EGM84大地水准面
EGM96大地水准面-通常称为 MSL ;用于DTED和KML
EGM2008大地水准面
默认情况下,osgearth中的srs使用 大地测量学 垂直基准面;即高度测量为“高于椭球体的高度(HAE)”。
投影¶
A 投影 SRS还将具有 投影 . 这是将椭球体上的点转换为二维平面(和背面)的数学公式。
OSGerath支持数千个已知的预测(通过GDAL/OGR工具包)。值得注意的是:
通用横轴墨卡托
立体图
LCC(兰伯特保形圆锥曲线)
每一种都具有特定的特性,使其适合某些类型的应用。请看 Map Projections 在维基百科上了解更多。
SRS表示¶
定义SRS有很多种方法。Osgearth支持以下功能。
WKT(众所周知的文本)¶
WKT是描述坐标系的OGC标准。它通常位于一个“.prj”文件中,旁边是一段地理空间数据,如形状文件或图像。
这是WKT代表 UTM 15N区 投影::
PROJCS["NAD_1983_UTM_Zone_15N",
GEOGCS["GCS_North_American_1983",
DATUM["D_North_American_1983",
SPHEROID["GRS_1980",6378137.0,298.257222101]],
PRIMEM["Greenwich",0.0],
UNIT["Degree",0.0174532925199433]],
PROJECTION["Transverse_Mercator"],
PARAMETER["False_Easting",500000.0],
PARAMETER["False_Northing",0.0],
PARAMETER["Central_Meridian",-93.0],
PARAMETER["Scale_Factor",0.9996],
PARAMETER["Latitude_Of_Origin",0.0],
UNIT["Meter",1.0]]
项目4¶
项目4 是一个地图投影工具包,由OSGerath和数百个其他地理空间应用程序和工具包使用。它有一个简短的重复描述SRS。这是上面相同的SRS,这次是PROJ4格式:
+proj=utm +zone=15 +ellps=GRS80 +units=m +no_defs
Proj4具有所有公共组件(如UTM区域和基准)的数据表,因此您不必像使用WKT那样显式定义所有内容。
EPSG代码¶
EPSG(现在已经解散的欧洲石油调查集团)建立了一个数字代码表,用于参考众所周知的预测。你可以浏览那里的列表 here . Osgearth将接受EPSG代码;对于上面的示例:
epsg:26915
如果你知道EPSG代码,这是一个很好的速记方式来表达它。OSGerath要求的OGR/PROJ4包括一个大的EPSG代码表。
别名¶
最后一类是 命名的SRS . 有一些SRS非常常见,所以我们为它们提供了速记符号。其中包括:
- WGS84
世界地理调查1984年地理系统
- 球形墨卡托
球面墨卡托(常用于网页绘图系统)
- 平板车
wgs84投影平面(x=经度,y=纬度)
在OSGerath中使用空间参考¶
OSGearth中有几种方法可以使用SRS,但最简单的方法是使用 GeoPoint
类。不过,让我们先看一下创建一个SRS,然后继续学习这个类。
空间引用API¶
这个 SpatialReference
类表示一个SRS。OSGerath中的许多类和函数都需要一个SRS。以下是在代码中创建的方法:
const SpatialReference* srs = SpatialReference::get("epsg:4326");
那会给你一个SRS。这个 get()
函数将接受我们上面讨论的任何SRS表示:wkt、proj4、epsg或别名。
如果需要具有垂直基准的SRS,请将其表示为第二个参数。Osgearth支架 egm84
, egm96
和 egm2008
. 像这样使用:
srs = SpatialReference::get("epsg:4326", "egm96");
有时也可以访问SRS的组件类型。例如,每个 投影 SRS有基础 地理的 它基于的SRS。您可以通过以下方式获得:
geoSRS = srs->getGeographicSRS();
如果要将投影点转换为纬度/经度,则需要输出SRS。
您还可以获取与任何SRS对应的地心(ECEF)SRS,如:
geocentricSRS = srs->getGeocentricSRS();
SpatialReference
有很多用于转换等的函数。有关这些函数的信息,请参阅头文件。但在实践中,最好使用 GeoPoint
而不是使用 SpatialReference
直接。
地理点API¶
A GeoPoint
是地理参照的二维或三维点。(“georeferenced”表示坐标值与SRS配对-这意味着在地图上绘制该点所需的所有信息都是独立的。)还有其他“geo”类,包括 GeoExtent
(边界框)和 GeoCircle
(一个边界圆)。
下面是如何创建二维 GeoPoint
::
GeoPoint point(srs, x, y);
也可以创建三维 GeoPoint
海拔高度:
GeoPoint point(srs, x, y, z, ALTMODE_ABSOLUTE);
这个 ALTMODE_ABSOLUTE
是 高度模式 ,并且在指定三维坐标时需要:
ALTMODE_ABSOLUTE
Z是相对于SRS的垂直基准,即高于椭球体的高度或高于大地水准面的高度。
ALTMODE_RELATIVE
Z是相对于点下地形的高度。
现在你有了你的 GeoPoint
您可以对其进行转换。假设要将其转换为另一个SRS::
GeoPoint point(srs, x, y);
GeoPoint newPoint = point.transform(newSRS);
下面是一个更具体的例子。假设您在经度/纬度(wgs84)中有一个点,您需要在UTM区域15N中表示它:
const SpatialReference* wgs84 = SpatialReference::get("wgs84");
const SpatialReference* utm15 = SpatialReference::get("+proj=utm +zone=15 +ellps=GRS80 +units=m");
...
GeoPoint wgsPoint( wgs84, -93.0, 34.0 );
GeoPoint utmPoint = wgsPoint.transform( utm15 );
if ( utmPoint.isValid() )
// do something
总是检查 isValid()
因为不是一个SRS中的每个点都可以转换成另一个SRS。例如,UTM区域15仅为经度的6度跨度定义——超出此范围的值可能会失败!