📄 mitab_miffile.cpp
字号:
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])),
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 %d\n", m_nVersion);
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 (%.15g, %.15g) (%.15g, %.15g)\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 TABFTime:
m_poMIFFile->WriteLine(" %s Time\n",
poFieldDefn->GetNameRef());
break;
case TABFDateTime:
m_poMIFFile->WriteLine(" %s DateTime\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;
m_nVersion = 0;
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -