📄 ogrlayer.cpp
字号:
/******************************************************************************
* $Id: ogrlayer.cpp 10646 2007-01-18 02:38:10Z warmerdam $
*
* Project: OpenGIS Simple Features Reference Implementation
* Purpose: The generic portions of the OGRSFLayer 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_attrind.h"
CPL_CVSID("$Id: ogrlayer.cpp 10646 2007-01-18 02:38:10Z warmerdam $");
/************************************************************************/
/* OGRLayer() */
/************************************************************************/
OGRLayer::OGRLayer()
{
m_poStyleTable = NULL;
m_poAttrQuery = NULL;
m_poAttrIndex = NULL;
m_nRefCount = 0;
m_nFeaturesRead = 0;
m_poFilterGeom = NULL;
m_bFilterIsEnvelope = FALSE;
}
/************************************************************************/
/* ~OGRLayer() */
/************************************************************************/
OGRLayer::~OGRLayer()
{
if ( m_poStyleTable )
{
delete m_poStyleTable;
m_poStyleTable = NULL;
}
if( m_poAttrIndex != NULL )
{
delete m_poAttrIndex;
m_poAttrIndex = NULL;
}
if( m_poAttrQuery != NULL )
{
delete m_poAttrQuery;
m_poAttrQuery = NULL;
}
if( m_poFilterGeom )
{
delete m_poFilterGeom;
m_poFilterGeom = NULL;
}
}
/************************************************************************/
/* Reference() */
/************************************************************************/
int OGRLayer::Reference()
{
return ++m_nRefCount;
}
/************************************************************************/
/* OGR_L_Reference() */
/************************************************************************/
int OGR_L_Reference( OGRLayerH hLayer )
{
return ((OGRLayer *) hLayer)->Reference();
}
/************************************************************************/
/* Dereference() */
/************************************************************************/
int OGRLayer::Dereference()
{
return --m_nRefCount;
}
/************************************************************************/
/* OGR_L_Dereference() */
/************************************************************************/
int OGR_L_Dereference( OGRLayerH hLayer )
{
return ((OGRLayer *) hLayer)->Dereference();
}
/************************************************************************/
/* GetRefCount() */
/************************************************************************/
int OGRLayer::GetRefCount() const
{
return m_nRefCount;
}
/************************************************************************/
/* OGR_L_GetRefCount() */
/************************************************************************/
int OGR_L_GetRefCount( OGRLayerH hLayer )
{
return ((OGRLayer *) hLayer)->GetRefCount();
}
/************************************************************************/
/* GetFeatureCount() */
/************************************************************************/
int OGRLayer::GetFeatureCount( int bForce )
{
OGRFeature *poFeature;
int nFeatureCount = 0;
if( !bForce )
return -1;
ResetReading();
while( (poFeature = GetNextFeature()) != NULL )
{
nFeatureCount++;
delete poFeature;
}
ResetReading();
return nFeatureCount;
}
/************************************************************************/
/* OGR_L_GetFeatureCount() */
/************************************************************************/
int OGR_L_GetFeatureCount( OGRLayerH hLayer, int bForce )
{
return ((OGRLayer *) hLayer)->GetFeatureCount(bForce);
}
/************************************************************************/
/* GetExtent() */
/************************************************************************/
OGRErr OGRLayer::GetExtent(OGREnvelope *psExtent, int bForce )
{
OGRFeature *poFeature;
OGREnvelope oEnv;
GBool bExtentSet = FALSE;
/* -------------------------------------------------------------------- */
/* If this layer has a none geometry type, then we can */
/* reasonably assume there are not extents available. */
/* -------------------------------------------------------------------- */
if( GetLayerDefn()->GetGeomType() == wkbNone )
{
psExtent->MinX = 0.0;
psExtent->MaxX = 0.0;
psExtent->MinY = 0.0;
psExtent->MaxY = 0.0;
return OGRERR_FAILURE;
}
/* -------------------------------------------------------------------- */
/* If not forced, we should avoid having to scan all the */
/* features and just return a failure. */
/* -------------------------------------------------------------------- */
if( !bForce )
return OGRERR_FAILURE;
/* -------------------------------------------------------------------- */
/* OK, we hate to do this, but go ahead and read through all */
/* the features to collect geometries and build extents. */
/* -------------------------------------------------------------------- */
ResetReading();
while( (poFeature = GetNextFeature()) != NULL )
{
OGRGeometry *poGeom = poFeature->GetGeometryRef();
if (poGeom && !bExtentSet)
{
poGeom->getEnvelope(psExtent);
bExtentSet = TRUE;
}
else if (poGeom)
{
poGeom->getEnvelope(&oEnv);
if (oEnv.MinX < psExtent->MinX)
psExtent->MinX = oEnv.MinX;
if (oEnv.MinY < psExtent->MinY)
psExtent->MinY = oEnv.MinY;
if (oEnv.MaxX > psExtent->MaxX)
psExtent->MaxX = oEnv.MaxX;
if (oEnv.MaxY > psExtent->MaxY)
psExtent->MaxY = oEnv.MaxY;
}
delete poFeature;
}
ResetReading();
return (bExtentSet ? OGRERR_NONE : OGRERR_FAILURE);
}
/************************************************************************/
/* OGR_L_GetExtent() */
/************************************************************************/
OGRErr OGR_L_GetExtent( OGRLayerH hLayer, OGREnvelope *psExtent, int bForce )
{
return ((OGRLayer *) hLayer)->GetExtent( psExtent, bForce );
}
/************************************************************************/
/* SetAttributeFilter() */
/************************************************************************/
OGRErr OGRLayer::SetAttributeFilter( const char *pszQuery )
{
/* -------------------------------------------------------------------- */
/* Are we just clearing any existing query? */
/* -------------------------------------------------------------------- */
if( pszQuery == NULL || strlen(pszQuery) == 0 )
{
if( m_poAttrQuery )
{
delete m_poAttrQuery;
m_poAttrQuery = NULL;
ResetReading();
}
return OGRERR_NONE;
}
/* -------------------------------------------------------------------- */
/* Or are we installing a new query? */
/* -------------------------------------------------------------------- */
OGRErr eErr;
if( !m_poAttrQuery )
m_poAttrQuery = new OGRFeatureQuery();
eErr = m_poAttrQuery->Compile( GetLayerDefn(), pszQuery );
if( eErr != OGRERR_NONE )
{
delete m_poAttrQuery;
m_poAttrQuery = NULL;
}
ResetReading();
return eErr;
}
/************************************************************************/
/* OGR_L_SetAttributeFilter() */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -