Как удалить функцию из шейп-файла с помощью GDAL C ++?

Я использую GDAL версии 2.0.0.

У меня есть программа на C ++, в которой я хочу удалить объект из шейп-файла. Код ошибки возврата указывает на успешное удаление. Тем не менее, функция остается в шейп-файле.

Есть ли какая-то последующая функция, которую я должен вызвать, чтобы удаление продолжалось? Например, когда вы вносите изменение в поле существующей функции, вам необходимо впоследствии вызвать OGRLayer::SetFeature() опять же, иначе изменения не сохраняются.

Ниже приведен фрагмент того, что я делаю. Шейп-файл создается с нуля путем полигонизации растрового файла. Затем я пытаюсь удалить один объект из этого шейп-файла перед закрытием файла.

#include <gdal_alg.h>     // GDALPolygonize()
#include <gdal_priv.h>

//
// srcPath is the path of the soruce raster geospatial file.  e.g., a GeoTIFF file.
// tgtPath is the path of the target vector geospatial file.  i.e., a shapefile.
//
void test( char const * srcPath, char const * tgtPath )
{
GDALAllRegister();

// Open source file.
GDALDataset * pSrcDataset = static_cast<GDALDataset *>( GDALOpen( srcPath, GA_ReadOnly ) );

GDALRasterBand * pSrcBand = pSrcDataset->GetRasterBand( 1 );

// Create and open target file.
GDALDriver * pDriver = GetGDALDriverManager()->GetDriverByName( "ESRI Shapefile" );
GDALDataset * pTgtDataset = pDriver->Create( tgtPath, 0, 0, 0, GDT_Unknown, NULL );

// Create a layer.
OGRLayer * pTgtLayer = pTgtDataset->CreateLayer( "layer", NULL, wkbPolygon, NULL );

// Create a field to contain value associated with each polygon feature.
OGRFieldDefn field( "value", OFTInteger );
field.SetWidth( 6 );
pTgtLayer->CreateField( &field );

// Call GDALPolygonize to convert source raster to polygon features.
GDALRasterBand * pMaskBand = NULL;
int valueFieldIdx = 0;
char ** options = NULL;
GDALPolygonize(
pSrcBand,
pMaskBand,
pTgtLayer,
valueFieldIdx,
options,
GDALTermProgress, NULL );

// Demonstrate that the target layer has the capability to delete a feature.
if ( !pTgtLayer->TestCapability( OLCDeleteFeature ) )
{
throw "Layer does not support delete feature capability";
}

// Delete a feature that I know is there.
// The feature has a particular integer ID.
OGRErr err = pTgtLayer->DeleteFeature( 12 );

// Demonstrate that there is a zero error code, indicating successful deletion.
if ( err != OGRERR_NONE )
{
throw "Failed to remove feature";
}

// Close source and target files.
GDALClose( pSrcDataset );
GDALClose( pTgtDataset );
}

0

Решение

Я узнал от коллеги, что заставляет удаление функции сохраняться в файле. После того как я выполнил все удаления объектов и перед тем, как закрыть шейп-файл, я делаю следующее.

  // Delete features.
...

// Flush pending changes.
pTgtLayer->SyncToDisk();

// Execute a SQL command.
// It is essential, to force my changes to take effect.
// As a side effect, it renumbers the features to fill in
// the gaps left by deleted features.
stringstream sql;
sql << "REPACK " << pTgtLayer->GetName();
pTgtDataset->ExecuteSQL( sql.str().c_str(), NULL, NULL );

// Close files.
...
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]