⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ogrogdilayer.cpp

📁 GIS系统支持库Geospatial Data Abstraction Library代码.GDAL is a translator library for raster geospatial dat
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    }/* -------------------------------------------------------------------- *//*      Set attributes                                                  *//* -------------------------------------------------------------------- */    char *pszAttrList = ECSOBJECTATTR(psResult);    for( int iField = 0; iField < m_poFeatureDefn->GetFieldCount(); iField++ )    {        char        *pszFieldStart;        int         nNameLen;        char        chSavedChar;        /* parse out the next attribute value */        if( !ecs_FindElement( pszAttrList, &pszFieldStart, &pszAttrList,                              &nNameLen, NULL ) )        {            nNameLen = 0;            pszFieldStart = pszAttrList;        }        /* Skip any trailing white space (for string constants). */        if( nNameLen > 0 && pszFieldStart[nNameLen-1] == ' ' )            nNameLen--;        /* skip leading white space */        while( pszFieldStart[0] == ' ' && nNameLen > 0 )        {            pszFieldStart++;            nNameLen--;        }        /* zero terminate the single field value, but save the          */        /* character we overwrote, so we can restore it when done.      */        chSavedChar = pszFieldStart[nNameLen];        pszFieldStart[nNameLen] = '\0';        /* OGR takes care of all field type conversions for us! */        poFeature->SetField(iField, pszFieldStart);        pszFieldStart[nNameLen] = chSavedChar;    }/* -------------------------------------------------------------------- *//*      Apply the text associated with text features if appropriate.    *//* -------------------------------------------------------------------- */    if( m_eFamily == Text )    {        poFeature->SetField( "text", ECSGEOM(psResult).text.desc );    }/* -------------------------------------------------------------------- *//*      Do we need to apply an attribute test?                          *//* -------------------------------------------------------------------- */    if( (m_poAttrQuery != NULL         && !m_poAttrQuery->Evaluate( poFeature ) )         || (m_poFilterGeom != NULL             && !FilterGeometry( poFeature->GetGeometryRef() ) ) )    {        delete poFeature;        goto TryAgain;    }    return poFeature;}/************************************************************************//*                             GetFeature()                             *//************************************************************************/OGRFeature *OGROGDILayer::GetFeature( long nFeatureId ){    ecs_Result  *psResult;    if (m_nTotalShapeCount != -1 && nFeatureId > m_nTotalShapeCount)        return NULL;    if (m_iNextShapeId > nFeatureId )        ResetReading();    while(m_iNextShapeId != nFeatureId)    {        psResult = cln_GetNextObject(m_nClientID);        if (ECSSUCCESS(psResult))            m_iNextShapeId++;        else        {            // We probably reached EOF... keep track of shape count.            m_nTotalShapeCount = m_iNextShapeId;            return NULL;        }    }    // OK, we're ready to read the requested feature...    return GetNextFeature();}/************************************************************************//*                          GetFeatureCount()                           *//*                                                                      *//*      If a spatial filter is in effect, we turn control over to       *//*      the generic counter.  Otherwise we return the total count.      *//*      Eventually we should consider implementing a more efficient     *//*      way of counting features matching a spatial query.              *//************************************************************************/int OGROGDILayer::GetFeatureCount( int bForce ){    if( m_nTotalShapeCount == -1)    {        m_nTotalShapeCount = OGRLayer::GetFeatureCount( bForce );    }    return m_nTotalShapeCount;}/************************************************************************//*                           TestCapability()                           *//************************************************************************/int OGROGDILayer::TestCapability( const char * pszCap ){/* -------------------------------------------------------------------- *//*      Hummm... what are the proper capabilities...                    *//*      Does OGDI have any idea of capabilities???                      *//*      For now just return FALSE for everything.                       *//* -------------------------------------------------------------------- */#ifdef __TODO__    if( EQUAL(pszCap,OLCRandomRead) )        return TRUE;    else if( EQUAL(pszCap,OLCFastFeatureCount) )        return m_poFilterGeom == NULL;    else if( EQUAL(pszCap,OLCFastSpatialFilter) )        return FALSE;    else         return FALSE;#endif    return FALSE;}/************************************************************************//*                          BuildFeatureDefn()                          *//*                                                                      *//*      (private) Initializes the schema in m_poFeatureDefn             *//************************************************************************/void OGROGDILayer::BuildFeatureDefn(){    ecs_Result  *psResult;    ecs_ObjAttributeFormat *oaf;    int         i, numFields;    const char  *pszGeomName;    OGRwkbGeometryType eLayerGeomType;/* -------------------------------------------------------------------- *//*      Feature Defn name will be "<OGDILyrName>_<FeatureFamily>"       *//* -------------------------------------------------------------------- */        switch(m_eFamily)    {      case Point:        pszGeomName = "point";        eLayerGeomType = wkbPoint;        break;      case Line:        pszGeomName = "line";        eLayerGeomType = wkbLineString;        break;      case Area:        pszGeomName = "area";        eLayerGeomType = wkbPolygon;        break;      case Text:        pszGeomName = "text";        eLayerGeomType = wkbPoint;        break;      default:        pszGeomName = "unknown";        eLayerGeomType = wkbUnknown;        break;    }    m_poFeatureDefn = new OGRFeatureDefn(CPLSPrintf("%s_%s",                                                     m_pszOGDILayerName,                                                     pszGeomName ));    m_poFeatureDefn->SetGeomType(eLayerGeomType);/* -------------------------------------------------------------------- *//*      Fetch schema from OGDI server and map to OGR types              *//* -------------------------------------------------------------------- */    psResult = cln_GetAttributesFormat( m_nClientID );    if( ECSERROR( psResult ) )    {        CPLError(CE_Failure, CPLE_AppDefined,                 "ECSERROR: %s\n", psResult->message);        return;    }    oaf = &(ECSRESULT(psResult).oaf);    numFields = oaf->oa.oa_len;    for( i = 0; i < numFields; i++ )    {        OGRFieldDefn    oField("", OFTInteger);        oField.SetName( oaf->oa.oa_val[i].name );        oField.SetPrecision( 0 );        switch( oaf->oa.oa_val[i].type )        {          case Decimal:          case Smallint:          case Integer:            oField.SetType( OFTInteger );            if( oaf->oa.oa_val[i].lenght > 0 )                oField.SetWidth( oaf->oa.oa_val[i].lenght );            else                oField.SetWidth( 11 );            break;          case Numeric:          case Real:          case Float:          case Double:            oField.SetType( OFTReal );            if( oaf->oa.oa_val[i].lenght > 0 )            {                oField.SetWidth( oaf->oa.oa_val[i].lenght );                oField.SetPrecision( oaf->oa.oa_val[i].precision );            }            else            {                oField.SetWidth( 18 );                oField.SetPrecision( 7 );            }            break;          case Char:          case Varchar:          case Longvarchar:          default:            oField.SetType( OFTString );            if( oaf->oa.oa_val[i].lenght > 0 )                oField.SetWidth( oaf->oa.oa_val[i].lenght );            else                oField.SetWidth( 64 );            break;        }        m_poFeatureDefn->AddFieldDefn( &oField );    }/* -------------------------------------------------------------------- *//*      Add a text attribute for text objects.                          *//* -------------------------------------------------------------------- */    if( m_eFamily == Text )    {        OGRFieldDefn    oField("text", OFTString);        m_poFeatureDefn->AddFieldDefn( &oField );    }    }

⌨️ 快捷键说明

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