ogrsdelayer.cpp

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

CPP
1,305
字号
/*      expensive, so we avoid it if we can.                            *//* -------------------------------------------------------------------- */    if ( nTypeCount == 0 )    {        CPLDebug( "OGR_SDE", "There is no layer type indicated for the current layer." );        return wkbUnknown;    }    else if ( nTypeCount > 1 )    {        CPLDebug( "OGR_SDE", "More than one layer type is indicated for this layer, gathering layer statistics are being gathered." );        SE_LAYER_STATS layerstats = {0};        char szTableName[SE_QUALIFIED_TABLE_NAME];        char szShapeColumn[SE_MAX_COLUMN_LEN];        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 wkbUnknown;        }        nSDEErr = SE_layer_get_statistics( poDS->GetConnection(), szTableName,                                            szShapeColumn,                                           &layerstats);        if( nSDEErr != SE_SUCCESS )        {            poDS->IssueSDEError( nSDEErr, "SE_layer_get_statistics" );            return wkbUnknown;        }        if ( nShapeTypeMask & SE_POINT_TYPE_MASK &&              ( layerstats.POINTs + layerstats.MultiPOINTs ) == 0 )            nShapeTypeMask &= ~SE_POINT_TYPE_MASK;        if ( nShapeTypeMask & SE_LINE_TYPE_MASK &&             ( layerstats.LINEs + layerstats.MultiLINEs ) == 0 )            nShapeTypeMask &= ~SE_LINE_TYPE_MASK;        if ( nShapeTypeMask & SE_SIMPLE_LINE_TYPE_MASK &&             ( layerstats.SIMPLE_LINEs + layerstats.MultiSIMPLE_LINEs ) == 0 )            nShapeTypeMask &= ~SE_SIMPLE_LINE_TYPE_MASK;        if ( nShapeTypeMask & SE_AREA_TYPE_MASK &&             ( layerstats.AREAs + layerstats.MultiAREAs ) == 0 )            nShapeTypeMask &= ~SE_AREA_TYPE_MASK;    }/* -------------------------------------------------------------------- *//*      Select a geometry type based on the remaining flags.  If        *//*      there is a mix we will fall through to the default (wkbUknown). *//* -------------------------------------------------------------------- */    OGRwkbGeometryType eGeoType;    char *pszTypeName;    switch (nShapeTypeMask)    {      case SE_POINT_TYPE_MASK:        if (bIsMultipart)            eGeoType = wkbMultiPoint;        else            eGeoType = wkbPoint;        pszTypeName = "point";        break;      case (SE_SIMPLE_LINE_TYPE_MASK | SE_LINE_TYPE_MASK):      case SE_SIMPLE_LINE_TYPE_MASK:      case SE_LINE_TYPE_MASK:        if (bIsMultipart)            eGeoType = wkbMultiLineString;        else            eGeoType = wkbLineString;        pszTypeName = "line";        break;            case SE_AREA_TYPE_MASK:        if (bIsMultipart)            eGeoType = wkbMultiPolygon;        else            eGeoType = wkbPolygon;        pszTypeName = "polygon";        break;            default:        eGeoType = wkbUnknown;        pszTypeName = "unknown";        break;    }    CPLDebug( "OGR_SDE",               "DiscoverLayerType is returning type=%d (%s), multipart=%d.",              eGeoType, pszTypeName, bIsMultipart );    return eGeoType;}/************************************************************************//*                            ResetReading()                            *//************************************************************************/void OGRSDELayer::ResetReading(){    bQueryInstalled = FALSE;    nNextFID = 0;}/************************************************************************//*                            InstallQuery()                            *//*                                                                      *//*      Setup the stream with current query characteristics.            *//************************************************************************/int OGRSDELayer::InstallQuery( int bCountingOnly ){    int nSDEErr;/* -------------------------------------------------------------------- *//*      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 );    }/* -------------------------------------------------------------------- *//*      Create query info.                                              *//* -------------------------------------------------------------------- */    SE_QUERYINFO hQueryInfo;    const char *pszTableName = poFeatureDefn->GetName();    nSDEErr = SE_queryinfo_create (&hQueryInfo);    if( nSDEErr != SE_SUCCESS) {        poDS->IssueSDEError( nSDEErr, "SE_queryinfo_create" );        return FALSE;    }        /* -------------------------------------------------------------------- *//*      Select table.                                                   *//* -------------------------------------------------------------------- */    nSDEErr = SE_queryinfo_set_tables( hQueryInfo, 1,                                        &pszTableName, NULL );    if( nSDEErr != SE_SUCCESS) {        poDS->IssueSDEError( nSDEErr, "SE_queryinfo_set_tables" );        return FALSE;    }    /* -------------------------------------------------------------------- *//*      Set where clause.                                               *//* -------------------------------------------------------------------- */    nSDEErr = SE_queryinfo_set_where_clause( hQueryInfo,                                              osAttributeFilter.c_str() );    if( nSDEErr != SE_SUCCESS) {        poDS->IssueSDEError( nSDEErr, "SE_queryinfo_set_where_clause" );        return FALSE;    }    /* -------------------------------------------------------------------- *//*      We want to join the spatial and attribute tables.               *//* -------------------------------------------------------------------- */    nSDEErr = SE_queryinfo_set_query_type(hQueryInfo,SE_QUERYTYPE_JSF);    if( nSDEErr != SE_SUCCESS) {        poDS->IssueSDEError( nSDEErr, "SE_queryinfo_set_query_type" );        return FALSE;    }    /* -------------------------------------------------------------------- *//*      Establish the columns to query.  If only counting features,     *//*      we will just use the FID column, otherwise we use all           *//*      columns.                                                        *//* -------------------------------------------------------------------- */    if( bCountingOnly && iFIDColumn != -1 )    {        const char *pszFIDColName =             poFeatureDefn->GetFieldDefn( iFIDColumn )->GetNameRef();                nSDEErr = SE_queryinfo_set_columns( hQueryInfo, 1,                                             (const char **) &pszFIDColName );        if( nSDEErr != SE_SUCCESS) {            poDS->IssueSDEError( nSDEErr, "SE_queryinfo_set_columns" );            return FALSE;        }        }    else    {        nSDEErr = SE_queryinfo_set_columns( hQueryInfo,                                             CSLCount(papszAllColumns),                                            (const char **) papszAllColumns );        if( nSDEErr != SE_SUCCESS) {            poDS->IssueSDEError( nSDEErr, "SE_queryinfo_set_columns" );            return FALSE;        }        }/* -------------------------------------------------------------------- *//*      Apply the query to the stream.                                  *//* -------------------------------------------------------------------- */    nSDEErr = SE_stream_query_with_info( hStream, hQueryInfo );    if( nSDEErr != SE_SUCCESS) {        poDS->IssueSDEError( nSDEErr, "SE_stream_query_with_info" );        return FALSE;    }    /* -------------------------------------------------------------------- *//*      Free query resources.                                           *//* -------------------------------------------------------------------- */    SE_queryinfo_free( hQueryInfo );/* -------------------------------------------------------------------- *//*      Setup spatial filter on stream if one is installed.             *//* -------------------------------------------------------------------- */    if( m_poFilterGeom != NULL )    {        SE_FILTER sConstraint;        SE_ENVELOPE sEnvelope;        SE_SHAPE hRectShape;        SHORT nSearchOrder = SE_SPATIAL_FIRST;        if( osAttributeFilter.size() > 0 )        {            const char *pszOrder = CPLGetConfigOption( "OGR_SDE_SEARCHORDER",                                                        "ATTRIBUTE_FIRST" );            if( EQUAL(pszOrder, "ATTRIBUTE_FIRST") )                nSearchOrder = SE_ATTRIBUTE_FIRST;            else             {                if( !EQUAL(pszOrder, "SPATIAL_FIRST") )                    CPLError( CE_Warning, CPLE_AppDefined,                               "Unrecognised OGR_SDE_SEARCHORDER value of %s.",                              pszOrder );                nSearchOrder = SE_SPATIAL_FIRST;            }        }        NeedLayerInfo(); // need hCoordRef        SE_shape_create( hCoordRef, &hRectShape );        sEnvelope.minx = m_sFilterEnvelope.MinX;        sEnvelope.miny = m_sFilterEnvelope.MinY;        sEnvelope.maxx = m_sFilterEnvelope.MaxX;        sEnvelope.maxy = m_sFilterEnvelope.MaxY;        SE_shape_generate_rectangle( &sEnvelope, hRectShape );        sConstraint.filter.shape = hRectShape;        strcpy( sConstraint.table, poFeatureDefn->GetName() );        strcpy( sConstraint.column, osShapeColumnName.c_str() );        sConstraint.method = SM_ENVP;        sConstraint.filter_type = SE_SHAPE_FILTER;        sConstraint.truth = TRUE;        nSDEErr = SE_stream_set_spatial_constraints( hStream, SE_SPATIAL_FIRST,                                                     FALSE, 1, &sConstraint );        if( nSDEErr != SE_SUCCESS)         {            poDS->IssueSDEError( nSDEErr, "SE_stream_set_spatial_constraints");            return FALSE;        }            SE_shape_free( hRectShape );    }/* -------------------------------------------------------------------- *//*      Execute the query.                                              *//* -------------------------------------------------------------------- */    nSDEErr = SE_stream_execute( hStream );    if( nSDEErr != SE_SUCCESS ) {        poDS->IssueSDEError( nSDEErr, "SE_stream_execute" );        return FALSE;    }        bQueryInstalled = TRUE;    return TRUE;}/************************************************************************//*                         SetAttributeFilter()                         *//************************************************************************/OGRErr OGRSDELayer::SetAttributeFilter( const char *pszQuery ){    if( pszQuery == NULL )        osAttributeFilter = "";    else        osAttributeFilter = pszQuery;    ResetReading();    return OGRERR_NONE;}/************************************************************************//*                        TranslateSDEGeometry()                        *//************************************************************************/OGRGeometry *OGRSDELayer::TranslateSDEGeometry( SE_SHAPE hShape ){    LONG nSDEGeomType;    OGRGeometry *poGeom = NULL;/* -------------------------------------------------------------------- *//*      Fetch geometry type.                                            *//* -------------------------------------------------------------------- */    SE_shape_get_type( hShape, &nSDEGeomType );    if( nSDEGeomType == SG_NIL_SHAPE )        return NULL;    /* -------------------------------------------------------------------- *//*      Fetch points and parts.                                         *//* -------------------------------------------------------------------- */    LONG nPointCount, nPartCount, nSubPartCount, nSDEErr;    SE_POINT *pasPoints;

⌨️ 快捷键说明

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