⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ogrodbclayer.cpp

📁 GIS系统支持库Geospatial Data Abstraction Library代码.GDAL is a translator library for raster geospatial dat
💻 CPP
字号:
/****************************************************************************** * $Id: ogrodbclayer.cpp,v 1.8 2005/02/22 12:53:56 fwarmerdam Exp $ * * Project:  OpenGIS Simple Features Reference Implementation * Purpose:  Implements OGRODBCLayer class, code shared between  *           the direct table access, and the generic SQL results. * Author:   Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 2003, Frank Warmerdam <warmerdam@pobox.com> * * 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. ****************************************************************************** * * $Log: ogrodbclayer.cpp,v $ * Revision 1.8  2005/02/22 12:53:56  fwarmerdam * use OGRLayer base spatial filter support * * Revision 1.7  2005/02/02 20:54:27  fwarmerdam * track m_nFeaturesRead * * Revision 1.6  2004/03/04 17:16:05  warmerda * Cleanup featuredefn on exit. * * Revision 1.5  2004/01/05 22:38:17  warmerda * stripped out some junk * * Revision 1.4  2003/10/29 16:47:38  warmerda * Improved width/precision handling for real numbers. * * Revision 1.3  2003/10/08 16:00:16  warmerda * provide default GetFeature(int) implementation * * Revision 1.2  2003/09/26 20:03:03  warmerda * initialize pszFIDColumn * * Revision 1.1  2003/09/25 17:08:37  warmerda * New * */#include "cpl_conv.h"#include "ogr_odbc.h"#include "cpl_string.h"CPL_CVSID("$Id: ogrodbclayer.cpp,v 1.8 2005/02/22 12:53:56 fwarmerdam Exp $");/************************************************************************//*                            OGRODBCLayer()                            *//************************************************************************/OGRODBCLayer::OGRODBCLayer(){    poDS = NULL;    pszGeomColumn = NULL;    pszFIDColumn = NULL;    poStmt = NULL;    iNextShapeId = 0;    poSRS = NULL;    nSRSId = -2; // we haven't even queried the database for it yet. }/************************************************************************//*                            ~OGRODBCLayer()                             *//************************************************************************/OGRODBCLayer::~OGRODBCLayer(){    if( m_nFeaturesRead > 0 && poFeatureDefn != NULL )    {        CPLDebug( "ODBC", "%d features read on layer '%s'.",                  (int) m_nFeaturesRead,                   poFeatureDefn->GetName() );    }    if( poStmt != NULL )    {        delete poStmt;        poStmt = NULL;    }    if( pszGeomColumn != NULL )        CPLFree( pszGeomColumn );    if( poFeatureDefn != NULL )    {        delete poFeatureDefn;        poFeatureDefn = NULL;    }    if( poSRS != NULL )        poSRS->Dereference();}/************************************************************************//*                          BuildFeatureDefn()                          *//*                                                                      *//*      Build feature definition from a set of column definitions       *//*      set on a statement.  Sift out geometry and FID fields.          *//************************************************************************/CPLErr OGRODBCLayer::BuildFeatureDefn( const char *pszLayerName,                                     CPLODBCStatement *poStmt ){    poFeatureDefn = new OGRFeatureDefn( pszLayerName );    int    nRawColumns = poStmt->GetColCount();    panFieldOrdinals = (int *) CPLMalloc( sizeof(int) * nRawColumns );    for( int iCol = 0; iCol < nRawColumns; iCol++ )    {        OGRFieldDefn    oField( poStmt->GetColName(iCol), OFTString );        oField.SetWidth( MAX(0,poStmt->GetColSize( iCol )) );        if( pszGeomColumn != NULL             && EQUAL(poStmt->GetColName(iCol),pszGeomColumn) )            continue;                switch( poStmt->GetColType(iCol) )        {          case SQL_INTEGER:            oField.SetType( OFTInteger );            break;          case SQL_DECIMAL:            oField.SetType( OFTReal );            break;          case SQL_FLOAT:          case SQL_REAL:          case SQL_DOUBLE:            oField.SetType( OFTReal );            oField.SetWidth( 0 );            break;          default:            /* leave it as OFTString */;        }        poFeatureDefn->AddFieldDefn( &oField );        panFieldOrdinals[poFeatureDefn->GetFieldCount() - 1] = iCol+1;    }    return CE_None;}/************************************************************************//*                            ResetReading()                            *//************************************************************************/void OGRODBCLayer::ResetReading(){    iNextShapeId = 0;}/************************************************************************//*                           GetNextFeature()                           *//************************************************************************/OGRFeature *OGRODBCLayer::GetNextFeature(){    for( ; TRUE; )    {        OGRFeature      *poFeature;        poFeature = GetNextRawFeature();        if( poFeature == NULL )            return NULL;        if( (m_poFilterGeom == NULL            || FilterGeometry( poFeature->GetGeometryRef() ) )            && (m_poAttrQuery == NULL                || m_poAttrQuery->Evaluate( poFeature )) )            return poFeature;        delete poFeature;    }}/************************************************************************//*                         GetNextRawFeature()                          *//************************************************************************/OGRFeature *OGRODBCLayer::GetNextRawFeature(){    if( GetStatement() == NULL )        return NULL;/* -------------------------------------------------------------------- *//*      If we are marked to restart then do so, and fetch a record.     *//* -------------------------------------------------------------------- */    if( !poStmt->Fetch() )    {        delete poStmt;        poStmt = NULL;        return NULL;    }/* -------------------------------------------------------------------- *//*      Create a feature from the current result.                       *//* -------------------------------------------------------------------- */    int         iField;    OGRFeature *poFeature = new OGRFeature( poFeatureDefn );    if( pszFIDColumn != NULL && poStmt->GetColId(pszFIDColumn) > -1 )        poFeature->SetFID(             atoi(poStmt->GetColData(poStmt->GetColId(pszFIDColumn))) );    else        poFeature->SetFID( iNextShapeId );    iNextShapeId++;    m_nFeaturesRead++;/* -------------------------------------------------------------------- *//*      Set the fields.                                                 *//* -------------------------------------------------------------------- */    for( iField = 0; iField < poFeatureDefn->GetFieldCount(); iField++ )    {        const char *pszValue = poStmt->GetColData(panFieldOrdinals[iField]-1);        if( pszValue != NULL )            poFeature->SetField( iField, pszValue );    }/* -------------------------------------------------------------------- *//*      Try to extract a geometry.                                      *//* -------------------------------------------------------------------- */    if( pszGeomColumn != NULL )    {        int iField = poStmt->GetColId( pszGeomColumn );        const char *pszGeomText = poStmt->GetColData( iField );        OGRGeometry *poGeom = NULL;        if( pszGeomText != NULL )            OGRGeometryFactory::createFromWkt( (char **) &pszGeomText,                                               NULL, &poGeom );                if( poGeom != NULL )            poFeature->SetGeometryDirectly( poGeom );    }    return poFeature;}/************************************************************************//*                             GetFeature()                             *//************************************************************************/OGRFeature *OGRODBCLayer::GetFeature( long nFeatureId ){    /* This should be implemented directly! */    return OGRLayer::GetFeature( nFeatureId );}/************************************************************************//*                           TestCapability()                           *//************************************************************************/int OGRODBCLayer::TestCapability( const char * pszCap ){    if( EQUAL(pszCap,OLCRandomRead) )        return FALSE;    else if( EQUAL(pszCap,OLCFastFeatureCount) )        return FALSE;    else if( EQUAL(pszCap,OLCFastSpatialFilter) )        return FALSE;    else if( EQUAL(pszCap,OLCTransactions) )        return FALSE;    else         return FALSE;}/************************************************************************//*                           GetSpatialRef()                            *//************************************************************************/OGRSpatialReference *OGRODBCLayer::GetSpatialRef(){    return poSRS;}

⌨️ 快捷键说明

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