GDAL C++ API 学习之路 (4) OGRGeometry 几何类 OGRGeometry

assignSpatialReference

virtual void assignSpatialReferenceconst OGRSpatialReference *poSR)

为此对象分配空间参考

参数:

poSR - 应用新的空间参考系统

getSpatialReference

inline const OGRSpatialReference *getSpatialReference(void) const

返回对象的空间参考系统

返回: 对空间参考对象的引用。该对象可以与许多几何对象共享,不应修改

    // 创建一个点对象
    OGRPoint point(1.0, 2.0);
    
    // 创建一个空间参考对象
    OGRSpatialReference* spatialRef = new OGRSpatialReference();
    spatialRef->importFromEPSG(4326);  // 设置空间参考为 WGS84
    
    // 将点对象与空间参考对象关联
    point.assignSpatialReference(spatialRef);
    
    // 获取点对象的空间参考
    const OGRSpatialReference* assignedSR = point.getSpatialReference();
    
    // 输出空间参考的名称
    char* srName = nullptr;
    assignedSR->exportToWkt(&srName);
    printf("Assigned spatial reference: %s\n", srName);
    
    // 释放内存
    CPLFree(srName);
    delete spatialRef;

transform

virtual OGRErr transform(OGRCoordinateTransformation *poCT) = 0

对几何图形应用任意坐标变换

参数:

poCT -- 要应用的转换。

返回: OGRERR_NONE成功或错误代码

transformTo

OGRErr transformToconst OGRSpatialReference *poSR)

将几何转换为新的空间参考系统        此方法会将几何图形的坐标从其当前空间参考系统转换为新的目标空间参考系统。通常这意味着重新投影矢量,但它可能包括基准面偏移和单位变化

参数:

poSR -- 要变换到的空间参考系统。

返回: OGRERR_NONE成功或错误代码

// 创建一个点对象
    OGRPoint point(1.0, 2.0);
    
    // 创建一个源空间参考对象
    OGRSpatialReference* srcSpatialRef = new OGRSpatialReference();
    srcSpatialRef->importFromEPSG(4326);  // 设置源空间参考为 WGS84
    
    // 将点对象与空间参考对象关联
    point.assignSpatialReference(srcSpatialRef);

    // 创建一个目标空间参考对象
    OGRSpatialReference* targetSpatialRef = new OGRSpatialReference();
    targetSpatialRef->importFromEPSG(3857);  // 设置目标空间参考为 Web Mercator
    
    // 将点对象从源空间参考转换到目标空间参考
    OGRErr result = point.transformTo(targetSpatialRef);

segmentize

virtual void segmentize(double dfMaxLength)

修改几何图形,使其没有超过给定距离的线段。        此方法会根据需要修改几何以添加中间顶点,以便 2 个连续顶点之间的最大长度小于 dfMaxLength

参数:

dfMaxLength -- 分割后 2 点之间的最大距离

// 创建一个线段对象
    OGRLineString line;
    line.addPoint(0, 0);
    line.addPoint(1, 1);
    
    // 对线段对象进行分段处理,最大分段长度为 0.1
    line.segmentize(0.1);

Equals

virtual OGRBoolean Equals(const OGRGeometry*) const = 0

返回: 如果等效,则为 TRUE,否则为 FALSE

Intersects

virtual OGRBoolean Intersects(const OGRGeometry*) const

判断几何图形是否相交

参数:

poOtherGeom -- 另一个要测试的几何图形。

返回: 如果几何相交,则为 TRUE,否则为 FALSE

// 创建两个几何对象
    OGRPoint point(0, 0);
    OGRPolygon polygon;
    OGRLinearRing ring;
    ring.addPoint(1, 1);
    ring.addPoint(1, 2);
    ring.addPoint(2, 2);
    ring.addPoint(2, 1);
    ring.addPoint(1, 1);
    polygon.addRing(&ring);

    // 判断两个几何对象是否相交
    OGRBoolean intersects = point.Intersects(&polygon);

    if (intersects) {
        printf("几何对象相交\n");
    } else {
        printf("几何对象不相交\n");
    }

Disjoint

virtual OGRBoolean Disjoint(const OGRGeometry*) const 

测试脱节性        测试此几何图形和传递到方法中的其他几何图形是否不相交

参数:

poOtherGeom -- 要与此几何进行比较的几何图形。

返回: 如果它们是不相交的,则为 TRUE,否则为 FALSE

// 创建两个几何对象
    OGRPoint point1(0, 0);
    OGRPoint point2(1, 1);

    // 判断两个几何对象是否不相交
    OGRBoolean disjoint = point1.Disjoint(&point2);

    if (disjoint) {
        printf("几何对象不相交\n");
    } else {
        printf("几何对象相交\n");
    }

Touches

virtual OGRBoolean Touches(const OGRGeometry*) const 

测试触摸        测试此几何图形和传递到方法中的另一个几何图形是否接触

参数:

poOtherGeom -- 要与此几何进行比较的几何图形。

返回: 如果它们在接触,则为 TRUE,否则为 FALSE

// 创建两个几何对象
    OGRPoint point(0, 0);
    OGRLineString linestring;
    linestring.addPoint(0, 0);
    linestring.addPoint(1, 1);

    // 判断几何对象是否相接触
    OGRBoolean touches = point.Touches(&linestring);

Crosses

virtual OGRBoolean Crosses(const OGRGeometry*) const

测试交叉        测试此几何图形和传递到方法中的另一个几何图形是否交叉

参数:

poOtherGeom -- 要与此几何进行比较的几何图形。

返回: 如果它们交叉,则为 TRUE,否则为 FALSE

// 创建两个几何对象
    OGRLineString linestring1;
    linestring1.addPoint(0, 0);
    linestring1.addPoint(2, 2);

    OGRLineString linestring2;
    linestring2.addPoint(1, 0);
    linestring2.addPoint(1, 2);

    // 判断几何对象是否相交交叉
    OGRBoolean crosses = linestring1.Crosses(&linestring2);

 

Within

virtual OGRBoolean Within(const OGRGeometry*) const

测试遏制性        测试实际几何对象是否在传递的几何图形中

参数:

poOtherGeom -- 要与此几何进行比较的几何图形。

返回: 如果 poOtherGeom 在此几何图形中,则为 TRUE,否则为 FALSE

 // 创建两个几何对象
    OGRPoint point(2, 2);
    OGRPolygon polygon;
    polygon.addRing(point.getX(), point.getY() - 1, point.getX() + 1, point.getY(), point.getX(), point.getY() + 1, point.getX() - 1, point.getY());

    // 判断几何对象是否在另一个几何对象内部
    OGRBoolean within = point.Within(&polygon);

Contains

virtual OGRBoolean Contains(const OGRGeometry*) const

测试遏制性        测试实际几何对象是否包含传递的几何图形

参数:

poOtherGeom -- 要与此几何进行比较的几何图形。

返回: 如果 poOtherGeom 包含此几何图形,则为 TRUE,否则为 FALSE

// 创建两个几何对象
    OGRPolygon polygon;
    polygon.addRing(0, 0, 0, 3, 3, 3, 3, 0, 0, 0); // 外环
    polygon.addRing(1, 1, 1, 2, 2, 2, 2, 1, 1, 1); // 内环

    OGRPoint point(1.5, 1.5);

    // 判断几何对象是否包含另一个几何对象
    OGRBoolean contains = polygon.Contains(&point);

Overlaps

virtual OGRBoolean Overlaps(const OGRGeometry*) const

测试重叠        测试此几何图形和传入方法的其他几何图形是否重叠,即它们的交集具有非零区域

参数:

poOtherGeom -- 要与此几何进行比较的几何图形。

返回: 如果它们重叠,则为 TRUE,否则为 FALSE

// 创建两个几何对象
    OGRPolygon polygon1;
    polygon1.addRing(0, 0, 0, 3, 3, 3, 3, 0, 0, 0); // 多边形1

    OGRPolygon polygon2;
    polygon2.addRing(2, 2, 2, 4, 4, 4, 4, 2, 2, 2); // 多边形2

    // 判断两个几何对象是否有重叠
    OGRBoolean overlaps = polygon1.Overlaps(&polygon2);

Boundary

Virtual OGRGeometry *Boundary() const

计算边界        将创建并返回一个新的几何对象,其中包含调用该方法的几何的边界

返回: 现在由调用方拥有的新分配的几何图形,或失败时为 NULL

// 创建一个多边形对象
    OGRPolygon polygon;
    polygon.addRing(0, 0, 0, 3, 3, 3, 3, 0, 0, 0);

    // 获取多边形对象的边界
    OGRGeometry* boundary = polygon.Boundary();

    // 判断边界对象的几何类型
    if (boundary->getGeometryType() == wkbLineString) {
        printf("多边形的边界是一个线串\n");
    } else if (boundary->getGeometryType() == wkbMultiLineString) {
        printf("多边形的边界是一个多线串\n");
    } else {
        printf("多边形的边界不是一个线串或多线串\n");
    }

    // 释放边界对象的内存
    OGRGeometryFactory::destroyGeometry(boundary);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
GDAL是一个功能强大的地理数据抽象库,用于读取、写入和处理各种栅格数据格式。在使用GDAL提取NDVI(归一化植被指数)时,我们可以按照以下步骤进行操作。 首先,我们需要引入GDAL库,并声明需要使用的数据集和波段。 ``` #include "gdal_priv.h" #include "cpl_conv.h" int main() { //声明需要使用的数据集和波段 GDALDatasetH hDataset; GDALRasterBandH hRedBand, hNirBand; //... return 0; } ``` 接下来,我们需要打开影像文件,并获取红光和近红外波段。 ``` hDataset = GDALOpen("input_image.tif", GA_ReadOnly); hRedBand = GDALGetRasterBand(hDataset, 1); hNirBand = GDALGetRasterBand(hDataset, 2); ``` 然后,我们需要读取红光和近红外波段的数据,并计算NDVI。 ``` int width = GDALGetRasterBandXSize(hRedBand); int height = GDALGetRasterBandYSize(hRedBand); float* redData = (float*) CPLMalloc(sizeof(float)*width*height); float* nirData = (float*) CPLMalloc(sizeof(float)*width*height); GDALRasterIO(hRedBand, GF_Read, 0, 0, width, height, redData, width, height, GDT_Float32, 0, 0); GDALRasterIO(hNirBand, GF_Read, 0, 0, width, height, nirData, width, height, GDT_Float32, 0, 0); float* ndviData = (float*) CPLMalloc(sizeof(float)*width*height); for (int i = 0; i < width*height; i++) { if (redData[i] + nirData[i] == 0) { ndviData[i] = 0; } else{ ndviData[i] = (nirData[i] - redData[i]) / (nirData[i] + redData[i]); } } ``` 最后,我们可以将计算得到的NDVI数据保存到新的影像文件中。 ``` GDALDriverH hDriver = GDALGetDriverByName("GTiff"); GDALDatasetH hOutputDataset = GDALCreateCopy(hDriver, "output_ndvi.tif", hDataset, 0, NULL, NULL, NULL); GDALRasterBandH hOutputBand = GDALGetRasterBand(hOutputDataset, 1); GDALRasterIO(hOutputBand, GF_Write, 0, 0, width, height, ndviData, width, height, GDT_Float32, 0, 0); ``` 上述代码片段展示了如何使用GDAL C API提取NDVI。通过逐像素计算红光和近红外波段之间的比值,我们可以得到NDVI并将其保存为新的栅格影像文件output_ndvi.tif。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

场主不吃鍋巴

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

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

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

打赏作者

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

抵扣说明:

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

余额充值