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

📄 ogrfeaturequery.cpp

📁 用于读取TAB、MIF、SHP文件的类
💻 CPP
📖 第 1 页 / 共 2 页
字号:
          case SWQ_LE:            return psField->Real <= op->float_value;          case SWQ_GE:            return psField->Real >= op->float_value;          case SWQ_ISNULL:            return !poFeature->IsFieldSet( op->field_index );          case SWQ_IN:          {              const char *pszSrc;                            pszSrc = op->string_value;              while( *pszSrc != '\0' )              {                  if( atof(pszSrc) == psField->Real )                      return TRUE;                  pszSrc += strlen(pszSrc) + 1;              }              return FALSE;          }          default:            CPLDebug( "OGRFeatureQuery",                       "Illegal operation (%d) on float field.",                      op->operation );            return FALSE;        }      case SWQ_STRING:        switch( op->operation )        {          case SWQ_EQ:            if (psField->Set.nMarker1 == OGRUnsetMarker                && psField->Set.nMarker2 == OGRUnsetMarker )            {                return (op->string_value[0] == '\0');            }            else            {                return EQUAL(psField->String,op->string_value);            }          case SWQ_NE:            if (psField->Set.nMarker1 == OGRUnsetMarker                && psField->Set.nMarker2 == OGRUnsetMarker )            {                return (op->string_value[0] != '\0');            }            else            {                return !EQUAL(psField->String,op->string_value);            }          case SWQ_ISNULL:            return !poFeature->IsFieldSet( op->field_index );          case SWQ_LIKE:            if (psField->Set.nMarker1 != OGRUnsetMarker                || psField->Set.nMarker2 != OGRUnsetMarker )                return swq_test_like(psField->String, op->string_value);            else                return FALSE;          case SWQ_IN:          {              const char *pszSrc;              if( !poFeature->IsFieldSet(op->field_index) )                  return FALSE;                            pszSrc = op->string_value;              while( *pszSrc != '\0' )              {                  if( EQUAL(pszSrc,psField->String) )                      return TRUE;                  pszSrc += strlen(pszSrc) + 1;              }              return FALSE;          }          default:            CPLDebug( "OGRFeatureQuery",                       "Illegal operation (%d) on string field.",                      op->operation );            return FALSE;        }      case SWQ_OTHER:        switch( op->operation )        {          case SWQ_ISNULL:            return !poFeature->IsFieldSet( op->field_index );          default:            CPLDebug( "OGRFeatureQuery",                       "Illegal operation (%d) on list or binary field.",                      op->operation );            return FALSE;        }      default:        assert( FALSE );        return FALSE;    }}/************************************************************************//*                              Evaluate()                              *//************************************************************************/int OGRFeatureQuery::Evaluate( OGRFeature *poFeature ){    if( pSWQExpr == NULL )        return FALSE;    return swq_expr_evaluate( (swq_expr *) pSWQExpr,                               (swq_op_evaluator) OGRFeatureQueryEvaluator,                               (void *) poFeature );}/************************************************************************//*                       EvaluateAgainstIndices()                       *//*                                                                      *//*      Attempt to return a list of FIDs matching the given             *//*      attribute query conditions utilizing attribute indices.         *//*      Returns NULL if the result cannot be computed from the          *//*      available indices, or an "OGRNullFID" terminated list of        *//*      FIDs if it can.                                                 *//*                                                                      *//*      For now we only support equality tests on a single indexed      *//*      attribute field.  Eventually we should make this support        *//*      multi-part queries with ranges.                                 *//************************************************************************/long *OGRFeatureQuery::EvaluateAgainstIndices( OGRLayer *poLayer,                                                OGRErr *peErr ){    swq_expr *psExpr = (swq_expr *) pSWQExpr;    OGRAttrIndex *poIndex;    if( peErr != NULL )        *peErr = OGRERR_NONE;/* -------------------------------------------------------------------- *//*      Does the expression meet our requirements?  Do we have an       *//*      index on the targetted field?                                   *//* -------------------------------------------------------------------- */    if( psExpr == NULL || psExpr->operation != SWQ_EQ         || poLayer->GetIndex() == NULL )        return NULL;    poIndex = poLayer->GetIndex()->GetFieldIndex( psExpr->field_index );    if( poIndex == NULL )        return NULL;/* -------------------------------------------------------------------- *//*      OK, we have an index, now we need to query it.                  *//* -------------------------------------------------------------------- */    OGRField sValue;    OGRFieldDefn *poFieldDefn;    poFieldDefn = poLayer->GetLayerDefn()->GetFieldDefn(psExpr->field_index);    switch( poFieldDefn->GetType() )    {      case OFTInteger:        sValue.Integer = psExpr->int_value;        break;      case OFTReal:        sValue.Real = psExpr->float_value;        break;      case OFTString:        sValue.String = psExpr->string_value;        break;      default:        CPLAssert( FALSE );        return NULL;    }    return poIndex->GetAllMatches( &sValue );}/************************************************************************//*                         OGRFieldCollector()                          *//*                                                                      *//*      Helper function for recursing through tree to satisfy           *//*      GetUsedFields().                                                *//************************************************************************/char **OGRFeatureQuery::FieldCollector( void *pBareOp,                                         char **papszList ){    swq_field_op *op = (swq_field_op *) pBareOp;/* -------------------------------------------------------------------- *//*      References to tables other than the primarily are currently     *//*      unsupported. Error out.                                         *//* -------------------------------------------------------------------- */    if( op->table_index != 0 )    {        CSLDestroy( papszList );        return NULL;    }/* -------------------------------------------------------------------- *//*      Add the field name into our list if it is not already there.    *//* -------------------------------------------------------------------- */    const char *pszFieldName;    if( op->field_index >= poTargetDefn->GetFieldCount()        && op->field_index < poTargetDefn->GetFieldCount() + SPECIAL_FIELD_COUNT)         pszFieldName = SpecialFieldNames[op->field_index];    else if( op->field_index >= 0              && op->field_index < poTargetDefn->GetFieldCount() )        pszFieldName =             poTargetDefn->GetFieldDefn(op->field_index)->GetNameRef();    else    {        CSLDestroy( papszList );        return NULL;    }    if( CSLFindString( papszList, pszFieldName ) == -1 )        papszList = CSLAddString( papszList, pszFieldName );/* -------------------------------------------------------------------- *//*      Add in fields from subexpressions.                              *//* -------------------------------------------------------------------- */    if( op->first_sub_expr != NULL )        papszList = FieldCollector( op->first_sub_expr, papszList );    if( op->second_sub_expr != NULL )        papszList = FieldCollector( op->second_sub_expr, papszList );    return papszList;}/************************************************************************//*                           GetUsedFields()                            *//************************************************************************//** * Returns lists of fields in expression. * * All attribute fields are used in the expression of this feature * query are returned as a StringList of field names.  This function would * primarily be used within drivers to recognise special case conditions * depending only on attribute fields that can be very efficiently  * fetched.  * * NOTE: If any fields in the expression are from tables other than the * primary table then NULL is returned indicating an error.  In succesful * use, no non-empty expression should return an empty list. * * @return list of field names.  Free list with CSLDestroy() when no longer * required. */char **OGRFeatureQuery::GetUsedFields( ){    if( pSWQExpr == NULL )        return NULL;        return FieldCollector( pSWQExpr, NULL );}

⌨️ 快捷键说明

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