GDAL C++ API 学习之路 OGRGeometry 圆弧类 OGRCircularString

OGRCircularString Class        <ogrsf_frmts.h>

OGRCircularString 类是 OGR 几何库中的一个类,用于表示圆弧字符串(circular string)类型的几何图形。圆弧字符串是由一系列圆弧段组成的几何图形,每个圆弧段由三个点定义:起始点、中间点和终止点。这些圆弧段可以连接成一个闭合的圆弧字符串,也可以构成一个非闭合的曲线

Public Functions

OGRCircularString()

创建一个空的圆弧字符串

OGRCircularStringconst OGRCircularString &other)

复制构造函数

OGRCircularString &operator=const OGRCircularString &other)

赋值运算符

importFromWkb

virtual OGRErr importFromWkb(const unsigned char*, size_t, OGRwkbVariant, size_t &nBytesConsumedOut) override

从已知的二进制数据中指定几何图形

参数:

  • pabyData -- 二进制输入数据。

  • nSize -- pabyData 的大小(以字节为单位),如果不知道,则为 -1。

  • eWkbVariant -- 如果 wkbVariantPostGIS1,则对曲线几何代码进行特殊解释

  • nBytesConsumptiondOut -- 输出参数。消耗的字节数。

返回:  OGRERR_NONE如果一切顺利,否则OGRERR_NOT_ENOUGH_DATA、OGRERR_UNSUPPORTED_GEOMETRY_TYPE或OGRERR_CORRUPT_DATA中的任何一个都可能被退回

exportToWkb

virtual OGRErr exportToWkb(OGRwkbByteOrder, unsigned char*, OGRwkbVariant = wkbVariantOldOgc) const override

将几何图形转换为众所周知的二进制格式

参数:

  • eByteOrder -- wkbXDR 或 wkbNDR 之一,分别表示 MSB 或 LSB 字节顺序。

  • pabyData -- 写入二进制表示的缓冲区。此缓冲区的大小必须至少为 OGRGeometry::WkbSize() 字节。

  • eWkbVariant -- 导出三维(或更多)几何图形时使用什么标准。默认的 wkbVariantOldOgc 是历史的 OGR 变体。wkbVariantIso 是 ISO SQL/MM 中定义的变体,并被 OGC 用于 SFSQL 1.2。

返回:  当前始终返回OGRERR_NONE

importFromWkt

virtual OGRErr importFromWkt(const char**) override

从已知文本数据中指定几何图形

参数:

ppszInput -- 指向源文本指针的指针。指针将更新为已使用文本之后的指针。

返回:  OGRERR_NONE如果一切顺利,否则OGRERR_NOT_ENOUGH_DATA、OGRERR_UNSUPPORTED_GEOMETRY_TYPE或OGRERR_CORRUPT_DATA中的任何一个都可能被退回

exportToWkt

virtual std::string exportToWkt(const OGRWktOptions &opts = OGRWktOptions(), OGRErr *err = nullptr) const override

将循环字符串导出到 WKT

参数:

  • opts -- 输出选项

  • err -- 指向错误代码的指针(如果需要)。

返回:

表示此循环字符串的 WKT 字符串

IsValid

virtual OGRBoolean IsValid() const override

测试几何图形是否有效

返回:  如果几何图形没有点,则为 TRUE,否则为 FALSE

getEnvelope

virtual void getEnvelope(OGREnvelope *psEnvelope) const override

计算并返回传递的 psEnvelope 结构中此几何图形的边界包络

参数:

psEnvelope -- 放置结果的结构

// 创建一个圆弧几何对象
    OGRCircularString circularString;
    
    // 添加一些点到圆弧
    circularString.addPoint(0, 0);
    circularString.addPoint(1, 1);
    circularString.addPoint(2, 2);
    
    // 创建一个用于存储外包络矩形的结构体
    OGREnvelope envelope;
    
    // 获取圆弧的外包络矩形
    circularString.getEnvelope(&envelope);
    
    // 打印外包络矩形的坐标信息
    std::cout << "MinX: " << envelope.MinX << std::endl;
    std::cout << "MinY: " << envelope.MinY << std::endl;
    std::cout << "MaxX: " << envelope.MaxX << std::endl;
    std::cout << "MaxY: " << envelope.MaxY << std::endl;

getEnvelope

virtual void getEnvelope(OGREnvelope3D *psEnvelope) const override

计算并返回传递的 psEnvelope 结构中此几何图形的边界包络 (3D)

参数:

psEnvelope -- 放置结果的结构

clone

virtual OGRCircularString *clone() const override

创建此对象的副本

返回:  具有与原始对象相同的几何和空间参考系统的新对象实例

get_Length

virtual double get_Length() const override

返回曲线的长度

返回: 曲线的长度,如果曲线尚未初始化,则为零

CurveToLine

virtual OGRLineString *CurveToLine(double dfMaxAngleStepSizeDegrees = 0, const char *const *papszOptions = nullptr) const override

参数:

  • dfMaxAngleStepSizeDegrees -- 沿弧的最大步长(以度为单位),使用默认设置为零。

  • papszOptions -- 选项作为以 null 结尾的字符串列表或 NULL。

返回:  近似曲线的线串

Value

virtual void Value(double, OGRPoint*) const override

沿曲线在给定距离处获取点

参数:

  • dfDistance -- 沿采样位置的曲线的距离。对于此曲线,此距离应介于 0 和 get_Length() 之间。

  • poPoint -- 要指定曲线位置的点

    // 创建一个OGRPoint对象表示圆弧曲线的起点
    OGRPoint startPoint(0.0, 0.0);

    // 创建一个圆弧曲线对象,构建一个圆弧
    OGRCircularString circularString;
    circularString.addPoint(&startPoint);
    circularString.addCircularArc(10.0, 0.0, 20.0);

    // 调用Value函数计算圆弧上的点
    double Distance = 15.0; // 假设给定一个长度
    OGRPoint resultPoint;
    circularString.Value(Distance, &resultPoint);

    // 打印计算得到的点坐标
    std::cout << "Point on circular arc at angle " << angle << ": " << resultPoint.getX() << ", " << resultPoint.getY() << std::endl;

get_Area

virtual double get_Area() const override

获取(闭合)曲线的面积

getGeometryType

virtual OGRwkbGeometryType getGeometryType() const override

获取几何类型

getGeometryName

Virtual const char *getGeometryName() const override

获取几何类型的 WKT 名称

返回:用于此几何类型的名称,采用众所周知的文本格式。返回的指针指向静态内部字符串,不应修改或释放

segmentize

virtual void segmentize(double dfMaxLength) override

修改几何图形,使其没有比给定距离更长的线段

参数:

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

// 创建一个圆弧几何对象
    OGRPoint point1(0, 0);
    OGRPoint point2(5, 0);
    OGRPoint point3(10, 0);
    OGRCircularString circularString;
    circularString.addPoint(&point1);
    circularString.addPoint(&point2);
    circularString.addPoint(&point3);

    // 打印原始的圆弧几何对象
    std::cout << "原始圆弧几何对象:" << std::endl;
    char* wkt;
    circularString.exportToWkt(&wkt);
    std::cout << wkt << std::endl;
    CPLFree(wkt);

    // 使用最大长度为2.0的线段对圆弧几何对象进行分段
    circularString.segmentize(2.0);

    // 打印分段后的圆弧几何对象
    std::cout << "分段后的圆弧几何对象:" << std::endl;
    circularString.exportToWkt(&wkt);
    std::cout << wkt << std::endl;
    CPLFree(wkt)

hasCurveGeometry

virtual OGRBoolean hasCurveGeometry(int bLookForNonLinear = FALSE) const override

如果此几何图形是或具有曲线几何图形,则返回此几何图形

  1. 线性几何类型:

    • OGRPoint:点几何类型,表示一个点。
    • OGRLineString:线几何类型,表示一条折线,由一系列连续的线段组成。
    • OGRRing:环几何类型,是线性几何类型的特殊类型,表示闭合的线。环几何类型可以用于表示简单多边形的外环或内环。
  2. 曲线几何类型:

    • OGRCircularString:圆弧几何类型,表示一个圆弧。
    • OGRCompoundCurve:复合曲线几何类型,由多个线段和圆弧组成的复杂曲线。
    • OGRCurvePolygon:曲线多边形几何类型,表示由曲线组成的多边形。曲线多边形由外环和零个或多个内环组成,这些环可以是线性环或圆弧环。
  1. bLookForNonLinear 参数设置为 FALSE 时,表示只查找线性的子几何对象,不查找曲线类型的子几何对象(包括圆弧、复合曲线等)。
  2. bLookForNonLinear 参数设置为 TRUE 时,表示同时查找曲线类型和线性类型的子几何对象

参数:

bLookForNonLinear -- 将其设置为 TRUE 以检查几何图形是否为 CIRCULARSTRING 或包含 CIRCULARSTRING。

返回: 如果此几何图形是或具有曲线几何图形,则为 TRUE

 OGRPoint point(10.0, 20.0);

    //检查点是否具有曲线几何(非线性)。
    if (point.hasCurveGeometry()) {
        std::cout << "The point contains curve geometry." << std::endl;
    } else {
        std::cout << "The point does not contain curve geometry." << std::endl;
    }

getLinearGeometry

virtual OGRGeometry *getLinearGeometry(double dfMaxAngleStepSizeDegrees = 0, const char *const *papszOptions = nullptr) const override

返回此几何图形的非曲线版本,可能是近似值

参数:

  • dfMaxAngleStepSizeDegrees -- 沿弧的最大步长(以度为单位),使用默认设置为零。

  • papszOptions -- 选项作为以 null 结尾的字符串列表。

返回:  新的几何图形

OGRPoint p1(0, 0);
OGRPoint p2(1, 1);
OGRPoint p3(2, 0);

OGRCircularString cs;
cs.addPoint(&p1);
cs.addPoint(&p2);
cs.addPoint(&p3);

// 转换为线性几何对象
OGRGeometry* linearGeom = cs.getLinearGeometry();

在上面的例子中,一开始设置的点在 OGRCircularString 中表示一个圆弧段,可以用中心点、起始点、终止点和半径等信息来表示。但是当将 OGRCircularString 对象转换为线性几何对象时,圆弧段将被拆分成一组连续的直线段,这些直线段近似地组成了原始圆弧的形状。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
GDAL开发手册API详细说明,内含详细示例代码,适合初学者使用,非常棒的入门书!In pythe Import go from gdalconst import s datasct-gdal. Open( filename, GA ReadOnly if dataset is none 如果 GDALOpen(函数返回NUL则表示打开失败,同时 CPLError(函数产生 相应的错误信息。如果您需要对错误迂行处理可以参考 CPLError相关文档 通常情况下,所有的GDAL函数都通过 CPLError(报告错误。另外需要注意的 是 pszFilename并不一定对应一个实际的文件名(当然也可以就是一个文件 名)。它的具休解释由相应的驱动程序负责。它可能是一个URL,或者是文件 名以后后面有许多用于控制打开方式的参数。通常建议,不要在打开文件的 选择对话框中对文件的型做太多的限制。 1.2.获取 Dataset信息 如果GL数据模型一节所描述的,一个 GDALDataset包含了光栅数据的一系列 的泼段信息。同时它还包含元数据、一个坐标系统、投影型、光枥的大小以 及其他许多信息。 dfGeotransform[0]/米左上角x*/ dfGeoTrans lori[1]/东西方向一个像素对应的距离*/ adfGeotransform[2]/米旋转,0表示上面为北方 adfGeotransform[3]米左上角y*/ adfGeotrans form[4]/*旋转,0表示上面为北方米/ adfGeoTransform[5]/*南北方向一个像素对应的距离*/ 如果需要输出 dataset的基木信息,可以这样: In c+t adfGcotransform[6] printf( Driver: %s/%s\n poDataset->GetDriver(->GetDescription o poDataset->GetDriver()->GetMetadataltem( GDAL DMD LONGNAME)) printr( Size is %dx%dx%d\n poDataset->GetRasterXSizeo, poDataset->GetRasterYSize( poDataset->GetRasterCounto) if( poDataset->GetProjectionRef(!= NULL printf( Projection is %s'n poDataset->GetProjectionRef() if( poDataset->GetGeoTransform( adfGeoTransform one printf( Origin=(%. 6f, %. 6f)\n adfGeoTransform[01, adfGeoTrans form[3]) printf(Pixel Size=(%. 6f, %. 6f)\n adfGcoTransform[1, adfGco Transform[5 In c GDALDriverh dRiver double adfGeoTransform[6] hDriver- GDALGctDatasctDriver( hDatasct printf( Driver: %s /%s\n GDALGetDriver ShortName( hDriver GDALGetDriverlongName ( dRiver)) printf size is %dx%dx%d\n GDALGetRasterXSize( hDataset GDALGetRasterYSize( dAtaset GDALGetRasterCount( hDataset)) if( GDALGetProjectionRef( hDataset )! -NULL printf( Projection is %s\n GDALGetProjectionRef( dAtaset )) if( GDALGetGeoTransform( hDataset, adfGeoTransform )==CE None printf( Origin =(9%.6f, %.6f)\n adfGeo Transform[01, adfGeo Transform[3]) printf( pixel Size=(%. 6f, %.6f)\n adfGeoTransform[1, adfGeoTrans form[5) In Python print Driver:', dataset GetDriver(. ShortName, /', dataset. Get Driver(. Lon
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、付费专栏及课程。

余额充值