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

📄 s57reader.cpp

📁 GIS系统支持库Geospatial Data Abstraction Library代码.GDAL is a translator library for raster geospatial dat
💻 CPP
📖 第 1 页 / 共 5 页
字号:
/*                             SetOptions()                             *//************************************************************************/void S57Reader::SetOptions( char ** papszOptionsIn ){    const char * pszOptionValue;        CSLDestroy( papszOptions );    papszOptions = CSLDuplicate( papszOptionsIn );    pszOptionValue = CSLFetchNameValue( papszOptions, S57O_SPLIT_MULTIPOINT );    if( pszOptionValue != NULL && !EQUAL(pszOptionValue,"OFF") )        nOptionFlags |= S57M_SPLIT_MULTIPOINT;    else        nOptionFlags &= ~S57M_SPLIT_MULTIPOINT;    pszOptionValue = CSLFetchNameValue( papszOptions, S57O_ADD_SOUNDG_DEPTH );    if( pszOptionValue != NULL && !EQUAL(pszOptionValue,"OFF") )        nOptionFlags |= S57M_ADD_SOUNDG_DEPTH;    else        nOptionFlags &= ~S57M_ADD_SOUNDG_DEPTH;    CPLAssert( ! (nOptionFlags & S57M_ADD_SOUNDG_DEPTH)               || (nOptionFlags & S57M_SPLIT_MULTIPOINT) );    pszOptionValue = CSLFetchNameValue( papszOptions, S57O_LNAM_REFS );    if( pszOptionValue != NULL && !EQUAL(pszOptionValue,"OFF") )        nOptionFlags |= S57M_LNAM_REFS;    else        nOptionFlags &= ~S57M_LNAM_REFS;    pszOptionValue = CSLFetchNameValue( papszOptions, S57O_UPDATES );    if( pszOptionValue == NULL )        /* no change */;    else if( pszOptionValue != NULL && !EQUAL(pszOptionValue,"APPLY") )        nOptionFlags &= ~S57M_UPDATES;    else        nOptionFlags |= S57M_UPDATES;    pszOptionValue = CSLFetchNameValue(papszOptions,                                        S57O_PRESERVE_EMPTY_NUMBERS);    if( pszOptionValue != NULL && !EQUAL(pszOptionValue,"OFF") )        nOptionFlags |= S57M_PRESERVE_EMPTY_NUMBERS;    else        nOptionFlags &= ~S57M_PRESERVE_EMPTY_NUMBERS;    pszOptionValue = CSLFetchNameValue( papszOptions, S57O_RETURN_PRIMITIVES );    if( pszOptionValue != NULL && !EQUAL(pszOptionValue,"OFF") )        nOptionFlags |= S57M_RETURN_PRIMITIVES;    else        nOptionFlags &= ~S57M_RETURN_PRIMITIVES;    pszOptionValue = CSLFetchNameValue( papszOptions, S57O_RETURN_LINKAGES );    if( pszOptionValue != NULL && !EQUAL(pszOptionValue,"OFF") )        nOptionFlags |= S57M_RETURN_LINKAGES;    else        nOptionFlags &= ~S57M_RETURN_LINKAGES;}/************************************************************************//*                           SetClassBased()                            *//************************************************************************/void S57Reader::SetClassBased( S57ClassRegistrar * poReg ){    poRegistrar = poReg;}/************************************************************************//*                               Rewind()                               *//************************************************************************/void S57Reader::Rewind(){    ClearPendingMultiPoint();    nNextFEIndex = 0;    nNextVIIndex = 0;    nNextVCIndex = 0;    nNextVEIndex = 0;    nNextVFIndex = 0;}/************************************************************************//*                               Ingest()                               *//*                                                                      *//*      Read all the records into memory, adding to the appropriate     *//*      indexes.                                                        *//************************************************************************/void S57Reader::Ingest(){    DDFRecord   *poRecord;        if( poModule == NULL || bFileIngested )        return;/* -------------------------------------------------------------------- *//*      Read all the records in the module, and place them in           *//*      appropriate indexes.                                            *//* -------------------------------------------------------------------- */    while( (poRecord = poModule->ReadRecord()) != NULL )    {        DDFField        *poKeyField = poRecord->GetField(1);                if( EQUAL(poKeyField->GetFieldDefn()->GetName(),"VRID") )        {            int         nRCNM = poRecord->GetIntSubfield( "VRID",0, "RCNM",0);            int         nRCID = poRecord->GetIntSubfield( "VRID",0, "RCID",0);            switch( nRCNM )            {              case RCNM_VI:                oVI_Index.AddRecord( nRCID, poRecord->Clone() );                break;              case RCNM_VC:                oVC_Index.AddRecord( nRCID, poRecord->Clone() );                break;              case RCNM_VE:                oVE_Index.AddRecord( nRCID, poRecord->Clone() );                break;              case RCNM_VF:                oVF_Index.AddRecord( nRCID, poRecord->Clone() );                break;              default:                CPLAssert( FALSE );                break;            }        }        else if( EQUAL(poKeyField->GetFieldDefn()->GetName(),"DSPM") )        {            nCOMF = MAX(1,poRecord->GetIntSubfield( "DSPM",0, "COMF",0));            nSOMF = MAX(1,poRecord->GetIntSubfield( "DSPM",0, "SOMF",0));        }        else if( EQUAL(poKeyField->GetFieldDefn()->GetName(),"FRID") )        {            int         nRCID = poRecord->GetIntSubfield( "FRID",0, "RCID",0);                        oFE_Index.AddRecord( nRCID, poRecord->Clone() );        }        else if( EQUAL(poKeyField->GetFieldDefn()->GetName(),"DSID") )        {            CPLFree( pszDSNM );            pszDSNM =                CPLStrdup(poRecord->GetStringSubfield( "DSID", 0, "DSNM", 0 ));        }        else        {            CPLDebug( "S57",                      "Skipping %s record in S57Reader::Ingest().\n",                      poKeyField->GetFieldDefn()->GetName() );        }    }    bFileIngested = TRUE;/* -------------------------------------------------------------------- *//*      If update support is enabled, read and apply them.              *//* -------------------------------------------------------------------- */    if( nOptionFlags & S57M_UPDATES )        FindAndApplyUpdates();}/************************************************************************//*                           SetNextFEIndex()                           *//************************************************************************/void S57Reader::SetNextFEIndex( int nNewIndex, int nRCNM ){    if( nRCNM == RCNM_VI )        nNextVIIndex = nNewIndex;    else if( nRCNM == RCNM_VC )        nNextVCIndex = nNewIndex;    else if( nRCNM == RCNM_VE )        nNextVEIndex = nNewIndex;    else if( nRCNM == RCNM_VF )        nNextVFIndex = nNewIndex;    else    {        if( nNextFEIndex != nNewIndex )            ClearPendingMultiPoint();                nNextFEIndex = nNewIndex;    }}/************************************************************************//*                           GetNextFEIndex()                           *//************************************************************************/int S57Reader::GetNextFEIndex( int nRCNM ){    if( nRCNM == RCNM_VI )        return nNextVIIndex;    else if( nRCNM == RCNM_VC )        return nNextVCIndex;    else if( nRCNM == RCNM_VE )        return nNextVEIndex;    else if( nRCNM == RCNM_VF )        return nNextVFIndex;    else        return nNextFEIndex;}/************************************************************************//*                          ReadNextFeature()                           *//************************************************************************/OGRFeature * S57Reader::ReadNextFeature( OGRFeatureDefn * poTarget ){    if( !bFileIngested )        Ingest();/* -------------------------------------------------------------------- *//*      Special case for "in progress" multipoints being split up.      *//* -------------------------------------------------------------------- */    if( poMultiPoint != NULL )    {        if( poTarget == NULL || poTarget == poMultiPoint->GetDefnRef() )        {            return NextPendingMultiPoint();        }        else        {            ClearPendingMultiPoint();        }    }/* -------------------------------------------------------------------- *//*      Next vector feature?                                            *//* -------------------------------------------------------------------- */    if( nOptionFlags & S57M_RETURN_PRIMITIVES )    {        int nRCNM = 0;        int *pnCounter = NULL;        if( poTarget == NULL )        {            if( nNextVIIndex < oVI_Index.GetCount() )            {                nRCNM = RCNM_VI;                pnCounter = &nNextVIIndex;            }            else if( nNextVCIndex < oVC_Index.GetCount() )            {                nRCNM = RCNM_VC;                pnCounter = &nNextVCIndex;            }            else if( nNextVEIndex < oVE_Index.GetCount() )            {                nRCNM = RCNM_VE;                pnCounter = &nNextVEIndex;            }            else if( nNextVFIndex < oVF_Index.GetCount() )            {                nRCNM = RCNM_VF;                pnCounter = &nNextVFIndex;            }        }        else        {            if( EQUAL(poTarget->GetName(),OGRN_VI) )            {                nRCNM = RCNM_VI;                pnCounter = &nNextVIIndex;            }            else if( EQUAL(poTarget->GetName(),OGRN_VC) )            {                nRCNM = RCNM_VC;                pnCounter = &nNextVCIndex;            }            else if( EQUAL(poTarget->GetName(),OGRN_VE) )            {                nRCNM = RCNM_VE;                pnCounter = &nNextVEIndex;            }            else if( EQUAL(poTarget->GetName(),OGRN_VF) )            {                nRCNM = RCNM_VF;                pnCounter = &nNextVFIndex;            }        }        if( nRCNM != 0 )        {            OGRFeature *poFeature = ReadVector( *pnCounter, nRCNM );            if( poFeature != NULL )            {                *pnCounter += 1;                return poFeature;            }        }    }        /* -------------------------------------------------------------------- *//*      Next feature.                                                   *//* -------------------------------------------------------------------- */    while( nNextFEIndex < oFE_Index.GetCount() )    {        OGRFeature      *poFeature;        OGRFeatureDefn *poFeatureDefn;        poFeatureDefn = (OGRFeatureDefn *)             oFE_Index.GetClientInfoByIndex( nNextFEIndex );        if( poFeatureDefn == NULL )        {            poFeatureDefn = FindFDefn( oFE_Index.GetByIndex( nNextFEIndex ) );            oFE_Index.SetClientInfoByIndex( nNextFEIndex, poFeatureDefn );        }        if( poFeatureDefn != poTarget )        {            nNextFEIndex++;            continue;        }        poFeature = ReadFeature( nNextFEIndex++, poTarget );        if( poFeature != NULL )        {            if( (nOptionFlags & S57M_SPLIT_MULTIPOINT)                && poFeature->GetGeometryRef() != NULL                && wkbFlatten(poFeature->GetGeometryRef()->getGeometryType())                                                        == wkbMultiPoint)            {                poMultiPoint = poFeature;                iPointOffset = 0;                return NextPendingMultiPoint();            }            return poFeature;        }    }    return NULL;}/************************************************************************//*                            ReadFeature()                             *//*                                                                      *//*      Read the features who's id is provided.                         *//************************************************************************/OGRFeature *S57Reader::ReadFeature( int nFeatureId, OGRFeatureDefn *poTarget ){    OGRFeature  *poFeature;    if( nFeatureId < 0 || nFeatureId >= oFE_Index.GetCount() )        return NULL;    poFeature = AssembleFeature( oFE_Index.GetByIndex(nFeatureId),                                 poTarget );    if( poFeature != NULL )        poFeature->SetFID( nFeatureId );

⌨️ 快捷键说明

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