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

📄 mitab_miffile.cpp

📁 用于读取TAB、MIF、SHP文件的类
💻 CPP
📖 第 1 页 / 共 5 页
字号:
      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;
	if (m_pszCoordSys)		CPLFree(m_pszCoordSys);    m_pszCoordSys = NULL;
	if (m_pszDelimiter)		CPLFree(m_pszDelimiter);    m_pszDelimiter = NULL;
	if (m_pszFname)		CPLFree(m_pszFname);    m_pszFname = NULL;
	if (m_pszVersion)		CPLFree(m_pszVersion);    m_pszVersion = NULL;
	if (m_pszCharset)		CPLFree(m_pszCharset);    m_pszCharset = NULL;
	if (m_pabFieldIndexed)		CPLFree(m_pabFieldIndexed);    m_pabFieldIndexed = NULL;
	if (m_pabFieldUnique)		CPLFree(m_pabFieldUnique);    m_pabFieldUnique = NULL;
	if (m_pszIndex)		CPLFree( m_pszIndex );    m_pszIndex = NULL;
	if (m_paeFieldType)		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;    }        /*-----------------------------------------------------------------     * Make sure file is opened and Validate feature id by positioning     * the read pointers for the .MAP and .DAT files to this feature id.     *----------------------------------------------------------------*/    if (m_poMIDFile == NULL)    {        CPLError(CE_Failure, CPLE_IllegalArg,                 "GetFeatureRef() failed: file is not opened!");        return NULL;    }    if (GotoFeature(nFeatureId)!= 0 )    {        CPLError(CE_Failure, CPLE_IllegalArg,                 "GetFeatureRef() failed: invalid feature id %d",                  nFeatureId);        return NULL;    }    /*-----------------------------------------------------------------     * Create new feature object of the right type     *----------------------------------------------------------------*/    if ((pszLine = m_poMIFFile->GetLastLine()) != NULL)    {        // Delete previous feature... we'll start we a clean one.        if (m_poCurFeature)            delete m_poCurFeature;        m_poCurFeature = NULL;        m_nCurFeatureId = m_nPreloadedId;        if (EQUALN(pszLine,"NONE",4))        {            m_poCurFeature = new TABFeature(m_poDefn);
			m_poCurFeature->SetMapInfoType(0);        }        else if (EQUALN(pszLine,"POINT",5))        {            // Special case, we need to know two lines to decide the type            char **papszToken;            papszToken = CSLTokenizeString(pszLine);                        if (CSLCount(papszToken) !=3)            {                CSLDestroy(papszToken);                CPLError(CE_Failure, CPLE_NotSupported,                         "GetFeatureRef() failed: invalid point line: '%s'",                         pszLine);                return NULL;            }

⌨️ 快捷键说明

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