空间参考

我们用 协调 ,以一定精度精确定位地图上特定位置的数字元组。但是仅仅知道坐标是不够的,你需要知道如何解释它们。

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 水平基准面 测量地球上的位置。由于地球不是一个完美的球体,甚至不是一个完美的椭球体,因此通常设计特定的基准来近似于特定区域的地球形状。常用基准包括 WGS84NAD863 在北美,以及 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支架 egm84egm96egm2008 . 像这样使用:

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度跨度定义——超出此范围的值可能会失败!