📄 mitab_miffile.cpp
字号:
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 + -