OGRSpatialReference 是 GDAL/OGR 库中的一个重要类,用于管理和操作地理空间数据的空间参考系统(Spatial Reference System,SRS)。它提供了一系列功能,允许用户定义、查询、解析和转换地理空间数据的坐标系统和投影信息
Public Functions
int GetAxesCount() const
返回 CRS 坐标系的轴数
// 定义一个 WGS 84 经纬度坐标系的WKT字符串
const char* wktString = "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]]";
// 创建一个 OGRSpatialReference 对象,并从WKT字符串中导入空间参考系统
OGRSpatialReference srs;
srs.importFromWkt(&wktString);
// 获取空间参考系统中坐标轴的数量
int axesCount = srs.GetAxesCount();
// 输出坐标轴的数量
printf("坐标轴的数量:%d\n", axesCount);
const char *GetAxis(const char *pszTargetKey, int iAxis, OGRAxisOrientation *peOrientation, double *pdfConvFactor = nullptr) const
获取一个轴的方向
参数:
pszTargetKey -- 要查询的坐标系部分(“PROJCS”或“GEOGCS”)。
iAxis -- 要查询的轴(0 表示第一个,1 表示第二个,2 表示第三个)。
peOrientation——放置获取方向的位置,可能为 NULL。
pdfConvUnit -- (GDAL >= 3.4) 放置轴转换因子的位置。可能为空。仅当 pszTargetKey == NULL 时才设置
返回: 失败时轴的名称或 NULL
// 定义一个 WGS 84 经纬度坐标系的WKT字符串
const char* wktString = "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]]";
// 创建一个 OGRSpatialReference 对象,并从WKT字符串中导入空间参考系统
OGRSpatialReference srs;
srs.importFromWkt(&wktString);
// 获取指定坐标轴的信息
const char* targetKey = "GEOGCS";
int axisIndex = 0; // 纬度的索引为0,经度的索引为1
OGRAxisOrientation orientation;
double convFactor;
const char* axisInfo = srs.GetAxis(targetKey, axisIndex, &orientation, &convFactor);
if (axisInfo != nullptr) {
printf("指定坐标轴的信息:%s\n", axisInfo);
printf("坐标轴的方向:%s\n", (orientation == OAO_East || orientation == OAO_North) ? "正向" : "反向");
printf("坐标轴的转换因子:%f\n", convFactor);
} else {
printf("未找到指定坐标轴的信息。\n");
}
OGRErr SetAxes(const char *pszTargetKey, const char *pszXAxisName, OGRAxisOrientation eXAxisOrientation, const char *pszYAxisName, OGRAxisOrientation eYAxisOrientation )
设置坐标系的轴
设置投影 (PROJCS) 或地理 (GEOGCS) 坐标系的名称和轴方向
参数:
pszTargetKey - “PROJCS”或“GEOGCS”,必须已经存在于SRS中。
pszXAxisName -- 第一个轴的名称,通常为“长”或“东”。
eXAxisOrientation——通常OAO_East。
pszYAxisName -- 第二个轴的名称,通常为“纬度”或“北”。
eYAxisOrientation——通常OAO_North。
返回: OGRERR_NONE成功或错误代码
// 创建一个空的 OGRSpatialReference 对象
OGRSpatialReference srs;
// 设置地理坐标系的坐标轴信息
const char* targetKey = "GEOGCS";
const char* xAxisName = "Longitude";
OGRAxisOrientation xAxisOrientation = OAO_East; // 东经方向为正向
const char* yAxisName = "Latitude";
OGRAxisOrientation yAxisOrientation = OAO_North; // 北纬方向为正向
OGRErr err = srs.SetAxes(targetKey, xAxisName, xAxisOrientation, yAxisName, yAxisOrientation);
OSRAxisMappingStrategy GetAxisMappingStrategy() const
将数据轴返回到 CRS 轴映射策略
返回: 数据轴到 CRS 轴映射策略
// 定义一个 WGS 84 经纬度坐标系的WKT字符串
const char* wktString = "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]]";
// 创建一个 OGRSpatialReference 对象,并从WKT字符串中导入空间参考系统
OGRSpatialReference srs;
srs.importFromWkt(&wktString);
// 获取坐标轴映射策略
OSRAxisMappingStrategy axisMappingStrategy = srs.GetAxisMappingStrategy();
// 输出坐标轴映射策略
switch (axisMappingStrategy) {
case OAMS_TRADITIONAL_GIS_ORDER:
printf("坐标轴映射策略:传统GIS顺序\n");
break;
case OAMS_AUTHORITY_COMPLIANT:
printf("坐标轴映射策略:符合权威机构要求\n");
break;
case OAMS_AUTO_COMPLIANT:
printf("坐标轴映射策略:自动符合\n");
break;
case OAMS_NONE:
printf("坐标轴映射策略:无映射\n");
break;
default:
printf("未知的坐标轴映射策略\n");
break;
}
void SetAxisMappingStrategy(OSRAxisMappingStrategy)
将数据轴设置为 CRS 轴映射策略
// 定义一个 WGS 84 经纬度坐标系的WKT字符串
const char* wktString = "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]]";
// 创建一个 OGRSpatialReference 对象,并从WKT字符串中导入空间参考系统
OGRSpatialReference srs;
srs.importFromWkt(&wktString);
// 设置坐标轴映射策略为符合权威机构要求
srs.SetAxisMappingStrategy(OAMS_AUTHORITY_COMPLIANT);
// 导出设置后的空间参考系统的WKT格式字符串并打印
char* srsWKT = NULL;
srs.exportToWkt(&srsWKT);
printf("设置后的空间参考系统:\n%s\n", srsWKT);
// 释放内存,避免内存泄漏
CPLFree(srsWKT);
OSRAxisMappingStrategy
是一个枚举类型,用于表示坐标轴映射策略。在 GDAL/OGR 中,OSRAxisMappingStrategy
定义了以下几种枚举值:
OAMS_TRADITIONAL_GIS_ORDER
:传统GIS顺序,通常用于传统GIS软件。即 X 轴(经度)在前,Y 轴(纬度)在后。
OAMS_AUTHORITY_COMPLIANT
:符合权威机构要求,通常用于符合权威机构标准的坐标系统。具体顺序和要求可能由权威机构定义。
OAMS_AUTO_COMPLIANT
:自动符合,表示由库自动选择符合要求的坐标轴顺序。通常情况下,如果空间参考系统包含了权威机构规定的坐标轴顺序,则会自动采用符合要求的顺序。
OAMS_NONE
:无映射,表示坐标轴没有进行映射。这种情况下,坐标轴的顺序可能是不确定的,需要用户自己确认。
OGRErr SetLinearUnitsAndUpdateParameters(const char *pszName, double dfInMeters, const char *pszUnitAuthority = nullptr, const char *pszUnitCode = nullptr)
设置投影的线性单位
参数:
pszName -- 要使用的单位名称。一些首选单位名称可以在 ogr_srs_api.h 中找到,例如 SRS_UL_METER、SRS_UL_FOOT 和 SRS_UL_US_FOOT。
dfInMeter -- 以指示单位转换为米的长度的倍数。一些标准换算系数可以在ogr_srs_api.h中找到。
pszUnitAuthority -- 单位授权名称。或空
pszUnitCode -- 单位代码。或空
返回: OGRERR_NONE成功
// 创建一个空的 OGRSpatialReference 对象
OGRSpatialReference srs;
// 设置线性单位为“米”(meters),并更新相关参数
const char* unitName = "Meter";
double unitInMeters = 1.0; // 1 米
const char* unitAuthority = "EPSG"; // 单位的权威机构(EPSG)
const char* unitCode = "9001"; // 单位的代码(EPSG代码:9001代表Meter)
OGRErr err = srs.SetLinearUnitsAndUpdateParameters(unitName, unitInMeters, unitAuthority, unitCode);
if (err == OGRERR_NONE) {
printf("线性单位设置成功!\n");
// 导出设置后的空间参考系统的WKT格式字符串并打印
char* srsWKT = NULL;
srs.exportToWkt(&srsWKT);
printf("设置后的空间参考系统:\n%s\n", srsWKT);
// 释放内存,避免内存泄漏
CPLFree(srsWKT);
} else {
printf("线性单位设置失败!\n");
}
double GetLinearUnits(char**) const
获取线性投影单位
参数:
ppszName -- 要用指向设备名称的指针更新的指针。返回的值保留在 OGRSpatialReference 的内部,不应释放或修改。它可能在下一次 OGRSpatialReference 调用时失效。
返回: 乘以线性距离以将其转换为米的值
// 定义一个 WGS 84 经纬度坐标系的WKT字符串
const char* wktString = "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]]";
// 创建一个 OGRSpatialReference 对象,并从WKT字符串中导入空间参考系统
OGRSpatialReference srs;
srs.importFromWkt(&wktString);
// 获取空间参考系统中线性单位的值
double linearUnits = srs.GetLinearUnits();
// 输出线性单位的值
printf("线性单位的值:%f\n", linearUnits);
OGRErr SetAngularUnits(const char *pszName, double dfInRadians)
设置地理坐标系的角度单位
参数:
pszName -- 要使用的单位名称。一些首选单位名称可以在 ogr_srs_api.h 中找到,例如 SRS_UA_DEGREE。
dfInRadians -- 以指示单位转换为弧度的角度的倍数。一些标准换算系数可以在ogr_srs_api.h中找到。
返回: OGRERR_NONE成功
// 创建一个空的 OGRSpatialReference 对象
OGRSpatialReference srs;
// 设置角度单位为“度”(degree),并更新相关参数
const char* unitName = "Degree";
double unitInRadians = CPLAtof(SRS_UA_DEGREE_CONV);
OGRErr err = srs.SetAngularUnits(unitName, unitInRadians);
double GetAngularUnits(char**) const
获取角度地理坐标系单位
参数:
ppszName -- 要用指向设备名称的指针更新的指针。返回的值保留在 OGRSpatialReference 的内部,不应释放或修改。它可能在下一次 OGRSpatialReference 调用时失效。
返回: 乘以角距离以将其转换为弧度的值
// 定义一个 WGS 84 经纬度坐标系的WKT字符串
const char* wktString = "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]]";
// 创建一个 OGRSpatialReference 对象,并从WKT字符串中导入空间参考系统
OGRSpatialReference srs;
srs.importFromWkt(&wktString);
// 获取空间参考系统中的角度单位
double angularUnits = srs.GetAngularUnits();
// 输出角度单位的值
printf("角度单位的值:%f\n", angularUnits);
double GetPrimeMeridian(char**) const
获取本初子午线信息
参数:
ppszName -- 返回本初子午线名称的位置。如果为 NULL,则不返回名称。
返回: 从格林威治到GEOGCS本初子午线的偏移量(以十进制度为单位)
// 定义一个 WGS 84 经纬度坐标系的WKT字符串
const char* wktString = "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]]";
// 创建一个 OGRSpatialReference 对象,并从WKT字符串中导入空间参考系统
OGRSpatialReference srs;
srs.importFromWkt(&wktString);
// 获取空间参考系统中的本初子午线
double primeMeridian = srs.GetPrimeMeridian();
// 输出本初子午线的值
printf("本初子午线的值:%f\n", primeMeridian);
bool IsEmpty() const
如果未设置 SRS,则返回
int IsGeographic() const
返回: 如果此空间参考是地理参考,则为 TRUE
int IsProjected() const
返回: 如果包含指示投影坐标系的 PROJCS 节点,则为 TRUE
int IsGeocentric() const
检查地心坐标系
返回: 如果它包含一个指示它是地心坐标系的 GEOCCS 节点,则为 TRUE
int IsLocal() const
检查是否为局部坐标系
返回: 如果此空间参考是局部的,则为 TRUE...即根是LOCAL_CS节点
int IsVertical() const
检查是否垂直坐标系
返回: 如果它包含一个指示它是垂直坐标系的VERT_CS节点,则为 TRUE
int IsCompound() const
检查坐标系是否为复合坐标系