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 + -
显示快捷键?