Программно определить openLayers 4 ol.format.filter.and - PullRequest
0 голосов
/ 26 апреля 2018

Я новичок в openLayers и надеюсь, что кто-нибудь мне поможет. В настоящее время я использую OpenLayers v4.6.4.

Я успешно использую ol.format.WFS для создания желаемого слоя.

var featureRequest = new ol.format.WFS().writeGetFeature({
    srsName: 'EPSG:4326',
    featureNS: 'http://myserver',
    featurePrefix: 'locations',
    featureTypes: ['photos'],
    outputFormat: 'application/json',
    filter: ol.format.filter.and(
                ol.format.filter.during('DATE', '2015-11-27T05:00:00Z', 
                                        '2015-12-31T05:00:00Z'),
               ol.format.filter.exactTo('Category', 'Church')
           )

В этот момент фильтр жестко закодирован. Что мне нужно сделать, так это создать объект ol.format.filter.and, используя значения в моих выпадающих списках. Я успешно создал функцию, которая выводит строку, которая точно соответствует вышеуказанному фильтру. Когда я физически копирую строковый вывод (filterString) из своей функции и вставляю его в вышеуказанный FeatureRequest, я получаю желаемые результаты. Если я ссылаюсь на filterString, я получаю сообщение об ошибке, когда OL пытается создать фильтр.

Есть что-то очевидное, чего мне не хватает?

Ответы [ 3 ]

0 голосов
/ 09 мая 2018

Это потому, что filter требует объект, а не строку. Вам нужно создать объект фильтра, что-то вроде этого:

var value1 = '<source of value>';
var value2 = '<source of value>';
var value3 = '<source of value>';

var f = ol.format.filter;
var filters = f.and(
  ol.format.filter.during('DATE', value1,
    value2),
  ol.format.filter.exactTo('Category', value3)
)

var featureRequest = new ol.format.WFS().writeGetFeature({
      srsName: 'EPSG:4326',
      featureNS: 'http://myserver',
      featurePrefix: 'locations',
      featureTypes: ['photos'],
      outputFormat: 'application/json',
      filter: filters
})
0 голосов
/ 02 февраля 2019

Если вы хотите динамически изменять содержимое фильтров (добавлять или удалять), вы можете определить массив фильтров и затем передать его функции, используя Function.prototype.apply ()

var filterArray = [
  ol.format.filter.during('DATE', '2015-11-27T05:00:00Z', '2015-12-31T05:00:00Z'),
  ol.format.filter.exactTo('Category', 'Church')
];

var featureRequest = new ol.format.WFS().writeGetFeature({
  srsName: 'EPSG:4326',
  featureNS: 'http://myserver',
  featurePrefix: 'locations',
  featureTypes: ['photos'],
  outputFormat: 'application/json',
  filter: ol.format.filter.and.apply(null, filterArray)
});
0 голосов
/ 27 апреля 2018

Это не имеет прямого отношения к OpenLayers, это больше о ваших знаниях JavaScript

Вы можете создать функцию для предоставления объекта new ol.format.WFS().writeGetFeature(

Так твой код

var featureRequest = new ol.format.WFS().writeGetFeature({
    srsName: 'EPSG:4326',
    featureNS: 'http://myserver',
    featurePrefix: 'locations',
    featureTypes: ['photos'],
    outputFormat: 'application/json',
    filter: ol.format.filter.and(
        ol.format.filter.during('DATE', '2015-11-27T05:00:00Z',
                                '2015-12-31T05:00:00Z'),
        ol.format.filter.exactTo('Category', 'Church')
    )
});

превратится в

var getFeatureParams = function(filter) {
    return {
        srsName: 'EPSG:4326',
        featureNS: 'http://myserver',
        featurePrefix: 'locations',
        featureTypes: ['photos'],
        outputFormat: 'application/json',
        filter: filter
    }
}

var yourDynamicFilter = ol.format.filter.and(
    ol.format.filter.during('DATE', '2015-11-27T05:00:00Z',
                            '2015-12-31T05:00:00Z'),
   ol.format.filter.exactTo('Category', 'Church')
);

var featureRequest = new ol.format.WFS().writeGetFeature(getFeatureParams(yourDynamicFilter));

PS: код, написанный в стиле ES5, возможно, вы захотите обновить его до синтаксиса ES6.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...