ogrsdelayer.cpp
来自「支持各种栅格图像和矢量图像读取的库」· C++ 代码 · 共 1,305 行 · 第 1/4 页
CPP
1,305 行
SE_BLOB_INFO sBlobVal; nSDEErr = SE_stream_get_blob( hStream, anFieldMap[i]+1, &sBlobVal ); if( nSDEErr == SE_SUCCESS ) { poFeat->SetField( i, sBlobVal.blob_length, (GByte *) sBlobVal.blob_buffer ); SE_blob_free( &sBlobVal ); } else if( nSDEErr != SE_NULL_VALUE ) { poDS->IssueSDEError( nSDEErr, "SE_stream_get_blob" ); return NULL; } } break; case SE_DATE_TYPE: { struct tm sDateVal; nSDEErr = SE_stream_get_date( hStream, anFieldMap[i]+1, &sDateVal ); if( nSDEErr == SE_SUCCESS ) { char szDate[128]; strftime( szDate, sizeof(szDate), "%T %m/%d/%Y", &sDateVal ); poFeat->SetField( i, szDate ); } else if( nSDEErr != SE_NULL_VALUE ) { poDS->IssueSDEError( nSDEErr, "SE_stream_get_date" ); return NULL; } } break; } }/* -------------------------------------------------------------------- *//* Apply FID. *//* -------------------------------------------------------------------- */ if( iFIDColumn != -1 ) poFeat->SetFID( poFeat->GetFieldAsInteger( iFIDColumn ) ); else poFeat->SetFID( nNextFID++ );/* -------------------------------------------------------------------- *//* Fetch geometry. *//* -------------------------------------------------------------------- */ if( iShapeColumn != -1 ) { SE_SHAPE hShape = 0; nSDEErr = SE_shape_create( NULL, &hShape ); if( nSDEErr != SE_SUCCESS ) poDS->IssueSDEError( nSDEErr, "SE_shape_create" ); else { nSDEErr = SE_stream_get_shape( hStream, (short) (iShapeColumn+1), hShape ); if( nSDEErr != SE_SUCCESS ) poDS->IssueSDEError( nSDEErr, "SE_stream_get_shape" ); } if( nSDEErr == SE_SUCCESS ) poFeat->SetGeometryDirectly( TranslateSDEGeometry( hShape ) ); SE_shape_free( hShape ); } return poFeat;}/************************************************************************//* GetNextFeature() *//************************************************************************/OGRFeature *OGRSDELayer::GetNextFeature(){ int nSDEErr;/* -------------------------------------------------------------------- *//* Make sure we have an installed query executed. *//* -------------------------------------------------------------------- */ if( !bQueryInstalled && !InstallQuery( FALSE ) ) return NULL;/* -------------------------------------------------------------------- *//* Fetch the next record. *//* -------------------------------------------------------------------- */ while( TRUE ) { nSDEErr = SE_stream_fetch( hStream ); if( nSDEErr == SE_FINISHED ) { bQueryInstalled = FALSE; return NULL; } else if( nSDEErr != SE_SUCCESS ) { poDS->IssueSDEError( nSDEErr, "SE_stream_fetch" ); return NULL; } m_nFeaturesRead++;/* -------------------------------------------------------------------- *//* Translate into an OGRFeature. *//* -------------------------------------------------------------------- */ OGRFeature *poFeature; poFeature = TranslateSDERecord(); if( poFeature != NULL ) { if( m_poFilterGeom == NULL || m_bFilterIsEnvelope || FilterGeometry( poFeature->GetGeometryRef() ) ) return poFeature; delete poFeature; } } }/************************************************************************//* GetFeature() *//************************************************************************/OGRFeature *OGRSDELayer::GetFeature( long nFeatureId ){ int nSDEErr; if( iFIDColumn == -1 ) return OGRLayer::GetFeature( nFeatureId );/* -------------------------------------------------------------------- *//* Our direct row access will terminate any active queries. *//* -------------------------------------------------------------------- */ ResetReading(); /* -------------------------------------------------------------------- *//* Create stream, or reset it. *//* -------------------------------------------------------------------- */ if( hStream == NULL ) { nSDEErr = SE_stream_create( poDS->GetConnection(), &hStream ); if( nSDEErr != SE_SUCCESS) { poDS->IssueSDEError( nSDEErr, "SE_stream_create" ); return FALSE; } } else { nSDEErr = SE_stream_close( hStream, TRUE ); }/* -------------------------------------------------------------------- *//* We want to fetch all the columns, just like we normally *//* would for GetNextFeature(). *//* -------------------------------------------------------------------- */ nSDEErr = SE_stream_fetch_row( hStream, poFeatureDefn->GetName(), nFeatureId, CSLCount( papszAllColumns ), (const char **) papszAllColumns ); if( nSDEErr != SE_SUCCESS ) { poDS->IssueSDEError( nSDEErr, "SE_stream_fetch_row" ); return NULL; }/* -------------------------------------------------------------------- *//* We got our row, now translate it. *//* -------------------------------------------------------------------- */ return TranslateSDERecord();}/************************************************************************//* GetFeatureCount() *//* *//* Issue a special "counter only" query that will just fetch *//* objectids, and count the result set. This will inherently *//* include all the spatial and attribute filtering logic in the *//* database. It would be nice if we could also use a COUNT() *//* operator in the database. *//************************************************************************/int OGRSDELayer::GetFeatureCount( int bForce ){/* -------------------------------------------------------------------- *//* If there is no attribute or spatial filter in place, then *//* use the SDE function call to obtain the number of *//* features. The performance difference between this and manual *//* iteration is significant. *//* -------------------------------------------------------------------- */ if( osAttributeFilter.empty() && m_poFilterGeom == NULL && NeedLayerInfo() ) { SE_LAYER_STATS layerstats = {0}; char szTableName[SE_QUALIFIED_TABLE_NAME]; char szShapeColumn[SE_MAX_COLUMN_LEN]; int nSDEErr; szTableName[0] = '\0'; szShapeColumn[0] = '\0'; nSDEErr = SE_layerinfo_get_spatial_column( hLayerInfo, szTableName, szShapeColumn ); if( nSDEErr != SE_SUCCESS ) { poDS->IssueSDEError( nSDEErr, "SE_layerinfo_get_spatial_column" ); return -1; } nSDEErr = SE_layer_get_statistics( poDS->GetConnection(), szTableName, szShapeColumn, &layerstats); if( nSDEErr != SE_SUCCESS ) { poDS->IssueSDEError( nSDEErr, "SE_layer_get_statistics" ); return -1; } return layerstats.TotalFeatures; }/* -------------------------------------------------------------------- *//* Otherwise use direct reading of the result set, though we *//* skip translating into OGRFeatures at least. *//* -------------------------------------------------------------------- */ int nSDEErr, nFeatureCount = 0; ResetReading(); if( !InstallQuery( TRUE ) ) return -1; for( nSDEErr = SE_stream_fetch( hStream ); nSDEErr == SE_SUCCESS; nSDEErr = SE_stream_fetch( hStream ) ) { nFeatureCount++; } if( nSDEErr != SE_FINISHED ) { poDS->IssueSDEError( nSDEErr, "SE_stream_fetch" ); return -1; } ResetReading(); return nFeatureCount;}/************************************************************************//* GetExtent() *//************************************************************************/OGRErr OGRSDELayer::GetExtent (OGREnvelope *psExtent, int bForce){ if( !NeedLayerInfo() ) return OGRERR_FAILURE; SE_ENVELOPE sEnvelope; int nSDEErr; nSDEErr = SE_layerinfo_get_envelope( hLayerInfo, &sEnvelope ); if( nSDEErr != SE_SUCCESS ) { poDS->IssueSDEError( nSDEErr, "SE_layerinfo_get_envelope" ); return OGRERR_FAILURE; } psExtent->MinX = sEnvelope.minx; psExtent->MinY = sEnvelope.miny; psExtent->MaxX = sEnvelope.maxx; psExtent->MaxY = sEnvelope.maxy; return OGRERR_NONE;}/************************************************************************//* TestCapability() *//************************************************************************/int OGRSDELayer::TestCapability( const char * pszCap ){ if( EQUAL(pszCap,OLCRandomRead) ) return iFIDColumn != -1; else if( EQUAL(pszCap,OLCFastFeatureCount) && osAttributeFilter.empty() && m_poFilterGeom == NULL ) return TRUE; else if( EQUAL(pszCap,OLCFastSpatialFilter) ) return TRUE; else if( EQUAL(pszCap,OLCFastGetExtent) ) return TRUE; else return FALSE;}/************************************************************************//* GetSpatialRef() *//************************************************************************/OGRSpatialReference *OGRSDELayer::GetSpatialRef(){ NeedLayerInfo(); return poSRS;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?