Initial GetFeature verification
This commit is contained in:
+41
-7
@@ -205,16 +205,20 @@ const WFSNS = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @type {string}
|
* @type {Object<string, string>}
|
||||||
*/
|
*/
|
||||||
const FESNS = 'http://www.opengis.net/fes';
|
const FESNS = {
|
||||||
|
'2.0.0': 'http://www.opengis.net/fes/2.0',
|
||||||
|
'1.1.0': 'http://www.opengis.net/fes',
|
||||||
|
'1.0.0': 'http://www.opengis.net/fes',
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @type {Object<string, string>}
|
* @type {Object<string, string>}
|
||||||
*/
|
*/
|
||||||
const SCHEMA_LOCATIONS = {
|
const SCHEMA_LOCATIONS = {
|
||||||
'2.0.0':
|
'2.0.0':
|
||||||
'http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0.0/wfs.xsd',
|
'http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0/wfs.xsd',
|
||||||
'1.1.0':
|
'1.1.0':
|
||||||
'http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd',
|
'http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd',
|
||||||
'1.0.0':
|
'1.0.0':
|
||||||
@@ -904,7 +908,7 @@ const GETFEATURE_SERIALIZERS = {
|
|||||||
'PropertyIsBetween': makeChildAppender(writeIsBetweenFilter),
|
'PropertyIsBetween': makeChildAppender(writeIsBetweenFilter),
|
||||||
'PropertyIsLike': makeChildAppender(writeIsLikeFilter),
|
'PropertyIsLike': makeChildAppender(writeIsLikeFilter),
|
||||||
},
|
},
|
||||||
'http://www.opengis.net/ogc/1.1': {
|
'http://www.opengis.net/fes/2.0': {
|
||||||
'During': makeChildAppender(writeDuringFilter),
|
'During': makeChildAppender(writeDuringFilter),
|
||||||
'And': makeChildAppender(writeLogicalFilter),
|
'And': makeChildAppender(writeLogicalFilter),
|
||||||
'Or': makeChildAppender(writeLogicalFilter),
|
'Or': makeChildAppender(writeLogicalFilter),
|
||||||
@@ -912,6 +916,7 @@ const GETFEATURE_SERIALIZERS = {
|
|||||||
'BBOX': makeChildAppender(writeBboxFilter),
|
'BBOX': makeChildAppender(writeBboxFilter),
|
||||||
'Contains': makeChildAppender(writeContainsFilter),
|
'Contains': makeChildAppender(writeContainsFilter),
|
||||||
'Intersects': makeChildAppender(writeIntersectsFilter),
|
'Intersects': makeChildAppender(writeIntersectsFilter),
|
||||||
|
'ResourceId': makeChildAppender(writeResourceIdFilter),
|
||||||
'Within': makeChildAppender(writeWithinFilter),
|
'Within': makeChildAppender(writeWithinFilter),
|
||||||
'PropertyIsEqualTo': makeChildAppender(writeComparisonFilter),
|
'PropertyIsEqualTo': makeChildAppender(writeComparisonFilter),
|
||||||
'PropertyIsNotEqualTo': makeChildAppender(writeComparisonFilter),
|
'PropertyIsNotEqualTo': makeChildAppender(writeComparisonFilter),
|
||||||
@@ -944,7 +949,13 @@ function writeQuery(node, featureType, objectStack) {
|
|||||||
} else {
|
} else {
|
||||||
typeName = featureType;
|
typeName = featureType;
|
||||||
}
|
}
|
||||||
node.setAttribute('typeName', typeName);
|
let typeNameAttr;
|
||||||
|
if (version === '2.0.0') {
|
||||||
|
typeNameAttr = 'typeNames';
|
||||||
|
} else {
|
||||||
|
typeNameAttr = 'typeName';
|
||||||
|
}
|
||||||
|
node.setAttribute(typeNameAttr, typeName);
|
||||||
if (srsName) {
|
if (srsName) {
|
||||||
node.setAttribute('srsName', srsName);
|
node.setAttribute('srsName', srsName);
|
||||||
}
|
}
|
||||||
@@ -965,7 +976,7 @@ function writeQuery(node, featureType, objectStack) {
|
|||||||
);
|
);
|
||||||
const filter = context['filter'];
|
const filter = context['filter'];
|
||||||
if (filter) {
|
if (filter) {
|
||||||
const child = createElementNS(OGCNS[version], 'Filter');
|
const child = createElementNS(getFilterNS(version), 'Filter');
|
||||||
node.appendChild(child);
|
node.appendChild(child);
|
||||||
writeFilterCondition(child, filter, objectStack);
|
writeFilterCondition(child, filter, objectStack);
|
||||||
}
|
}
|
||||||
@@ -1035,6 +1046,15 @@ function writeIntersectsFilter(node, filter, objectStack) {
|
|||||||
GML3.prototype.writeGeometryElement(node, filter.geometry, objectStack);
|
GML3.prototype.writeGeometryElement(node, filter.geometry, objectStack);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Element} node Element.
|
||||||
|
* @param {import("./filter/ResourceId.js").default} filter Filter.
|
||||||
|
* @param {Array<*>} objectStack Node stack.
|
||||||
|
*/
|
||||||
|
function writeResourceIdFilter(node, filter, objectStack) {
|
||||||
|
node.setAttribute('rid', /** @type {string} */ (filter.rid));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Node} node Node.
|
* @param {Node} node Node.
|
||||||
* @param {import("./filter/Within.js").default} filter Filter.
|
* @param {import("./filter/Within.js").default} filter Filter.
|
||||||
@@ -1056,7 +1076,11 @@ function writeWithinFilter(node, filter, objectStack) {
|
|||||||
* @param {Array<*>} objectStack Node stack.
|
* @param {Array<*>} objectStack Node stack.
|
||||||
*/
|
*/
|
||||||
function writeDuringFilter(node, filter, objectStack) {
|
function writeDuringFilter(node, filter, objectStack) {
|
||||||
const valueReference = createElementNS(FESNS, 'ValueReference');
|
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);
|
writeStringTextNode(valueReference, filter.propertyName);
|
||||||
node.appendChild(valueReference);
|
node.appendChild(valueReference);
|
||||||
|
|
||||||
@@ -1271,4 +1295,14 @@ function writeGetFeature(node, featureTypes, objectStack) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getFilterNS(version) {
|
||||||
|
let ns;
|
||||||
|
if (version === '2.0.0') {
|
||||||
|
ns = FESNS[version];
|
||||||
|
} else {
|
||||||
|
ns = OGCNS[version];
|
||||||
|
}
|
||||||
|
return ns;
|
||||||
|
}
|
||||||
|
|
||||||
export default WFS;
|
export default WFS;
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import LessThanOrEqualTo from './filter/LessThanOrEqualTo.js';
|
|||||||
import Not from './filter/Not.js';
|
import Not from './filter/Not.js';
|
||||||
import NotEqualTo from './filter/NotEqualTo.js';
|
import NotEqualTo from './filter/NotEqualTo.js';
|
||||||
import Or from './filter/Or.js';
|
import Or from './filter/Or.js';
|
||||||
|
import ResourceId from './filter/ResourceId.js';
|
||||||
import Within from './filter/Within.js';
|
import Within from './filter/Within.js';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -260,3 +261,7 @@ export function like(
|
|||||||
export function during(propertyName, begin, end) {
|
export function during(propertyName, begin, end) {
|
||||||
return new During(propertyName, begin, end);
|
return new During(propertyName, begin, end);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function resourceId(rid) {
|
||||||
|
return new ResourceId(rid);
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
/**
|
||||||
|
* @module ol/format/filter/ResourceId
|
||||||
|
*/
|
||||||
|
import Filter from './Filter.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @classdesc
|
||||||
|
*
|
||||||
|
* @abstract
|
||||||
|
*/
|
||||||
|
class ResourceId extends Filter {
|
||||||
|
/**
|
||||||
|
* @param {!string} rid Resource ID.
|
||||||
|
*/
|
||||||
|
constructor(rid) {
|
||||||
|
super('ResourceId');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {!string}
|
||||||
|
*/
|
||||||
|
this.rid = rid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ResourceId;
|
||||||
@@ -27,6 +27,7 @@ import {
|
|||||||
like as likeFilter,
|
like as likeFilter,
|
||||||
not as notFilter,
|
not as notFilter,
|
||||||
or as orFilter,
|
or as orFilter,
|
||||||
|
resourceId as resourceIdFilter,
|
||||||
within as withinFilter,
|
within as withinFilter,
|
||||||
} from '../../../../src/ol/format/filter.js';
|
} from '../../../../src/ol/format/filter.js';
|
||||||
import {parse} from '../../../../src/ol/xml.js';
|
import {parse} from '../../../../src/ol/xml.js';
|
||||||
@@ -1382,4 +1383,28 @@ describe('ol.format.WFS', function () {
|
|||||||
expect(serialized).to.xmleql(parse(text));
|
expect(serialized).to.xmleql(parse(text));
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('WFS 2.0.0', function () {
|
||||||
|
let getFeatureXml;
|
||||||
|
before(function (done) {
|
||||||
|
afterLoadText('spec/ol/format/wfs/2.0.0/GetFeature.xml', function (xml) {
|
||||||
|
getFeatureXml = xml;
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('GetFeature', function () {
|
||||||
|
const wfs = new WFS({
|
||||||
|
version: '2.0.0',
|
||||||
|
});
|
||||||
|
const filter = resourceIdFilter('bugsites.3');
|
||||||
|
const serialized = wfs.writeGetFeature({
|
||||||
|
featureNS: 'http://www.openplans.org/spearfish',
|
||||||
|
featureTypes: ['bugsites'],
|
||||||
|
featurePrefix: 'sf',
|
||||||
|
filter,
|
||||||
|
});
|
||||||
|
expect(serialized).to.xmleql(parse(getFeatureXml));
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
This example demonstrates a WFS 2.0 GetFeature POST request.
|
||||||
|
|
||||||
|
This filter selects a single feature with id "bugsites.3".
|
||||||
|
|
||||||
|
See also:
|
||||||
|
WFS Standard: http://www.opengeospatial.org/standards/wfs
|
||||||
|
Filter Encoding Standard: http://www.opengeospatial.org/standards/filter
|
||||||
|
-->
|
||||||
|
<wfs:GetFeature service="WFS" version="2.0.0"
|
||||||
|
xmlns:wfs="http://www.opengis.net/wfs/2.0" xmlns:fes="http://www.opengis.net/fes/2.0"
|
||||||
|
xmlns:sf="http://www.openplans.org/spearfish" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0/wfs.xsd">
|
||||||
|
<wfs:Query typeNames="sf:bugsites">
|
||||||
|
<fes:Filter>
|
||||||
|
<fes:ResourceId rid="bugsites.3"/>
|
||||||
|
</fes:Filter>
|
||||||
|
</wfs:Query>
|
||||||
|
</wfs:GetFeature>
|
||||||
Reference in New Issue
Block a user