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

📄 ogrfeaturequery.cpp

📁 mitab,读取MapInfo的地图文件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
            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_LT:
            if (psField->Set.nMarker1 == OGRUnsetMarker
                && psField->Set.nMarker2 == OGRUnsetMarker )
            {
                return (op->string_value[0] != '\0');
            }
            else
            {
                return strcmp(psField->String,op->string_value) < 0;
            }
          case SWQ_GT:
            if (psField->Set.nMarker1 == OGRUnsetMarker
                && psField->Set.nMarker2 == OGRUnsetMarker )
            {
                return (op->string_value[0] != '\0');
            }
            else
            {
                return strcmp(psField->String,op->string_value) > 0;
            }
          case SWQ_LE:
            if (psField->Set.nMarker1 == OGRUnsetMarker
                && psField->Set.nMarker2 == OGRUnsetMarker )
            {
                return (op->string_value[0] != '\0');
            }
            else
            {
                return strcmp(psField->String,op->string_value) <= 0;
            }
          case SWQ_GE:
            if (psField->Set.nMarker1 == OGRUnsetMarker
                && psField->Set.nMarker2 == OGRUnsetMarker )
            {
                return (op->string_value[0] != '\0');
            }
            else
            {
                return strcmp(psField->String,op->string_value) >= 0;
            }

          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 + -