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

📄 ogrdatasource.cpp

📁 GIS系统支持库Geospatial Data Abstraction Library代码.GDAL is a translator library for raster geospatial dat
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/*      Transfer features.                                              *//* -------------------------------------------------------------------- */    OGRFeature  *poFeature;        poSrcLayer->ResetReading();    while( TRUE )    {        OGRFeature      *poDstFeature = NULL;        poFeature = poSrcLayer->GetNextFeature();                if( poFeature == NULL )            break;        CPLErrorReset();        poDstFeature = OGRFeature::CreateFeature( poDstLayer->GetLayerDefn() );        if( poDstFeature->SetFrom( poFeature, TRUE ) != OGRERR_NONE )        {            delete poFeature;            CPLError( CE_Failure, CPLE_AppDefined,                      "Unable to translate feature %d from layer %s.\n",                      poFeature->GetFID(), poSrcDefn->GetName() );            return poDstLayer;        }        poDstFeature->SetFID( poFeature->GetFID() );        OGRFeature::DestroyFeature( poFeature );        CPLErrorReset();        if( poDstLayer->CreateFeature( poDstFeature ) != OGRERR_NONE )        {            OGRFeature::DestroyFeature( poDstFeature );            return poDstLayer;        }        OGRFeature::DestroyFeature( poDstFeature );    }    return poDstLayer;}/************************************************************************//*                          OGR_DS_CopyLayer()                          *//************************************************************************/OGRLayerH OGR_DS_CopyLayer( OGRDataSourceH hDS,                             OGRLayerH hSrcLayer, const char *pszNewName,                            char **papszOptions ){    return ((OGRDataSource *) hDS)->CopyLayer( (OGRLayer *) hSrcLayer,                                                pszNewName, papszOptions );}/************************************************************************//*                            DeleteLayer()                             *//************************************************************************/OGRErr OGRDataSource::DeleteLayer( int iLayer ){    (void) iLayer;    CPLError( CE_Failure, CPLE_NotSupported,              "DeleteLayer() not supported by this data source." );                  return OGRERR_UNSUPPORTED_OPERATION;}/************************************************************************//*                         OGR_DS_DeleteLayer()                         *//************************************************************************/OGRErr OGR_DS_DeleteLayer( OGRDataSourceH hDS, int iLayer ){    return ((OGRDataSource *) hDS)->DeleteLayer( iLayer );}/************************************************************************//*                           GetLayerByName()                           *//************************************************************************/OGRLayer *OGRDataSource::GetLayerByName( const char *pszName ){    int  i;    /* first a case sensitive check */    for( i = 0; i < GetLayerCount(); i++ )    {        OGRLayer *poLayer = GetLayer(i);        if( strcmp( pszName, poLayer->GetLayerDefn()->GetName() ) == 0 )            return poLayer;    }    /* then case insensitive */    for( i = 0; i < GetLayerCount(); i++ )    {        OGRLayer *poLayer = GetLayer(i);        if( EQUAL( pszName, poLayer->GetLayerDefn()->GetName() ) )            return poLayer;    }    return NULL;}/************************************************************************//*                       OGR_DS_GetLayerByName()                        *//************************************************************************/OGRLayerH OGR_DS_GetLayerByName( OGRDataSourceH hDS, const char *pszName ){    return (OGRLayerH) ((OGRDataSource *) hDS)->GetLayerByName( pszName );}/************************************************************************//*                       ProcessSQLCreateIndex()                        *//*                                                                      *//*      The correct syntax for creating an index in our dialect of      *//*      SQL is:                                                         *//*                                                                      *//*        CREATE INDEX ON <layername> USING <columnname>                *//************************************************************************/OGRErr OGRDataSource::ProcessSQLCreateIndex( const char *pszSQLCommand ){    char **papszTokens = CSLTokenizeString( pszSQLCommand );/* -------------------------------------------------------------------- *//*      Do some general syntax checking.                                *//* -------------------------------------------------------------------- */    if( CSLCount(papszTokens) != 6         || !EQUAL(papszTokens[0],"CREATE")        || !EQUAL(papszTokens[1],"INDEX")        || !EQUAL(papszTokens[2],"ON")        || !EQUAL(papszTokens[4],"USING") )    {        CSLDestroy( papszTokens );        CPLError( CE_Failure, CPLE_AppDefined,                   "Syntax error in CREATE INDEX command.\n"                  "Was '%s'\n"                  "Should be of form 'CREATE INDEX ON <table> USING <field>'",                  pszSQLCommand );        return OGRERR_FAILURE;    }/* -------------------------------------------------------------------- *//*      Find the named layer.                                           *//* -------------------------------------------------------------------- */    int  i;    OGRLayer *poLayer = NULL;    for( i = 0; i < GetLayerCount(); i++ )    {        poLayer = GetLayer(i);                if( EQUAL(poLayer->GetLayerDefn()->GetName(),papszTokens[3]) )            break;    }    if( i >= GetLayerCount() )    {        CPLError( CE_Failure, CPLE_AppDefined,                   "CREATE INDEX ON failed, no such layer as `%s'.",                  papszTokens[3] );        CSLDestroy( papszTokens );        return OGRERR_FAILURE;    }/* -------------------------------------------------------------------- *//*      Does this layer even support attribute indexes?                 *//* -------------------------------------------------------------------- */    if( poLayer->GetIndex() == NULL )    {        CPLError( CE_Failure, CPLE_AppDefined,                   "CREATE INDEX ON not supported by this driver." );        CSLDestroy( papszTokens );        return OGRERR_FAILURE;    }/* -------------------------------------------------------------------- *//*      Find the named field.                                           *//* -------------------------------------------------------------------- */    for( i = 0; i < poLayer->GetLayerDefn()->GetFieldCount(); i++ )    {        if( EQUAL(papszTokens[5],                  poLayer->GetLayerDefn()->GetFieldDefn(i)->GetNameRef()) )            break;    }    CSLDestroy( papszTokens );    if( i >= poLayer->GetLayerDefn()->GetFieldCount() )    {        CPLError( CE_Failure, CPLE_AppDefined,                   "`%s' failed, field not found.",                  pszSQLCommand );        return OGRERR_FAILURE;    }/* -------------------------------------------------------------------- *//*      Attempt to create the index.                                    *//* -------------------------------------------------------------------- */    OGRErr eErr;    eErr = poLayer->GetIndex()->CreateIndex( i );    if( eErr == OGRERR_NONE )        eErr = poLayer->GetIndex()->IndexAllFeatures( i );    return eErr;}/************************************************************************//*                        ProcessSQLDropIndex()                         *//*                                                                      *//*      The correct syntax for droping one or more indexes in           *//*      the OGR SQL dialect is:                                         *//*                                                                      *//*          DROP INDEX ON <layername> [USING <columnname>]              *//************************************************************************/OGRErr OGRDataSource::ProcessSQLDropIndex( const char *pszSQLCommand ){    char **papszTokens = CSLTokenizeString( pszSQLCommand );/* -------------------------------------------------------------------- *//*      Do some general syntax checking.                                *//* -------------------------------------------------------------------- */    if( (CSLCount(papszTokens) != 4 && CSLCount(papszTokens) != 6)        || !EQUAL(papszTokens[0],"DROP")        || !EQUAL(papszTokens[1],"INDEX")        || !EQUAL(papszTokens[2],"ON")         || (CSLCount(papszTokens) == 6 && !EQUAL(papszTokens[4],"USING")) )    {        CSLDestroy( papszTokens );        CPLError( CE_Failure, CPLE_AppDefined,                   "Syntax error in DROP INDEX command.\n"                  "Was '%s'\n"                  "Should be of form 'DROP INDEX ON <table> [USING <field>]'",                  pszSQLCommand );        return OGRERR_FAILURE;    }/* -------------------------------------------------------------------- *//*      Find the named layer.                                           *//* -------------------------------------------------------------------- */    int  i;    OGRLayer *poLayer=NULL;    for( i = 0; i < GetLayerCount(); i++ )    {        poLayer = GetLayer(i);                if( EQUAL(poLayer->GetLayerDefn()->GetName(),papszTokens[3]) )            break;    }    if( i >= GetLayerCount() )    {        CPLError( CE_Failure, CPLE_AppDefined,                   "CREATE INDEX ON failed, no such layer as `%s'.",                  papszTokens[3] );        CSLDestroy( papszTokens );        return OGRERR_FAILURE;    }/* -------------------------------------------------------------------- *//*      Does this layer even support attribute indexes?                 *//* -------------------------------------------------------------------- */    if( poLayer->GetIndex() == NULL )    {        CPLError( CE_Failure, CPLE_AppDefined,                   "Indexes not supported by this driver." );        CSLDestroy( papszTokens );        return OGRERR_FAILURE;    }/* -------------------------------------------------------------------- *//*      If we weren't given a field name, drop all indexes.             *//* -------------------------------------------------------------------- */    OGRErr eErr;    if( CSLCount(papszTokens) == 4 )    {        for( i = 0; i < poLayer->GetLayerDefn()->GetFieldCount(); i++ )        {            OGRAttrIndex *poAttrIndex;            poAttrIndex = poLayer->GetIndex()->GetFieldIndex(i);            if( poAttrIndex != NULL )            {                eErr = poLayer->GetIndex()->DropIndex( i );                if( eErr != OGRERR_NONE )                    return eErr;            }        }        CSLDestroy(papszTokens);        return OGRERR_NONE;    }/* -------------------------------------------------------------------- *//*      Find the named field.                                           *//* -------------------------------------------------------------------- */    for( i = 0; i < poLayer->GetLayerDefn()->GetFieldCount(); i++ )    {        if( EQUAL(papszTokens[5],                  poLayer->GetLayerDefn()->GetFieldDefn(i)->GetNameRef()) )            break;    }    CSLDestroy( papszTokens );    if( i >= poLayer->GetLayerDefn()->GetFieldCount() )    {        CPLError( CE_Failure, CPLE_AppDefined,                   "`%s' failed, field not found.",

⌨️ 快捷键说明

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