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 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 OGRFeature *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();