OGRSpatialReference 是 GDAL/OGR 库中的一个重要类,用于管理和操作地理空间数据的空间参考系统(Spatial Reference System,SRS)。它提供了一系列功能,允许用户定义、查询、解析和转换地理空间数据的坐标系统和投影信息
Public Functions
OGRErr SetFromUserInput(const char*)
从各种文本格式设置空间参考
参数:
pszDefinition -- 尝试从中推断出 SRS 的文本定义。
返回: 成功时OGRERR_NONE,或者如果无法识别名称、定义已损坏或无法成功查找 EPSG 值,则为错误代码
// 创建一个 OGRSpatialReference 对象
OGRSpatialReference srs;
// 定义一个字符串,包含空间参考系统的信息
const char* user_input = "+proj=utm +zone=48 +datum=WGS84 +units=m +no_defs";
// 使用 SetFromUserInput() 函数设置空间参考系统
OGRErr result = srs.SetFromUserInput(user_input);
OGRErr SetTOWGS84(double, double, double, double = 0.0, double = 0.0, double = 0.0, double = 0.0)
将Bursa-Wolf转换设置为 WGS84 这将创建 TOWGS84 节点作为基准面的子节点
参数:
dfDX -- X 子级,单位为米。
dfDY -- 以米为单位的 Y 孩子。
dfDZ -- Z 子级,单位为米。
dfEX -- X 以弧秒为单位旋转(可选,默认为零)。
dfEY -- 以弧秒为单位的 Y 旋转(可选,默认为零)。
dfEZ -- Z 旋转(以弧秒为单位)(可选,默认为零)。
dfPPM -- 比例因子(百万分之一)。
返回: OGRERR_NONE成功
// 创建一个 OGRSpatialReference 对象
OGRSpatialReference srs;
// 设置空间参考系统的转换参数到 WGS 84
double dx = -84.0;
double dy = -97.0;
double dz = -119.0;
double ex = 0.0;
double ey = 0.0;
double ez = 0.0;
double ppm = 0.0;
OGRErr result = srs.SetTOWGS84(dx, dy, dz, ex, ey, ez, ppm);
OGRErr GetTOWGS84(double *padfCoef, int nCoeff = 7) const
获取 TOWGS84 参数(如果可用)
参数:
padfCoeff -- 最多放置 7 个系数的数组。
nCoeffCount -- padfCoeff 的大小 - 默认为 7。
返回: 成功时OGRERR_NONE,如果没有可用的 TOWGS84 节点,则OGRERR_FAILURE
// 创建一个 OGRSpatialReference 对象
OGRSpatialReference srs;
// 设置空间参考系统的转换参数到 WGS 84
double dx = -84.0;
double dy = -97.0;
double dz = -119.0;
double ex = 0.0;
double ey = 0.0;
double ez = 0.0;
double ppm = 0.0;
srs.SetTOWGS84(dx, dy, dz, ex, ey, ez, ppm);
// 获取空间参考系统的转换参数
double transformationParams[7];
OGRErr result = srs.GetTOWGS84(transformationParams, 7);
OGRErr AddGuessedTOWGS84()
尝试将 3 参数或 7 参数 Helmert 变换添加到 WGS84
返回: 成功时OGRERR_NONE,失败时错误代码(CRS 已转换为 WGS84 或找不到匹配项)
// 创建一个 OGRSpatialReference 对象
OGRSpatialReference srs;
// 定义一个字符串,包含空间参考系统的信息
const char* user_input = "+proj=utm +zone=48 +datum=WGS84 +units=m +no_defs";
// 使用 SetFromUserInput() 函数设置空间参考系统
OGRErr result = srs.SetFromUserInput(user_input);
// 检查是否设置成功
if (result != OGRERR_NONE) {
printf("空间参考系统设置失败!\n");
return 1;
}
// 尝试添加转换参数
OGRErr guessResult = srs.AddGuessedTOWGS84();
double GetSemiMajor(OGRErr* = nullptr) const
获取椭球体半长轴(以米为单位,从 GDAL 3.0 开始)
// 创建一个 OGRSpatialReference 对象
OGRSpatialReference srs;
// 定义一个字符串,包含空间参考系统的信息
const char* user_input = "+proj=utm +zone=48 +datum=WGS84 +units=m +no_defs";
// 使用 SetFromUserInput() 函数设置空间参考系统
OGRErr result = srs.SetFromUserInput(user_input);
// 获取椭球体的长半轴值
OGRErr err;
double semiMajor = srs.GetSemiMajor(&err);
double GetSemiMinor(OGRErr* = nullptr) const
获取球体短半轴
参数:
pnErr -- 如果非 NULL 设置为 OGRERR_FAILURE 如果可以找到半短轴。
返回: 短半轴,或 WGS84 半小轴(如果找不到)
double GetInvFlattening(OGRErr* = nullptr) const
获得球面逆平坦化
double GetEccentricity() const
返回: 偏心率(或错误时为 -1)
double GetSquaredEccentricity() const
获得椭球体平方偏心率
返回:偏心率平方(或误差时为 -1)
int GetEPSGGeogCS() const
获取此坐标系 GEOGCS 的 EPSG 代码
返回: EPSG 代码
// 获取地理坐标系的 EPSG 代码
int epsgCode = srs.GetEPSGGeogCS();
地理坐标系的 EPSG 代码为: 4326
const char *GetAuthorityCode(const char *pszTargetKey) const
获取节点的颁发机构代码
参数:
pszTargetKey -- 要从中获取权限的节点的部分或完整路径。即“PROJCS”、“GEOGCS”、“GEOGCS|UNIT“或 NULL 以搜索根元素上的颁发机构节点。
返回: 来自授权节点的值代码,或失败时为 NULL。返回的值是内部值,不应释放或修改
// 获取地理坐标系的标识代码
const char* authorityCode = srs.GetAuthorityCode("GEOGCS");
地理坐标系的标识代码为: EPSG:4326
const char *GetAuthorityName(const char *pszTargetKey) const
获取节点的颁发机构名称
参数:
pszTargetKey -- 要从中获取权限的节点的部分或完整路径。即“PROJCS”、“GEOGCS”、“GEOGCS|UNIT“或 NULL 以搜索根元素上的颁发机构节点。
返回: 来自授权节点的值代码,或失败时为 NULL。返回的值是内部值,不应释放或修改
bool GetAreaOfUse(double *pdfWestLongitudeDeg, double *pdfSouthLatitudeDeg, double *pdfEastLongitudeDeg, double *pdfNorthLatitudeDeg, const char **ppszAreaName) const
返回 CRS 的使用区域
参数:
pdfWestLongitudeDeg -- 指向双精度的指针,用于接收最西端的经度,以度数表示。可能为空。如果返回值为 -1000,则边界框未知。
pdfSouthLatitudeDeg -- 指向双精度的指针,用于接收最南端的纬度,以度数表示。可能为空。如果返回值为 -1000,则边界框未知。
pdfEastLongitudeDeg -- 指向双精度的指针,用于接收最东端的经度,以度数表示。可能为空。如果返回值为 -1000,则边界框未知。
pdfNorthLatitudeDeg -- 指向接收最北纬度的双精度的指针,以度表示。可能为空。如果返回值为 -1000,则边界框未知。
ppszAreaName -- 指向用于接收使用区域名称的字符串的指针。可能为空。请注意,*ppszAreaName 的生存期很短,可能会因进一步的调用而失效。
返回: 在成功的情况下为真
// 定义变量用于接收使用范围信息
double westLongitude, southLatitude, eastLongitude, northLatitude;
const char* areaName;
// 获取使用范围信息
bool success = srs.GetAreaOfUse(&westLongitude, &southLatitude, &eastLongitude, &northLatitude, &areaName);
// 检查是否获取成功
if (success) {
printf("使用范围信息:\n");
printf("西边界经度: %.6f\n", westLongitude);
printf("南边界纬度: %.6f\n", southLatitude);
printf("东边界经度: %.6f\n", eastLongitude);
printf("北边界纬度: %.6f\n", northLatitude);
printf("使用范围名称: %s\n", areaName);
} else {
printf("获取使用范围信息失败!\n");
}
OGRErr SetProjParm(const char*, double)
设置投影参数值 在 PROJCS 下添加一个具有指示名称和值的新参数
参数:
pszParamName -- 参数名称,应从 ogr_srs_api.h 中的宏中选择,例如 SRS_PP_CENTRAL_MERIDIAN。
dfValue -- 要分配的值。
返回: OGRERR_NONE成功
// 创建一个 OGRSpatialReference 对象
OGRSpatialReference srs;
// 设置投影坐标系为 Transverse Mercator 投影
srs.SetUTM(48, TRUE);
// 设置投影坐标系的中央经线参数值为 80.0 度
OGRErr result = srs.SetProjParm("central_meridian", 80.0);
double GetProjParm(const char*, double = 0.0, OGRErr* = nullptr) const
获取投影参数值
参数:
pszName -- 要从 ogr_srs_api.h 中的SRS_PP代码集中获取的参数的名称。
dfDefaultValue -- 此参数不存在时要返回的值。
pnErr -- 在失败时放置错误代码的位置。如果为 NULL,则忽略。
返回: 参数的值
OGRErr SetNormProjParm(const char*, double)
使用归一化值设置投影参数
参数:
pszName -- 参数名称,应从 ogr_srs_api.h 中的宏中选择,例如 SRS_PP_CENTRAL_MERIDIAN。
dfValue -- 要分配的值。
返回: OGRERR_NONE成功
// 创建一个 OGRSpatialReference 对象
OGRSpatialReference srs;
// 设置投影坐标系为 Transverse Mercator 投影
srs.SetUTM(48, TRUE);
// 设置投影坐标系的中央经线参数值为 80.0 度
OGRErr result = srs.SetProjParm("central_meridian", 80.0);
在地理空间数据处理中,"归一化"或者说"标准化"是指将数据转换为统一的标准范围或单位,以便于比较、分析和处理。地理空间数据通常来自不同的数据源、采用不同的投影、坐标系统或单位,因此其数值范围和表示方式可能有很大的差异。归一化的目的是消除这些差异,使得数据在不同数据源之间可以进行有效的比较和分析。
double GetNormProjParm(const char*, double = 0.0, OGRErr* = nullptr) const
获取归一化投影参数值
参数:
pszName -- 要从 ogr_srs_api.h 中的SRS_PP代码集中获取的参数的名称。
dfDefaultValue -- 此参数不存在时要返回的值。
pnErr -- 在失败时放置错误代码的位置。如果为 NULL,则忽略。
返回: 参数的值
// 创建一个 OGRSpatialReference 对象
OGRSpatialReference srs;
// 设置投影坐标系为 Transverse Mercator 投影
srs.SetUTM(48, TRUE);
// 设置投影坐标系的中央经线参数值为 80.0 度
OGRErr result = srs.SetProjParm("central_meridian", 80.0);