📄 mitab_miffile.cpp
字号:
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()
*
* 打开MIF文件(不打开MID文件),并读取字段定义,并返回,文件需要在返回时关闭
*
* Returns not NULL on success, NULL on error.
**********************************************************************/
OGRFeatureDefn* MIFFile::GetFeDfnFromFileDir(const char *pszFname)
{
OGRFeatureDefn* poFeaDefn = NULL;
//////////////////////////////////////////////////////////////////////////
// 参数设置
m_eAccessMode = TABRead;
char* pszAccess = "rt";
bool bIsMIFFile = FALSE;
int nFnameLen = strlen(pszFname);
if (nFnameLen > 4 && (EQUAL(pszFname+nFnameLen-4, ".mid") ||
EQUAL(pszFname+nFnameLen-4, ".mif") ) )
bIsMIFFile = TRUE;
if (bIsMIFFile == FALSE)
return NULL;
MIDDATAFile *poMIFFile = new MIDDATAFile;
if (poMIFFile->Open(pszFname, pszAccess) != 0)
{
return NULL;
}
char *pszFeatureClassName = TABGetBasename(pszFname);
poFeaDefn = new OGRFeatureDefn(pszFeatureClassName);
CPLFree(pszFeatureClassName);
poFeaDefn->Reference();
//paeFieldType = CPLCalloc()
if (m_paeFieldTypeMy != NULL){
delete[] m_paeFieldTypeMy;
m_paeFieldTypeMy = NULL;
}
if (m_eAccessMode == TABRead && ParseMIFHeader(poMIFFile, poFeaDefn) != 0)
{
poMIFFile->Close();
delete poMIFFile;
delete poFeaDefn;
return NULL;
}
// if (m_paeFieldType != NULL){
// // 进行复制
// paeFieldType = new TABFieldType[];
// }
poMIFFile->Close();
delete poMIFFile;
return poFeaDefn;
}/********************************************************************** * 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 (EQUALN(pszLine,"VERSION",7)) { papszToken = CSLTokenizeStringComplex(pszLine," ()\t",TRUE,FALSE); bColumns = FALSE; bCoordSys = FALSE; if (CSLCount(papszToken) == 2) m_pszVersion = CPLStrdup(papszToken[1]); CSLDestroy(papszToken); } else if (EQUALN(pszLine,"CHARSET",7)) { papszToken = CSLTokenizeStringComplex(pszLine," ()\t",TRUE,FALSE); bColumns = FALSE; bCoordSys = FALSE; if (CSLCount(papszToken) == 2) 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 (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 (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;}
/************************************************************************/
/* 序列化MIF文件头 */
/************************************************************************/
int MIFFile::ParseMIFHeader(MIDDATAFile* poMIFFile, OGRFeatureDefn* poFeaDfn)
{
GBool bColumns = FALSE;
int nColumns = 0;
GBool bCoordSys = FALSE;
char *pszTmp;
const char *pszLine;
char **papszToken;
/*-----------------------------------------------------------------
* Parse header until we find the "Data" line
*----------------------------------------------------------------*/
char* pszVersion = NULL;
char* pszCharset = NULL;
char* pszDelimiter = NULL;
char* pszUnique = NULL;
char* pszIndex = NULL;
char* pszCoordSys = NULL;
bool bBoundsSet;
double dXMin, dXMax, dYMin, dYMax;
double dfXMultiplier, dfYMultiplier;
double dfXDisplacement, dfYDisplacement;
int nAttribut;
while (((pszLine = poMIFFile->GetLine()) != NULL) &&
!(EQUALN(pszLine,"Data",4)))
{
while(pszLine && (*pszLine == ' ' || *pszLine == '\t') )
pszLine++; // skip leading spaces
if (EQUALN(pszLine,"VERSION",7))
{
papszToken = CSLTokenizeStringComplex(pszLine," ()\t",TRUE,FALSE);
// bColumns = FALSE; bCoordSys = FALSE;
// if (CSLCount(papszToken) == 2)
// pszVersion = CPLStrdup(papszToken[1]);
CSLDestroy(papszToken);
}
else if (EQUALN(pszLine,"CHARSET",7))
{
papszToken = CSLTokenizeStringComplex(pszLine," ()\t",TRUE,FALSE);
// bColumns = FALSE; bCoordSys = FALSE;
//
// if (CSLCount(papszToken) == 2)
// 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)
// {
// if (pszDelimiter)
// CPLFree(pszDelimiter);
// pszDelimiter = CPLStrdup(papszToken[1]);
// }
CSLDestroy(papszToken);
}
else if (EQUALN(pszLine,"UNIQUE",6))
{
// bColumns = FALSE; bCoordSys = FALSE;
// pszUnique = CPLStrdup(pszLine + 6);
}
else if (EQUALN(pszLine,"INDEX",5))
{
// bColumns = FALSE; bCoordSys = FALSE;
//
// pszIndex = CPLStrdup(pszLine + 5);
}
else if (EQUALN(pszLine,"COORDSYS",8) )
{
// bCoordSys = TRUE;
// pszCoordSys = CPLStrdup(pszLine + 9);
//
// // Extract bounds if present
// char **papszFields;
// papszFields = CSLTokenizeStringComplex(pszCoordSys, " ,()\t",
// TRUE, FALSE );
// int iBounds = CSLFindString( papszFields, "Bounds" );
// if (iBounds >= 0 && iBounds + 4 < CSLCount(papszFields))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -