GDAL OGR C++ API 学习之路 (4)OGRLayer篇 代码示例

GetExtent

virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE)

获取此图层的范围

参数:

  • psExtent -- 将在其中返回范围值的结构。

  • bForce -- 指示是否应计算范围(即使成本高昂)的标志。

返回:  OGRERR_NONE成功,OGRERR_FAILURE程度未知

    // 获取第一个图层(OGRLayer)
    OGRLayer* layer = dataset->GetLayer(0);

    // 定义一个 OGREnvelope 对象用于存储范围
    OGREnvelope envelope;

    // 获取图层的范围
    OGRErr err = layer->GetExtent(&envelope);

   // 检查获取范围是否成功
    if (err == OGRERR_NONE) {
        printf("Extent of layer: (%f, %f) - (%f, %f)\n", envelope.MinX, envelope.MinY, envelope.MaxX, envelope.MaxY);
    } else {
        printf("Failed to get extent.\n");
    }

GetExtent

virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, int bForce = TRUE)

在指定的几何字段上获取此图层的范围

参数:

  • iGeomField -- 用于计算范围的几何字段的索引。

  • psExtent -- 将在其中返回范围值的结构。

  • bForce -- 指示是否应计算范围(即使成本高昂)的标志。

返回:  OGRERR_NONE成功,OGRERR_FAILURE程度未知

    OGRLayer* poLayer = poDS->GetLayer(0);

    // 指定要获取范围的几何字段索引
    int iGeomField = 0;

    // 创建一个 OGREnvelope 对象,用于存储范围
    OGREnvelope extent;

    // 获取指定几何字段的范围
    OGRErr err = poLayer->GetExtent(iGeomField, &extent);

TestCapability

virtual int TestCapability(const char*) = 0

测试此层是否支持命名功能

参数:

pszCap -- 要测试的功能的名称。

返回: 如果图层具有请求的功能,则为 TRUE,否则为 FALSE。OGRLayers 将为任何无法识别的功能返回 FALSE

在GNMGenericLayer和OGRGNMWrappedResultLayer中实现

Rename

virtual OGRErr Renameconst char *pszNewName)

重命名图层

参数:

pszNewName -- 新图层名称。不得为空。

返回:

成功时的OGRERR_NONE

    // 获取第一个图层
    OGRLayer* poLayer = poDS->GetLayer(0);

    // 输出当前图层名称
    cout << "Current layer name: " << poLayer->GetName() << endl;

    // 重命名图层
    const char* pszNewName = "NewLayerName";
    OGRErr err = poLayer->Rename(pszNewName);

    if (err == OGRERR_NONE) {
        cout << "Layer renamed successfully to: " << poLayer->GetName() << endl;
    } else {
        cout << "Failed to rename the layer." << endl;
    }

CreateField

virtual OGRErr CreateField(OGRFieldDefn *poField, int bApproxOK = TRUE)

在图层上创建新字段

参数:

  • poField -- 要写入磁盘的字段定义。

  • bApproxOK -- 如果为 TRUE,则根据格式驱动程序的限制,可能会以略有不同的形式创建字段。

返回:  OGRERR_NONE成功

    // 创建一个新的图层
    OGRLayer* poLayer = poDS->CreateLayer("NewLayer", nullptr, wkbPoint, nullptr);

    // 创建一个新的字段
    OGRFieldDefn oField("NewField", OFTString);

    if (poLayer->CreateField(&oField) != OGRERR_NONE) {
        std::cout << "Failed to create the new field." << std::endl;
    } else {
        std::cout << "New field created successfully." << std::endl;
    }

DeleteField

virtual OGRErr DeleteField(int iField)

删除图层上的现有字段

参数:

iField -- 要删除的字段的索引。

返回:  OGRERR_NONE成功

    // 获取第一个图层
    OGRLayer* poLayer = poDS->GetLayer(0);

    if (poLayer == nullptr) {
        printf("Failed to get layer.\n");
        GDALClose(poDS);
        return 1;
    }

    // 获取要删除的字段的索引
    int fieldIndex = 2; // 假设要删除第三个字段

    // 删除字段
    OGRErr err = poLayer->DeleteField(fieldIndex);
    if (err == OGRERR_NONE) {
        printf("Field deleted successfully.\n");
    } else {
        printf("Failed to delete field.\n");
    }

ReorderFields

virtual OGRErr ReorderFields(int *panMap)

对图层的所有字段重新排序

参数:

panMap -- GetLayerDefn()->OGRFeatureDefn::GetFieldCount() 元素的数组,它是 [0, GetLayerDefn()->OGRFeatureDefn::GetFieldCount()-1] 的排列。

返回:  OGRERR_NONE成功

    // 获取第一个图层
    OGRLayer* poLayer = poDS->GetLayer(0);

    if (poLayer == nullptr) {
        printf("Failed to get layer.\n");
        GDALClose(poDS);
        return 1;
    }

    // 获取当前字段顺序
    int numFields = poLayer->GetLayerDefn()->GetFieldCount();
    int* fieldMap = new int[numFields];

    for (int i = 0; i < numFields; ++i) {
        fieldMap[i] = i; // 默认顺序
    }

    // 定义新的字段顺序
    int newOrder[] = {2, 0, 1}; // 假设我们想把第三个字段放在第一个位置,第一个字段放在第二个位置,第二个字段放在第三个位置

    // 重新排列字段
    OGRErr err = poLayer->ReorderFields(newOrder);
    if (err == OGRERR_NONE) {
        printf("Fields reordered successfully.\n");
    } else {
        printf("Failed to reorder fields.\n");
    }

AlterFieldDefn

virtual OGRErr AlterFieldDefn(int iField, OGRFieldDefn *poNewFieldDefn, int nFlagsIn)

更改图层上现有字段的定义

参数:

  • iField -- 必须更改其定义的字段的索引。

  • poNewFieldDefn -- 新的字段定义

  • nFlags -- ALTER_NAME_FLAG、ALTER_TYPE_FLAG、ALTER_WIDTH_PRECISION_FLAG、ALTER_NULLABLE_FLAG和ALTER_DEFAULT_FLAG的组合,以指示必须考虑新字段定义中的哪些名称和/或类型和/或宽度和精度字段和/或可空性。

返回:  OGRERR_NONE成功

    // 获取第一个图层
    OGRLayer* poLayer = poDS->GetLayer(0);

    if (poLayer == nullptr) {
        printf("Failed to get layer.\n");
        GDALClose(poDS);
        return 1;
    }

    // 获取指定字段的定义
    int fieldIndex = 0; // 假设我们要修改第一个字段的定义
    OGRFieldDefn* poFieldDefn = poLayer->GetLayerDefn()->GetFieldDefn(fieldIndex);

    if (poFieldDefn == nullptr) {
        printf("Failed to get field definition.\n");
        GDALClose(poDS);
        return 1;
    }

    // 修改字段定义
    poFieldDefn->SetWidth(50); // 设置字段宽度为50
    poFieldDefn->SetPrecision(2); // 设置字段精度为2

    // 提交字段修改
    OGRErr err = poLayer->AlterFieldDefn(fieldIndex, poFieldDefn, OGRAlterFieldDefnOptions::OGR_ALTER_ALL_FLAG);
    if (err == OGRERR_NONE) {
        printf("Field definition altered successfully.\n");
    } else {
        printf("Failed to alter field definition.\n");
    }

AlterGeomFieldDefn

virtual OGRErr AlterGeomFieldDefn(int iGeomField, const OGRGeomFieldDefn *poNewGeomFieldDefn, int nFlagsIn)

更改图层上现有几何字段的定义

参数:

  • iGeomField -- 必须更改其定义的字段的索引。

  • poNewGeomFieldDefn -- 新的字段定义

  • nFlagsIn -- ALTER_GEOM_FIELD_DEFN_NAME_FLAG、ALTER_GEOM_FIELD_DEFN_TYPE_FLAG、ALTER_GEOM_FIELD_DEFN_NULLABLE_FLAG、ALTER_GEOM_FIELD_DEFN_SRS_FLAG ALTER_GEOM_FIELD_DEFN_SRS_COORD_EPOCH_FLAG的组合,以指示必须考虑新字段定义中的哪一个名称和/或类型和/或可空性和/或 SRS 和/或坐标纪元。或者ALTER_GEOM_FIELD_DEFN_ALL_FLAG更新所有成员。

返回:  OGRERR_NONE成功

    // 获取第一个图层
    OGRLayer* poLayer = poDS->GetLayer(0);

    // 获取指定几何字段的定义
    int geomFieldIndex = 0; // 假设我们要修改第一个几何字段的定义
    OGRGeomFieldDefn* poGeomFieldDefn = poLayer->GetLayerDefn()->GetGeomFieldDefn(geomFieldIndex);

    // 修改几何字段定义
    OGRGeomFieldDefn newGeomFieldDefn = *poGeomFieldDefn; // 复制原有字段定义
    newGeomFieldDefn.SetWidth(50); // 设置字段宽度为50
    newGeomFieldDefn.SetPrecision(2); // 设置字段精度为2

    // 提交几何字段修改
    OGRErr err = poLayer->AlterGeomFieldDefn(geomFieldIndex, &newGeomFieldDefn, OGRAlterGeomFieldDefnOptions::OGR_ALTER_NAME_FLAG);

    if (err == OGRERR_NONE) {
        printf("Geometry field definition altered successfully.\n");
    } else {
        printf("Failed to alter geometry field definition.\n");
    }

 `AlterGeomFieldDefn` 用于修改几何字段的定义,即图层中存储几何信息的字段。

 `AlterFieldDefn` 用于修改非几何字段的定义,即图层中存储属性信息的字段。

 

CreateGeomField

virtual OGRErr CreateGeomField(OGRGeomFieldDefn *poField, int bApproxOK = TRUE)

在图层上创建新的几何字段

参数:

  • poField -- 要写入磁盘的几何字段定义。

  • bApproxOK -- 如果为 TRUE,则根据格式驱动程序的限制,可能会以略有不同的形式创建字段。

返回:  OGRERR_NONE成功

// 创建一个新的几何字段
OGRGeomFieldDefn geomFieldDefn("MyGeometry", OGRwkbGeometryType::wkbPoint);
geomFieldDefn.SetWidth(2); // 设置坐标维度为2

// 调用CreateGeomField添加几何字段到图层
OGRErr err = layer->CreateGeomField(&geomFieldDefn);
if (err == OGRERR_NONE) {
    // 几何字段创建成功
    std::cout << "Created new geometry field: " << geomFieldDefn.GetName() << std::endl;
} else {
    std::cout << "Failed to create geometry field." << std::endl;
}

SyncToDisk

Virtual OGRErr SyncToDisk()

将挂起的更改刷新到磁盘

返回:   OGRERR_NONE是否没有发生错误(即使什么都不做)或错误代码

// 将修改同步到磁盘
OGRErr err = layer->SyncToDisk();
if (err == OGRERR_NONE) {
    std::cout << "Changes synchronized to disk." << std::endl;
} else {
    std::cout << "Failed to sync changes to disk." << std::endl;
}

你可能感兴趣的:(OGR,学习)