GDAL官网 OGR API Tutorial学习笔记一:Reading From OGR

#include "ogrsf_frmts.h"

int main()

{

//注册所有格式驱动

GDALAllRegister();

//打开数据源,参数1:路径,参数2:向量驱动,不更新数据

GDALDataset *poDS;

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

if( poDS == NULL )

{

printf( "Open failed.\n" );

exit( 1 );

}

//获得数据源下的图层

OGRLayer *poLayer;

poLayer = poDS->GetLayerByName( "point" ); //通过名字获得图层

//也可以通过序号(index:0,1,2,3,...)获得图层

//poLayer = poDS->GetLayer(index);

//图层数可以通过GDALDataset::GetLayerCount()获得

//从图层中遍历所有的要素features

OGRFeature *poFeature;

poLayer->ResetReading(); //保证从图层开头读取

while( (poFeature = poLayer->GetNextFeature() ) != NULL )

{

//转存要素的所有属性字段

//先从图层获得包含所有字段定义的对象OGRFeatureDefn

OGRFeatureDefn *poFDefn = plLayerDefn();

int iField;

//遍历所有字段,通过类型获得属性值

for( iField = 0; iField < poFDefn->GetFieldCount(); iField++ )

{

OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn( iField );

if( poFieldDefn->GetType() == OFTInteger )

printf( "%d,", poFeature->GetFieldAsInteger( iField ) ); //整数

else if( poFieldDefn->GetType() == OFTReal )

printf( "%.3f,", poFeature->GetFieldAsDouble( iField ) ); //double

else if( poFieldDefn->GetType() == OFTString )

printf( "%s,", poFeature->GetFieldAsString( iField ) ); //string

else

printf( "%s,", poFeature->GetFieldAsString( iField ) ); //string

}

//从要素获得几何图形,屏幕显示x、y坐标值

OGRGeometry *poGeometry;

poGeometry = poFeature->GetGeometryRef(); //几何图形统一的类型

if( poGemetry != NULL && wkbFlatten( poGemetry->getGeometryType() ) == wkbPoint ) //如果是点要素

{ //wkbFlatten()宏将wkbPoint25D(带z坐标值)转换成2维wkbPoint

OGRPoint *poPoint = ( OGRPoint * ) poGeometry; //类型转换

printf( "%.3f, %3.f\n", poPoint->getX(), poPoint->getY()  );

}

else

{

printf( "no point geometry\n" );

}

//OGR 1.11及以后的版本,几何图形字段关联到要素

//也可以通过以下方式从要素获得几何图形,屏幕显示x、y坐标值

/*

OGRGeometry *poGeometry;

int iGeomField;

int nGeomFieldCount;

nGeomFieldCount = poFeature->GetGeomFieldCount();

for( iGeomField = 0;  iGeomField < nGeomFieldCount;  iGeomField++ )

{

poGeometry = poFeature->GetGeomFieldRef(iGeoField);

if( poGeometry != NULL && wkbFlatten( poGeometry->getGeometryType() ) == wkbPoint )

{

OGRPoint *poPoint = (OGRPoint *) poGeometry;

printf( "%.3f, %3.f\n", poPoint->getX(),  poPoint->getY() );

}

else

{

printf( "no point geometry\n" );

}

}

*/

OGRFeature::DestroyFeature( poFeature ); // the OGRLayer::GetNextFeature() method returns a copy of the feature that is now owned by us.

} //So at the end of use we must free the feature.

GDALClose( poDS ); //we do need to delete the datasource in order to close the input file.

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值