📄 mitab_ogr_datasource.cpp
字号:
/* -------------------------------------------------------------------- */
/* Is this a file or directory? */
/* -------------------------------------------------------------------- */
if( VSIStat( pszName, &stat ) != 0
|| (!VSI_ISDIR(stat.st_mode) && !VSI_ISREG(stat.st_mode)) )
{
if( !bTestOpen )
{
CPLError( CE_Failure, CPLE_OpenFailed,
"%s is not a file or directory.\n"
"Unable to open as a Mapinfo dataset.\n",
pszName );
}
return FALSE;
}
/* -------------------------------------------------------------------- */
/* If it is a file, try to open as a Mapinfo file. */
/* -------------------------------------------------------------------- */
if( VSI_ISREG(stat.st_mode) )
{
IMapInfoFile *poFile;
poFile = IMapInfoFile::SmartOpen( pszName, bTestOpen );
if( poFile == NULL )
return FALSE;
m_nLayerCount = 1;
m_papoLayers = (IMapInfoFile **) CPLMalloc(sizeof(void*));
m_papoLayers[0] = poFile;
m_pszDirectory = CPLStrdup( CPLGetPath(pszName) );
}
/* -------------------------------------------------------------------- */
/* Otherwise, we need to scan the whole directory for files */
/* ending in .tab or .mif. */
/* -------------------------------------------------------------------- */
else
{
char **papszFileList = CPLReadDir( pszName );
m_pszDirectory = CPLStrdup( pszName );
for( int iFile = 0;
papszFileList != NULL && papszFileList[iFile] != NULL;
iFile++ )
{
IMapInfoFile *poFile;
const char *pszExtension = CPLGetExtension(papszFileList[iFile]);
char *pszSubFilename;
if( !EQUAL(pszExtension,"tab") && !EQUAL(pszExtension,"mif") )
continue;
pszSubFilename = CPLStrdup(
CPLFormFilename( m_pszDirectory, papszFileList[iFile], NULL ));
poFile = IMapInfoFile::SmartOpen( pszSubFilename, bTestOpen );
CPLFree( pszSubFilename );
if( poFile == NULL )
{
CSLDestroy( papszFileList );
return FALSE;
}
m_nLayerCount++;
m_papoLayers = (IMapInfoFile **)
CPLRealloc(m_papoLayers,sizeof(void*)*m_nLayerCount);
m_papoLayers[m_nLayerCount-1] = poFile;
}
CSLDestroy( papszFileList );
if( m_nLayerCount == 0 )
{
if( !bTestOpen )
CPLError( CE_Failure, CPLE_OpenFailed,
"No mapinfo files found in directory %s.\n",
m_pszDirectory );
return FALSE;
}
}
return TRUE;
}
/************************************************************************/
/* GetLayerCount() */
/************************************************************************/
int OGRTABDataSource::GetLayerCount()
{
if( m_bSingleFile && !m_bSingleLayerAlreadyCreated )
return 0;
else
return m_nLayerCount;
}
/************************************************************************/
/* GetLayer() */
/************************************************************************/
OGRLayer *OGRTABDataSource::GetLayer( int iLayer )
{
if( iLayer < 0 || iLayer >= GetLayerCount() )
return NULL;
else
return m_papoLayers[iLayer];
}
/************************************************************************/
/* CreateLayer() */
/************************************************************************/
OGRLayer *
OGRTABDataSource::CreateLayer( const char * pszLayerName,
OGRSpatialReference *poSRSIn,
OGRwkbGeometryType /* eGeomTypeIn */,
char ** /* papszOptions */ )
{
IMapInfoFile *poFile;
char *pszFullFilename;
/* -------------------------------------------------------------------- */
/* If it's a single file mode file, then we may have already */
/* instantiated the low level layer. We would just need to */
/* reset the coordinate system and (potentially) bounds. */
/* -------------------------------------------------------------------- */
if( m_bSingleFile )
{
if( m_bSingleLayerAlreadyCreated )
{
CPLError( CE_Failure, CPLE_AppDefined,
"Unable to create new layers in this single file dataset.");
return NULL;
}
m_bSingleLayerAlreadyCreated = TRUE;
poFile = (IMapInfoFile *) m_papoLayers[0];
}
/* -------------------------------------------------------------------- */
/* We need to initially create the file, and add it as a layer. */
/* -------------------------------------------------------------------- */
else
{
if( m_bCreateMIF )
{
pszFullFilename = CPLStrdup( CPLFormFilename( m_pszDirectory,
pszLayerName, "mif" ) );
poFile = new MIFFile;
}
else
{
pszFullFilename = CPLStrdup( CPLFormFilename( m_pszDirectory,
pszLayerName, "tab" ) );
poFile = new TABFile;
}
if( poFile->Open( pszFullFilename, "wb", FALSE ) != 0 )
{
CPLFree( pszFullFilename );
delete poFile;
return FALSE;
}
m_nLayerCount++;
m_papoLayers = (IMapInfoFile **)
CPLRealloc(m_papoLayers,sizeof(void*)*m_nLayerCount);
m_papoLayers[m_nLayerCount-1] = poFile;
CPLFree( pszFullFilename );
}
/* -------------------------------------------------------------------- */
/* Assign the coordinate system (if provided) and set */
/* reasonable bounds. */
/* -------------------------------------------------------------------- */
if( poSRSIn != NULL )
poFile->SetSpatialRef( poSRSIn );
if( !poFile->IsBoundsSet() && !m_bCreateMIF )
{
if( poSRSIn != NULL && poSRSIn->GetRoot() != NULL
&& EQUAL(poSRSIn->GetRoot()->GetValue(),"GEOGCS") )
poFile->SetBounds( -1000, -1000, 1000, 1000 );
else
poFile->SetBounds( -30000000, -15000000, 30000000, 15000000 );
}
if (m_bQuickSpatialIndexMode && poFile->SetQuickSpatialIndexMode() != 0)
{
CPLError( CE_Warning, CPLE_AppDefined,
"Setting Quick Spatial Index Mode failed.");
}
return poFile;
}
/************************************************************************/
/* TestCapability() */
/************************************************************************/
int OGRTABDataSource::TestCapability( const char * pszCap )
{
if( EQUAL(pszCap,ODsCCreateLayer) )
return !m_bSingleFile || !m_bSingleLayerAlreadyCreated;
else
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -