📄 mitab_miffile.cpp
字号:
* 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++; // 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;}/************************************************************************//* 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;}/************************************************************************//* 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])),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -