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

📄 mitab_miffile.cpp

📁 用于读取TAB、MIF、SHP文件的类
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                               FALSE ) == 0 )    {        numPoints += numTexts;        if( numPoints > 0 && numLines == 0 && numRegions == 0 )            m_poDefn->SetGeomType( wkbPoint );        else if( numPoints == 0 && numLines > 0 && numRegions == 0 )            m_poDefn->SetGeomType( wkbLineString );        else            /* we leave it unknown indicating a mixture */;    }    return 0;}

/**********************************************************************
 *                   MIFFile::ParseMIFHeader()
 *
 * 打开MIF文件(不打开MID文件),并读取字段定义,并返回,文件需要在返回时关闭
 *
 * Returns not NULL on success, NULL on error.
 **********************************************************************/
OGRFeatureDefn*  MIFFile::GetFeDfnFromFileDir(const char *pszFname)
{
	OGRFeatureDefn* poFeaDefn = NULL;

	//////////////////////////////////////////////////////////////////////////
	// 参数设置
	m_eAccessMode = TABRead;
	char* pszAccess = "rt";

	bool bIsMIFFile = FALSE;
	int nFnameLen = strlen(pszFname);
    if (nFnameLen > 4 && (EQUAL(pszFname+nFnameLen-4, ".mid") ||
                               EQUAL(pszFname+nFnameLen-4, ".mif") ) )
        bIsMIFFile = TRUE;
	if (bIsMIFFile == FALSE)
		return NULL;

    MIDDATAFile *poMIFFile = new MIDDATAFile;

    if (poMIFFile->Open(pszFname, pszAccess) != 0)
    {
        return NULL;
    }

	char *pszFeatureClassName = TABGetBasename(pszFname);
	poFeaDefn = new OGRFeatureDefn(pszFeatureClassName);
	CPLFree(pszFeatureClassName);
    poFeaDefn->Reference();

	//paeFieldType = CPLCalloc()

	if (m_paeFieldTypeMy != NULL){
		delete[] m_paeFieldTypeMy;
		m_paeFieldTypeMy = NULL;
	}
	
    if (m_eAccessMode == TABRead && ParseMIFHeader(poMIFFile, poFeaDefn) != 0)
    {
        poMIFFile->Close();
		delete poMIFFile;

		delete poFeaDefn;
        return NULL;
    }
// 	if (m_paeFieldType != NULL){
// 		// 进行复制
// 		paeFieldType = new TABFieldType[];
// 	}

	poMIFFile->Close();
	delete poMIFFile;

	return poFeaDefn;
}/********************************************************************** *                   MIFFile::ParseMIFHeader() * * 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 == '\t') )            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;}

/************************************************************************/
/*                             序列化MIF文件头                          */
/************************************************************************/

int  MIFFile::ParseMIFHeader(MIDDATAFile* poMIFFile, OGRFeatureDefn* poFeaDfn)
{
	GBool  bColumns = FALSE;
    int    nColumns = 0;
    GBool  bCoordSys = FALSE;
    char  *pszTmp;
            
    
    const char *pszLine;
    char **papszToken;

    /*-----------------------------------------------------------------
     * Parse header until we find the "Data" line
     *----------------------------------------------------------------*/
	char*   pszVersion = NULL;
	char*   pszCharset = NULL;
	char*   pszDelimiter = NULL;
	char*   pszUnique = NULL;
	char*   pszIndex = NULL;
	char*   pszCoordSys = NULL;

	bool    bBoundsSet;
	double  dXMin, dXMax, dYMin, dYMax;

	double  dfXMultiplier, dfYMultiplier;
	double  dfXDisplacement, dfYDisplacement;

	int     nAttribut;	

    while (((pszLine = poMIFFile->GetLine()) != NULL) && 
           !(EQUALN(pszLine,"Data",4)))
    {
        while(pszLine && (*pszLine == ' ' || *pszLine == '\t') )
            pszLine++;  // skip leading spaces

        if (EQUALN(pszLine,"VERSION",7))
        {
            papszToken = CSLTokenizeStringComplex(pszLine," ()\t",TRUE,FALSE); 
//             bColumns = FALSE; bCoordSys = FALSE;
//             if (CSLCount(papszToken)  == 2)
//               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)
//               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)
//            {
// 			   if (pszDelimiter)
// 				CPLFree(pszDelimiter);
//                pszDelimiter = CPLStrdup(papszToken[1]);    
//            }
          CSLDestroy(papszToken);
        
        }
        else if (EQUALN(pszLine,"UNIQUE",6))
        {
//            bColumns = FALSE; bCoordSys = FALSE;
          
//            pszUnique = CPLStrdup(pszLine + 6);
        }
        else if (EQUALN(pszLine,"INDEX",5))
        {
//             bColumns = FALSE; bCoordSys = FALSE;
//           
//             pszIndex = CPLStrdup(pszLine + 5);
        }
        else if (EQUALN(pszLine,"COORDSYS",8) )
        {
//             bCoordSys = TRUE;
//             pszCoordSys = CPLStrdup(pszLine + 9);
// 
//             // Extract bounds if present
//             char  **papszFields;
//             papszFields = CSLTokenizeStringComplex(pszCoordSys, " ,()\t",
//                                                    TRUE, FALSE );
//             int iBounds = CSLFindString( papszFields, "Bounds" );
//             if (iBounds >= 0 && iBounds + 4 < CSLCount(papszFields))

⌨️ 快捷键说明

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