#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.
}