?? 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() *//************************************************************************/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 + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -