?? mitab_tabview.cpp
字號:
if (m_nMainTableIndex == -1)
{
CPLError(CE_Failure, CPLE_AppDefined,
"GetExtent() can be called only after dataset has been opened.");
return -1;
}
return m_papoTABFiles[m_nMainTableIndex]->GetExtent(psExtent, bForce);
}
/**********************************************************************
* TABView::GetFeatureCountByType()
*
* Return number of features of each type.
*
* Note that the sum of the 4 returned values may be different from
* the total number of features since features with NONE geometry
* are not taken into account here.
*
* Note: the bForce flag has nmo effect on .TAB files since the info
* is always in the header.
*
* Returns 0 on success, or silently returns -1 (with no error) if this
* information is not available.
**********************************************************************/
int TABView::GetFeatureCountByType(int &numPoints, int &numLines,
int &numRegions, int &numTexts,
GBool bForce /*= TRUE*/)
{
if (m_nMainTableIndex == -1)
return -1;
return m_papoTABFiles[m_nMainTableIndex]->GetFeatureCountByType(numPoints,
numLines,
numRegions,
numTexts,
bForce);
}
/**********************************************************************
* TABView::GetSpatialRef()
*
* Returns a reference to an OGRSpatialReference for this dataset.
* If the projection parameters have not been parsed yet, then we will
* parse them before returning.
*
* The returned object is owned and maintained by this TABFile and
* should not be modified or freed by the caller.
*
* Returns NULL if the SpatialRef cannot be accessed.
**********************************************************************/
OGRSpatialReference *TABView::GetSpatialRef()
{
if (m_nMainTableIndex == -1)
{
CPLError(CE_Failure, CPLE_AssertionFailed,
"GetSpatialRef() failed: file has not been opened yet.");
return NULL;
}
return m_papoTABFiles[m_nMainTableIndex]->GetSpatialRef();
}
/**********************************************************************
* TABView::SetSpatialRef()
**********************************************************************/
int TABView::SetSpatialRef(OGRSpatialReference *poSpatialRef)
{
if (m_nMainTableIndex == -1)
{
CPLError(CE_Failure, CPLE_AssertionFailed,
"SetSpatialRef() failed: file has not been opened yet.");
return -1;
}
return m_papoTABFiles[m_nMainTableIndex]->SetSpatialRef(poSpatialRef);
}
/**********************************************************************
* TABView::SetBounds()
**********************************************************************/
int TABView::SetBounds(double dXMin, double dYMin,
double dXMax, double dYMax)
{
if (m_nMainTableIndex == -1)
{
CPLError(CE_Failure, CPLE_AssertionFailed,
"SetBounds() failed: file has not been opened yet.");
return -1;
}
return m_papoTABFiles[m_nMainTableIndex]->SetBounds(dXMin, dYMin,
dXMax, dYMax);
}
/************************************************************************/
/* TestCapability() */
/************************************************************************/
int TABView::TestCapability( const char * pszCap )
{
if( EQUAL(pszCap,OLCRandomRead) )
return TRUE;
else if( EQUAL(pszCap,OLCSequentialWrite))
return TRUE;
else if( EQUAL(pszCap,OLCRandomWrite))
return FALSE;
else if( EQUAL(pszCap,OLCFastFeatureCount) )
return m_poFilterGeom == NULL;
else if( EQUAL(pszCap,OLCFastSpatialFilter) )
return FALSE;
else if( EQUAL(pszCap,OLCFastGetExtent) )
return TRUE;
else
return FALSE;
}
/**********************************************************************
* TABView::Dump()
*
* Dump block contents... available only in DEBUG mode.
**********************************************************************/
#ifdef DEBUG
void TABView::Dump(FILE *fpOut /*=NULL*/)
{
if (fpOut == NULL)
fpOut = stdout;
fprintf(fpOut, "----- TABView::Dump() -----\n");
if (m_numTABFiles > 0)
{
fprintf(fpOut, "File is not opened.\n");
}
else
{
fprintf(fpOut, "File is opened: %s\n", m_pszFname);
fprintf(fpOut, "View contains %d tables\n", m_numTABFiles);
}
fflush(fpOut);
}
#endif // DEBUG
/*=====================================================================
* class TABRelation
*====================================================================*/
/**********************************************************************
* TABRelation::TABRelation()
*
* Constructor.
**********************************************************************/
TABRelation::TABRelation()
{
m_poMainTable = NULL;
m_pszMainFieldName = NULL;
m_nMainFieldNo = -1;
m_poRelTable = NULL;
m_pszRelFieldName = NULL;
m_nRelFieldNo = -1;
m_nRelFieldIndexNo = -1;
m_poRelINDFileRef = NULL;
m_nUniqueRecordNo = 0;
m_panMainTableFieldMap = NULL;
m_panRelTableFieldMap = NULL;
m_poDefn = NULL;
}
/**********************************************************************
* TABRelation::~TABRelation()
*
* Destructor.
**********************************************************************/
TABRelation::~TABRelation()
{
ResetAllMembers();
}
/**********************************************************************
* TABRelation::ResetAllMembers()
*
* Reset all class members.
**********************************************************************/
void TABRelation::ResetAllMembers()
{
m_poMainTable = NULL;
CPLFree(m_pszMainFieldName);
m_pszMainFieldName = NULL;
m_nMainFieldNo = -1;
m_poRelTable = NULL;
CPLFree(m_pszRelFieldName);
m_pszRelFieldName = NULL;
m_nRelFieldNo = -1;
m_nRelFieldIndexNo = -1;
m_nUniqueRecordNo = 0;
// No need to close m_poRelINDFileRef since we only got a ref. to it
m_poRelINDFileRef = NULL;
CPLFree(m_panMainTableFieldMap);
m_panMainTableFieldMap = NULL;
CPLFree(m_panRelTableFieldMap);
m_panRelTableFieldMap = NULL;
/*-----------------------------------------------------------------
* Note: we have to check the reference count before deleting m_poDefn
*----------------------------------------------------------------*/
if (m_poDefn && m_poDefn->Dereference() == 0)
delete m_poDefn;
m_poDefn = NULL;
}
/**********************************************************************
* TABRelation::Init()
*
* Set the details of the relation: the main and related tables, the fields
* through which they will be connected, and the list of fields to select.
* After this call, we are ready to read data records.
*
* For write access, Init() is called with pszMain/RelFieldName and
* **papszSelectedFields passed as NULL. They will have to be set through
* other methods before a first feature can be written.
*
* A new OGRFeatureDefn is also built for the combined tables.
*
* Returns 0 on success, or -1 or error.
**********************************************************************/
int TABRelation::Init(const char *pszViewName,
TABFile *poMainTable, TABFile *poRelTable,
const char *pszMainFieldName,
const char *pszRelFieldName,
char **papszSelectedFields)
{
if (poMainTable == NULL || poRelTable == NULL)
return -1;
// We'll need the feature Defn later...
OGRFeatureDefn *poMainDefn, *poRelDefn;
poMainDefn = poMainTable->GetLayerDefn();
poRelDefn = poRelTable->GetLayerDefn();
/*-----------------------------------------------------------------
* Keep info for later use about source tables, etc.
*----------------------------------------------------------------*/
ResetAllMembers();
m_poMainTable = poMainTable;
if (pszMainFieldName)
{
m_pszMainFieldName = CPLStrdup(pszMainFieldName);
m_nMainFieldNo = poMainDefn->GetFieldIndex(pszMainFieldName);
}
m_poRelTable = poRelTable;
if (pszRelFieldName)
{
m_pszRelFieldName = CPLStrdup(pszRelFieldName);
m_nRelFieldNo = poRelDefn->GetFieldIndex(pszRelFieldName);
m_nRelFieldIndexNo = poRelTable->GetFieldIndexNumber(m_nRelFieldNo);
m_poRelINDFileRef = poRelTable->GetINDFileRef();
if (m_nRelFieldIndexNo >= 0 && m_poRelINDFileRef == NULL)
{
CPLError(CE_Failure, CPLE_FileIO,
"Field %s is indexed but the .IND file is missing.",
pszRelFieldName);
return -1;
}
}
/*-----------------------------------------------------------------
* Init field maps. For each field in each table, a -1 means that
* the field is not selected, and a value >=0 is the index of the
* field in the view's FeatureDefn
*----------------------------------------------------------------*/
int i;
int numFields1 = (poMainDefn?poMainDefn->GetFieldCount():0);
int numFields2 = (poRelDefn?poRelDefn->GetFieldCount():0);
m_panMainTableFieldMap = (int*)CPLMalloc((numFields1+1)*sizeof(int));
for(i=0; i<numFields1; i++)
m_panMainTableFieldMap[i] = -1;
m_panRelTableFieldMap = (int*)CPLMalloc((numFields2+1)*sizeof(int));
for(i=0; i<numFields2; i++)
m_panRelTableFieldMap[i] = -1;
/*-----------------------------------------------------------------
* If selectedFields = "*" then select all fields from both tables
*----------------------------------------------------------------*/
if (CSLCount(papszSelectedFields) == 1 &&
EQUAL(papszSelectedFields[0], "*") )
{
CSLDestroy(papszSelectedFields);
papszSelectedFields = NULL;
for(i=0; i<numFields1; i++)
{
OGRFieldDefn *poFieldDefn = poMainDefn->GetFieldDefn(i);
papszSelectedFields = CSLAddString(papszSelectedFields,
poFieldDefn->GetNameRef());
}
for(i=0; i<numFields2; i++)
{
OGRFieldDefn *poFieldDefn = poRelDefn->GetFieldDefn(i);
if (CSLFindString(papszSelectedFields,
poFieldDefn->GetNameRef()) != -1)
continue; // Avoid duplicate field name in view
papszSelectedFields = CSLAddString(papszSelectedFields,
poFieldDefn->GetNameRef());
}
}
/*-----------------------------------------------------------------
* Create new FeatureDefn and copy selected fields definitions
* while updating the appropriate field maps.
*----------------------------------------------------------------*/
int nIndex, numSelFields = CSLCount(papszSelectedFields);
OGRFieldDefn *poFieldDefn;
m_poDefn = new OGRFeatureDefn(pszViewName);
// Ref count defaults to 0... set it to 1
m_poDefn->Reference();
for(i=0; i<numSelFields ; i++)
{
if (poMainDefn &&
(nIndex=poMainDefn->GetFieldIndex(papszSelectedFields[i])) >=0)
{
/* Field from the main table
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -