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

📄 mitab_miffile.cpp

📁 GIS系统支持库Geospatial Data Abstraction Library代码.GDAL is a translator library for raster geospatial dat
💻 CPP
📖 第 1 页 / 共 5 页
字号:
 * Scan the header of a MIF file, and store any useful information into * class members.  The main piece of information being the fields  * definition that we use to build the OGRFeatureDefn for this file. * * This private method should be used only during the Open() call. * * Returns 0 on success, -1 on error. **********************************************************************/int MIFFile::ParseMIFHeader(){      GBool  bColumns = FALSE;    int    nColumns = 0;    GBool  bCoordSys = FALSE;    char  *pszTmp;                    const char *pszLine;    char **papszToken;    char *pszFeatureClassName = TABGetBasename(m_pszFname);    m_poDefn = new OGRFeatureDefn(pszFeatureClassName);    CPLFree(pszFeatureClassName);    // Ref count defaults to 0... set it to 1    m_poDefn->Reference();        if (m_eAccessMode != TABRead)    {        CPLError(CE_Failure, CPLE_NotSupported,                 "ParseMIDFile() can be used only with Read access.");        return -1;    }        /*-----------------------------------------------------------------     * Parse header until we find the "Data" line     *----------------------------------------------------------------*/    while (((pszLine = m_poMIFFile->GetLine()) != NULL) &&            !(EQUALN(pszLine,"Data",4)))    {        while(pszLine && *pszLine == ' ')            pszLine++;  // skip leading spaces        if (EQUALN(pszLine,"VERSION",7))        {            papszToken = CSLTokenizeStringComplex(pszLine," ()\t",TRUE,FALSE);             bColumns = FALSE; bCoordSys = FALSE;            if (CSLCount(papszToken)  == 2)              m_pszVersion = CPLStrdup(papszToken[1]);            CSLDestroy(papszToken);                }        else if (EQUALN(pszLine,"CHARSET",7))        {            papszToken = CSLTokenizeStringComplex(pszLine," ()\t",TRUE,FALSE);              bColumns = FALSE; bCoordSys = FALSE;                      if (CSLCount(papszToken)  == 2)              m_pszCharset = CPLStrdup(papszToken[1]);            CSLDestroy(papszToken);                }        else if (EQUALN(pszLine,"DELIMITER",9))        {            papszToken = CSLTokenizeStringComplex(pszLine," ()\t",TRUE,FALSE);              bColumns = FALSE; bCoordSys = FALSE;                     if (CSLCount(papszToken)  == 2)           {               CPLFree(m_pszDelimiter);               m_pszDelimiter = CPLStrdup(papszToken[1]);               }          CSLDestroy(papszToken);                }        else if (EQUALN(pszLine,"UNIQUE",6))        {            bColumns = FALSE; bCoordSys = FALSE;                      m_pszUnique = CPLStrdup(pszLine + 6);        }        else if (EQUALN(pszLine,"INDEX",5))        {            bColumns = FALSE; bCoordSys = FALSE;                      m_pszIndex = CPLStrdup(pszLine + 5);        }        else if (EQUALN(pszLine,"COORDSYS",8) )        {            bCoordSys = TRUE;            m_pszCoordSys = CPLStrdup(pszLine + 9);            // Extract bounds if present            char  **papszFields;            papszFields = CSLTokenizeStringComplex(m_pszCoordSys, " ,()\t",                                                   TRUE, FALSE );            int iBounds = CSLFindString( papszFields, "Bounds" );            if (iBounds >= 0 && iBounds + 4 < CSLCount(papszFields))            {                m_dXMin = atof(papszFields[++iBounds]);                m_dYMin = atof(papszFields[++iBounds]);                m_dXMax = atof(papszFields[++iBounds]);                m_dYMax = atof(papszFields[++iBounds]);                m_bBoundsSet = TRUE;            }            CSLDestroy( papszFields );        }        else if (EQUALN(pszLine,"TRANSFORM",9))        {            papszToken = CSLTokenizeStringComplex(pszLine," ,\t",TRUE,FALSE);             bColumns = FALSE; bCoordSys = FALSE;                      if (CSLCount(papszToken) == 5)            {                m_dfXMultiplier   = atof(papszToken[1]);                m_dfYMultiplier   = atof(papszToken[2]);                m_dfXDisplacement = atof(papszToken[3]);                m_dfYDisplacement = atof(papszToken[4]);                                if (m_dfXMultiplier == 0.0)                  m_dfXMultiplier = 1.0;                if (m_dfYMultiplier == 0.0)                  m_dfYMultiplier = 1.0;            }            CSLDestroy(papszToken);        }        else if (EQUALN(pszLine,"COLUMNS",7))        {            papszToken = CSLTokenizeStringComplex(pszLine," ()\t",TRUE,FALSE);             bCoordSys = FALSE;            bColumns = TRUE;            if (CSLCount(papszToken) == 2)            {                nColumns = atoi(papszToken[1]);                m_nAttribut = nColumns;            }            else            {                bColumns = FALSE;                m_nAttribut = 0;            }            CSLDestroy(papszToken);        }        else if (bColumns == TRUE && nColumns >0)        {            if (nColumns == 0)            {                // Permit to 0 columns                bColumns = FALSE;            }            else if (AddFields(pszLine) == 0)            {                nColumns--;                if (nColumns == 0)                  bColumns = FALSE;            }            else            {                bColumns = FALSE;            }        }        else if (bCoordSys == TRUE)        {            pszTmp = m_pszCoordSys;            m_pszCoordSys = CPLStrdup(CPLSPrintf("%s %s",m_pszCoordSys,                                                 pszLine));            CPLFree(pszTmp);            //printf("Reading CoordSys\n");            // Reading CoordSys        }    }        if ((pszLine = m_poMIFFile->GetLastLine()) == NULL ||         EQUALN(m_poMIFFile->GetLastLine(),"DATA",4) == FALSE)    {        CPLError(CE_Failure, CPLE_NotSupported,                 "DATA keyword not found in %s.  File may be corrupt.",                 m_pszFname);        return -1;    }        /*-----------------------------------------------------------------     * Move pointer to first line of first object     *----------------------------------------------------------------*/    while (((pszLine = m_poMIFFile->GetLine()) != NULL) &&            m_poMIFFile->IsValidFeature(pszLine) == FALSE)        ;    /*-----------------------------------------------------------------     * Check for Unique and Indexed flags     *----------------------------------------------------------------*/    if (m_pszIndex)    {        papszToken = CSLTokenizeStringComplex(m_pszIndex," ,\t",TRUE,FALSE);        for(int i=0; papszToken && papszToken[i]; i++)        {            int nVal = atoi(papszToken[i]);            if (nVal > 0 && nVal <= m_poDefn->GetFieldCount())                m_pabFieldIndexed[nVal-1] = TRUE;        }        CSLDestroy(papszToken);    }    if (m_pszUnique)    {        papszToken = CSLTokenizeStringComplex(m_pszUnique," ,\t",TRUE,FALSE);        for(int i=0; papszToken && papszToken[i]; i++)        {            int nVal = atoi(papszToken[i]);            if (nVal > 0 && nVal <= m_poDefn->GetFieldCount())                m_pabFieldUnique[nVal-1] = TRUE;        }        CSLDestroy(papszToken);    }    return 0;}/************************************************************************//*                             AddFields()                              *//************************************************************************/int  MIFFile::AddFields(const char *pszLine){    char **papszToken;    int nStatus = 0,numTok;    CPLAssert(m_bHeaderWrote == FALSE);    papszToken = CSLTokenizeStringComplex(pszLine," (,)\t",TRUE,FALSE);     numTok = CSLCount(papszToken);    if (numTok >= 3 && EQUAL(papszToken[1], "char"))    {        /*-------------------------------------------------         * CHAR type         *------------------------------------------------*/        nStatus = AddFieldNative(papszToken[0], TABFChar,                                 atoi(papszToken[2]));    }    else if (numTok >= 2 && EQUAL(papszToken[1], "integer"))    {        /*-------------------------------------------------         * INTEGER type         *------------------------------------------------*/        nStatus = AddFieldNative(papszToken[0], TABFInteger);    }    else if (numTok >= 2 && EQUAL(papszToken[1], "smallint"))    {        /*-------------------------------------------------         * SMALLINT type         *------------------------------------------------*/        nStatus = AddFieldNative(papszToken[0], TABFSmallInt);    }    else if (numTok >= 4 && EQUAL(papszToken[1], "decimal"))    {        /*-------------------------------------------------         * DECIMAL type         *------------------------------------------------*/        nStatus = AddFieldNative(papszToken[0], TABFDecimal,                                 atoi(papszToken[2]), atoi(papszToken[3]));    }    else if (numTok >= 2 && EQUAL(papszToken[1], "float"))    {        /*-------------------------------------------------         * FLOAT type         *------------------------------------------------*/        nStatus = AddFieldNative(papszToken[0], TABFFloat);    }    else if (numTok >= 2 && EQUAL(papszToken[1], "date"))    {        /*-------------------------------------------------         * DATE type (returned as a string: "DD/MM/YYYY")         *------------------------------------------------*/        nStatus = AddFieldNative(papszToken[0], TABFDate);    }    else if (numTok >= 2 && EQUAL(papszToken[1], "logical"))    {        /*-------------------------------------------------         * LOGICAL type (value "T" or "F")         *------------------------------------------------*/        nStatus = AddFieldNative(papszToken[0], TABFLogical);    }    else       nStatus = -1; // Unrecognized field type or line corrupt        CSLDestroy(papszToken);    papszToken = NULL;    if (nStatus != 0)    {        CPLError(CE_Failure, CPLE_FileIO,                 "Failed to parse field definition in file %s", m_pszFname);        return -1;    }        return 0;}/************************************************************************//*                          GetFeatureCount()                           *//************************************************************************/int MIFFile::GetFeatureCount (int bForce){        if( m_poFilterGeom != NULL || m_poAttrQuery != NULL )        return OGRLayer::GetFeatureCount( bForce );    else    {        if (bForce == TRUE)            PreParseFile();        if (m_bPreParsed)            return m_nFeatureCount;        else            return -1;    }}/************************************************************************//*                            ResetReading()                            *//************************************************************************/void MIFFile::ResetReading(){       const char *pszLine;    m_poMIFFile->Rewind();    while ((pszLine = m_poMIFFile->GetLine()) != NULL)      if (EQUALN(pszLine,"DATA",4))        break;    while ((pszLine = m_poMIFFile->GetLine()) != NULL)    {        if (m_poMIFFile->IsValidFeature(pszLine))          break;    }    m_poMIDFile->Rewind();    m_poMIDFile->GetLine();        // We're positioned on first feature.  Feature Ids start at 1.    if (m_poCurFeature)    {        delete m_poCurFeature;        m_poCurFeature = NULL;    }    m_nCurFeatureId = 0;    m_nPreloadedId = 1;}/************************************************************************//*                            PreParseFile()                            *//************************************************************************/void MIFFile::PreParseFile(){    char **papszToken = NULL;    const char *pszLine;        GBool bPLine = FALSE;    GBool bText = FALSE;    if (m_bPreParsed == TRUE)      return;    m_poMIFFile->Rewind();    while ((pszLine = m_poMIFFile->GetLine()) != NULL)      if (EQUALN(pszLine,"DATA",4))        break;    m_nPoints = m_nLines = m_nRegions = m_nTexts = 0;    while ((pszLine = m_poMIFFile->GetLine()) != NULL)    {        if (m_poMIFFile->IsValidFeature(pszLine))        {            bPLine = FALSE;            bText = FALSE;            m_nFeatureCount++;        }        CSLDestroy(papszToken);        papszToken = CSLTokenizeString(pszLine);        if (EQUALN(pszLine,"POINT",5))        {            m_nPoints++;            if (CSLCount(papszToken) == 3)            {                UpdateExtents(m_poMIFFile->GetXTrans(atof(papszToken[1])),

⌨️ 快捷键说明

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