访问量: 206 次浏览
下面是在C++中使用开源GIS类库GDAL/OGR读写shaple文件的一些代码片段
(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(); (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();