📄 mitab_miffile.cpp
字号:
m_pszCharset = CPLStrdup("Neutral");
}
/* Put the MID file at the correct location, on the first feature */
if (m_eAccessMode == TABRead && (m_poMIDFile->GetLine() == NULL))
{
Close();
if (bTestOpenNoError)
CPLErrorReset();
return -1;
}
m_poMIFFile->SetTranslation(m_dfXMultiplier,m_dfYMultiplier,
m_dfXDisplacement, m_dfYDisplacement);
m_poMIDFile->SetTranslation(m_dfXMultiplier,m_dfYMultiplier,
m_dfXDisplacement, m_dfYDisplacement);
m_poMIFFile->SetDelimiter(m_pszDelimiter);
m_poMIDFile->SetDelimiter(m_pszDelimiter);
/*-------------------------------------------------------------
* Set geometry type if the geometry objects are uniform.
*------------------------------------------------------------*/
int numPoints=0, numRegions=0, numTexts=0, numLines=0;
if( GetFeatureCountByType( numPoints, numLines, numRegions, numTexts,
FALSE ) == 0 )
{
numPoints += numTexts;
if( numPoints > 0 && numLines == 0 && numRegions == 0 )
m_poDefn->SetGeomType( wkbPoint );
else if( numPoints == 0 && numLines > 0 && numRegions == 0 )
m_poDefn->SetGeomType( wkbLineString );
else
/* we leave it unknown indicating a mixture */;
}
return 0;
}
/**********************************************************************
* MIFFile::ParseMIFHeader()
*
* 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 == '\t') )
pszLine++; // skip leading spaces
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 (EQUALN(pszLine,"VERSION",7))
{
papszToken = CSLTokenizeStringComplex(pszLine," ()\t",TRUE,FALSE);
bColumns = FALSE; bCoordSys = FALSE;
if (CSLCount(papszToken) == 2)
m_nVersion = atoi(papszToken[1]);
CSLDestroy(papszToken);
}
else if (EQUALN(pszLine,"CHARSET",7))
{
papszToken = CSLTokenizeStringComplex(pszLine," ()\t",TRUE,FALSE);
bColumns = FALSE; bCoordSys = FALSE;
if (CSLCount(papszToken) == 2)
{
CPLFree(m_pszCharset);
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 (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" or "YYYYMMDD")
*------------------------------------------------*/
nStatus = AddFieldNative(papszToken[0], TABFDate);
}
else if (numTok >= 2 && EQUAL(papszToken[1], "time"))
{
/*-------------------------------------------------
* TIME type (v900, returned as a string: "HH:MM:SS" or "HHMMSSmmm")
*------------------------------------------------*/
nStatus = AddFieldNative(papszToken[0], TABFTime);
}
else if (numTok >= 2 && EQUAL(papszToken[1], "datetime"))
{
/*-------------------------------------------------
* DATETIME type (v900, returned as a string: "DD/MM/YYYY HH:MM:SS",
* "YYYY/MM/DD HH:MM:SS" or "YYYYMMDDHHMMSSmmm")
*------------------------------------------------*/
nStatus = AddFieldNative(papszToken[0], TABFDateTime);
}
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -