void Reset()
将 OGRFeature 的状态重置为构造后的状态
OGRFeature* feature = new OGRFeature(featureDefn);
// 设置要素的属性和几何信息
...
// 重置要素,清除所有属性和几何信息
feature->Reset();
// 重新设置要素的属性和几何信息
...
OGRFeature *Clone() const 方法与 C 函数 OGR_F_Clone() 相同
克隆要素
返回: 新要素,与此要素完全匹配
OGRFeature *feature = layer->GetFeature(0);
OGRFeature *cloned_feature = feature->Clone();
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,即它们在数据源中的位置相同。
inline int GetFieldCount() const 方法与 C 函数 OGR_F_GetFieldCount() 相同
获取此功能的字段数
返回: 字段计数
int fieldCount = poFeature->GetFieldCount();
printf("Feature has %d fields\n", fieldCount);
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());
}
inline int GetFieldIndex(const char *pszName) const 此方法与 C 函数 OGR_F_GetFieldIndex() 相同
获取给定字段名称的字段索引
参数:
pszName – 要搜索的字段的名称。
返回: 字段索引,如果未找到匹配的字段,则为 -1
int idx = feature->GetFieldIndex("fieldName");
int IsFieldSet(int iField) const 方法与 C 函数 OGR_F_IsFieldSet() 相同
测试字段是否曾经被分配过值
参数:
iField – 要测试的字段。
返回: 如果已设置该字段,则为 TRUE,否则为 false
int iField = 0; // 要检查的字段索引
if (poFeature->IsFieldSet(iField)) {
// 字段已设置
} else {
// 字段未设置
}
void UnsetField(int iField) 与 C 函数 OGR_F_UnsetField() 相同。
清除字段,将其标记为未设置。
参数:
iField – 要取消设置的字段。
int iField = 0; // 要检查的字段索引
poFeature->UnsetField(iField);
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
void SetFieldNull(int iField) 与 C 函数 OGR_F_SetFieldNull() 相同
清除字段,将其标记为空。
参数:
iField – 要设置为 null 的字段。
int iField = 0; // 要检查的字段索引
poFeature->SetFieldNull(iField);
SetFieldNull和UnsetField对比:
清除字段的操作会将其标记为空,而不是未设置。当一个字段被标记为空时,表示它被设置了一个特殊的NULL值,而未设置的字段则表示它们根本没有被赋值。因此,将字段清除后,它将被视为已设置但为空
bool IsFieldSetAndNotNull(int iField) const 与 C 函数 OGR_F_IsFieldSetAndNotNull() 相同。
测试字段是否已设置且不为空。
参数:
iField – 要测试的字段。
返回: 如果字段已设置,则为 TRUE,是null或者未设置,否则为 false。
bool isSet = feature->IsFieldSetAndNotNull(0);