📄 miffile.cpp
字号:
{ papszToken = TokenizeStringComplex(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; } FreeStrList(papszToken); } if (m_pszUnique) { papszToken = TokenizeStringComplex(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; } FreeStrList(papszToken); } return 0;}/************************************************************************//* AddFields() *//************************************************************************/int MIFFile::AddFields(const char *pszLine){ char **papszToken; int nStatus = 0,numTok; assert(m_bHeaderWrote == FALSE); papszToken = TokenizeStringComplex(pszLine," (,)\t",TRUE,FALSE); numTok = CountOfList(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 FreeStrList(papszToken); papszToken = NULL; if (nStatus != 0) { UGKError(ET_Failure, UGKErr_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 ) return UGKLayer::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; UGKBool bPLine = FALSE; UGKBool 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++; } FreeStrList(papszToken); papszToken = TokenizeString(pszLine); if (EQUALN(pszLine,"POINT",5)) { m_nPoints++; if (CountOfList(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 (CountOfList(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 (CountOfList(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 (CountOfList(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]))); } } } FreeStrList(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; UGKBool bFound; if (m_eAccessMode != TABWrite) { UGKError(ET_Failure, UGKErr_NotSupported, "WriteMIFHeader() can be used only with Write access."); return -1; } if (m_poDefn==NULL || m_poDefn->GetFieldCount() == 0) { UGKError(ET_Failure, UGKErr_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 *----------------------------------------------------------------*/ assert(m_paeFieldType); m_poMIFFile->WriteLine("Columns %d\n", m_poDefn->GetFieldCount()); for(iField=0; iField<m_poDefn->GetFieldCount(); iField++) { UGKFieldDefn *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; UGK_Free(m_pszCoordSys); m_pszCoordSys = NULL; UGK_Free(m_pszDelimiter); m_pszDelimiter = NULL; UGK_Free(m_pszFname); m_pszFname = NULL; UGK_Free(m_pszVersion);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -