#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 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 }
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();
2 OGRCleanupAll();
GDAL写shp文件
(1) 注册所有的文件格式驱动
1
GDALAllRegister();
2 OGRRegisterAll();
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;}
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 }
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();
2 OGRCleanupAll();