📄 mitab_tabseamless.cpp
字号:
return -1;
}
/**********************************************************************
* TABSeamless::GetFeatureRef()
*
* Fill and return a TABFeature object for the specified feature id.
*
* The returned pointer is a reference to an object owned and maintained
* by this TABSeamless object. It should not be altered or freed by the
* caller and its contents is guaranteed to be valid only until the next
* call to GetFeatureRef() or Close().
*
* Returns NULL if the specified feature id does not exist of if an
* error happened. In any case, CPLError() will have been called to
* report the reason of the failure.
**********************************************************************/
TABFeature *TABSeamless::GetFeatureRef(int nFeatureId)
{
if (m_poIndexTable == NULL)
return NULL; // File is not opened yet
if (nFeatureId == m_nCurFeatureId && m_poCurFeature)
return m_poCurFeature;
if (m_nCurBaseTableId != ExtractBaseTableId(nFeatureId))
{
if (OpenBaseTable(ExtractBaseTableId(nFeatureId)) != 0)
return NULL;
}
if (m_poCurBaseTable)
{
if (m_poCurFeature)
delete m_poCurFeature;
m_poCurFeature = (TABFeature*)m_poCurBaseTable->GetFeature(ExtractBaseFeatureId(nFeatureId));
m_nCurFeatureId = nFeatureId;
m_poCurFeature->SetFID(nFeatureId);
return m_poCurFeature;
}
return NULL;
}
/**********************************************************************
* TABSeamless::GetLayerDefn()
*
* Returns a reference to the OGRFeatureDefn that will be used to create
* features in this dataset.
*
* Returns a reference to an object that is maintained by this TABSeamless
* object (and thus should not be modified or freed by the caller) or
* NULL if the OGRFeatureDefn has not been initialized yet (i.e. no file
* opened yet)
**********************************************************************/
OGRFeatureDefn *TABSeamless::GetLayerDefn()
{
return m_poFeatureDefnRef;
}
/**********************************************************************
* TABSeamless::GetNativeFieldType()
*
* Returns the native MapInfo field type for the specified field.
*
* Returns TABFUnknown if file is not opened, or if specified field index is
* invalid.
*
* Note that field ids are positive and start at 0.
**********************************************************************/
TABFieldType TABSeamless::GetNativeFieldType(int nFieldId)
{
if (m_poCurBaseTable)
return m_poCurBaseTable->GetNativeFieldType(nFieldId);
return TABFUnknown;
}
/**********************************************************************
* TABSeamless::IsFieldIndexed()
*
* Returns TRUE if field is indexed, or FALSE otherwise.
**********************************************************************/
GBool TABSeamless::IsFieldIndexed(int nFieldId)
{
if (m_poCurBaseTable)
return m_poCurBaseTable->IsFieldIndexed(nFieldId);
return FALSE;
}
/**********************************************************************
* TABSeamless::IsFieldUnique()
*
* Returns TRUE if field is in the Unique table, or FALSE otherwise.
**********************************************************************/
GBool TABSeamless::IsFieldUnique(int nFieldId)
{
if (m_poCurBaseTable)
return m_poCurBaseTable->IsFieldUnique(nFieldId);
return FALSE;
}
/**********************************************************************
* TABSeamless::GetBounds()
*
* Fetch projection coordinates bounds of a dataset.
*
* The bForce flag has no effect on TAB files since the bounds are
* always in the header.
*
* Returns 0 on success, -1 on error.
**********************************************************************/
int TABSeamless::GetBounds(double &dXMin, double &dYMin,
double &dXMax, double &dYMax,
GBool bForce /*= TRUE*/)
{
if (m_poIndexTable == NULL)
{
CPLError(CE_Failure, CPLE_AppDefined,
"GetBounds() can be called only after dataset has been opened.");
return -1;
}
return m_poIndexTable->GetBounds(dXMin, dYMin, dXMax, dYMax, bForce);
}
/**********************************************************************
* TABSeamless::GetExtent()
*
* Fetch extent of the data currently stored in the dataset.
*
* The bForce flag has no effect on TAB files since that value is
* always in the header.
*
* Returns OGRERR_NONE/OGRRERR_FAILURE.
**********************************************************************/
OGRErr TABSeamless::GetExtent (OGREnvelope *psExtent, int bForce)
{
if (m_poIndexTable == NULL)
{
CPLError(CE_Failure, CPLE_AppDefined,
"GetExtent() can be called only after dataset has been opened.");
return OGRERR_FAILURE;
}
return m_poIndexTable->GetExtent(psExtent, bForce);
}
/**********************************************************************
* TABSeamless::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.
*
* Returns 0 on success, or silently returns -1 (with no error) if this
* information is not available.
**********************************************************************/
int TABSeamless::GetFeatureCountByType(int &numPoints, int &numLines,
int &numRegions, int &numTexts,
GBool bForce /*= TRUE*/)
{
/*-----------------------------------------------------------------
* __TODO__ This should be implemented to return -1 if force=false,
* or scan all the base tables if force=true
*----------------------------------------------------------------*/
return -1;
}
int TABSeamless::GetFeatureCount(int bForce)
{
/*-----------------------------------------------------------------
* __TODO__ This should be implemented to return -1 if force=false,
* or scan all the base tables if force=true
*----------------------------------------------------------------*/
return OGRLayer::GetFeatureCount(bForce);
}
/**********************************************************************
* TABSeamless::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 *TABSeamless::GetSpatialRef()
{
if (m_poIndexTable == NULL)
{
CPLError(CE_Failure, CPLE_AssertionFailed,
"GetSpatialRef() failed: file has not been opened yet.");
return NULL;
}
return m_poIndexTable->GetSpatialRef();
}
/**********************************************************************
* IMapInfoFile::SetSpatialFilter()
*
* Standard OGR SetSpatialFiltere implementation. This methode is used
* to set a SpatialFilter for this OGRLayer
**********************************************************************/
void TABSeamless::SetSpatialFilter (OGRGeometry * poGeomIn )
{
IMapInfoFile::SetSpatialFilter( poGeomIn );
if( m_poIndexTable )
m_poIndexTable->SetSpatialFilter( poGeomIn );
if( m_poCurBaseTable )
m_poCurBaseTable->SetSpatialFilter( poGeomIn );
}
/************************************************************************/
/* TestCapability() */
/************************************************************************/
int TABSeamless::TestCapability( const char * pszCap )
{
if( EQUAL(pszCap,OLCRandomRead) )
return TRUE;
else if( EQUAL(pszCap,OLCSequentialWrite)
|| EQUAL(pszCap,OLCRandomWrite) )
return FALSE;
else if( EQUAL(pszCap,OLCFastFeatureCount) )
return FALSE;
else if( EQUAL(pszCap,OLCFastSpatialFilter) )
return FALSE;
else if( EQUAL(pszCap,OLCFastGetExtent) )
return TRUE;
else
return FALSE;
}
/**********************************************************************
* TABSeamless::Dump()
*
* Dump block contents... available only in DEBUG mode.
**********************************************************************/
#ifdef DEBUG
void TABSeamless::Dump(FILE *fpOut /*=NULL*/)
{
if (fpOut == NULL)
fpOut = stdout;
fprintf(fpOut, "----- TABSeamless::Dump() -----\n");
if (m_poIndexTable == NULL)
{
fprintf(fpOut, "File is not opened.\n");
}
else
{
fprintf(fpOut, "File is opened: %s\n", m_pszFname);
}
fflush(fpOut);
}
#endif // DEBUG
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -