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");
}
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);
virtual int TestCapability(const char*) = 0
测试此层是否支持命名功能
参数:
pszCap -- 要测试的功能的名称。
返回: 如果图层具有请求的功能,则为 TRUE,否则为 FALSE。OGRLayers 将为任何无法识别的功能返回 FALSE
在GNMGenericLayer和OGRGNMWrappedResultLayer中实现
virtual OGRErr Rename(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;
}
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;
}
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");
}
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");
}
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");
}
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` 用于修改非几何字段的定义,即图层中存储属性信息的字段。
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;
}
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;
}