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

GetName

virtual const char *GetName()        此方法与 C 函数 OGR_L_GetName() 相同

返回图层名称

返回: 图层名称(不得释放)

// 获取第一个图层
OGRLayer* poLayer = poDS->GetLayer(0);

// 获取图层的名字
const char* layerName = poLayer->GetName();

// 打印图层的名字
printf("Layer name: %s\n", layerName);

 GetGeomType

virtual OGRwkbGeometryType GetGeomType ()        此方法与 C 函数 OGR_L_GetGeomType() 相同

返回图层几何类型

返回: 几何类型

OGRFeature *poFeature;
poLayer->ResetReading();
poFeature = poLayer->GetNextFeature();
if (poFeature != NULL) {
    OGRwkbGeometryType eType = poFeature->GetGeomType();
    printf("Geometry Type: %s\n", OGRGeometryFactory::getGeometryName(eType));
    OGRFeature::DestroyFeature(poFeature);
}

OGRGeometryFactory::getGeometryName

用于获取图层支持的几何类型名称的方法。对于每种几何类型(如点、线、面等),GDAL/OGR中都有一个预定义的名称,可以通过此方法获取它们的名称

OGRwkbGeometryType 对应的  字符串

  • wkbUnknown: "Unknown"
  • wkbPoint: "Point"
  • wkbLineString: "LineString"
  • wkbPolygon: "Polygon"
  • wkbMultiPoint: "MultiPoint"
  • wkbMultiLineString: "MultiLineString"
  • wkbMultiPolygon: "MultiPolygon"
  • wkbGeometryCollection: "GeometryCollection"
  • wkbNone: "None"

GetLayerDefn 

virtual OGRFeatureDefn *GetLayerDefn() = 0        此方法与 C 函数 OGR_L_GetLayerDefn() 相同

此方法与 C 函数 OGR_L_GetLayerDefn() 相同

返回: 功能定义

GDALDataset *poDS = (GDALDataset *)GDALOpenEx("data.shp", GDAL_OF_VECTOR, NULL, NULL, NULL);

//获取第一个图层
OGRLayer *poLayer = poDS->GetLayer(0);

//获取图层的定义
OGRFeatureDefn *poDefn = poLayer->GetLayerDefn();

FindFieldIndex

virtual int FindFieldIndexconst char *pszFieldName, int bExactMatch)        此方法与 C 函数 OGR_L_FindFieldIndex() 相同

查找图层中字段的索引

返回:  字段索引,如果字段不存在,则为 -1

GDALDataset *poDS = (GDALDataset *) GDALOpenEx("path/to/shapefile.shp", GDAL_OF_VECTOR, NULL, NULL, NULL);

// 获得第一个图层
OGRLayer *poLayer = poDS->GetLayer(0);

// 获得字段"NAME"的下标索引
int nameFieldIndex = poLayer->FindFieldIndex("NAME", TRUE);

if (nameFieldIndex < 0) {
    // 找不到字段
    cout << "Field " << fieldName << " not found!" << endl;
} else {
    // 找到字段
    cout << "Field " << fieldName << " found! Index = " << nameFieldIndex << endl;
}

GetSpatialRef

virtual OGRSpatialReference *GetSpatialRef()        此方法与 C 函数 OGR_L_GetSpatialRef() 相同

获取此图层的空间参考系统

返回: 空间参考,如果没有空间参考,则为 NULL

// 获取第一个图层
OGRLayer *poLayer = poDS->GetLayer(0);

// 获取空间参考
OGRSpatialReference *poSR = poLayer->GetSpatialRef();

// 打印坐标系信息
char *pszWkt = nullptr;
posR.exportToWkt(&pszWkt);
printf("WKT: %s\n", pszWkt);
CPLFree(pszWkt);

GetSupportedSRSListRetType  &  GetSupportedSRSList

virtual const GetSupportedSRSListRetType &GetSupportedSRSList(int iGeomField)  

获取支持的 SRS 列表

参数:

iGeomField – 几何字段索引。  

返回: 支持的 SRS 列表

在大多数情况下,这个索引值应该为0,因为大多数数据集只有一个几何图形字段。但是,如果您的数据集包含多个几何图形字段,则可以使用不同的索引值来获取每个字段所支持的坐标参考系列表

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

// 获取支持的空间参考系统列表
auto supportedSRSList = poLayer->GetSupportedSRSList(0);

// 输出列表中所有的空间参考系统
for (auto &srs : supportedSRSList)
{
    cout << srs << endl;
}

 输出 

PROJCS["WGS 84 / UTM zone 48N",    GEOGCS["WGS 84",        DATUM["WGS_1984",            SPHEROID["WGS 84",6378137,298.257223563,                AUTHORITY["EPSG","7030"]],
            AUTHORITY["EPSG","6326"]],
        PRIMEM["Greenwich",0,            AUTHORITY["EPSG","8901"]],
        UNIT["degree",0.0174532925199433,            AUTHORITY["EPSG","9122"]],
        AXIS["Latitude",NORTH],
        AXIS["Longitude",EAST],
        AUTHORITY["EPSG","4326"]],
    PROJECTION["Transverse_Mercator"],
    PARAMETER["latitude_of_origin",0],
    PARAMETER["central_meridian",105],
    PARAMETER["scale_factor",0.9996],
    PARAMETER["false_easting",500000],
    PARAMETER["false_northing",0],
    UNIT["metre",1,        AUTHORITY["EPSG","9001"]],
    AXIS["Easting",EAST],
    AXIS["Northing",NORTH],
    AUTHORITY["EPSG","32648"]]

SetActiveSRS

virtual OGRErr SetActiveSRS(int iGeomField, const OGRSpatialReference *poSRS)

更改活动的 SRS

参数:

  • iGeomField – 几何字段索引。

  • poSRS – 要使用的 SRS

返回: OGRERR_NONE成功,如果传递的SRS不在GetSupportedSRSList()中,则OGRERR_FAILURE

更改活动 SRS 会影响

GDALDataset* poDS = (GDALDataset*)GDALOpenEx("test.shp", GDAL_OF_VECTOR, NULL, NULL, NULL);

// 获取第一个图层
OGRLayer* poLayer = poDS->GetLayer(0);

// 创建一个EPSG:4326的空间参考对象
OGRSpatialReference oSRS;
oSRS.importFromEPSG(4326);

// 将第一个几何字段的活动SRS设置为EPSG:4326
poLayer->SetActiveSRS(0, &oSRS);

GetFeatureCount

virtual GIntBig GetFeatureCount(int bForce = TRUE)                此方法与 C 函数 OGR_L_GetFeatureCount() 相同

获取此图层中的要素计数

参数:

bForce – 指示是否应计算计数的标志,即使计数很昂贵。

返回: 特征计数,如果计数未知,则为 -1。

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

const int count = poLayer->GetFeatureCount()

printf("Feature count: %d\n", count);

GetFeatureCount() 返回的计数会考虑当前设置的空间过滤器。也就是说,如果设置了一个空间过滤器,返回的计数将仅包括满足空间过滤器条件的要素数量。如果没有设置空间过滤器,则返回的计数将是整个图层中的要素数量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

场主不吃鍋巴

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

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

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

打赏作者

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

抵扣说明:

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

余额充值