ogrsdelayer.cpp

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

CPP
1,305
字号
/****************************************************************************** * $Id: ogrsdelayer.cpp 10646 2007-01-18 02:38:10Z warmerdam $ * * Project:  OpenGIS Simple Features Reference Implementation * Purpose:  Implements OGRSDELayer class. * Author:   Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 2005, 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. ****************************************************************************/#include "ogr_sde.h"#include "cpl_conv.h"#include "cpl_string.h"CPL_CVSID("$Id: ogrsdelayer.cpp 10646 2007-01-18 02:38:10Z warmerdam $");/************************************************************************//*                            OGRSDELayer()                             *//************************************************************************/OGRSDELayer::OGRSDELayer( OGRSDEDataSource *poDSIn ){    poDS = poDSIn;    iFIDColumn = -1;    nNextFID = 0;    iShapeColumn = -1;    poSRS = NULL;    poFeatureDefn = NULL;    bQueryInstalled = FALSE;    hStream = NULL;    hCoordRef = NULL;    papszAllColumns = NULL;    bHaveLayerInfo = FALSE;}/************************************************************************//*                            ~OGRSDELayer()                            *//************************************************************************/OGRSDELayer::~OGRSDELayer(){    if( m_nFeaturesRead > 0 && poFeatureDefn != NULL )    {        CPLDebug( "SDE", "%d features read on layer '%s'.",                  (int) m_nFeaturesRead,                   poFeatureDefn->GetName() );    }    if( bHaveLayerInfo )        SE_layerinfo_free( hLayerInfo );    if( hStream )    {        SE_stream_free( hStream );        hStream = NULL;    }    if( poFeatureDefn )        poFeatureDefn->Release();    if( hCoordRef )        SE_coordref_free( hCoordRef );    if( poSRS )        poSRS->Release();    CSLDestroy( papszAllColumns );}/************************************************************************//*                             Initialize()                             *//************************************************************************/int OGRSDELayer::Initialize( const char *pszTableName,                              const char *pszFIDColumn,                             const char *pszShapeColumn ){    SE_COLUMN_DEF *asColumnDefs;    SHORT   nColumnCount;    int nSDEErr, iCol;    nSDEErr =         SE_table_describe( poDS->GetConnection(), pszTableName,                            &nColumnCount, &asColumnDefs );    if( nSDEErr != SE_SUCCESS )    {        poDS->IssueSDEError( nSDEErr, "SE_table_describe" );        return FALSE;    }    poFeatureDefn = new OGRFeatureDefn( pszTableName );    poFeatureDefn->Reference();/* -------------------------------------------------------------------- *//*  If the OGR_SDE_GETLAYERTYPE option is set to TRUE, then the layer   *//*  is tested to see if it contains one, and only one, type of geometry *//*  then that geometry type is placed into the LayerDefn.               *//* -------------------------------------------------------------------- */    const char *pszLayerType = CPLGetConfigOption( "OGR_SDE_GETLAYERTYPE",                                                    "FALSE" );    if( CSLTestBoolean(pszLayerType) != FALSE )    {        poFeatureDefn->SetGeomType(DiscoverLayerType());    }    for( iCol = 0; iCol < nColumnCount; iCol++ )    {        OGRFieldType eOGRType = OFTIntegerList; // dummy        int nWidth = -1, nPrecision = -1;        papszAllColumns = CSLAddString( papszAllColumns,                                         asColumnDefs[iCol].column_name );        switch( asColumnDefs[iCol].sde_type )        {          case SE_SMALLINT_TYPE:          case SE_INTEGER_TYPE:            eOGRType = OFTInteger;            nWidth = asColumnDefs[iCol].size;            break;          case SE_FLOAT_TYPE:          case SE_DOUBLE_TYPE:            eOGRType = OFTReal;            nWidth = asColumnDefs[iCol].size;            nPrecision = asColumnDefs[iCol].decimal_digits;            break;          case SE_STRING_TYPE:            eOGRType = OFTString;            nWidth = asColumnDefs[iCol].size;            break;          case SE_BLOB_TYPE:            eOGRType = OFTBinary;            break;          case SE_DATE_TYPE:            eOGRType = OFTString;            nWidth = asColumnDefs[iCol].size;            break;          case SE_SHAPE_TYPE:          {              if( iShapeColumn == -1 )              {                  if( pszShapeColumn == NULL                      || EQUAL(pszShapeColumn,                               asColumnDefs[iCol].column_name) )                  {                      iShapeColumn = iCol;                      osShapeColumnName = asColumnDefs[iCol].column_name;                  }              }          }          break;          default:            break;        }        if( eOGRType == OFTIntegerList )            continue;        OGRFieldDefn  oField( asColumnDefs[iCol].column_name, eOGRType );        if( nWidth != -1 )            oField.SetWidth( nWidth );        if( nPrecision != -1 )            oField.SetPrecision( nPrecision );        poFeatureDefn->AddFieldDefn( &oField );                anFieldMap.push_back( iCol );        anFieldTypeMap.push_back( asColumnDefs[iCol].sde_type );        if( pszFIDColumn            && EQUAL(asColumnDefs[iCol].column_name,pszFIDColumn) )            iFIDColumn = anFieldMap.size() - 1;    }    SE_table_free_descriptions( asColumnDefs );    return TRUE;}/************************************************************************//*                           NeedLayerInfo()                            *//*                                                                      *//*      Verify layerinfo is available, and load if not.  Loading        *//*      layerinfo is relatively expensive so we try to put it off as    *//*      long as possible.                                               *//************************************************************************/int OGRSDELayer::NeedLayerInfo(){    int nSDEErr;    if( bHaveLayerInfo )        return TRUE;    nSDEErr = SE_layerinfo_create( NULL, &hLayerInfo );    if( nSDEErr != SE_SUCCESS )    {        poDS->IssueSDEError( nSDEErr, "SE_layerinfo_create" );        return FALSE;    }    CPLDebug( "OGR_SDE", "Loading %s layerinfo.",               poFeatureDefn->GetName() );    nSDEErr = SE_layer_get_info( poDS->GetConnection(),                                  poFeatureDefn->GetName(),                                  osShapeColumnName.c_str(),                                 hLayerInfo );    if( nSDEErr != SE_SUCCESS )    {        poDS->IssueSDEError( nSDEErr, "SE_layer_get_info" );        return FALSE;    }    bHaveLayerInfo = TRUE;/* -------------------------------------------------------------------- *//*      Fetch coordinate reference system.                              *//* -------------------------------------------------------------------- */    SE_coordref_create( &hCoordRef );        nSDEErr = SE_layerinfo_get_coordref( hLayerInfo, hCoordRef );    if( nSDEErr != SE_SUCCESS )    {        poDS->IssueSDEError( nSDEErr, "SE_layerinfo_get_coordref" );    }    else    {        char szWKT[4000];        nSDEErr = SE_coordref_get_description( hCoordRef, szWKT );        if( nSDEErr != SE_SUCCESS )        {            poDS->IssueSDEError( nSDEErr, "SE_coordref_get_description" );        }        else        {            poSRS = new OGRSpatialReference(szWKT);            poSRS->morphFromESRI();        }    }    return TRUE;}/************************************************************************//*                          DiscoverLayerType()                         *//************************************************************************/OGRwkbGeometryType OGRSDELayer::DiscoverLayerType(){    if( !NeedLayerInfo() )        return wkbUnknown;    int nSDEErr;    long nShapeTypeMask = 0;  /* -------------------------------------------------------------------- *//*      Check layerinfo flags to establish what geometry types may      *//*      occur.                                                          *//* -------------------------------------------------------------------- */    nSDEErr = SE_layerinfo_get_shape_types( hLayerInfo, &nShapeTypeMask );    if (nSDEErr != SE_SUCCESS)    {        CPLDebug( "OGR_SDE",                  "Unable to read the layer type information, defaulting to wkbUnknown:  error=%d.",                  nSDEErr );        return wkbUnknown;    }    int bIsMultipart = ( nShapeTypeMask & SE_MULTIPART_TYPE_MASK ? 1 : 0);    nShapeTypeMask &= ~SE_MULTIPART_TYPE_MASK;    // Since we assume that all layers can bear a NULL geometry,     // throw the flag away.    nShapeTypeMask &= ~SE_NIL_TYPE_MASK;    int nTypeCount = 0;    if ( nShapeTypeMask & SE_POINT_TYPE_MASK )        nTypeCount++;    if ( nShapeTypeMask & SE_LINE_TYPE_MASK          || nShapeTypeMask & SE_SIMPLE_LINE_TYPE_MASK )        nTypeCount++;    if ( nShapeTypeMask & SE_AREA_TYPE_MASK )        nTypeCount++;/* -------------------------------------------------------------------- *//*      When the flags indicate multiple geometry types are             *//*      possible, we examine the layer statistics to see if in          *//*      reality only one geometry type does occur.  This is somewhat    */

⌨️ 快捷键说明

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