⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ogrs57datasource.cpp

📁 GIS系统支持库Geospatial Data Abstraction Library代码.GDAL is a translator library for raster geospatial dat
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* -------------------------------------------------------------------- *//*      Try opening.                                                    *//*                                                                      *//*      Eventually this should check for catalogs, and if found         *//*      instantiate a whole series of modules.                          *//* -------------------------------------------------------------------- */    if( !poModule->Open( bTestOpen ) )    {        delete poModule;        return FALSE;    }    nModules = 1;    papoModules = (S57Reader **) CPLMalloc(sizeof(void*));    papoModules[0] = poModule;    /* -------------------------------------------------------------------- *//*      Add the primitive layers if they are called for.                *//* -------------------------------------------------------------------- */    if( GetOption( S57O_RETURN_PRIMITIVES ) != NULL )    {        OGRFeatureDefn  *poDefn;        poDefn = S57GenerateVectorPrimitiveFeatureDefn( RCNM_VI, poModule->GetOptionFlags());        AddLayer( new OGRS57Layer( this, poDefn ) );        poDefn = S57GenerateVectorPrimitiveFeatureDefn( RCNM_VC, poModule->GetOptionFlags());        AddLayer( new OGRS57Layer( this, poDefn ) );        poDefn = S57GenerateVectorPrimitiveFeatureDefn( RCNM_VE, poModule->GetOptionFlags());        AddLayer( new OGRS57Layer( this, poDefn ) );        poDefn = S57GenerateVectorPrimitiveFeatureDefn( RCNM_VF, poModule->GetOptionFlags());        AddLayer( new OGRS57Layer( this, poDefn ) );    }/* -------------------------------------------------------------------- *//*      Initialize a layer for each type of geometry.  Eventually       *//*      we will do this by object class.                                *//* -------------------------------------------------------------------- */    if( OGRS57Driver::GetS57Registrar() == NULL )    {        OGRFeatureDefn  *poDefn;        poDefn = S57GenerateGeomFeatureDefn( wkbPoint,                                              poModule->GetOptionFlags() );        AddLayer( new OGRS57Layer( this, poDefn ) );            poDefn = S57GenerateGeomFeatureDefn( wkbLineString,                                              poModule->GetOptionFlags() );        AddLayer( new OGRS57Layer( this, poDefn ) );            poDefn = S57GenerateGeomFeatureDefn( wkbPolygon,                                              poModule->GetOptionFlags() );        AddLayer( new OGRS57Layer( this, poDefn ) );            poDefn = S57GenerateGeomFeatureDefn( wkbNone,                                              poModule->GetOptionFlags() );        AddLayer( new OGRS57Layer( this, poDefn ) );    }/* -------------------------------------------------------------------- *//*      Initialize a feature definition for each class that actually    *//*      occurs in the dataset.                                          *//* -------------------------------------------------------------------- */    else    {        OGRFeatureDefn  *poDefn;        int             *panClassCount;        int             iClass, bGeneric = FALSE;        for( iModule = 0; iModule < nModules; iModule++ )        {            papoModules[iModule]->SetClassBased( OGRS57Driver::GetS57Registrar() );        }                panClassCount = (int *) CPLCalloc(sizeof(int),MAX_CLASSES);        for( iModule = 0; iModule < nModules; iModule++ )            papoModules[iModule]->CollectClassList(panClassCount,MAX_CLASSES);        for( iClass = 0; iClass < MAX_CLASSES; iClass++ )        {            if( panClassCount[iClass] > 0 )            {                poDefn =                     S57GenerateObjectClassDefn( OGRS57Driver::GetS57Registrar(),                                                 iClass,                                                 poModule->GetOptionFlags() );                if( poDefn != NULL )                    AddLayer( new OGRS57Layer( this, poDefn,                                                panClassCount[iClass] ) );                else                {                    bGeneric = TRUE;                    CPLDebug( "S57",                               "Unable to find definition for OBJL=%d\n",                               iClass );                }            }        }        if( bGeneric )        {            poDefn = S57GenerateGeomFeatureDefn( wkbUnknown,                                                  poModule->GetOptionFlags() );            AddLayer( new OGRS57Layer( this, poDefn ) );        }                    CPLFree( panClassCount );    }/* -------------------------------------------------------------------- *//*      Attach the layer definitions to each of the readers.            *//* -------------------------------------------------------------------- */    for( iModule = 0; iModule < nModules; iModule++ )    {        for( int iLayer = 0; iLayer < nLayers; iLayer++ )        {            papoModules[iModule]->AddFeatureDefn(                papoLayers[iLayer]->GetLayerDefn() );        }    }        return TRUE;}/************************************************************************//*                              GetLayer()                              *//************************************************************************/OGRLayer *OGRS57DataSource::GetLayer( int iLayer ){    if( iLayer < 0 || iLayer >= nLayers )        return NULL;    else        return papoLayers[iLayer];}/************************************************************************//*                              AddLayer()                              *//************************************************************************/void OGRS57DataSource::AddLayer( OGRS57Layer * poNewLayer ){    papoLayers = (OGRS57Layer **)        CPLRealloc( papoLayers, sizeof(void*) * ++nLayers );        papoLayers[nLayers-1] = poNewLayer;}/************************************************************************//*                             GetModule()                              *//************************************************************************/S57Reader * OGRS57DataSource::GetModule( int i ){    if( i < 0 || i >= nModules )        return NULL;    else        return papoModules[i];}/************************************************************************//*                            GetDSExtent()                             *//************************************************************************/OGRErr OGRS57DataSource::GetDSExtent( OGREnvelope *psExtent, int bForce ){/* -------------------------------------------------------------------- *//*      If we have it, return it immediately.                           *//* -------------------------------------------------------------------- */    if( bExtentsSet )    {        *psExtent = oExtents;        return OGRERR_NONE;    }    if( nModules == 0 )        return OGRERR_FAILURE;/* -------------------------------------------------------------------- *//*      Otherwise try asking each of the readers for it.                *//* -------------------------------------------------------------------- */    for( int iModule=0; iModule < nModules; iModule++ )    {        OGREnvelope     oModuleEnvelope;        OGRErr          eErr;        eErr = papoModules[iModule]->GetExtent( &oModuleEnvelope, bForce );        if( eErr != OGRERR_NONE )            return eErr;        if( iModule == 0 )            oExtents = oModuleEnvelope;        else        {            oExtents.MinX = MIN(oExtents.MinX,oModuleEnvelope.MinX);            oExtents.MaxX = MAX(oExtents.MaxX,oModuleEnvelope.MaxX);            oExtents.MinY = MIN(oExtents.MinY,oModuleEnvelope.MinY);            oExtents.MaxX = MAX(oExtents.MaxY,oModuleEnvelope.MaxY);        }    }    *psExtent = oExtents;    bExtentsSet = TRUE;    return OGRERR_NONE;}/************************************************************************//*                               Create()                               *//*                                                                      *//*      Create a new S57 file, and represent it as a datasource.        *//************************************************************************/int OGRS57DataSource::Create( const char *pszFilename, char **papszOptions ){/* -------------------------------------------------------------------- *//*      Instantiate the class registrar if possible.                    *//* -------------------------------------------------------------------- */    if( OGRS57Driver::GetS57Registrar() == NULL )    {        CPLError( CE_Failure, CPLE_AppDefined,                   "Unable to load s57objectclasses.csv, unable to continue." );        return FALSE;    }/* -------------------------------------------------------------------- *//*      Create the S-57 file with definition record.                    *//* -------------------------------------------------------------------- */    poWriter = new S57Writer();    if( !poWriter->CreateS57File( pszFilename ) )        return FALSE;    poWriter->SetClassBased( OGRS57Driver::GetS57Registrar() );    pszName = CPLStrdup( pszFilename );/* -------------------------------------------------------------------- *//*      Add the primitive layers if they are called for.                *//* -------------------------------------------------------------------- */    OGRFeatureDefn  *poDefn;    int nOptionFlags = S57M_RETURN_LINKAGES | S57M_LNAM_REFS;    poDefn = S57GenerateVectorPrimitiveFeatureDefn( RCNM_VI, nOptionFlags );    AddLayer( new OGRS57Layer( this, poDefn ) );        poDefn = S57GenerateVectorPrimitiveFeatureDefn( RCNM_VC, nOptionFlags );    AddLayer( new OGRS57Layer( this, poDefn ) );        poDefn = S57GenerateVectorPrimitiveFeatureDefn( RCNM_VE, nOptionFlags );    AddLayer( new OGRS57Layer( this, poDefn ) );        poDefn = S57GenerateVectorPrimitiveFeatureDefn( RCNM_VF, nOptionFlags );    AddLayer( new OGRS57Layer( this, poDefn ) );/* -------------------------------------------------------------------- *//*      Initialize a feature definition for each object class.          *//* -------------------------------------------------------------------- */    for( int iClass = 0; iClass < MAX_CLASSES; iClass++ )    {        poDefn =             S57GenerateObjectClassDefn( OGRS57Driver::GetS57Registrar(),                                         iClass, nOptionFlags );                if( poDefn == NULL )            continue;        AddLayer( new OGRS57Layer( this, poDefn, 0, iClass ) );    }/* -------------------------------------------------------------------- *//*      Write out "header" records.                                     *//* -------------------------------------------------------------------- */    poWriter->WriteDSID( pszFilename, "20010409", "03.1", 540, "" );    poWriter->WriteDSPM();    return TRUE;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -