GDAL OGR C++ API 학습 경로 (4) OGRLayer 코드 예제

GetExtent

가상  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

가상  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);

테스트 기능

가상 int TestCapability(const char*) = 0

이 계층이 이름 지정 기능을 지원하는지 여부를 테스트합니다.

매개변수:

pszCap  – 테스트할 기능의 이름입니다.

반환값: 레이어에 요청된 기능이 있으면 TRUE, 그렇지 않으면 FALSE. OGRLayers는 인식할 수 없는 기능에 대해 FALSE를 반환합니다.

GNMGenericLayerOGRGNMWrappedResultLayer 에서 구현됨

이름 바꾸기

가상  OGRErr  이름 바꾸기const  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

가상  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;
    }

필드 삭제

가상  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");
    }

재정렬 필드

가상  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

가상  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의 조합으로 새 필드 정의에서 고려해야 하는 이름 및/또는 유형 및/또는 너비 및 정밀도 필드 및/또는 null 허용 여부를 나타냅니다.

반환: 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

가상  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의 조합으로 이름 및/또는 유형 및/또는 null을 나타냅니다. 능력 및/또는 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

가상  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

가상  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;
}

Supongo que te gusta

Origin blog.csdn.net/qq_69574549/article/details/132023396
Recomendado
Clasificación