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

📄 mitab_miffile.cpp

📁 用于读取TAB、MIF、SHP文件的类
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//             {
//                 dXMin = atof(papszFields[++iBounds]);
//                 dYMin = atof(papszFields[++iBounds]);
//                 dXMax = atof(papszFields[++iBounds]);
//                 dYMax = atof(papszFields[++iBounds]);
//                 bBoundsSet = TRUE;
//             }
//             CSLDestroy( papszFields );
        }
        else if (EQUALN(pszLine,"TRANSFORM",9))
        {
//             papszToken = CSLTokenizeStringComplex(pszLine," ,\t",TRUE,FALSE); 
//             bColumns = FALSE; bCoordSys = FALSE;
//           
//             if (CSLCount(papszToken) == 5)
//             {
//                 dfXMultiplier   = atof(papszToken[1]);
//                 dfYMultiplier   = atof(papszToken[2]);
//                 dfXDisplacement = atof(papszToken[3]);
//                 dfYDisplacement = atof(papszToken[4]);
//                 
//                 if (dfXMultiplier == 0.0)
//                   dfXMultiplier = 1.0;
//                 if (dfYMultiplier == 0.0)
//                   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]);
                nAttribut = nColumns;

				if (m_paeFieldTypeMy == NULL){
					m_paeFieldTypeMy = new TABFieldType[nAttribut];
				}
            }
            else
            {
                bColumns = FALSE;
                nAttribut = 0;
            }
            CSLDestroy(papszToken);
        }
        else if (bColumns == TRUE && nColumns >0)
        {
            if (nColumns == 0)
            {
                // Permit to 0 columns
                bColumns = FALSE;
            }
            else if (AddFields(poFeaDfn, pszLine) == 0)
            {
                nColumns--;
                if (nColumns == 0)
                  bColumns = FALSE;
            }
            else
            {
                bColumns = FALSE;
            }
        }
        else if (bCoordSys == TRUE)
        {
//             pszTmp = pszCoordSys;
//             pszCoordSys = CPLStrdup(CPLSPrintf("%s %s",pszCoordSys,
//                                                  pszLine));
//             CPLFree(pszTmp);
            //printf("Reading CoordSys\n");
            // Reading CoordSys
        }

    }

	//paeFieldType = paeFieldTypeTemp;
    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;}

/************************************************************************/
/*                          增加一个字段信息                            */
/************************************************************************/
int	MIFFile::AddFields(OGRFeatureDefn* poFeaDfn, const char *pszLine)
{
	char **papszToken;
    int nStatus = 0,numTok;

    papszToken = CSLTokenizeStringComplex(pszLine," (,)\t",TRUE,FALSE); 
    numTok = CSLCount(papszToken);

    if (numTok >= 3 && EQUAL(papszToken[1], "char"))
    {
        /*-------------------------------------------------
         * CHAR type
         *------------------------------------------------*/
        nStatus = AddFieldNativeEx(poFeaDfn, papszToken[0], TABFChar,
                                 atoi(papszToken[2]));
    }
    else if (numTok >= 2 && EQUAL(papszToken[1], "integer"))
    {
        /*-------------------------------------------------
         * INTEGER type
         *------------------------------------------------*/
        nStatus = AddFieldNativeEx(poFeaDfn, papszToken[0], TABFInteger);
    }
    else if (numTok >= 2 && EQUAL(papszToken[1], "smallint"))
    {
        /*-------------------------------------------------
         * SMALLINT type
         *------------------------------------------------*/
        nStatus = AddFieldNativeEx(poFeaDfn, papszToken[0], TABFSmallInt);
    }
    else if (numTok >= 4 && EQUAL(papszToken[1], "decimal"))
    {
        /*-------------------------------------------------
         * DECIMAL type
         *------------------------------------------------*/
        nStatus = AddFieldNativeEx(poFeaDfn, papszToken[0], TABFDecimal,
                                 atoi(papszToken[2]), atoi(papszToken[3]));
    }
    else if (numTok >= 2 && EQUAL(papszToken[1], "float"))
    {
        /*-------------------------------------------------
         * FLOAT type
         *------------------------------------------------*/
        nStatus = AddFieldNativeEx(poFeaDfn, papszToken[0], TABFFloat);
    }
    else if (numTok >= 2 && EQUAL(papszToken[1], "date"))
    {
        /*-------------------------------------------------
         * DATE type (returned as a string: "DD/MM/YYYY")
         *------------------------------------------------*/
        nStatus = AddFieldNativeEx(poFeaDfn, papszToken[0], TABFDate);
    }
    else if (numTok >= 2 && EQUAL(papszToken[1], "logical"))
    {
        /*-------------------------------------------------
         * LOGICAL type (value "T" or "F")
         *------------------------------------------------*/
        nStatus = AddFieldNativeEx(poFeaDfn, papszToken[0], TABFLogical);
    }
    else 
      nStatus = -1; // Unrecognized field type or line corrupt
    
    CSLDestroy(papszToken);
    papszToken = NULL;

    if (nStatus != 0)
    {
        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])),                             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)

⌨️ 快捷键说明

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