ogrlayer.cpp

来自「支持各种栅格图像和矢量图像读取的库」· C++ 代码 · 共 890 行 · 第 1/2 页

CPP
890
字号
/****************************************************************************** * $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()                      *//************************************************************************/OGRErr OGR_L_SetAttributeFilter( OGRLayerH hLayer, const char *pszQuery ){    return ((OGRLayer *) hLayer)->SetAttributeFilter( pszQuery );}/************************************************************************//*                             GetFeature()                             *//************************************************************************/OGRFeature *OGRLayer::GetFeature( long nFID ){    OGRFeature *poFeature;    ResetReading();    while( (poFeature = GetNextFeature()) != NULL )    {        if( poFeature->GetFID() == nFID )            return poFeature;        else            delete poFeature;    }        return NULL;}/************************************************************************//*                          OGR_L_GetFeature()                          *//************************************************************************/OGRFeatureH OGR_L_GetFeature( OGRLayerH hLayer, long nFeatureId ){    return (OGRFeatureH) ((OGRLayer *)hLayer)->GetFeature( nFeatureId );}/************************************************************************//*                           SetNextByIndex()                           *//************************************************************************/OGRErr OGRLayer::SetNextByIndex( long nIndex ){    OGRFeature *poFeature;    ResetReading();    while( nIndex-- > 0 )    {        poFeature = GetNextFeature();        if( poFeature == NULL )            return OGRERR_FAILURE;        delete poFeature;    }    return OGRERR_NONE;}/************************************************************************//*                        OGR_L_SetNextByIndex()                        *//************************************************************************/OGRErr OGR_L_SetNextByIndex( OGRLayerH hLayer, long nIndex ){    return ((OGRLayer *)hLayer)->SetNextByIndex( nIndex );}/************************************************************************//*                        OGR_L_GetNextFeature()                        *//************************************************************************/OGRFeatureH OGR_L_GetNextFeature( OGRLayerH hLayer ){    return (OGRFeatureH) ((OGRLayer *)hLayer)->GetNextFeature();}/************************************************************************//*                             SetFeature()                             *//************************************************************************/OGRErr OGRLayer::SetFeature( OGRFeature * ){    return OGRERR_UNSUPPORTED_OPERATION;}/************************************************************************//*                          OGR_L_SetFeature()                          *//************************************************************************/OGRErr OGR_L_SetFeature( OGRLayerH hLayer, OGRFeatureH hFeat ){    return ((OGRLayer *)hLayer)->SetFeature( (OGRFeature *) hFeat );}/************************************************************************//*                           CreateFeature()                            *//************************************************************************/OGRErr OGRLayer::CreateFeature( OGRFeature * ){    return OGRERR_UNSUPPORTED_OPERATION;}/************************************************************************//*                        OGR_L_CreateFeature()                         *//************************************************************************/OGRErr OGR_L_CreateFeature( OGRLayerH hLayer, OGRFeatureH hFeat ){    return ((OGRLayer *) hLayer)->CreateFeature( (OGRFeature *) hFeat );}/************************************************************************//*                              GetInfo()                               *//************************************************************************/const char *OGRLayer::GetInfo( const char * pszTag ){    (void) pszTag;    return NULL;}/************************************************************************//*                            CreateField()                             *//************************************************************************/OGRErr OGRLayer::CreateField( OGRFieldDefn * poField, int bApproxOK ){    (void) poField;    (void) bApproxOK;    CPLError( CE_Failure, CPLE_NotSupported,              "CreateField() not supported by this layer.\n" );                  return OGRERR_UNSUPPORTED_OPERATION;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?