OGRLayer Class “ogrsf_frmts.hpp/ogrsf_frmts.h”
OGRLayer是C++的类,是GDAL/OGR库中用于表示矢量图层的核心类之一。它提供了读取和写入矢量数据的方法和属性,例如读取和写入要素,修改属性和几何形状等
此类表示具有访问方法的简单功能层
GetSpatialFilter
virtual OGRGeometry *GetSpatialFilter() 此方法与 C 函数 OGR_L_GetSpatialFilter() 相同。
此方法返回此图层的当前空间过滤器
返回: 空间过滤器几何
空间过滤器是一种基于空间位置的查询机制,用于限制查询结果集。它可以根据几何形状、位置和拓扑关系等条件来过滤和筛选矢量数据中的要素。常见的空间过滤器包括矩形、圆形、多边形等。空间过滤器可以用于提高查询效率,减少查询结果集的大小,并且可以更好地支持地理空间分析。
GDALAllRegister();
OGRRegisterAll();
GDALDataset *poDataset = (GDALDataset*)GDALOpenEx("example.tif", GDAL_OF_VECTOR, NULL, NULL, NULL); //打开一个数据集
OGRLayer *poLayer = poDataset->GetLayerByName("layer_name"); //获取一个OGRLayer对象
OGRGeometry *poSpatialFilter = poLayer->GetSpatialFilter(); //获取当前设置的空间过滤器
GDALClose(poDataset);
OGRGeometryFactory::destroyGeometry(poSpatialFilter); //使用destroyGeometry方法清理空间过滤器
SetSpatialFilter
virtual void SetSpatialFilter(OGRGeometry*) 此方法与 C 函数 OGR_L_SetSpatialFilter() 相同
设置新的空间过滤器
参数: poFilter – 用作过滤区域的几何图形。可以传递 NULL,指示应清除当前空间过滤器,但不建立新的空间过滤器
SetSpatialFilter
virtual void SetSpatialFilter(int iGeomField, OGRGeometry*) 此方法与 C 函数 OGR_L_SetSpatialFilterEx() 相同
设置新的空间过滤器
SetSpatialFilterRect
virtual void SetSpatialFilterRect(double dfMinX, double dfMinY, double dfMaxX, double dfMaxY) 此方法与 C 函数 OGR_L_SetSpatialFilterRect() 相同
设置新的矩形空间过滤器
参数:
-
dfMinX – 矩形区域的最小 X 坐标。
-
dfMinY – 矩形区域的最小 Y 坐标。
-
dfMaxX – 矩形区域的最大 X 坐标。
-
dfMaxY – 矩形区域的最大 Y 坐标。
SetSpatialFilterRect
virtual void SetSpatialFilterRect(int iGeomField, double dfMinX, double dfMinY, double dfMaxX, double dfMaxY) 此方法与 C 函数 OGR_L_SetSpatialFilterRectEx() 相同
设置新的矩形空间过滤器
参数:
-
iGeomField – 空间过滤器在其上运行的几何字段的索引。
-
dfMinX – 矩形区域的最小 X 坐标。
-
dfMinY – 矩形区域的最小 Y 坐标。
-
dfMaxX – 矩形区域的最大 X 坐标。
-
dfMaxY – 矩形区域的最大 Y 坐标。
对比
SetSpatialFilter()方法用于指定一个OGREnvelope(包含xmin、ymin、xmax、ymax)作为过滤器,用于检索与该空间范围相交的要素。这个方法通常用于在一个较大的地理数据集中选择某个特定区域的要素。如果OGREnvelope为空,则将禁用空间过滤器。
SetSpatialFilterRect()方法用于指定一个矩形区域的边界(左上角和右下角),用于检索与该矩形相交的要素。这个方法通常用于在一个较小的地理数据集中选择一个特定的矩形区域内的要素。如果矩形为空,则将禁用空间过滤器。
需要注意的是,SetSpatialFilter()和SetSpatialFilterRect()方法设置的空间过滤器都是针对OGRLayer的,而不是针对整个GDALDataset的。所以如果要针对整个GDALDataset设置空间过滤器,需要为每个OGRLayer都设置空间过滤器。
SetSpatialFilter(int iGeomField, OGRGeometry*) 是设置指定几何列上的空间过滤器,而 SetSpatialFilter(OGRGeometry*) 则是在所有几何列上设置空间过滤器。
在某些数据源中,一个图层可以包含多个几何列,这些几何列包含不同的几何类型和空间参考系统。通过使用 SetSpatialFilter(int iGeomField, OGRGeometry*),可以选择一个具体的几何列并在该列上设置过滤器。如果没有指定几何列,则将在第一个可用的几何列上设置过滤器。
而 SetSpatialFilter(OGRGeometry*) 会在所有的几何列上设置过滤器,可能会导致性能下降或者结果不准确。因此,如果数据源只有一个几何列,或者只需要在其中一个几何列上进行空间查询,则最好使用 SetSpatialFilter(int iGeomField, OGRGeometry*) 方法来指定几何列。
同理SetSpatialFilterRect也是如此
几何列
几何列(Geometry Column)是指OGR数据源中记录几何信息的列,通常是点、线、面等空间要素。在一些数据源中,一个图层可以包含多个几何列,每个几何列都包含不同类型的空间要素。例如,在ESRI File Geodatabase中,一个图层可以包含点、线、面三个几何列
SetAttributeFilter
virtual OGRErr SetAttributeFilter(const char*) 此方法与 C 函数 OGR_L_SetAttributeFilter() 相同
设置新的属性查询
参数:
pszQuery – 以受限的 SQL WHERE 格式进行查询,或 NULL 以清除当前查询。
返回: OGRERR_NONE如果安装成功,或者错误代码(如果查询表达式出错)或发生某些其他故障
GDALDataset *poDS = (GDALDataset*) GDALOpenEx("example.tif", GDAL_OF_VECTOR, NULL, NULL, NULL);
// 获取第一个图层
OGRLayer *poLayer = poDS->GetLayer(0);
// 设置属性过滤器
poLayer->SetAttributeFilter("POPULATION > 1000000");
ResetReading
virtual void ResetReading() = 0 此方法与 C 函数 OGR_L_ResetReading() 相同
重置特征读取以从第一个特征开始
一般情况下,在读取完一个图层之后,如果想重新读取该图层,则应调用ResetReading()
GetNextFeature
Virtual OGRFeature *GetNextFeature() = 0 此方法与 C 函数 OGR_L_GetNextFeature() 相同
从此图层获取下一个可用要素
返回: 一个功能,如果没有其他功能可用,则为 NULL
GDALDataset *poDS = (GDALDataset *) GDALOpenEx("example.tif", GDAL_OF_VECTOR, NULL, NULL, NULL);
// 获得图层
OGRLayer *poLayer = poDS->GetLayer(0);
poLayer->ResetReading();
OGRFeature *poFeature;
while ((poFeature = poLayer->GetNextFeature()) != NULL) {
// 对特征.....
// 释放内存
OGRFeature::DestroyFeature(poFeature);
}
// 关闭数据集
GDALClose(poDS);
SetNextByIndex
virtual OGRErr SetNextByIndex(GIntBig nIndex) 此方法与 C 函数 OGR_L_SetNextByIndex() 相同
将读取光标移动到当前结果集中的第 nIndex(一个)特征
参数:
nIndex – 指示要查找的结果集的步骤数的索引。
返回: OGRERR_NONE成功或错误代码
OGRLayer* poLayer = poDS->GetLayer(0);
// 设置当前要素为第3个要素
OGRFeature* poFeature = poLayer->SetNextByIndex(2);
GetFeature
virtual OGRFeature *GetFeature(GIntBig nFID) 此方法与 C 函数 OGR_L_GetFeature() 相同
按标识符获取要素
参数:
nFID – 要读取的功能的功能 ID。
返回: 现在由调用方拥有的功能,或失败时为 NULL
OGRLayer* poLayer = poDS->GetLayer(0);
// 获取 FID 为 100 的要素
OGRFeature* poFeature = poLayer->GetFeature(100);
遍历获取FID
OGRLayer* poLayer = poDS->GetLayer(0);
// 遍历图层中的所有要素
poLayer->ResetReading();
OGRFeature* poFeature = NULL;
while ((poFeature = poLayer->GetNextFeature()) != NULL)
{
// 获取要素的 FID
GIntBig nFID = poFeature->GetFID();
// 输出 FID
std::cout << "FID: " << nFID << std::endl;
// 释放要素内存
OGRFeature::DestroyFeature(poFeature);
}
GetDataset
virtual GDALDataset *GetDataset()
返回与此图层关联的数据集
返回: 数据集,或未知时的 nullptr
在OGRLayer中,该函数不是经常被使用,因为一个OGRLayer对象通常只表示一个图层或表,而不是一个完整的数据集