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