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

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 SetSpatialFilterOGRGeometry*)                此方法与 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 SetAttributeFilterconst 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 SetNextByIndexGIntBig nIndex)        此方法与 C 函数 OGR_L_SetNextByIndex() 相同

将读取光标移动到当前结果集中的第 nIndex(一个)特征

参数:

nIndex – 指示要查找的结果集的步骤数的索引。

返回: OGRERR_NONE成功或错误代码

OGRLayer* poLayer = poDS->GetLayer(0);

// 设置当前要素为第3个要素
OGRFeature* poFeature = poLayer->SetNextByIndex(2);

GetFeature

virtual OGRFeature *GetFeatureGIntBig 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对象通常只表示一个图层或表,而不是一个完整的数据集

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是示例代码: ```python from osgeo import ogr, osr def grid_extent(geotransform, x_size, y_size): ulx, xres, xskew, uly, yskew, yres = geotransform lrx = ulx + (x_size * xres) lry = uly + (y_size * yres) return ulx, lrx, lry, uly def create_grid(shp_path, raster_path, grid_size): # Open raster file raster = ogr.Open(raster_path) layer = raster.GetLayer() # Compute extent of raster geotransform = layer.GetExtent() x_min, x_max, y_min, y_max = grid_extent(geotransform, layer.RasterXSize, layer.RasterYSize) # Create new shapefile for grid features driver = ogr.GetDriverByName("ESRI Shapefile") grid_shp = driver.CreateDataSource(shp_path) srs = osr.SpatialReference() srs.ImportFromEPSG(4326) layer = grid_shp.CreateLayer("grid", srs, ogr.wkbPolygon) # Create grid cells x_range = range(int(x_min), int(x_max), grid_size) y_range = range(int(y_min), int(y_max), grid_size) for x in x_range: for y in y_range: # Create new polygon feature feature = ogr.Feature(layer.GetLayerDefn()) feature.SetField("id", f"{x}-{y}") # Add geometry to feature ring = ogr.Geometry(ogr.wkbLinearRing) ring.AddPoint(x, y) ring.AddPoint(x + grid_size, y) ring.AddPoint(x + grid_size, y + grid_size) ring.AddPoint(x, y + grid_size) ring.AddPoint(x, y) poly = ogr.Geometry(ogr.wkbPolygon) poly.AddGeometry(ring) feature.SetGeometry(poly) # Add feature to layer layer.CreateFeature(feature) # Cleanup raster = None grid_shp = None ``` 这段代码使用GDALOGR库来创建一个矩形的网格。输入参数包括一个栅格文件的路径、一个输出的矢量文件的路径、以及每个网格的大小。输出的矢量文件包括了每个网格的四个角点,同时包含了其ID。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

场主不吃鍋巴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值