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

GetExtent

virtual OGRErr GetExtentOGREnvelope *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

GNMGenericLayerOGRGNMWrappedResultLayer中实现

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 CreateFieldOGRFieldDefn *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 CreateGeomFieldOGRGeomFieldDefn *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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是示例代码: ```python from osgeo import ogr, osr def grid_extent(geotransform, x_size, y_size): ulx, xres, xskew, uly, yskew, yres = geotransform lrx = ulx + (x_size * xres) lry = uly + (y_size * yres) return ulx, lrx, lry, uly def create_grid(shp_path, raster_path, grid_size): # Open raster file raster = ogr.Open(raster_path) layer = raster.GetLayer() # Compute extent of raster geotransform = layer.GetExtent() x_min, x_max, y_min, y_max = grid_extent(geotransform, layer.RasterXSize, layer.RasterYSize) # Create new shapefile for grid features driver = ogr.GetDriverByName("ESRI Shapefile") grid_shp = driver.CreateDataSource(shp_path) srs = osr.SpatialReference() srs.ImportFromEPSG(4326) layer = grid_shp.CreateLayer("grid", srs, ogr.wkbPolygon) # Create grid cells x_range = range(int(x_min), int(x_max), grid_size) y_range = range(int(y_min), int(y_max), grid_size) for x in x_range: for y in y_range: # Create new polygon feature feature = ogr.Feature(layer.GetLayerDefn()) feature.SetField("id", f"{x}-{y}") # Add geometry to feature ring = ogr.Geometry(ogr.wkbLinearRing) ring.AddPoint(x, y) ring.AddPoint(x + grid_size, y) ring.AddPoint(x + grid_size, y + grid_size) ring.AddPoint(x, y + grid_size) ring.AddPoint(x, y) poly = ogr.Geometry(ogr.wkbPolygon) poly.AddGeometry(ring) feature.SetGeometry(poly) # Add feature to layer layer.CreateFeature(feature) # Cleanup raster = None grid_shp = None ``` 这段代码使用GDALOGR库来创建一个矩形的网格。输入参数包括一个栅格文件的径、一个输出的矢量文件的径、以及每个网格的大小。输出的矢量文件包括了每个网格的四个角点,同时包含了其ID。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

场主不吃鍋巴

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

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

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

打赏作者

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

抵扣说明:

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

余额充值