使用开源GIS类库GDAL/OGR读写shaple文件的一些代码片段


发布日期 : 2015-04-06 22:32:27 UTC

访问量: 206 次浏览

下面是在C++中使用开源GIS类库GDAL/OGR读写shaple文件的一些代码片段

GDAL读shp文件

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

GDALAllRegister(); OGRRegisterAll(); 

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

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

(3)打开shp文件

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

(4)获取shp图层

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

(5)读取几何和属性值

 OGRFeature * pFeature;  while ((pFeature=poLayer->GetNextFeature())!=NULL)  {  OGRGeometry* pGeometry = pFeature->GetGeometryRef(); if (pGeometry == NULL) { AfxMessageBox("Geometry get failed."); return FALSE; } OGRwkbGeometryType geoType = pGeometry->getGeometryType(); if (wkbPoint==geoType) CString strNodeID = pFeature->GetFieldAsString("NodeID"); else if (wkbLineString==geoType) { OGRLineString* pLineGeo = (OGRLineString*)pGeometry; double staX = pLineGeo->getX(0); double staY = pLineGeo->getY(0); } } 

6)资源清理

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

GDAL写shp文件

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

 GDALAllRegister(); OGRRegisterAll(); 

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

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

(3)创建shp文件

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

(4)创建图层

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

(5)创建字段

 // 字符串  OGRFieldDefn oField1("GeoObjNum",OFTString);  oField1.SetWidth(8);  if( poLayer->CreateField( &oField1 ) != OGRERR_NONE ){  AfxMessageBox( "Creating Name field failed.\n" );return FALSE;}  // 浮点数  OGRFieldDefn oField2("LBTG",OFTReal);  oField2.SetPrecision(3);  if( poLayer->CreateField( &oField2 ) != OGRERR_NONE ){ AfxMessageBox( "Creating Name field failed.\n" );return FALSE;}  // 整型  OGRFieldDefn oField3("Number",OFTInteger);  if( poLayer->CreateField( &oField3 ) != OGRERR_NONE ){ AfxMessageBox( "Creating Name field failed.\n" );return FALSE;} 

(6)创建几何和Feature

 GRFeature *poFeature; poFeature = new OGRFeature( poLayer->GetLayerDefn() ); poFeature->SetField( "GeoObjNum", strGeoObjNum ); poFeature->SetField( "LBTG", fLBTG ); poFeature->SetField( "Number", number ); OGRLineString *poLine = new OGRLineString(); poLine->setNumPoints(2); poLine->setPoint(0,startX,startY, 0.0); poLine->setPoint(1,endX,endY, 0.0); poFeature->SetGeometryDirectly( poLine ); if( poLayer->CreateFeature( poFeature ) != OGRERR_NONE ) { AfxMessageBox("Failed to create feature in shapefile."); return FALSE; } 

(7)资源清理

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