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

📄 mitab_miffile.cpp

📁 GIS系统支持库Geospatial Data Abstraction Library代码.GDAL is a translator library for raster geospatial dat
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                             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 (CSLCount(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 (CSLCount(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 (CSLCount(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])));            }         }              }    CSLDestroy(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;    GBool bFound;    if (m_eAccessMode != TABWrite)    {        CPLError(CE_Failure, CPLE_NotSupported,                 "WriteMIFHeader() can be used only with Write access.");        return -1;    }    if (m_poDefn==NULL || m_poDefn->GetFieldCount() == 0)    {        CPLError(CE_Failure, CPLE_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     *----------------------------------------------------------------*/    CPLAssert(m_paeFieldType);    m_poMIFFile->WriteLine("Columns %d\n", m_poDefn->GetFieldCount());            for(iField=0; iField<m_poDefn->GetFieldCount(); iField++)    {        OGRFieldDefn *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;        if (m_poSpatialRef && m_poSpatialRef->Dereference() == 0)        delete m_poSpatialRef;    m_poSpatialRef = NULL;    CPLFree(m_pszCoordSys);    m_pszCoordSys = NULL;    CPLFree(m_pszDelimiter);    m_pszDelimiter = NULL;    CPLFree(m_pszFname);    m_pszFname = NULL;    CPLFree(m_pszVersion);    m_pszVersion = NULL;    CPLFree(m_pszCharset);    m_pszCharset = NULL;    CPLFree(m_pabFieldIndexed);    m_pabFieldIndexed = NULL;    CPLFree(m_pabFieldUnique);    m_pabFieldUnique = NULL;    CPLFree( m_pszIndex );    m_pszIndex = NULL;    CPLFree(m_paeFieldType);    m_paeFieldType = NULL;    m_nCurFeatureId = 0;    m_nPreloadedId = 0;    m_nFeatureCount =0;       m_bBoundsSet = FALSE;    return 0;}/********************************************************************** *                   MIFFile::GetNextFeatureId() * * Returns feature id that follows nPrevId, or -1 if it is the * last feature id.  Pass nPrevId=-1 to fetch the first valid feature id. **********************************************************************/int MIFFile::GetNextFeatureId(int nPrevId){    if (m_eAccessMode != TABRead)    {        CPLError(CE_Failure, CPLE_NotSupported,                 "GetNextFeatureId() can be used only with Read access.");        return -1;    }    if (nPrevId <= 0 && m_poMIFFile->GetLastLine() != NULL)        return 1;       // Feature Ids start at 1    else if (nPrevId > 0 && m_poMIFFile->GetLastLine() != NULL)        return nPrevId + 1;    else        return -1;    return 0;}/********************************************************************** *                   MIFFile::GotoFeature() * * Private method to move MIF and MID pointers ready to read specified  * feature.  Note that Feature Ids start at 1. * * Returns 0 on success, -1 on error (likely request for invalid feature id) **********************************************************************/int MIFFile::GotoFeature(int nFeatureId){    if (nFeatureId < 1)      return -1;    if (nFeatureId == m_nPreloadedId) // CorrectPosition    {        return 0;    }    else    {        if (nFeatureId < m_nCurFeatureId || m_nCurFeatureId == 0)            ResetReading();        while(m_nPreloadedId < nFeatureId)        {            if (NextFeature() == FALSE)              return -1;        }        CPLAssert(m_nPreloadedId == nFeatureId);        return 0;    }}/********************************************************************** *                   MIFFile::NextFeature() **********************************************************************/GBool MIFFile::NextFeature(){    const char *pszLine;    while ((pszLine = m_poMIFFile->GetLine()) != NULL)    {        if (m_poMIFFile->IsValidFeature(pszLine))        {            m_poMIDFile->GetLine();            m_nPreloadedId++;            return TRUE;        }    }    return FALSE;}/********************************************************************** *                   MIFFile::GetFeatureRef() * * Fill and return a TABFeature object for the specified feature id. * * The retruned pointer is a reference to an object owned and maintained * by this MIFFile object.  It should not be altered or freed by the  * caller and its contents is guaranteed to be valid only until the next * call to GetFeatureRef() or Close(). * * Returns NULL if the specified feature id does not exist of if an * error happened.  In any case, CPLError() will have been called to * report the reason of the failure. **********************************************************************/TABFeature *MIFFile::GetFeatureRef(int nFeatureId){    const char *pszLine;    if (m_eAccessMode != TABRead)    {        CPLError(CE_Failure, CPLE_NotSupported,                 "GetFeatureRef() can be used only with Read access.");        return NULL;    }

⌨️ 快捷键说明

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