這是一個函數,實現複製原來的矢量文件,然後刪除掉FID與對應數組pFID中相等的要素,參數1爲原來的矢量文件DataSource指針,參數2爲輸出的矢量文件名,參數3爲存儲要刪除的FID的數組,參數4爲結果矢量的格式。
{
//創建輸出矢量文件
OGRSFDriver *poDriver;
if (pszFormat == NULL)
{
pszFormat = "ESRI Shapefile";
}
poDriver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName( pszFormat );
if (poDriver == NULL)
{
cerr<<"Creater poDriver error!"<<endl;
return false;
}
//先複製一份原來的矢量文件,實驗驗證過使用CopyDataSource的方法可以將投影也複製
OGRDataSource* poDstDS = poDriver->CopyDataSource(poSrcDs,outputFileName.c_str(),NULL);
if (poDstDS == NULL)
{
cerr<<"Creater poDstDS error!"<<endl;
return false;
}
//獲取該數據源的圖層數量
int nLayerCount = poDstDS->GetLayerCount();
cout<<"nLayerCount = "<<nLayerCount<<endl;
//讀取該數據源中的第一個圖層
OGRLayer *_Layer = poDstDS->GetLayer(0);
if (_Layer == NULL)
{
cout<<"Layer Error!"<<endl;
return 0;
}
//讀取該圖層的定義
OGRFeatureDefn *pFeatureDefn = NULL;
pFeatureDefn = _Layer->GetLayerDefn();
//讀取該圖層的名稱
std::string strLayerName = pFeatureDefn->GetName();
//讀取圖層的字段個數
int nFieldCount = 0;
nFieldCount = pFeatureDefn->GetFieldCount();
//獲取每個Feature
OGRFeature *_Feature;
OGRFieldDefn *pFieldDefn = NULL;
OGRFieldType fieldtype;
_Layer->ResetReading();//從頭開始讀取
/* -------------------------------------------------------------------- */
/* 循環處理每一個Feature,Feature包括形狀Geometry和屬性Field */
/* -------------------------------------------------------------------- */
while ((_Feature = _Layer->GetNextFeature()) != NULL)
{
//根據字段名稱獲取字段的內容
long iFID = _Feature->GetFID();
for (int i = 0;i<pFID->size();i++)
{
if(abs(pFID->at(i) - iFID) < 0.00001)
{
_Layer->DeleteFeature(iFID);
}
}
}
std::string strSQL = "REPACK " + strLayerName;
poDstDS->ExecuteSQL(strSQL.c_str(),NULL,""); //此句非常關鍵,如果只用DeleteFeature只是把dbf文件裏FID爲該值的要素標記爲deleted,但實際上並未將該feature真正刪除,利用REPACK命令,將忽略標記爲deleted的feature。
OGRDataSource::DestroyDataSource(poDstDS);
cout<<"Create result shp file completed!"<<endl;
return true;
}