OGR根據FID刪除矢量中的某個要素(多邊形)

這是一個函數,實現複製原來的矢量文件,然後刪除掉FID與對應數組pFID中相等的要素,參數1爲原來的矢量文件DataSource指針,參數2爲輸出的矢量文件名,參數3爲存儲要刪除的FID的數組,參數4爲結果矢量的格式。

bool CreateResultSHP(OGRDataSource *poSrcDs,std::string outputFileName,vector<int> *pFID,const char* pszFormat)
{
 //創建輸出矢量文件
 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;

}

 

發佈了21 篇原創文章 · 獲贊 15 · 訪問量 40萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章