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

Distance

virtual double Distance(const OGRGeometry*) const

计算两个几何之间的距离        返回两个几何图形之间的最短距离。距离表示为与几何坐标相同的单位

参数:

poOtherGeom -- 另一个要比较的几何图形。

返回: 几何图形之间的距离,如果发生错误,则为 -1

// 创建两个点
OGRPoint point1(0, 0);
OGRPoint point2(3, 4);

// 计算两个点之间的距离
double distance = point1.Distance(&point2);

cout << "Distance between point1 and point2: " << distance << endl;

ConvexHull

Virtual OGRGeometry *ConvexHull() const

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

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

    // 创建一个线环(LinearRing)
    OGRLinearRing ring;
    ring.addPoint(0, 0);
    ring.addPoint(1, 0);
    ring.addPoint(1, 1);
    ring.addPoint(0, 1);
    ring.addPoint(0, 0);

    // 创建一个多边形(Polygon)
    OGRPolygon polygon;
    polygon.addRing(&ring);

    // 计算凸包
    OGRGeometry* convexHull = polygon.ConvexHull();

    // 输出凸包的WKT表示
    char* wkt;
    convexHull->exportToWkt(&wkt);
    std::cout << "Convex Hull: " << wkt << std::endl;

    // 释放内存
    CPLFree(wkt);
    delete convexHull;

ConcaveHull

virtual OGRGeometry *ConcaveHull(double dfRatio, bool bAllowHoles) const

计算几何图形的“凹壳”        计算几何图形的“凹壳”

凹壳完全包含在凸包内,并且还包含输入的所有点,但面积较小。面积比是凸包和凹壳面积的比值。常用于将多点转换为多边形区域。包含输入几何图形中的所有点

参数:

  • dfRatio -- 凸包和凹包面积的比率。

  • bAllowHole -- 是否允许孔。

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

    // 创建一个线环(LinearRing)
    OGRLinearRing ring;
    ring.addPoint(0, 0);
    ring.addPoint(1, 0);
    ring.addPoint(1, 1);
    ring.addPoint(0, 1);
    ring.addPoint(0, 0);

    // 创建一个多边形(Polygon)
    OGRPolygon polygon;
    polygon.addRing(&ring);

    // 计算凹多边形凸包
    double concaveHullRatio = 0.8; // 指定一个凹多边形凸包的压缩比例
    bool allowHoles = true;        // 允许生成含有洞的凹多边形凸包
    OGRGeometry* concaveHull = polygon.ConcaveHull(concaveHullRatio, allowHoles);

    // 输出凹多边形凸包的WKT表示
    char* wkt;
    concaveHull->exportToWkt(&wkt);
    std::cout << "Concave Hull: " << wkt << std::endl;

    // 释放内存
    CPLFree(wkt);
    delete concaveHull;


Buffer

virtual OGRGeometry *Buffer(double dfDist, int nQuadSegs = 30) const

计算几何的缓冲区

生成一个新几何图形,其中包含调用该几何图形的缓冲区。缓冲区是一个面,其中包含原始几何的缓冲距离内的区域

某些缓冲区部分被正确描述为曲线,但会转换为近似多边形。nQuadSegs 参数可用于控制应使用多少条线来定义 90 度曲线 - 圆的象限。值 30 是合理的默认值。较大的值会导致生成的缓冲区几何中出现大量顶点,而较小的数字会降低结果的准确性

参数:

  • dfDist -- 要应用的缓冲距离。应表示为与几何坐标相同的单位。

  • nQuadSegs -- 用于近似 90 度(象限)曲率的段数。

返回: 新创建的几何图形,如果发生错误,则为 NULL

 // 创建一个点(Point)
 OGRPoint point(0, 0);

// 对点进行缓冲区分析,生成一个缓冲区几何对象
double bufferDistance = 1.0; // 缓冲区的距离
int numQuadSegments = 30;    // 四边形段数,用于控制缓冲区的平滑程度
OGRGeometry* buffer = point.Buffer(bufferDistance, numQuadSegments);

Intersection

Virtual OGRGeometry *Intersection(const OGRGeometry*) const

计算交集

生成一个新的几何图形,它是操作的两个几何图形的交点区域。Intersects() 方法可用于测试两个几何图形是否相交

不检查几何有效性。如果不确定输入几何的有效性,在之前调用 IsValid(),否则结果可能是错误的

参数:

poOtherGeom -- 另一个几何与“这个”几何相交。

返回: 表示交点的新几何图形,如果没有交集或发生错误,则为 NULL

    // 创建两个多边形对象
    OGRLinearRing ring1, ring2;
    ring1.addPoint(0, 0);
    ring1.addPoint(0, 1);
    ring1.addPoint(1, 1);
    ring1.addPoint(1, 0);
    ring1.addPoint(0, 0);

    ring2.addPoint(0.5, 0.5);
    ring2.addPoint(0.5, 1.5);
    ring2.addPoint(1.5, 1.5);
    ring2.addPoint(1.5, 0.5);
    ring2.addPoint(0.5, 0.5);

    OGRPolygon polygon1, polygon2;
    polygon1.addRing(&ring1);
    polygon2.addRing(&ring2);

    // 计算两个多边形的交集
    OGRGeometry* intersection = polygon1.Intersection(&polygon2);

Union

Virtual OGRGeometry *Union(const OGRGeometry*) const 

计算联合

生成一个新的几何图形,该几何图形是操作的两个几何图形的并集区域

不检查几何有效性。如果不确定输入几何的有效性,在之前调用 IsValid(),否则结果可能是错误的

参数:

poOtherGeom -- 与“这个”几何结合的其他几何。

返回:  表示并集或 NULL 的新几何图形(如果发生错误)

// 创建两个多边形对象
    OGRLinearRing ring1, ring2;
    ring1.addPoint(0, 0);
    ring1.addPoint(0, 1);
    ring1.addPoint(1, 1);
    ring1.addPoint(1, 0);
    ring1.addPoint(0, 0);

    ring2.addPoint(0.5, 0.5);
    ring2.addPoint(0.5, 1.5);
    ring2.addPoint(1.5, 1.5);
    ring2.addPoint(1.5, 0.5);
    ring2.addPoint(0.5, 0.5);

    OGRPolygon polygon1, polygon2;
    polygon1.addRing(&ring1);
    polygon2.addRing(&ring2);

    // 计算两个多边形的并集
    OGRGeometry* unionGeometry = polygon1.Union(&polygon2);

UnionCascaded

Virtual OGRGeometry *UnionCascaded() const

使用级联计算联合        输入几何必须是多面

不检查几何有效性。如果不确定输入几何的有效性,在之前调用 IsValid(),否则结果可能是错误的

返回: 表示并集或 NULL 的新几何图形(如果发生错误)

    // 创建一个多边形对象
    OGRLinearRing ring;
    ring.addPoint(0, 0);
    ring.addPoint(0, 1);
    ring.addPoint(1, 1);
    ring.addPoint(1, 0);
    ring.addPoint(0, 0);

    OGRPolygon polygon;
    polygon.addRing(&ring);

    // 计算多边形与其自身的并集
    OGRGeometry* unionGeometry = polygon.UnionCascaded();
  • Virtual OGRGeometry *UnionCascaded() const: 这个函数用于返回当前几何对象与其自身的联合(Union)。也就是说,它将当前几何对象中的所有几何组件进行联合操作,得到一个包含所有组件的新几何对象。例如,如果当前几何对象是一个多边形,且其中包含了多个不相交的环,那么该函数将返回一个新的多边形,其中包含了所有环的联合结果。

  • Virtual OGRGeometry *Union(const OGRGeometry*) const: 这个函数用于返回当前几何对象与另一个几何对象的联合(Union)。也就是说,它将当前几何对象与另一个几何对象进行联合操作,得到一个包含两个几何对象的所有组件的新几何对象。例如,如果当前几何对象是一个多边形,而传入的参数是另一个多边形,那么该函数将返回一个新的多边形,其中包含了两个多边形的联合结果

  • 总结:

  • UnionCascaded() 函数用于计算当前几何对象内部的联合结果。
  • Union(const OGRGeometry*) 函数用于计算当前几何对象与另一个几何对象的联合结果

UnaryUnion

OGRGeometry *UnaryUnion() const

返回单个几何图形的所有组件的并集        通常用于将集合转换为覆盖相同区域的最小多边形集

返回: 表示并集或 NULL 的新几何图形(如果发生错误)

    // 创建两个多边形对象
    OGRLinearRing ring1;
    ring1.addPoint(0, 0);
    ring1.addPoint(0, 1);
    ring1.addPoint(1, 1);
    ring1.addPoint(1, 0);
    ring1.addPoint(0, 0);

    OGRPolygon polygon1;
    polygon1.addRing(&ring1);

    OGRLinearRing ring2;
    ring2.addPoint(1, 1);
    ring2.addPoint(1, 2);
    ring2.addPoint(2, 2);
    ring2.addPoint(2, 1);
    ring2.addPoint(1, 1);

    OGRPolygon polygon2;
    polygon2.addRing(&ring2);

    // 计算两个多边形对象的一元并集
    OGRGeometry* unaryUnionGeometry = polygon1.Union(&polygon2);

Difference

virtual OGRGeometry *Difference(const OGRGeometry*) const

计算差异

生成一个新几何图形,该几何图形是该几何图形的区域,并删除了第二个几何图形的区域

不检查几何有效性。如果不确定输入几何的有效性,在之前调用 IsValid(),否则结果可能是错误的

参数:

poOtherGeom -- 从“this”几何中删除的其他几何图形。

返回:  表示差值的新几何图形,如果差值为空或发生错误,则为 NULL

    // 创建两个多边形对象
    OGRLinearRing ring1;
    ring1.addPoint(0, 0);
    ring1.addPoint(0, 2);
    ring1.addPoint(2, 2);
    ring1.addPoint(2, 0);
    ring1.addPoint(0, 0);

    OGRPolygon polygon1;
    polygon1.addRing(&ring1);

    OGRLinearRing ring2;
    ring2.addPoint(1, 1);
    ring2.addPoint(1, 3);
    ring2.addPoint(3, 3);
    ring2.addPoint(3, 1);
    ring2.addPoint(1, 1);

    OGRPolygon polygon2;
    polygon2.addRing(&ring2);

    // 计算两个多边形对象的差异
    OGRGeometry* differenceGeometry = polygon1.Difference(&polygon2);

SymDifference

virtual OGRGeometry *SymDifference(const OGRGeometry*) const

计算对称差分

生成一个新的几何图形,该几何图形是此几何图形与传递到方法中的第二个几何图形的对称差值

不检查几何有效性。如果不确定输入几何的有效性,在之前调用 IsValid(),否则结果可能是错误的

参数:

poOtherGeom -- 其他几何形状。

返回:  表示对称差值的新几何图形,如果差值为空或发生错误,则为 NULL

    // 创建两个多边形对象
    OGRLinearRing ring1;
    ring1.addPoint(0, 0);
    ring1.addPoint(0, 2);
    ring1.addPoint(2, 2);
    ring1.addPoint(2, 0);
    ring1.addPoint(0, 0);

    OGRPolygon polygon1;
    polygon1.addRing(&ring1);

    OGRLinearRing ring2;
    ring2.addPoint(1, 1);
    ring2.addPoint(1, 3);
    ring2.addPoint(3, 3);
    ring2.addPoint(3, 1);
    ring2.addPoint(1, 1);

    OGRPolygon polygon2;
    polygon2.addRing(&ring2);

    // 计算两个多边形对象的对称差异
    OGRGeometry* symDifferenceGeometry = polygon1.SymDifference(&polygon2);

Centroid

virtual OGRErr Centroid(OGRPoint *poPoint) const

计算几何质心

质心位置应用于传入的 OGRPoint 对象。质心不一定在几何图形内

返回:  OGRERR_NONE成功或OGRERR_FAILURE错误

    // 创建一个多边形对象
    OGRLinearRing ring;
    ring.addPoint(0, 0);
    ring.addPoint(0, 4);
    ring.addPoint(4, 4);
    ring.addPoint(4, 0);
    ring.addPoint(0, 0);

    OGRPolygon polygon;
    polygon.addRing(&ring);

    // 创建一个空的 OGRPoint 对象用于存储质心
    OGRPoint centroidPoint;

    // 计算多边形对象的质心
    OGRErr err = polygon.Centroid(&centroidPoint);

    if (err == OGRERR_NONE) {
        // 输出质心的坐标
        double x = centroidPoint.getX();
        double y = centroidPoint.getY();
        std::cout << "Centroid coordinates: (" << x << ", " << y << ")" << std::endl;
    } else {
        std::cout << "Error calculating centroid." << std::endl;







  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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、付费专栏及课程。

余额充值