?? ogrdatasource.cpp
字號:
/******************************************************************************
* $Id: ogrdatasource.cpp 10646 2007-01-18 02:38:10Z warmerdam $
*
* Project: OpenGIS Simple Features Reference Implementation
* Purpose: The generic portions of the OGRDataSource class.
* Author: Frank Warmerdam, warmerdam@pobox.com
*
******************************************************************************
* Copyright (c) 1999, Les Technologies SoftMap Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
****************************************************************************/
#include "ogrsf_frmts.h"
#include "ogr_api.h"
#include "ogr_p.h"
#include "ogr_gensql.h"
#include "ogr_attrind.h"
CPL_CVSID("$Id: ogrdatasource.cpp 10646 2007-01-18 02:38:10Z warmerdam $");
/************************************************************************/
/* ~OGRDataSource() */
/************************************************************************/
OGRDataSource::OGRDataSource()
{
m_poStyleTable = NULL;
m_nRefCount = 0;
m_poDriver = NULL;
}
/************************************************************************/
/* ~OGRDataSource() */
/************************************************************************/
OGRDataSource::~OGRDataSource()
{
if ( m_poStyleTable )
{
delete m_poStyleTable;
m_poStyleTable = NULL;
}
}
/************************************************************************/
/* DestroyDataSource() */
/************************************************************************/
void OGRDataSource::DestroyDataSource( OGRDataSource *poDS )
{
delete poDS;
}
/************************************************************************/
/* OGR_DS_Destroy() */
/************************************************************************/
void OGR_DS_Destroy( OGRDataSourceH hDS )
{
delete (OGRDataSource *) hDS;
}
/************************************************************************/
/* Release() */
/************************************************************************/
OGRErr OGRDataSource::Release()
{
return OGRSFDriverRegistrar::GetRegistrar()->ReleaseDataSource( this );
}
/************************************************************************/
/* Reference() */
/************************************************************************/
int OGRDataSource::Reference()
{
return ++m_nRefCount;
}
/************************************************************************/
/* OGR_DS_Reference() */
/************************************************************************/
int OGR_DS_Reference( OGRDataSourceH hDataSource )
{
return ((OGRDataSource *) hDataSource)->Reference();
}
/************************************************************************/
/* Dereference() */
/************************************************************************/
int OGRDataSource::Dereference()
{
return --m_nRefCount;
}
/************************************************************************/
/* OGR_DS_Dereference() */
/************************************************************************/
int OGR_DS_Dereference( OGRDataSourceH hDataSource )
{
return ((OGRDataSource *) hDataSource)->Dereference();
}
/************************************************************************/
/* GetRefCount() */
/************************************************************************/
int OGRDataSource::GetRefCount() const
{
return m_nRefCount;
}
/************************************************************************/
/* OGR_DS_GetRefCount() */
/************************************************************************/
int OGR_DS_GetRefCount( OGRDataSourceH hDataSource )
{
return ((OGRDataSource *) hDataSource)->GetRefCount();
}
/************************************************************************/
/* GetSummaryRefCount() */
/************************************************************************/
int OGRDataSource::GetSummaryRefCount() const
{
int nSummaryCount = m_nRefCount;
int iLayer;
OGRDataSource *poUseThis = (OGRDataSource *) this;
for( iLayer=0; iLayer < poUseThis->GetLayerCount(); iLayer++ )
nSummaryCount += poUseThis->GetLayer( iLayer )->GetRefCount();
return nSummaryCount;
}
/************************************************************************/
/* OGR_DS_GetSummaryRefCount() */
/************************************************************************/
int OGR_DS_GetSummaryRefCount( OGRDataSourceH hDataSource )
{
return ((OGRDataSource *) hDataSource)->GetSummaryRefCount();
}
/************************************************************************/
/* CreateLayer() */
/************************************************************************/
OGRLayer *OGRDataSource::CreateLayer( const char * pszName,
OGRSpatialReference * poSpatialRef,
OGRwkbGeometryType eGType,
char **papszOptions )
{
(void) eGType;
(void) poSpatialRef;
(void) pszName;
(void) papszOptions;
CPLError( CE_Failure, CPLE_NotSupported,
"CreateLayer() not supported by this data source." );
return NULL;
}
/************************************************************************/
/* OGR_DS_CreateLayer() */
/************************************************************************/
OGRLayerH OGR_DS_CreateLayer( OGRDataSourceH hDS,
const char * pszName,
OGRSpatialReferenceH hSpatialRef,
OGRwkbGeometryType eType,
char ** papszOptions )
{
return ((OGRDataSource *)hDS)->CreateLayer(
pszName, (OGRSpatialReference *) hSpatialRef, eType, papszOptions );
}
/************************************************************************/
/* CopyLayer() */
/************************************************************************/
OGRLayer *OGRDataSource::CopyLayer( OGRLayer *poSrcLayer,
const char *pszNewName,
char **papszOptions )
{
OGRFeatureDefn *poSrcDefn = poSrcLayer->GetLayerDefn();
OGRLayer *poDstLayer = NULL;
/* -------------------------------------------------------------------- */
/* Create the layer. */
/* -------------------------------------------------------------------- */
if( !TestCapability( ODsCCreateLayer ) )
{
CPLError( CE_Failure, CPLE_NotSupported,
"This datasource does not support creation of layers." );
return NULL;
}
CPLErrorReset();
poDstLayer = CreateLayer( pszNewName, poSrcLayer->GetSpatialRef(),
poSrcDefn->GetGeomType(), papszOptions );
if( poDstLayer == NULL )
return NULL;
/* -------------------------------------------------------------------- */
/* Add fields. Default to copy all field. */
/* If only a subset of all fields requested, then output only */
/* the selected fields, and in the order that they were */
/* selected. */
/* -------------------------------------------------------------------- */
int iField;
for( iField = 0; iField < poSrcDefn->GetFieldCount(); iField++ )
poDstLayer->CreateField( poSrcDefn->GetFieldDefn(iField) );
/* -------------------------------------------------------------------- */
/* Transfer features. */
/* -------------------------------------------------------------------- */
OGRFeature *poFeature;
poSrcLayer->ResetReading();
while( TRUE )
{
OGRFeature *poDstFeature = NULL;
poFeature = poSrcLayer->GetNextFeature();
if( poFeature == NULL )
break;
CPLErrorReset();
poDstFeature = OGRFeature::CreateFeature( poDstLayer->GetLayerDefn() );
if( poDstFeature->SetFrom( poFeature, TRUE ) != OGRERR_NONE )
{
delete poFeature;
CPLError( CE_Failure, CPLE_AppDefined,
"Unable to translate feature %d from layer %s.\n",
poFeature->GetFID(), poSrcDefn->GetName() );
return poDstLayer;
}
poDstFeature->SetFID( poFeature->GetFID() );
OGRFeature::DestroyFeature( poFeature );
CPLErrorReset();
if( poDstLayer->CreateFeature( poDstFeature ) != OGRERR_NONE )
{
OGRFeature::DestroyFeature( poDstFeature );
return poDstLayer;
}
OGRFeature::DestroyFeature( poDstFeature );
}
return poDstLayer;
}
/************************************************************************/
/* OGR_DS_CopyLayer() */
/************************************************************************/
OGRLayerH OGR_DS_CopyLayer( OGRDataSourceH hDS,
OGRLayerH hSrcLayer, const char *pszNewName,
char **papszOptions )
{
return ((OGRDataSource *) hDS)->CopyLayer( (OGRLayer *) hSrcLayer,
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -