GDAL C++ API 学习之路 (3) Dataset篇 代码示例 翻译 自学

先学习一些专业名词

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的输出投影

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

场主不吃鍋巴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值