添加头文件
gdal库在处理矢量文件的时候,需要引入ogrsf_frmts.h
头文件,要是需要处理空间参考系统,主要指定义坐标系,修改坐标系操作,那我们就得引入ogr_srs_api.h
头文件了,SRS指的是Spatial Reference System,这个SRS包括三个部分,分别是坐标系统、基准面、投影,这些部分相互关联,共同定义了地理数据的位置和形状。
-
坐标系统(Coordinate System):坐标系统定义了地理数据的坐标表示方法,包括坐标轴的方向、单位以及原点的位置。常见的坐标系统包括经纬度坐标系统和投影坐标系统。
-
基准面(Datum):基准面是用于测量和表示地球表面形状和位置的基准。它定义了地理数据的原点、参考椭球体以及与地球的相对位置。常见的基准面包括WGS84、NAD83等。
-
投影(Projection):投影是将地球表面的三维坐标投影到平面上的方法。地球是一个三维的椭球体,为了在平面地图上准确表示地理位置,需要使用投影将地球表面的曲线投影为平面上的直线或曲线。
获取shp文件
GDALAllRegister();
GDALDataset* poDS = static_cast<GDALDataset*>(GDALOpenEx(shp_file, GDAL_OF_VECTOR, NULL, NULL, NULL));
//判断文件是否打开
if (poDS == NULL) {
printf("create dataset failed\n");
exit(1);
}
GDALOpenEx()
函数返回一个GDALDataset*
类型的指针,因此我们可创建一个GDALDataset*
类型变量poDS
,GDALOpenEx()
的输入参数分别是“文件路径、文件类型、驱动选项(一般默认NULL即可)、打开数据层次水平选项(一般也默认NULL即可)、辅助字符串(一般也默认NULL即可)”,倘如获取失败,返回NULL
。
获取图层坐标系信息
// 获取第一个图层
OGRLayer* poLayer = poDS->GetLayer(0);
if (poLayer == nullptr) {
printf("无法获取图层\n");
exit(1);
}
// 获取图层的坐标系
OGRSpatialReference* poSpatialRef = poLayer->GetSpatialRef();
//判断获取空间参考是否成功
if (poSpatialRef == nullptr) {
printf("无法获取坐标系\n");
exit(1);
}
使用GetSpatialRef()
函数获取图层空间参考信息,这个函数返回值是OGRSpatialReference*
类型,因此我们引入这个类型的变量 poSpatialRef
,倘如获取失败,返回NULL
。
输出坐标信息
// 输出坐标系信息
char* pszWKT = nullptr;
poSpatialRef->exportToWkt(&pszWKT);
printf("坐标系信息:\n%s\n", pszWKT);
// 释放资源
CPLFree(pszWKT);
GDALClose(poDS);
我们要使用exportToWkt()
函数将坐标信息转换成wkt文本,至于为什么要引入wkt文本呢?这是因为在 GDAL(Geospatial Data Abstraction Library)库中引入 Well-Known Text(WKT)类型数据是为了方便地表示和传输空间参考系统(Spatial Reference System,SRS)信息。WKT 是一种用文本形式表示空间参考系统的标准格式,它能够准确描述坐标系统、基准面和投影等信息。
引入 WKT 类型数据的好处包括:
-
标准化:WKT 是一种标准格式,能够统一表示各种空间参考系统的信息,便于不同系统之间的交换和共享。
-
可读性:WKT 使用文本形式表示空间参考系统,易于阅读和理解。这使得在程序中使用 WKT 格式的 SRS 信息更加直观和方便。
-
轻量级:WKT 格式的数据相对于其他二进制格式的 SRS 数据来说更加轻量级,便于存储和传输。
需要注意这个exportToWkt()
的传入参数是一个二级指针,最后别忘了把资源全部释放掉。
这是全部代码
#include "ogrsf_frmts.h"
#include "ogr_srs_api.h"
void getSRS(const char* shp_file) {
GDALAllRegister();
GDALDataset* poDS = static_cast<GDALDataset*>(GDALOpenEx(shp_file, GDAL_OF_VECTOR, NULL, NULL, NULL));
if (poDS == NULL) {
printf("create dataset failed\n");
exit(1);
}
// 获取第一个图层
OGRLayer* poLayer = poDS->GetLayer(0);
if (poLayer == nullptr) {
printf("无法获取图层\n");
exit(1);
}
// 获取图层的坐标系
OGRSpatialReference* poSpatialRef = poLayer->GetSpatialRef();
if (poSpatialRef == nullptr) {
printf("无法获取坐标系\n");
exit(1);
}
// 输出坐标系信息
char* pszWKT = nullptr;
poSpatialRef->exportToWkt(&pszWKT);
printf("坐标系信息:\n%s\n", pszWKT);
// 释放资源
CPLFree(pszWKT);
GDALClose(poDS);
}
其中这个shp_file
我选的是arcgis10.2自带的数据,一般在你的arcgis安装包的...\ArcGIS10.2\Desktop10.2\ArcGlobeData\continent.shp"
输出结果如下