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

📄 ogrutils.cpp

📁 用于读取TAB、MIF、SHP文件的类
💻 CPP
📖 第 1 页 / 共 3 页
字号:
        }/* -------------------------------------------------------------------- *//*      --optfile                                                       *//*                                                                      *//*      Annoyingly the options inserted by --optfile will *not* be      *//*      processed properly if they are general options.                 *//* -------------------------------------------------------------------- */        else if( EQUAL(papszArgv[iArg],"--optfile") )        {            const char *pszLine;            FILE *fpOptFile;            if( iArg + 1 >= nArgc )            {                CPLError( CE_Failure, CPLE_AppDefined,                           "--optfile option given without filename." );                CSLDestroy( papszReturn );                return -1;            }            fpOptFile = VSIFOpen( papszArgv[iArg+1], "rb" );            if( fpOptFile == NULL )            {                CPLError( CE_Failure, CPLE_AppDefined,                           "Unable to open optfile '%s'.\n%s",                          papszArgv[iArg+1], VSIStrerror( errno ) );                CSLDestroy( papszReturn );                return -1;            }                        while( (pszLine = CPLReadLine( fpOptFile )) != NULL )            {                char **papszTokens;                int i;                if( pszLine[0] == '#' || strlen(pszLine) == 0 )                    continue;                papszTokens = CSLTokenizeString( pszLine );                for( i = 0; papszTokens != NULL && papszTokens[i] != NULL; i++)                    papszReturn = CSLAddString( papszReturn, papszTokens[i] );                CSLDestroy( papszTokens );            }            VSIFClose( fpOptFile );                            iArg += 1;        }/* -------------------------------------------------------------------- *//*      --formats                                                       *//* -------------------------------------------------------------------- */#ifdef OGR_ENABLED        else if( EQUAL(papszArgv[iArg], "--formats") )        {            int iDr;            printf( "Supported Formats:\n" );            OGRSFDriverRegistrar *poR = OGRSFDriverRegistrar::GetRegistrar();                    for( iDr = 0; iDr < poR->GetDriverCount(); iDr++ )            {                OGRSFDriver *poDriver = poR->GetDriver(iDr);                if( poDriver->TestCapability( ODrCCreateDataSource ) )                    printf( "  -> \"%s\" (read/write)\n",                             poDriver->GetName() );                else                    printf( "  -> \"%s\" (readonly)\n",                             poDriver->GetName() );            }            CSLDestroy( papszReturn );            return 0;        }#endif /* OGR_ENABLED *//* -------------------------------------------------------------------- *//*      --help-general                                                  *//* -------------------------------------------------------------------- */        else if( EQUAL(papszArgv[iArg],"--help-general") )        {            printf( "Generic GDAL utility command options:\n" );#ifdef OGR_ENABLED            printf( "  --formats: report all configured format drivers.\n" );#endif /* OGR_ENABLED */            printf( "  --optfile filename: expand an option file into the argument list.\n" );            printf( "  --config key value: set system configuration option.\n" );            printf( "  --debug [on/off/value]: set debug level.\n" );            printf( "  --help-general: report detailed help on general options.\n" );            CSLDestroy( papszReturn );            return 0;        }/* -------------------------------------------------------------------- *//*      carry through unrecognised options.                             *//* -------------------------------------------------------------------- */        else        {            papszReturn = CSLAddString( papszReturn, papszArgv[iArg] );        }    }    *ppapszArgv = papszReturn;    return CSLCount( *ppapszArgv );}/************************************************************************//*                            OGRParseDate()                            *//*                                                                      *//*      Parse a variety of text date formats into an OGRField.          *//************************************************************************//** * Parse date string. * * This function attempts to parse a date string in a variety of formats * into the OGRField.Date format suitable for use with OGR.  Generally  * speaking this function is expecting values like: *  *   YYYY-MM-DD HH:MM:SS+nn * * The seconds may also have a decimal portion (which is ignored).  And * just dates (YYYY-MM-DD) or just times (HH:MM:SS) are also supported.  * The date may also be in YYYY/MM/DD format.  If the year is less than 100 * and greater than 30 a "1900" century value will be set.  If it is less than * 30 and greater than -1 then a "2000" century value will be set.  In  * the future this function may be generalized, and additional control  * provided through nOptions, but an nOptions value of "0" should always do * a reasonable default form of processing. * * The value of psField will be indeterminate if the function fails (returns * FALSE).   * * @param pszInput the input date string. * @param psField the OGRField that will be updated with the parsed result. * @param nOptions parsing options, for now always 0.  * * @return TRUE if apparently successful or FALSE on failure. */int OGRParseDate( const char *pszInput, OGRField *psField, int nOptions ){    int bGotSomething = FALSE;    psField->Date.Year = 0;    psField->Date.Month = 0;    psField->Date.Day = 0;    psField->Date.Hour = 0;    psField->Date.Minute = 0;    psField->Date.Second = 0;    psField->Date.TZFlag = 0;    /* -------------------------------------------------------------------- *//*      Do we have a date?                                              *//* -------------------------------------------------------------------- */    while( *pszInput == ' ' )        pszInput++;        if( strstr(pszInput,"-") != NULL || strstr(pszInput,"/") != NULL )    {        psField->Date.Year = atoi(pszInput);        if( psField->Date.Year < 100 && psField->Date.Year >= 30 )            psField->Date.Year += 1900;        else if( psField->Date.Year < 30 && psField->Date.Year >= 0 )            psField->Date.Year += 2000;        while( *pszInput >= '0' && *pszInput <= '9' )             pszInput++;        if( *pszInput != '-' && *pszInput != '/' )            return FALSE;        else             pszInput++;        psField->Date.Month = atoi(pszInput);        if( psField->Date.Month > 12 )            return FALSE;        while( *pszInput >= '0' && *pszInput <= '9' )             pszInput++;        if( *pszInput != '-' && *pszInput != '/' )            return FALSE;        else             pszInput++;        psField->Date.Day = atoi(pszInput);        if( psField->Date.Day > 31 )            return FALSE;        while( *pszInput >= '0' && *pszInput <= '9' )            pszInput++;        bGotSomething = TRUE;    }/* -------------------------------------------------------------------- *//*      Do we have a time?                                              *//* -------------------------------------------------------------------- */    while( *pszInput == ' ' )        pszInput++;        if( strstr(pszInput,":") != NULL )    {        psField->Date.Hour = atoi(pszInput);        if( psField->Date.Hour > 23 )            return FALSE;        while( *pszInput >= '0' && *pszInput <= '9' )             pszInput++;        if( *pszInput != ':' )            return FALSE;        else             pszInput++;        psField->Date.Minute = atoi(pszInput);        if( psField->Date.Minute > 59 )            return FALSE;        while( *pszInput >= '0' && *pszInput <= '9' )             pszInput++;        if( *pszInput != ':' )            return FALSE;        else             pszInput++;        psField->Date.Second = atoi(pszInput);        if( psField->Date.Second > 59 )            return FALSE;        while( *pszInput >= '0' && *pszInput <= '9'                || *pszInput == '.' )            pszInput++;        bGotSomething = TRUE;    }    // No date or time!    if( !bGotSomething )        return FALSE;/* -------------------------------------------------------------------- *//*      Do we have a timezone?                                          *//* -------------------------------------------------------------------- */    while( *pszInput == ' ' )        pszInput++;        if( *pszInput == '-' || *pszInput == '+' )    {        // +HH integral offset        if( strlen(pszInput) <= 3 )            psField->Date.TZFlag = 100 + atoi(pszInput) * 4;        else if( pszInput[3] == ':'  // +HH:MM offset                 && atoi(pszInput+4) % 15 == 0 )        {            psField->Date.TZFlag = 100                 + atoi(pszInput+1) * 4                + (atoi(pszInput+4) / 15);            if( pszInput[0] == '-' )                psField->Date.TZFlag = -1 * (psField->Date.TZFlag - 100) + 100;        }        else if( isdigit(pszInput[3]) && isdigit(pszInput[4])  // +HHMM offset                 && atoi(pszInput+3) % 15 == 0 )        {            psField->Date.TZFlag = 100                 + static_cast<GByte>(CPLScanLong(pszInput+1,2)) * 4                + (atoi(pszInput+3) / 15);            if( pszInput[0] == '-' )                psField->Date.TZFlag = -1 * (psField->Date.TZFlag - 100) + 100;        }        else if( isdigit(pszInput[3]) && pszInput[4] == '\0'  // +HMM offset                 && atoi(pszInput+2) % 15 == 0 )        {            psField->Date.TZFlag = 100                 + static_cast<GByte>(CPLScanLong(pszInput+1,1)) * 4                + (atoi(pszInput+2) / 15);            if( pszInput[0] == '-' )                psField->Date.TZFlag = -1 * (psField->Date.TZFlag - 100) + 100;        }        // otherwise ignore any timezone info.    }    return TRUE;}

⌨️ 快捷键说明

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