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

Reset

void Reset()

将 OGRFeature 的状态重置为构造后的状态

OGRFeature* feature = new OGRFeature(featureDefn);
// 设置要素的属性和几何信息
...
// 重置要素,清除所有属性和几何信息
feature->Reset();
// 重新设置要素的属性和几何信息
...

Clone

OGRFeature *Clone() const        方法与 C 函数 OGR_F_Clone() 相同

克隆要素

返回:  新要素,与此要素完全匹配

OGRFeature *feature = layer->GetFeature(0);
OGRFeature *cloned_feature = feature->Clone();

Equal

virtual OGRBoolean Equal(const OGRFeature *poFeature) const        方法与 C 函数 OGR_F_Equal() 相同

参数:

poFeature – 测试这个的另一个功能。

返回:  如果它们相等,则为 TRUE,否则为 FALSE

OGRFeature* feat1 = layer->GetFeature(0);
OGRFeature* feat2 = layer->GetFeature(1);

if (feat1->Equal(feat2)) {
    cout << "Features are equal." << endl;
} else {
    cout << "Features are not equal." << endl;
}
  • 两个对象共享相同的OGRFeatureDefn,即它们具有相同的属性表结构。
  • 两个对象具有相同的字段值,即它们所有属性的值都相等。
  • 两个对象具有相同的几何,即它们的几何对象相等(由OGRGeometry::Equal()函数测试)。
  • 两个对象具有相同的特征ID,即它们在数据源中的位置相同。

GetFieldCount

inline int GetFieldCount() const        方法与 C 函数 OGR_F_GetFieldCount() 相同

获取此功能的字段数

返回:  字段计数

int fieldCount = poFeature->GetFieldCount();
printf("Feature has %d fields\n", fieldCount);

GetFieldDefnRef

inline const OGRFieldDefn *GetFieldDefnRef(int iField) const         inline OGRFieldDefn *GetFieldDefnRef(int iField)         此方法与 C 函数 OGR_F_GetFieldDefnRef() 相同

获取此非几何字段的定义

参数:

iField – 要获取的字段,从 0 到 GetFieldCount()-1。

返回:  字段定义(来自 OGRFeatureDefn)。这是一个内部引用,不应删除或修改

OGRFeature* poFeature;
int iField = 0;  // 获取第一个字段定义
OGRFieldDefn* poFieldDefn = poFeature->GetFieldDefnRef(iField);
if (poFieldDefn != nullptr) {
    printf("Field name: %s\n", poFieldDefn->GetNameRef());
    printf("Field type: %d\n", poFieldDefn->GetType());
    printf("Field width: %d\n", poFieldDefn->GetWidth());
    printf("Field precision: %d\n", poFieldDefn->GetPrecision());
}

GetFieldIndex

inline int GetFieldIndex(const char *pszName) const         此方法与 C 函数 OGR_F_GetFieldIndex() 相同

获取给定字段名称的字段索引

参数:

pszName – 要搜索的字段的名称。

返回: 字段索引,如果未找到匹配的字段,则为 -1

int idx = feature->GetFieldIndex("fieldName");

IsFieldSet

int IsFieldSet(int iField) const        方法与 C 函数 OGR_F_IsFieldSet() 相同

测试字段是否曾经被分配过值

参数:

iField – 要测试的字段。

返回: 如果已设置该字段,则为 TRUE,否则为 false

int iField = 0;  // 要检查的字段索引
if (poFeature->IsFieldSet(iField)) {
    // 字段已设置
} else {
    // 字段未设置
}

UnsetField

void UnsetField(int iField)        与 C 函数 OGR_F_UnsetField() 相同。

清除字段,将其标记为未设置。

参数:

iField – 要取消设置的字段。

int iField = 0;  // 要检查的字段索引
poFeature->UnsetField(iField);

IsFieldNull

bool IsFieldNull(int iField) const         与 C 函数 OGR_F_IsFieldNull() 相同

测试字段是否为空

参数:

iField – 要测试的字段。

返回:  如果字段为空,则为 TRUE,否则为 false。

OGRFeature* poFeature = ...; // 假设已经定义了一个OGRFeature对象
int fieldIndex = 1; // 假设需要检查第2个字段是否为NULL
bool isNull = poFeature->IsFieldNull(fieldIndex);
if(isNull) {
    printf("Field %d is NULL.\n", fieldIndex);
} else {
    printf("Field %d is not NULL.\n", fieldIndex);
}

IsFieldNull和IsFieldSet对比:

  • 一个字段没有被设置值,IsFieldNull返回true,而IsFieldSet返回false
  • 一个字段设置为一个非NULL值,IsFieldNull返回false,而IsFieldSet返回ture
  • 一个字段被设置了 NULL 值,IsFieldSet() 也会返回 true,而 IsFieldNull() 返回 true

SetFieldNull

void SetFieldNull(int iField)        与 C 函数 OGR_F_SetFieldNull() 相同

清除字段,将其标记为空。

参数:

iField – 要设置为 null 的字段。

int iField = 0;  // 要检查的字段索引
poFeature->SetFieldNull(iField);

SetFieldNull和UnsetField对比:

清除字段的操作会将其标记为空,而不是未设置。当一个字段被标记为空时,表示它被设置了一个特殊的NULL值,而未设置的字段则表示它们根本没有被赋值。因此,将字段清除后,它将被视为已设置但为空

IsFieldSetAndNotNull

bool IsFieldSetAndNotNull(int iField) const         与 C 函数 OGR_F_IsFieldSetAndNotNull() 相同。

测试字段是否已设置且不为空。           

参数:

iField – 要测试的字段。

返回:  如果字段已设置,则为 TRUE,是null或者未设置,否则为 false。

bool isSet = feature->IsFieldSetAndNotNull(0);

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