📄 mitab_miffile.cpp
字号:
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) 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; CPLFree(m_pszCoordSys); m_pszCoordSys = NULL; CPLFree(m_pszDelimiter); m_pszDelimiter = NULL; CPLFree(m_pszFname); m_pszFname = NULL; CPLFree(m_pszVersion); m_pszVersion = NULL; CPLFree(m_pszCharset); m_pszCharset = NULL; CPLFree(m_pabFieldIndexed); m_pabFieldIndexed = NULL; CPLFree(m_pabFieldUnique); m_pabFieldUnique = NULL; CPLFree( m_pszIndex ); m_pszIndex = NULL; 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; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -