Example #1
0
  /**
   * Create and return an OpenLayers filter object using the available
   * dimensions filters configuration within the data source.
   * @param {import("ngeo/datasource/OGC.js").default} dataSource Data source from which to create the
   *     filter.
   * @return {?import("ol/format/filter/Filter.js").default} Filter
   * @private
   */
  createDimensionsFilterFromDataSource_(dataSource) {
    const config = dataSource.dimensionsFiltersConfig || {};
    const dimensions = dataSource.dimensions;
    if (!dimensions) {
      throw new Error('Missing dimensions');
    }

    const conditions = [];
    for (const key in config) {
      let value = config[key].value;
      if (value === null) {
        const dimensionValue = dimensions[key];
        if (dimensionValue !== undefined && dimensionValue !== null) {
          value = dimensionValue;
        }
      }
      if (value !== null) {
        conditions.push(olFormatFilter.equalTo(config[key].field, value, true));
      }
    }
    if (conditions.length === 1) {
      return conditions[0];
    } else if (conditions.length >= 2) {
      return olFormatFilter.and.apply(null, conditions);
    }
    return null;
  }
Example #2
0
  /**
   * Create a `ol.format.filter.Filter` object for a given data source.
   * See the `CreateFilterOptions` to learn more.
   *
   * @param {CreateFilterOptions} options Options.
   * @return {?import("ol/format/filter/Filter.js").default} Filter.
   */
  createFilter(options) {

    const dataSource = options.dataSource;
    let mainFilter = null;

    if (options.filter) {
      mainFilter = options.filter;
    } else {
      const rules = options.filterRules || dataSource.filterRules;
      const conditions = [];

      if (rules && rules.length) {
        for (const rule of rules) {
          const filter = this.createFilterFromRule_(
            rule,
            dataSource,
            options.srsName
          );
          if (filter) {
            conditions.push(filter);
          }
        }
      }

      const condition = dataSource.filterCondition;
      if (conditions.length === 1) {
        mainFilter = conditions[0];
      } else if (conditions.length >= 2) {
        if (condition === ngeoFilterCondition.AND) {
          mainFilter = olFormatFilter.and.apply(null, conditions);
        } else if (condition === ngeoFilterCondition.OR ||
                   condition === ngeoFilterCondition.NOT
        ) {
          mainFilter = olFormatFilter.or.apply(null, conditions);
        }
      }
      if (mainFilter && condition === ngeoFilterCondition.NOT) {
        mainFilter = olFormatFilter.not(mainFilter);
      }
    }

    if (options.incTime) {
      const timeFilter = this.createTimeFilterFromDataSource_(dataSource);
      if (timeFilter) {
        if (mainFilter) {
          mainFilter = olFormatFilter.and.apply(
            null,
            [
              mainFilter,
              timeFilter
            ]
          );
        } else {
          mainFilter = timeFilter;
        }
      }
    }

    if (options.incDimensions) {
      const dimensionsFilter = this.createDimensionsFilterFromDataSource_(dataSource);
      if (dimensionsFilter) {
        if (mainFilter) {
          mainFilter = olFormatFilter.and.apply(null, [mainFilter, dimensionsFilter]);
        } else {
          mainFilter = dimensionsFilter;
        }
      }
    }

    return mainFilter;
  }