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

📄 miffile.cpp

📁 linux下一款GIS程序源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
    {        papszToken = TokenizeStringComplex(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;        }        FreeStrList(papszToken);    }    if (m_pszUnique)    {        papszToken = TokenizeStringComplex(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;        }        FreeStrList(papszToken);    }    return 0;}/************************************************************************//*                             AddFields()                              *//************************************************************************/int  MIFFile::AddFields(const char *pszLine){    char **papszToken;    int nStatus = 0,numTok;    assert(m_bHeaderWrote == FALSE);    papszToken = TokenizeStringComplex(pszLine," (,)\t",TRUE,FALSE);     numTok = CountOfList(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        FreeStrList(papszToken);    papszToken = NULL;    if (nStatus != 0)    {        UGKError(ET_Failure, UGKErr_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 )        return UGKLayer::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;        UGKBool bPLine = FALSE;    UGKBool 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++;        }        FreeStrList(papszToken);        papszToken = TokenizeString(pszLine);        if (EQUALN(pszLine,"POINT",5))        {            m_nPoints++;            if (CountOfList(papszToken) == 3)            {                UpdateExtents(m_poMIFFile->GetXTrans(atof(papszToken[1])),                             m_poMIFFile->GetYTrans(atof(papszToken[2])));            }                      }        else if (EQUALN(pszLine,"LINE",4) ||                 EQUALN(pszLine,"RECT",4) ||                 EQUALN(pszLine,"ROUNDRECT",9) ||                 EQUALN(pszLine,"ARC",3) ||                 EQUALN(pszLine,"ELLIPSE",7))        {            if (CountOfList(papszToken) == 5)            {                m_nLines++;                UpdateExtents(m_poMIFFile->GetXTrans(atof(papszToken[1])),                              m_poMIFFile->GetYTrans(atof(papszToken[2])));                UpdateExtents(m_poMIFFile->GetXTrans(atof(papszToken[3])),                              m_poMIFFile->GetYTrans(atof(papszToken[4])));            }        }        else if (EQUALN(pszLine,"REGION",6) )        {            m_nRegions++;            bPLine = TRUE;        }        else if( EQUALN(pszLine,"PLINE",5))        {            m_nLines++;            bPLine = TRUE;        }        else if (EQUALN(pszLine,"TEXT",4))         {            m_nTexts++;            bText = TRUE;        }        else if (bPLine == TRUE)        {            if (CountOfList(papszToken) == 2 &&                strchr("-.0123456789", papszToken[0][0]) != NULL)            {                UpdateExtents( m_poMIFFile->GetXTrans(atof(papszToken[0])),                              m_poMIFFile->GetYTrans(atof(papszToken[1])));            }        }        else if (bText == TRUE)        {           if (CountOfList(papszToken) == 4 &&                strchr("-.0123456789", papszToken[0][0]) != NULL)            {                UpdateExtents(m_poMIFFile->GetXTrans(atof(papszToken[0])),                             m_poMIFFile->GetYTrans(atof(papszToken[1])));                UpdateExtents(m_poMIFFile->GetXTrans(atof(papszToken[2])),                             m_poMIFFile->GetYTrans(atof(papszToken[3])));            }         }              }    FreeStrList(papszToken);        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();     m_bPreParsed = TRUE;}/********************************************************************** *                   MIFFile::WriteMIFHeader() * * Generate the .MIF header. * * Returns 0 on success, -1 on error. **********************************************************************/int MIFFile::WriteMIFHeader(){    int iField;    UGKBool bFound;    if (m_eAccessMode != TABWrite)    {        UGKError(ET_Failure, UGKErr_NotSupported,                 "WriteMIFHeader() can be used only with Write access.");        return -1;    }    if (m_poDefn==NULL || m_poDefn->GetFieldCount() == 0)    {        UGKError(ET_Failure, UGKErr_NotSupported,                 "File %s must contain at least 1 attribute field.",                 m_pszFname);        return -1;    }    /*-----------------------------------------------------------------     * Start writing header.     *----------------------------------------------------------------*/    m_bHeaderWrote = TRUE;    m_poMIFFile->WriteLine("Version %s\n", m_pszVersion);    m_poMIFFile->WriteLine("Charset \"%s\"\n", m_pszCharset);    // Delimiter is not required if you use \t as delimiter    if ( !EQUAL(m_pszDelimiter, "\t") )        m_poMIFFile->WriteLine("Delimiter \"%s\"\n", m_pszDelimiter);    bFound = FALSE;    for(iField=0; iField<m_poDefn->GetFieldCount(); iField++)    {        if (m_pabFieldUnique[iField])        {            if (!bFound)                m_poMIFFile->WriteLine("Unique %d", iField+1);            else                m_poMIFFile->WriteLine(",%d", iField+1);            bFound = TRUE;        }    }    if (bFound)        m_poMIFFile->WriteLine("\n");    bFound = FALSE;    for(iField=0; iField<m_poDefn->GetFieldCount(); iField++)    {        if (m_pabFieldIndexed[iField])        {            if (!bFound)                m_poMIFFile->WriteLine("Index  %d", iField+1);            else                m_poMIFFile->WriteLine(",%d", iField+1);            bFound = TRUE;        }    }    if (bFound)        m_poMIFFile->WriteLine("\n");    if (m_pszCoordSys && m_bBoundsSet)    {        m_poMIFFile->WriteLine("CoordSys %s "                               "Bounds (%.16g, %.16g) (%.16g, %.16g)\n",                               m_pszCoordSys,                                m_dXMin, m_dYMin, m_dXMax, m_dYMax);    }    else if (m_pszCoordSys)    {        m_poMIFFile->WriteLine("CoordSys %s\n",m_pszCoordSys);    }        /*-----------------------------------------------------------------     * Column definitions     *----------------------------------------------------------------*/    assert(m_paeFieldType);    m_poMIFFile->WriteLine("Columns %d\n", m_poDefn->GetFieldCount());            for(iField=0; iField<m_poDefn->GetFieldCount(); iField++)    {        UGKFieldDefn *poFieldDefn;        poFieldDefn = m_poDefn->GetFieldDefn(iField);                switch(m_paeFieldType[iField])        {          case TABFInteger:            m_poMIFFile->WriteLine("  %s Integer\n",                                   poFieldDefn->GetNameRef());            break;          case TABFSmallInt:            m_poMIFFile->WriteLine("  %s SmallInt\n",                                   poFieldDefn->GetNameRef());            break;          case TABFFloat:            m_poMIFFile->WriteLine("  %s Float\n",                                   poFieldDefn->GetNameRef());                break;          case TABFDecimal:            m_poMIFFile->WriteLine("  %s Decimal(%d,%d)\n",                                   poFieldDefn->GetNameRef(),                                   poFieldDefn->GetWidth(),                                   poFieldDefn->GetPrecision());            break;          case TABFLogical:            m_poMIFFile->WriteLine("  %s Logical\n",                                   poFieldDefn->GetNameRef());            break;          case TABFDate:            m_poMIFFile->WriteLine("  %s Date\n",                                   poFieldDefn->GetNameRef());            break;          case TABFChar:          default:            m_poMIFFile->WriteLine("  %s Char(%d)\n",                                   poFieldDefn->GetNameRef(),                                   poFieldDefn->GetWidth());        }    }    /*-----------------------------------------------------------------     * Ready to write objects     *----------------------------------------------------------------*/    m_poMIFFile->WriteLine("Data\n\n");       return 0;}/********************************************************************** *                   MIFFile::Close() * * Close current file, and release all memory used. * * Returns 0 on success, -1 on error. **********************************************************************/int MIFFile::Close(){    /* flush .mif header if not already written */    if ( m_poDefn != NULL && m_bHeaderWrote == FALSE          && m_eAccessMode != TABRead )    {        WriteMIFHeader();         }    if (m_poMIDFile)    {        m_poMIDFile->Close();        delete m_poMIDFile;        m_poMIDFile = NULL;    }    if (m_poMIFFile)    {        m_poMIFFile->Close();        delete m_poMIFFile;        m_poMIFFile = NULL;    }    if (m_poCurFeature)    {        delete m_poCurFeature;        m_poCurFeature = NULL;    }    /*-----------------------------------------------------------------     * Note: we have to check the reference count before deleting      * m_poSpatialRef and m_poDefn     *----------------------------------------------------------------*/    if (m_poDefn && m_poDefn->Dereference() == 0)        delete m_poDefn;    m_poDefn = NULL;        UGK_Free(m_pszCoordSys);    m_pszCoordSys = NULL;    UGK_Free(m_pszDelimiter);    m_pszDelimiter = NULL;    UGK_Free(m_pszFname);    m_pszFname = NULL;    UGK_Free(m_pszVersion);

⌨️ 快捷键说明

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