GDAL读写shp文件

#include "gdal_include/gdal.h"

#include "gdal_include/ogr_api.h"
#include "gdal_include/ogrsf_frmts.h"

#pragma comment(lib, "lib/gdal_i.lib")

-----------------------------------------

GDAL读shp文件

(1) 注册所有的文件格式驱动

1 GDALAllRegister();
2 OGRRegisterAll();

(2)得到shp文件的处理器

1 OGRSFDriver * poDriver =  OGRSFDriverRegistrar::GetRegistrar() -> GetDriverByName( " ESRI Shapefile " );

(3)打开shp文件

1 OGRDataSource * poDS = poDriver -> Open( " D:\\lakes.shp " , NULL );

(4)获取shp图层

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

(5)读取几何和属性值

1 OGRFeature * pFeature;
2   while ((pFeature = poLayer -> GetNextFeature()) != NULL)
3 {
4 OGRGeometry * pGeometry = pFeature -> GetGeometryRef();
5 if (pGeometry == NULL)
6 {
7 AfxMessageBox( " Geometry get failed. " );
8 return FALSE;
9 }
10
11 OGRwkbGeometryType geoType = pGeometry -> getGeometryType();
12 if (wkbPoint == geoType)
13 CString strNodeID = pFeature -> GetFieldAsString( " NodeID " );
14 else  if (wkbLineString == geoType)
15 {
16 OGRLineString * pLineGeo = (OGRLineString * )pGeometry;
17 double staX = pLineGeo -> getX( 0 );
18 double staY = pLineGeo -> getY( 0 );
19 }
20 }

(6)资源清理

1 OGRDataSource::DestroyDataSource( poDS );
2 OGRCleanupAll();

GDAL写shp文件

(1) 注册所有的文件格式驱动

1 GDALAllRegister();
2 OGRRegisterAll();

 

(2)得到shp文件的处理器

1 OGRSFDriver * poDriver = OGRSFDriverRegistrar::GetRegistrar() -> GetDriverByName( " ESRI Shapefile " );
 

(3)创建shp文件

1 OGRDataSource * poDS = poDriver -> CreateDataSource( " D:\\lakes.shp " , NULL );

 

(4)创建图层

OGRLayer * poLayer = poDS -> CreateLayer( " tbLine " , NULL, wkbLineString, NULL );

 

(5)创建字段

1 // 字符串
2   OGRFieldDefn oField1( " GeoObjNum " ,OFTString);
3 oField1.SetWidth( 8 );
4   if ( poLayer -> CreateField( & oField1 ) != OGRERR_NONE ){
5 AfxMessageBox( " Creating Name field failed.\n " ); return FALSE;}
6
7   // 浮点数
8   OGRFieldDefn oField2( " LBTG " ,OFTReal);
9 oField2.SetPrecision( 3 );
10   if ( poLayer -> CreateField( & oField2 ) != OGRERR_NONE ){
11 AfxMessageBox( " Creating Name field failed.\n " ); return FALSE;}
12
13   // 整型
14   OGRFieldDefn oField3( " Number " ,OFTInteger);
15   if ( poLayer -> CreateField( & oField3 ) != OGRERR_NONE ){
16 AfxMessageBox( " Creating Name field failed.\n " ); return FALSE;}

 

(6)创建几何和Feature

1 O GRFeature * poFeature;
2 poFeature = new OGRFeature( poLayer -> GetLayerDefn() );
3
4 poFeature -> SetField( " GeoObjNum " , strGeoObjNum );
5 poFeature -> SetField( " LBTG " , fLBTG );
6 poFeature -> SetField( " Number " , number );
7
8 OGRLineString * poLine = new OGRLineString();
9
10 poLine -> setNumPoints( 2 );
11 poLine -> setPoint( 0 ,startX,startY, 0.0 );
12 poLine -> setPoint( 1 ,endX,endY, 0.0 );
13
14 poFeature -> SetGeometryDirectly( poLine );
15   if ( poLayer -> CreateFeature( poFeature ) != OGRERR_NONE )
16 {
17 AfxMessageBox( " Failed to create feature in shapefile. " );
18 return FALSE;
19 }

 

(7)资源清理

1 OGRDataSource::DestroyDataSource( poDS );
2 OGRCleanupAll();

你可能感兴趣的:(HP)