Quantcast
Channel: Question and Answer » gdal
Viewing all articles
Browse latest Browse all 397

Can't convert geometry from Dgn file to Shape file?

$
0
0

I am using below codes to try convert geometry from a Dgn file to Shape file. But, I can’t exit the Feature reading loop. Are there anyone know why and how to fix it ? Please download the dgn file from the link: DgnFile

bool Convert()
{

    OGRRegisterAll();

    OGRDataSource       *poDS,  *poSHPDS;
    const char *pszDriverName = "ESRI Shapefile";
    OGRSFDriver *poDriver;

    poDriver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(
                  pszDriverName );

    // Open file DGN

    poDS = OGRSFDriverRegistrar::Open( sourceFile, FALSE );

    if( poDS == NULL )

    {
         cout << "Error opeing DGN file." << endl;
         return false;
    } 
    // Create datasource for file shp
  poSHPDS = poDriver->CreateDataSource(destinationPath,NULL);

  if( poSHPDS == NULL )

  {

        cout << "Error creating shape file." << endl;

        return false;
  }


  OGRLayer  *poLayer, *poSHPLayer; 

  // Get Layer from DGN file

  poLayer = poDS->GetLayer(0);

  // Create new Layer of SHP file

  poSHPLayer = poSHPDS->CreateLayer (shpFileName, NULL, wkbPolygon, NULL);

  if(poSHPLayer == NULL)

  {

          cout << "Error creating Layer of Shape File." << endl;

          return false;
  }

  OGRFeature *poFeature;

  poLayer->ResetReading(); 

  **while( (poFeature = poLayer->GetNextFeature()) != NULL ) // Can't exit this loop** 

  {

        OGRGeometry *poGeometry;
        poGeometry = poFeature->GetGeometryRef();

        // if feature is a Polygon
        if( poGeometry != NULL && (wkbFlatten(poGeometry->getGeometryType()) == wkbPolygon ) )
        {
                OGRFeature *poSHPFeature;
                //Create new Feature shape file
                poSHPFeature = OGRFeature::CreateFeature (poSHPLayer->GetLayerDefn());
                poSHPFeature->SetGeometry (poGeometry);
                OGRPolygon *poPolygon = (OGRPolygon*) poSHPFeature->GetGeometryRef();

                poLayer->SetSpatialFilter(poGeometry);
                poLayer->ResetReading ();

         }
         OGRFeature::DestroyFeature( poFeature );

    }
    OGRDataSource::DestroyDataSource( poDS );
    OGRDataSource::DestroyDataSource( poSHPDS );
    return true;
} 

Thanks and regards,

Tai


Viewing all articles
Browse latest Browse all 397