diff --git a/src/ol/format/WFS.js b/src/ol/format/WFS.js
index e433aba72a..f0983b1f04 100644
--- a/src/ol/format/WFS.js
+++ b/src/ol/format/WFS.js
@@ -1104,11 +1104,8 @@ function writeDuringFilter(node, filter, objectStack) {
const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]);
const context = parent['context'];
const version = context['version'];
- const ns = FESNS[version];
- const valueReference = createElementNS(ns, 'ValueReference');
- writeStringTextNode(valueReference, filter.propertyName);
- node.appendChild(valueReference);
+ writePropertyName(version, node, filter.propertyName);
const timePeriod = createElementNS(GMLNS, 'TimePeriod');
node.appendChild(timePeriod);
@@ -1176,12 +1173,11 @@ function writeComparisonFilter(node, filter, objectStack) {
const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]);
const context = parent['context'];
const version = context['version'];
- const ns = OGCNS[context['version']];
if (filter.matchCase !== undefined) {
node.setAttribute('matchCase', filter.matchCase.toString());
}
writePropertyName(version, node, filter.propertyName);
- writeOgcLiteral(ns, node, '' + filter.expression);
+ writeLiteral(version, node, '' + filter.expression);
}
/**
@@ -1205,17 +1201,17 @@ function writeIsBetweenFilter(node, filter, objectStack) {
const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]);
const context = parent['context'];
const version = context['version'];
- const ns = OGCNS[context['version']];
+ const ns = getFilterNS(version);
writePropertyName(version, node, filter.propertyName);
const lowerBoundary = createElementNS(ns, 'LowerBoundary');
node.appendChild(lowerBoundary);
- writeOgcLiteral(ns, lowerBoundary, '' + filter.lowerBoundary);
+ writeLiteral(version, lowerBoundary, '' + filter.lowerBoundary);
const upperBoundary = createElementNS(ns, 'UpperBoundary');
node.appendChild(upperBoundary);
- writeOgcLiteral(ns, upperBoundary, '' + filter.upperBoundary);
+ writeLiteral(version, upperBoundary, '' + filter.upperBoundary);
}
/**
@@ -1227,7 +1223,6 @@ function writeIsLikeFilter(node, filter, objectStack) {
const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]);
const context = parent['context'];
const version = context['version'];
- const ns = OGCNS[version];
node.setAttribute('wildCard', filter.wildCard);
node.setAttribute('singleChar', filter.singleChar);
node.setAttribute('escapeChar', filter.escapeChar);
@@ -1235,7 +1230,7 @@ function writeIsLikeFilter(node, filter, objectStack) {
node.setAttribute('matchCase', filter.matchCase.toString());
}
writePropertyName(version, node, filter.propertyName);
- writeOgcLiteral(ns, node, '' + filter.pattern);
+ writeLiteral(version, node, '' + filter.pattern);
}
/**
@@ -1244,12 +1239,21 @@ function writeIsLikeFilter(node, filter, objectStack) {
* @param {Node} node Node.
* @param {string} value Value.
*/
-function writeOgcExpression(ns, tagName, node, value) {
+function writeExpression(ns, tagName, node, value) {
const property = createElementNS(ns, tagName);
writeStringTextNode(property, value);
node.appendChild(property);
}
+/**
+ * @param {string} version Version.
+ * @param {Node} node Node.
+ * @param {string} value PropertyName value.
+ */
+function writeLiteral(version, node, value) {
+ writeExpression(getFilterNS(version), 'Literal', node, value);
+}
+
/**
* @param {string} version Version.
* @param {Node} node Node.
@@ -1257,30 +1261,12 @@ function writeOgcExpression(ns, tagName, node, value) {
*/
function writePropertyName(version, node, value) {
if (version === '2.0.0') {
- writeFesValueReference(FESNS[version], node, value);
+ writeExpression(FESNS[version], 'ValueReference', node, value);
} else {
- writeOgcExpression(OGCNS[version], 'PropertyName', node, value);
+ writeExpression(OGCNS[version], 'PropertyName', node, value);
}
}
-/**
- * @param {string} ns Namespace.
- * @param {Node} node Node.
- * @param {string} value PropertyName value.
- */
-function writeFesValueReference(ns, node, value) {
- writeOgcExpression(ns, 'ValueReference', node, value);
-}
-
-/**
- * @param {string} ns Namespace.
- * @param {Node} node Node.
- * @param {string} value PropertyName value.
- */
-function writeOgcLiteral(ns, node, value) {
- writeOgcExpression(ns, 'Literal', node, value);
-}
-
/**
* @param {Node} node Node.
* @param {string} time PropertyName value.
diff --git a/test/spec/ol/format/wfs.test.js b/test/spec/ol/format/wfs.test.js
index 4881d588c1..fc30e14e5d 100644
--- a/test/spec/ol/format/wfs.test.js
+++ b/test/spec/ol/format/wfs.test.js
@@ -687,7 +687,7 @@ describe('ol.format.WFS', function () {
expect(serialized.firstElementChild).to.xmleql(parse(text));
});
- it('creates a dwithin filter for WFS 1.x', function () {
+ it('creates a dwithin filter', function () {
const text =
'' +
- ' ' +
- ' ' +
- ' the_geom' +
- ' ' +
- ' ' +
- ' ' +
- ' ' +
- ' 10 20 10 25 15 25 15 20 10 20' +
- ' ' +
- ' ' +
- ' ' +
- ' ' +
- ' 10' +
- ' ' +
- ' ' +
- '';
- const serialized = new WFS({version: '2.0.0'}).writeGetFeature({
- srsName: 'EPSG:4326',
- featureTypes: ['area'],
- filter: dwithinFilter(
- 'the_geom',
- new Polygon([
- [
- [10, 20],
- [10, 25],
- [15, 25],
- [15, 20],
- [10, 20],
- ],
- ]),
- 10,
- 'm'
- ),
- });
- expect(serialized.firstElementChild).to.xmleql(parse(text));
- });
-
it('creates During property filter', function () {
const text =
'' +
' ' +
' ' +
- ' date_prop' +
+ ' date_prop' +
' ' +
' ' +
' ' +
@@ -1680,5 +1638,176 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
expect(serialized).to.xmleql(parse(text));
});
});
+
+ it('creates a dwithin filter', function () {
+ const text =
+ '' +
+ ' ' +
+ ' ' +
+ ' the_geom' +
+ ' ' +
+ ' ' +
+ ' ' +
+ ' ' +
+ ' 10 20 10 25 15 25 15 20 10 20' +
+ ' ' +
+ ' ' +
+ ' ' +
+ ' ' +
+ ' 10' +
+ ' ' +
+ ' ' +
+ '';
+ const serialized = new WFS({version: '2.0.0'}).writeGetFeature({
+ srsName: 'EPSG:4326',
+ featureTypes: ['area'],
+ filter: dwithinFilter(
+ 'the_geom',
+ new Polygon([
+ [
+ [10, 20],
+ [10, 25],
+ [15, 25],
+ [15, 20],
+ [10, 20],
+ ],
+ ]),
+ 10,
+ 'm'
+ ),
+ });
+ expect(serialized.firstElementChild).to.xmleql(parse(text));
+ });
+
+ it('creates isLike property filter', function () {
+ const text =
+ '' +
+ ' ' +
+ ' ' +
+ ' name' +
+ ' New*' +
+ ' ' +
+ ' ' +
+ '';
+ const serialized = new WFS({version: '2.0.0'}).writeGetFeature({
+ srsName: 'urn:ogc:def:crs:EPSG::4326',
+ featureNS: 'http://www.openplans.org/topp',
+ featurePrefix: 'topp',
+ featureTypes: ['states'],
+ filter: likeFilter('name', 'New*'),
+ });
+ expect(serialized.firstElementChild).to.xmleql(parse(text));
+ });
+
+ it('creates isBetween property filter', function () {
+ const text =
+ '' +
+ ' ' +
+ ' ' +
+ ' area' +
+ ' 100' +
+ ' 1000' +
+ ' ' +
+ ' ' +
+ '';
+ const serialized = new WFS({version: '2.0.0'}).writeGetFeature({
+ srsName: 'urn:ogc:def:crs:EPSG::4326',
+ featureNS: 'http://www.openplans.org/topp',
+ featurePrefix: 'topp',
+ featureTypes: ['states'],
+ filter: betweenFilter('area', 100, 1000),
+ });
+ expect(serialized.firstElementChild).to.xmleql(parse(text));
+ });
+
+ it('creates greater/less than property filters', function () {
+ const text =
+ '' +
+ ' ' +
+ ' ' +
+ ' ' +
+ ' ' +
+ ' area' +
+ ' 100' +
+ ' ' +
+ ' ' +
+ ' pop' +
+ ' 20000' +
+ ' ' +
+ ' ' +
+ ' ' +
+ ' ' +
+ ' area' +
+ ' 100' +
+ ' ' +
+ ' ' +
+ ' pop' +
+ ' 20000' +
+ ' ' +
+ ' ' +
+ ' ' +
+ ' ' +
+ '';
+ const serialized = new WFS({version: '2.0.0'}).writeGetFeature({
+ srsName: 'urn:ogc:def:crs:EPSG::4326',
+ featureNS: 'http://www.openplans.org/topp',
+ featurePrefix: 'topp',
+ featureTypes: ['states'],
+ filter: orFilter(
+ andFilter(
+ greaterThanFilter('area', 100),
+ greaterThanOrEqualToFilter('pop', 20000)
+ ),
+ andFilter(
+ lessThanFilter('area', 100),
+ lessThanOrEqualToFilter('pop', 20000)
+ )
+ ),
+ });
+ expect(serialized.firstElementChild).to.xmleql(parse(text));
+ });
+
+ it('creates During property filter', function () {
+ const text =
+ '' +
+ ' ' +
+ ' ' +
+ ' date_prop' +
+ ' ' +
+ ' ' +
+ ' ' +
+ ' 2010-01-20T00:00:00Z' +
+ ' ' +
+ ' ' +
+ ' ' +
+ ' ' +
+ ' 2012-12-31T00:00:00Z' +
+ ' ' +
+ ' ' +
+ ' ' +
+ ' ' +
+ ' ' +
+ '';
+
+ const serialized = new WFS({version: '2.0.0'}).writeGetFeature({
+ srsName: 'EPSG:4326',
+ featureTypes: ['states'],
+ filter: duringFilter(
+ 'date_prop',
+ '2010-01-20T00:00:00Z',
+ '2012-12-31T00:00:00Z'
+ ),
+ });
+ expect(serialized.firstElementChild).to.xmleql(parse(text));
+ });
});
});