先学习一些专业名词
GCP
GCP是GDAL库中的一个概念,指的是地理控制点(Ground Control Point),是用于将图像的像素坐标与地理坐标进行关联的重要元素。在遥感图像处理和地图制图等领域,GCP通常被用于校正、配准和几何校正等操作。
EPSG
EPSG代码是一个唯一标识,用于标识地理空间参考系统和坐标参考系统。它是由欧洲石油勘探组织(European Petroleum Survey Group)制定的一套标准。EPSG代码通常由一个数字组成,例如,WGS84空间参考系统的EPSG代码为4326。它可以用来在不同的GIS软件和工具之间交换空间参考信息,以确保在不同平台之间的数据一致性
WKT
WKT代表Well-known text,是一种文本格式,用于表示各种空间参考系统、坐标系、几何图形等的几何信息。WKT是一个由标准词汇和标点符号组成的结构化文本字符串,它包含一个空间参考系统的定义,通常是由坐标系统、椭球体和基准面组成。WKT格式是一种开放的标准,可以在不同的GIS软件和系统之间进行互操作性和数据共享
WKT的使用:http://t.csdn.cn/iHLmb
GetGCPSpatialRef
virtual const OGRSpatialReference *GetGCPSpatialRef() const 与 C 函数 GDALGetGCPSpatialRef() 相同
获取 GCP 的输出空间参考系统
参数:无参
返回: 该函数返回一个 GDALSpatialRef 对象,该对象包含了所提取的控制点所在的地理空间参考系统信息
GDALDataset* poDS = (GDALDataset*) GDALOpen("example.tif", GA_ReadOnly);
GDALSpatialRef* gcpSpatialRef = poDS->GetGCPSpatialRef();
关于空间参考的内容有点乱,做了一篇来详解:
GDALDataset有关空间参考的对比详细解释:http://t.csdn.cn/y9BLv
GetGCPCount
virtual int GetGCPCount() 此方法与 C 函数 GDALGetGCPCount() 相同
返回:
此数据集的 GCP 数。如果没有,则为零
// 打开数据集
GDALDataset* poDataset = (GDALDataset*)GDALOpen("sample.tif", GA_ReadOnly);
// 获取GCP的数量
int nGCPCount = poDataset->GetGCPCount();
cout<< "GCP count: " << nGCPCount << endl;
我测试了一张普通的jepg图片,可想而之输出的是0
GetGCPs
Virtual const GDAL_GCP *GetGCPs() 此方法与 C 函数 GDALGetGCPs() 相同
获取GCP
返回: 指向内部 GCP 结构列表的指针。不应对其进行修改,并且可能会在下次 GDAL 调用时更改
GDAL_GCP
是一个结构体,包含了GCP的信息
char* pszId: GCP 的标识符,通常是数字或字母组合。
double dfGCPPixel: GCP 在数据集中的像素X坐标。
double dfGCPLine: GCP 在数据集中的像素Y坐标。
double dfGCPX:GCP 的地理坐标中的 X 坐标,通常是经度。
double dfGCPY:GCP 的地理坐标中的 Y 坐标,通常是纬度。
double dfGCPZ:GCP 的地理坐标中的 Z 坐标,通常是高程,如果可以有的话。
GetGCPs获取的是第一个元素的指针,而不是整个数组的指针,因此可以通过对指针进行递增操作来访问数组中的其他元素
int nGCPCount = poDS->GetGCPCount();
const GDAL_GCP *pGCPs = poDS->GetGCPs();
for (int i = 0; i < nGCPCount; i++)
{
printf(" Id: %s\n", pGCPs[i].pszId);
printf("\n");
}
SetGCPs
virtual CPLErr SetGCPs(int nGCPCount, const GDAL_GCP *pasGCPList, const OGRSpatialReference *poGCP_SRS) 此方法与 C 函数 GDALSetGCPs() 相同
分配 GCP
参数:
nGCPCount – 分配的 GCP 数量。
pasGCPList – 正在分配的 GCP 结构数组。
poGCP_SRS – 要为 GCP 输出坐标分配的新坐标参考系。如果输出坐标系未知,则此参数应为 null。
返回: CE_None成功时,CE_Failure失败时(包括此格式不支持操作的情况)
SetGCPs
CPLErr SetGCPs(int nGCPCount, const GDAL_GCP *pasGCPList, const char *pszGCPProjection) 此方法与 C 函数 GDALSetGCPs() 相同
分配 GCP
参数:
nGCPCount – 分配的 GCP 数量。
pasGCPList – 正在分配的 GCP 结构数组(nGCPCount in array)。
pszGCPProjection – 要为 GCP 输出坐标分配的新 OGC WKT 坐标系。如果输出坐标系未知,则此参数应为““ (空字符)
返回: CE_None成功时,CE_Failure失败时(包括此格式不支持操作的情况)。
对比:
两个函数的功能是一样的,只是参数的类型不同。一个使用OGRSpatialReference为函数提供空间参考,一个直接指定空间参考系统的名称或字符串表示,
一个可以更准确地定义控制点的坐标系,适用于需要更精确地地理定位的场景 ,一个只提供了一个字符串表示的坐标系,缺少了更多的细节信息
GDALDataset *poDS = (GDALDataset*) GDALOpen("test.tif", GA_Update);
int nCount = 5;
OGRSpatialReference* poSRS = poDS->GetSpatialRef();
//假设pasGCPs内已经有若干个控制点信息
poDS->SetGCPs(nCount, pasGCPs, "WGS84");
poDS->SetGCPs(nCount, pasGCPs, poSRS);
GetGCPProjection
const char *GetGCPProjection() 此方法与 C 函数 GDALGetGCPProjection() 相同
获取 GCP 的输出投影。
投影字符串遵循 GetProjectionRef() 中的正常规则
返回: 内部投影字符串或 “”(如果没有 GCP)
GDALDataset *dataset = (GDALDataset *) GDALOpen("USGS_1_n33w096_20211124.tif", GA_Update);
const char * projection1= dataset->GetGCPProjection();
cout<<projection1<<endl;
我输出了空的一行,那应该就是这张USGS的tif图没有控制点,自然没有GCP的输出投影