Merge pull request #7814 from tschaub/unstatic-private

Remove more private static members
This commit is contained in:
Tim Schaub
2018-02-12 05:55:53 -07:00
committed by GitHub
9 changed files with 1605 additions and 1842 deletions
+85 -73
View File
@@ -83,81 +83,94 @@ inherits(MVT, FeatureFormat);
/** /**
* Reader callbacks for parsing the PBF. * Reader callback for parsing layers.
* @type {Object.<string, function(number, Object, ol.ext.PBF)>} * @param {number} tag The tag.
* @param {Object} layers The layers object.
* @param {ol.ext.PBF} pbf The PBF.
*/ */
MVT.pbfReaders_ = { function layersPBFReader(tag, layers, pbf) {
layers: function(tag, layers, pbf) { if (tag === 3) {
if (tag === 3) { const layer = {
const layer = { keys: [],
keys: [], values: [],
values: [], features: []
features: [] };
}; const end = pbf.readVarint() + pbf.pos;
const end = pbf.readVarint() + pbf.pos; pbf.readFields(layerPBFReader, layer, end);
pbf.readFields(MVT.pbfReaders_.layer, layer, end); layer.length = layer.features.length;
layer.length = layer.features.length; if (layer.length) {
if (layer.length) { layers[layer.name] = layer;
layers[layer.name] = layer;
}
}
},
layer: function(tag, layer, pbf) {
if (tag === 15) {
layer.version = pbf.readVarint();
} else if (tag === 1) {
layer.name = pbf.readString();
} else if (tag === 5) {
layer.extent = pbf.readVarint();
} else if (tag === 2) {
layer.features.push(pbf.pos);
} else if (tag === 3) {
layer.keys.push(pbf.readString());
} else if (tag === 4) {
let value = null;
const end = pbf.readVarint() + pbf.pos;
while (pbf.pos < end) {
tag = pbf.readVarint() >> 3;
value = tag === 1 ? pbf.readString() :
tag === 2 ? pbf.readFloat() :
tag === 3 ? pbf.readDouble() :
tag === 4 ? pbf.readVarint64() :
tag === 5 ? pbf.readVarint() :
tag === 6 ? pbf.readSVarint() :
tag === 7 ? pbf.readBoolean() : null;
}
layer.values.push(value);
}
},
feature: function(tag, feature, pbf) {
if (tag == 1) {
feature.id = pbf.readVarint();
} else if (tag == 2) {
const end = pbf.readVarint() + pbf.pos;
while (pbf.pos < end) {
const key = feature.layer.keys[pbf.readVarint()];
const value = feature.layer.values[pbf.readVarint()];
feature.properties[key] = value;
}
} else if (tag == 3) {
feature.type = pbf.readVarint();
} else if (tag == 4) {
feature.geometry = pbf.pos;
} }
} }
}; }
/**
* Reader callback for parsing layer.
* @param {number} tag The tag.
* @param {Object} layer The layer object.
* @param {ol.ext.PBF} pbf The PBF.
*/
function layerPBFReader(tag, layer, pbf) {
if (tag === 15) {
layer.version = pbf.readVarint();
} else if (tag === 1) {
layer.name = pbf.readString();
} else if (tag === 5) {
layer.extent = pbf.readVarint();
} else if (tag === 2) {
layer.features.push(pbf.pos);
} else if (tag === 3) {
layer.keys.push(pbf.readString());
} else if (tag === 4) {
let value = null;
const end = pbf.readVarint() + pbf.pos;
while (pbf.pos < end) {
tag = pbf.readVarint() >> 3;
value = tag === 1 ? pbf.readString() :
tag === 2 ? pbf.readFloat() :
tag === 3 ? pbf.readDouble() :
tag === 4 ? pbf.readVarint64() :
tag === 5 ? pbf.readVarint() :
tag === 6 ? pbf.readSVarint() :
tag === 7 ? pbf.readBoolean() : null;
}
layer.values.push(value);
}
}
/**
* Reader callback for parsing feature.
* @param {number} tag The tag.
* @param {Object} feature The feature object.
* @param {ol.ext.PBF} pbf The PBF.
*/
function featurePBFReader(tag, feature, pbf) {
if (tag == 1) {
feature.id = pbf.readVarint();
} else if (tag == 2) {
const end = pbf.readVarint() + pbf.pos;
while (pbf.pos < end) {
const key = feature.layer.keys[pbf.readVarint()];
const value = feature.layer.values[pbf.readVarint()];
feature.properties[key] = value;
}
} else if (tag == 3) {
feature.type = pbf.readVarint();
} else if (tag == 4) {
feature.geometry = pbf.pos;
}
}
/** /**
* Read a raw feature from the pbf offset stored at index `i` in the raw layer. * Read a raw feature from the pbf offset stored at index `i` in the raw layer.
* @suppress {missingProperties} * @suppress {missingProperties}
* @private
* @param {ol.ext.PBF} pbf PBF. * @param {ol.ext.PBF} pbf PBF.
* @param {Object} layer Raw layer. * @param {Object} layer Raw layer.
* @param {number} i Index of the feature in the raw layer's `features` array. * @param {number} i Index of the feature in the raw layer's `features` array.
* @return {Object} Raw feature. * @return {Object} Raw feature.
*/ */
MVT.readRawFeature_ = function(pbf, layer, i) { function readRawFeature(pbf, layer, i) {
pbf.pos = layer.features[i]; pbf.pos = layer.features[i];
const end = pbf.readVarint() + pbf.pos; const end = pbf.readVarint() + pbf.pos;
@@ -166,22 +179,22 @@ MVT.readRawFeature_ = function(pbf, layer, i) {
type: 0, type: 0,
properties: {} properties: {}
}; };
pbf.readFields(MVT.pbfReaders_.feature, feature, end); pbf.readFields(featurePBFReader, feature, end);
return feature; return feature;
}; }
/** /**
* Read the raw geometry from the pbf offset stored in a raw feature's geometry * Read the raw geometry from the pbf offset stored in a raw feature's geometry
* proeprty. * proeprty.
* @suppress {missingProperties} * @suppress {missingProperties}
* @private
* @param {ol.ext.PBF} pbf PBF. * @param {ol.ext.PBF} pbf PBF.
* @param {Object} feature Raw feature. * @param {Object} feature Raw feature.
* @param {Array.<number>} flatCoordinates Array to store flat coordinates in. * @param {Array.<number>} flatCoordinates Array to store flat coordinates in.
* @param {Array.<number>} ends Array to store ends in. * @param {Array.<number>} ends Array to store ends in.
* @private
*/ */
MVT.readRawGeometry_ = function(pbf, feature, flatCoordinates, ends) { MVT.prototype.readRawGeometry_ = function(pbf, feature, flatCoordinates, ends) {
pbf.pos = feature.geometry; pbf.pos = feature.geometry;
const end = pbf.readVarint() + pbf.pos; const end = pbf.readVarint() + pbf.pos;
@@ -239,13 +252,12 @@ MVT.readRawGeometry_ = function(pbf, feature, flatCoordinates, ends) {
/** /**
* @suppress {missingProperties} * @suppress {missingProperties}
* @private
* @param {number} type The raw feature's geometry type * @param {number} type The raw feature's geometry type
* @param {number} numEnds Number of ends of the flat coordinates of the * @param {number} numEnds Number of ends of the flat coordinates of the
* geometry. * geometry.
* @return {ol.geom.GeometryType} The geometry type. * @return {ol.geom.GeometryType} The geometry type.
*/ */
MVT.getGeometryType_ = function(type, numEnds) { function getGeometryType(type, numEnds) {
/** @type {ol.geom.GeometryType} */ /** @type {ol.geom.GeometryType} */
let geometryType; let geometryType;
if (type === 1) { if (type === 1) {
@@ -261,7 +273,7 @@ MVT.getGeometryType_ = function(type, numEnds) {
// outer rings of polygons. // outer rings of polygons.
} }
return geometryType; return geometryType;
}; }
/** /**
* @private * @private
@@ -283,9 +295,9 @@ MVT.prototype.createFeature_ = function(pbf, rawFeature, opt_options) {
const flatCoordinates = []; const flatCoordinates = [];
let ends = []; let ends = [];
MVT.readRawGeometry_(pbf, rawFeature, flatCoordinates, ends); this.readRawGeometry_(pbf, rawFeature, flatCoordinates, ends);
const geometryType = MVT.getGeometryType_(type, ends.length); const geometryType = getGeometryType(type, ends.length);
if (this.featureClass_ === RenderFeature) { if (this.featureClass_ === RenderFeature) {
feature = new this.featureClass_(geometryType, flatCoordinates, ends, values, id); feature = new this.featureClass_(geometryType, flatCoordinates, ends, values, id);
@@ -357,7 +369,7 @@ MVT.prototype.readFeatures = function(source, opt_options) {
const layers = this.layers_; const layers = this.layers_;
const pbf = new PBF(/** @type {ArrayBuffer} */ (source)); const pbf = new PBF(/** @type {ArrayBuffer} */ (source));
const pbfLayers = pbf.readFields(MVT.pbfReaders_.layers, {}); const pbfLayers = pbf.readFields(layersPBFReader, {});
/** @type {Array.<ol.Feature|ol.render.Feature>} */ /** @type {Array.<ol.Feature|ol.render.Feature>} */
const features = []; const features = [];
let pbfLayer; let pbfLayer;
@@ -368,7 +380,7 @@ MVT.prototype.readFeatures = function(source, opt_options) {
pbfLayer = pbfLayers[name]; pbfLayer = pbfLayers[name];
for (let i = 0, ii = pbfLayer.length; i < ii; ++i) { for (let i = 0, ii = pbfLayer.length; i < ii; ++i) {
const rawFeature = MVT.readRawFeature_(pbf, pbfLayer, i); const rawFeature = readRawFeature(pbf, pbfLayer, i);
features.push(this.createFeature_(pbf, rawFeature)); features.push(this.createFeature_(pbf, rawFeature));
} }
this.extent_ = pbfLayer ? [0, 0, pbfLayer.extent, pbfLayer.extent] : null; this.extent_ = pbfLayer ? [0, 0, pbfLayer.extent, pbfLayer.extent] : null;
+50 -60
View File
@@ -36,12 +36,50 @@ const OSMXML = function() {
inherits(OSMXML, XMLFeature); inherits(OSMXML, XMLFeature);
/**
* @const
* @type {Array.<string>}
*/
const NAMESPACE_URIS = [null];
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const WAY_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'nd': readNd,
'tag': readTag
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'node': readNode,
'way': readWay
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const NODE_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'tag': readTag
});
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @private
*/ */
OSMXML.readNode_ = function(node, objectStack) { function readNode(node, objectStack) {
const options = /** @type {olx.format.ReadOptions} */ (objectStack[0]); const options = /** @type {olx.format.ReadOptions} */ (objectStack[0]);
const state = /** @type {Object} */ (objectStack[objectStack.length - 1]); const state = /** @type {Object} */ (objectStack[objectStack.length - 1]);
const id = node.getAttribute('id'); const id = node.getAttribute('id');
@@ -54,7 +92,7 @@ OSMXML.readNode_ = function(node, objectStack) {
const values = pushParseAndPop({ const values = pushParseAndPop({
tags: {} tags: {}
}, OSMXML.NODE_PARSERS_, node, objectStack); }, NODE_PARSERS, node, objectStack);
if (!isEmpty(values.tags)) { if (!isEmpty(values.tags)) {
const geometry = new Point(coordinates); const geometry = new Point(coordinates);
transformWithOptions(geometry, false, options); transformWithOptions(geometry, false, options);
@@ -63,91 +101,43 @@ OSMXML.readNode_ = function(node, objectStack) {
feature.setProperties(values.tags); feature.setProperties(values.tags);
state.features.push(feature); state.features.push(feature);
} }
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @private
*/ */
OSMXML.readWay_ = function(node, objectStack) { function readWay(node, objectStack) {
const id = node.getAttribute('id'); const id = node.getAttribute('id');
const values = pushParseAndPop({ const values = pushParseAndPop({
id: id, id: id,
ndrefs: [], ndrefs: [],
tags: {} tags: {}
}, OSMXML.WAY_PARSERS_, node, objectStack); }, WAY_PARSERS, node, objectStack);
const state = /** @type {Object} */ (objectStack[objectStack.length - 1]); const state = /** @type {Object} */ (objectStack[objectStack.length - 1]);
state.ways.push(values); state.ways.push(values);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @private
*/ */
OSMXML.readNd_ = function(node, objectStack) { function readNd(node, objectStack) {
const values = /** @type {Object} */ (objectStack[objectStack.length - 1]); const values = /** @type {Object} */ (objectStack[objectStack.length - 1]);
values.ndrefs.push(node.getAttribute('ref')); values.ndrefs.push(node.getAttribute('ref'));
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @private
*/ */
OSMXML.readTag_ = function(node, objectStack) { function readTag(node, objectStack) {
const values = /** @type {Object} */ (objectStack[objectStack.length - 1]); const values = /** @type {Object} */ (objectStack[objectStack.length - 1]);
values.tags[node.getAttribute('k')] = node.getAttribute('v'); values.tags[node.getAttribute('k')] = node.getAttribute('v');
}; }
/**
* @const
* @private
* @type {Array.<string>}
*/
OSMXML.NAMESPACE_URIS_ = [
null
];
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
OSMXML.WAY_PARSERS_ = makeStructureNS(
OSMXML.NAMESPACE_URIS_, {
'nd': OSMXML.readNd_,
'tag': OSMXML.readTag_
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
OSMXML.PARSERS_ = makeStructureNS(
OSMXML.NAMESPACE_URIS_, {
'node': OSMXML.readNode_,
'way': OSMXML.readWay_
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
OSMXML.NODE_PARSERS_ = makeStructureNS(
OSMXML.NAMESPACE_URIS_, {
'tag': OSMXML.readTag_
});
/** /**
@@ -172,7 +162,7 @@ OSMXML.prototype.readFeaturesFromNode = function(node, opt_options) {
nodes: {}, nodes: {},
ways: [], ways: [],
features: [] features: []
}, OSMXML.PARSERS_, node, [options]); }, PARSERS, node, [options]);
// parse nodes in ways // parse nodes in ways
for (let j = 0; j < state.ways.length; j++) { for (let j = 0; j < state.ways.length; j++) {
const values = /** @type {Object} */ (state.ways[j]); const values = /** @type {Object} */ (state.ways[j]);
+223 -253
View File
@@ -18,6 +18,187 @@ const OWS = function() {
inherits(OWS, XML); inherits(OWS, XML);
/**
* @const
* @type {Array.<string>}
*/
const NAMESPACE_URIS = [null, 'http://www.opengis.net/ows/1.1'];
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'ServiceIdentification': makeObjectPropertySetter(
readServiceIdentification),
'ServiceProvider': makeObjectPropertySetter(
readServiceProvider),
'OperationsMetadata': makeObjectPropertySetter(
readOperationsMetadata)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const ADDRESS_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'DeliveryPoint': makeObjectPropertySetter(
XSD.readString),
'City': makeObjectPropertySetter(XSD.readString),
'AdministrativeArea': makeObjectPropertySetter(
XSD.readString),
'PostalCode': makeObjectPropertySetter(XSD.readString),
'Country': makeObjectPropertySetter(XSD.readString),
'ElectronicMailAddress': makeObjectPropertySetter(
XSD.readString)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const ALLOWED_VALUES_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'Value': makeObjectPropertyPusher(readValue)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const CONSTRAINT_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'AllowedValues': makeObjectPropertySetter(
readAllowedValues)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const CONTACT_INFO_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'Phone': makeObjectPropertySetter(readPhone),
'Address': makeObjectPropertySetter(readAddress)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const DCP_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'HTTP': makeObjectPropertySetter(readHttp)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const HTTP_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'Get': makeObjectPropertyPusher(readGet),
'Post': undefined // TODO
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const OPERATION_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'DCP': makeObjectPropertySetter(readDcp)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const OPERATIONS_METADATA_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'Operation': readOperation
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const PHONE_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'Voice': makeObjectPropertySetter(XSD.readString),
'Facsimile': makeObjectPropertySetter(XSD.readString)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const REQUEST_METHOD_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'Constraint': makeObjectPropertyPusher(
readConstraint)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const SERVICE_CONTACT_PARSERS =
makeStructureNS(
NAMESPACE_URIS, {
'IndividualName': makeObjectPropertySetter(
XSD.readString),
'PositionName': makeObjectPropertySetter(XSD.readString),
'ContactInfo': makeObjectPropertySetter(
readContactInfo)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const SERVICE_IDENTIFICATION_PARSERS =
makeStructureNS(
NAMESPACE_URIS, {
'Abstract': makeObjectPropertySetter(XSD.readString),
'AccessConstraints': makeObjectPropertySetter(XSD.readString),
'Fees': makeObjectPropertySetter(XSD.readString),
'Title': makeObjectPropertySetter(XSD.readString),
'ServiceTypeVersion': makeObjectPropertySetter(
XSD.readString),
'ServiceType': makeObjectPropertySetter(XSD.readString)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const SERVICE_PROVIDER_PARSERS =
makeStructureNS(
NAMESPACE_URIS, {
'ProviderName': makeObjectPropertySetter(XSD.readString),
'ProviderSite': makeObjectPropertySetter(XLink.readHref),
'ServiceContact': makeObjectPropertySetter(
readServiceContact)
});
/** /**
* @inheritDoc * @inheritDoc
*/ */
@@ -36,7 +217,7 @@ OWS.prototype.readFromDocument = function(doc) {
*/ */
OWS.prototype.readFromNode = function(node) { OWS.prototype.readFromNode = function(node) {
const owsObject = pushParseAndPop({}, const owsObject = pushParseAndPop({},
OWS.PARSERS_, node, []); PARSERS, node, []);
return owsObject ? owsObject : null; return owsObject ? owsObject : null;
}; };
@@ -44,387 +225,176 @@ OWS.prototype.readFromNode = function(node) {
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @private
* @return {Object|undefined} The address. * @return {Object|undefined} The address.
*/ */
OWS.readAddress_ = function(node, objectStack) { function readAddress(node, objectStack) {
return pushParseAndPop({}, return pushParseAndPop({},
OWS.ADDRESS_PARSERS_, node, objectStack); ADDRESS_PARSERS, node, objectStack);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @private
* @return {Object|undefined} The values. * @return {Object|undefined} The values.
*/ */
OWS.readAllowedValues_ = function(node, objectStack) { function readAllowedValues(node, objectStack) {
return pushParseAndPop({}, return pushParseAndPop({},
OWS.ALLOWED_VALUES_PARSERS_, node, objectStack); ALLOWED_VALUES_PARSERS, node, objectStack);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @private
* @return {Object|undefined} The constraint. * @return {Object|undefined} The constraint.
*/ */
OWS.readConstraint_ = function(node, objectStack) { function readConstraint(node, objectStack) {
const name = node.getAttribute('name'); const name = node.getAttribute('name');
if (!name) { if (!name) {
return undefined; return undefined;
} }
return pushParseAndPop({'name': name}, return pushParseAndPop({'name': name},
OWS.CONSTRAINT_PARSERS_, node, CONSTRAINT_PARSERS, node,
objectStack); objectStack);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @private
* @return {Object|undefined} The contact info. * @return {Object|undefined} The contact info.
*/ */
OWS.readContactInfo_ = function(node, objectStack) { function readContactInfo(node, objectStack) {
return pushParseAndPop({}, return pushParseAndPop({},
OWS.CONTACT_INFO_PARSERS_, node, objectStack); CONTACT_INFO_PARSERS, node, objectStack);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @private
* @return {Object|undefined} The DCP. * @return {Object|undefined} The DCP.
*/ */
OWS.readDcp_ = function(node, objectStack) { function readDcp(node, objectStack) {
return pushParseAndPop({}, return pushParseAndPop({},
OWS.DCP_PARSERS_, node, objectStack); DCP_PARSERS, node, objectStack);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @private
* @return {Object|undefined} The GET object. * @return {Object|undefined} The GET object.
*/ */
OWS.readGet_ = function(node, objectStack) { function readGet(node, objectStack) {
const href = XLink.readHref(node); const href = XLink.readHref(node);
if (!href) { if (!href) {
return undefined; return undefined;
} }
return pushParseAndPop({'href': href}, return pushParseAndPop({'href': href},
OWS.REQUEST_METHOD_PARSERS_, node, objectStack); REQUEST_METHOD_PARSERS, node, objectStack);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @private
* @return {Object|undefined} The HTTP object. * @return {Object|undefined} The HTTP object.
*/ */
OWS.readHttp_ = function(node, objectStack) { function readHttp(node, objectStack) {
return pushParseAndPop({}, OWS.HTTP_PARSERS_, return pushParseAndPop({}, HTTP_PARSERS,
node, objectStack); node, objectStack);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @private
* @return {Object|undefined} The operation. * @return {Object|undefined} The operation.
*/ */
OWS.readOperation_ = function(node, objectStack) { function readOperation(node, objectStack) {
const name = node.getAttribute('name'); const name = node.getAttribute('name');
const value = pushParseAndPop({}, const value = pushParseAndPop({},
OWS.OPERATION_PARSERS_, node, objectStack); OPERATION_PARSERS, node, objectStack);
if (!value) { if (!value) {
return undefined; return undefined;
} }
const object = /** @type {Object} */ const object = /** @type {Object} */
(objectStack[objectStack.length - 1]); (objectStack[objectStack.length - 1]);
object[name] = value; object[name] = value;
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @private
* @return {Object|undefined} The operations metadata. * @return {Object|undefined} The operations metadata.
*/ */
OWS.readOperationsMetadata_ = function(node, function readOperationsMetadata(node,
objectStack) { objectStack) {
return pushParseAndPop({}, return pushParseAndPop({},
OWS.OPERATIONS_METADATA_PARSERS_, node, OPERATIONS_METADATA_PARSERS, node,
objectStack); objectStack);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @private
* @return {Object|undefined} The phone. * @return {Object|undefined} The phone.
*/ */
OWS.readPhone_ = function(node, objectStack) { function readPhone(node, objectStack) {
return pushParseAndPop({}, return pushParseAndPop({},
OWS.PHONE_PARSERS_, node, objectStack); PHONE_PARSERS, node, objectStack);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @private
* @return {Object|undefined} The service identification. * @return {Object|undefined} The service identification.
*/ */
OWS.readServiceIdentification_ = function(node, function readServiceIdentification(node,
objectStack) { objectStack) {
return pushParseAndPop( return pushParseAndPop(
{}, OWS.SERVICE_IDENTIFICATION_PARSERS_, node, {}, SERVICE_IDENTIFICATION_PARSERS, node,
objectStack); objectStack);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @private
* @return {Object|undefined} The service contact. * @return {Object|undefined} The service contact.
*/ */
OWS.readServiceContact_ = function(node, objectStack) { function readServiceContact(node, objectStack) {
return pushParseAndPop( return pushParseAndPop(
{}, OWS.SERVICE_CONTACT_PARSERS_, node, {}, SERVICE_CONTACT_PARSERS, node,
objectStack); objectStack);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @private
* @return {Object|undefined} The service provider. * @return {Object|undefined} The service provider.
*/ */
OWS.readServiceProvider_ = function(node, objectStack) { function readServiceProvider(node, objectStack) {
return pushParseAndPop( return pushParseAndPop(
{}, OWS.SERVICE_PROVIDER_PARSERS_, node, {}, SERVICE_PROVIDER_PARSERS, node,
objectStack); objectStack);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @private
* @return {string|undefined} The value. * @return {string|undefined} The value.
*/ */
OWS.readValue_ = function(node, objectStack) { function readValue(node, objectStack) {
return XSD.readString(node); return XSD.readString(node);
}; }
/**
* @const
* @type {Array.<string>}
* @private
*/
OWS.NAMESPACE_URIS_ = [
null,
'http://www.opengis.net/ows/1.1'
];
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
OWS.PARSERS_ = makeStructureNS(
OWS.NAMESPACE_URIS_, {
'ServiceIdentification': makeObjectPropertySetter(
OWS.readServiceIdentification_),
'ServiceProvider': makeObjectPropertySetter(
OWS.readServiceProvider_),
'OperationsMetadata': makeObjectPropertySetter(
OWS.readOperationsMetadata_)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
OWS.ADDRESS_PARSERS_ = makeStructureNS(
OWS.NAMESPACE_URIS_, {
'DeliveryPoint': makeObjectPropertySetter(
XSD.readString),
'City': makeObjectPropertySetter(XSD.readString),
'AdministrativeArea': makeObjectPropertySetter(
XSD.readString),
'PostalCode': makeObjectPropertySetter(XSD.readString),
'Country': makeObjectPropertySetter(XSD.readString),
'ElectronicMailAddress': makeObjectPropertySetter(
XSD.readString)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
OWS.ALLOWED_VALUES_PARSERS_ = makeStructureNS(
OWS.NAMESPACE_URIS_, {
'Value': makeObjectPropertyPusher(OWS.readValue_)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
OWS.CONSTRAINT_PARSERS_ = makeStructureNS(
OWS.NAMESPACE_URIS_, {
'AllowedValues': makeObjectPropertySetter(
OWS.readAllowedValues_)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
OWS.CONTACT_INFO_PARSERS_ = makeStructureNS(
OWS.NAMESPACE_URIS_, {
'Phone': makeObjectPropertySetter(OWS.readPhone_),
'Address': makeObjectPropertySetter(OWS.readAddress_)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
OWS.DCP_PARSERS_ = makeStructureNS(
OWS.NAMESPACE_URIS_, {
'HTTP': makeObjectPropertySetter(OWS.readHttp_)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
OWS.HTTP_PARSERS_ = makeStructureNS(
OWS.NAMESPACE_URIS_, {
'Get': makeObjectPropertyPusher(OWS.readGet_),
'Post': undefined // TODO
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
OWS.OPERATION_PARSERS_ = makeStructureNS(
OWS.NAMESPACE_URIS_, {
'DCP': makeObjectPropertySetter(OWS.readDcp_)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
OWS.OPERATIONS_METADATA_PARSERS_ = makeStructureNS(
OWS.NAMESPACE_URIS_, {
'Operation': OWS.readOperation_
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
OWS.PHONE_PARSERS_ = makeStructureNS(
OWS.NAMESPACE_URIS_, {
'Voice': makeObjectPropertySetter(XSD.readString),
'Facsimile': makeObjectPropertySetter(XSD.readString)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
OWS.REQUEST_METHOD_PARSERS_ = makeStructureNS(
OWS.NAMESPACE_URIS_, {
'Constraint': makeObjectPropertyPusher(
OWS.readConstraint_)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
OWS.SERVICE_CONTACT_PARSERS_ =
makeStructureNS(
OWS.NAMESPACE_URIS_, {
'IndividualName': makeObjectPropertySetter(
XSD.readString),
'PositionName': makeObjectPropertySetter(XSD.readString),
'ContactInfo': makeObjectPropertySetter(
OWS.readContactInfo_)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
OWS.SERVICE_IDENTIFICATION_PARSERS_ =
makeStructureNS(
OWS.NAMESPACE_URIS_, {
'Abstract': makeObjectPropertySetter(XSD.readString),
'AccessConstraints': makeObjectPropertySetter(XSD.readString),
'Fees': makeObjectPropertySetter(XSD.readString),
'Title': makeObjectPropertySetter(XSD.readString),
'ServiceTypeVersion': makeObjectPropertySetter(
XSD.readString),
'ServiceType': makeObjectPropertySetter(XSD.readString)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
OWS.SERVICE_PROVIDER_PARSERS_ =
makeStructureNS(
OWS.NAMESPACE_URIS_, {
'ProviderName': makeObjectPropertySetter(XSD.readString),
'ProviderSite': makeObjectPropertySetter(XLink.readHref),
'ServiceContact': makeObjectPropertySetter(
OWS.readServiceContact_)
});
export default OWS; export default OWS;
+138 -174
View File
@@ -234,9 +234,8 @@ WFS.prototype.readFeatureCollectionMetadataFromDocument = function(doc) {
/** /**
* @const * @const
* @type {Object.<string, Object.<string, ol.XmlParser>>} * @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/ */
WFS.FEATURE_COLLECTION_PARSERS_ = { const FEATURE_COLLECTION_PARSERS = {
'http://www.opengis.net/gml': { 'http://www.opengis.net/gml': {
'boundedBy': makeObjectPropertySetter( 'boundedBy': makeObjectPropertySetter(
GMLBase.prototype.readGeometryElement, 'bounds') GMLBase.prototype.readGeometryElement, 'bounds')
@@ -256,16 +255,15 @@ WFS.prototype.readFeatureCollectionMetadataFromNode = function(node) {
result['numberOfFeatures'] = value; result['numberOfFeatures'] = value;
return pushParseAndPop( return pushParseAndPop(
/** @type {ol.WFSFeatureCollectionMetadata} */ (result), /** @type {ol.WFSFeatureCollectionMetadata} */ (result),
WFS.FEATURE_COLLECTION_PARSERS_, node, [], this.gmlFormat_); FEATURE_COLLECTION_PARSERS, node, [], this.gmlFormat_);
}; };
/** /**
* @const * @const
* @type {Object.<string, Object.<string, ol.XmlParser>>} * @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/ */
WFS.TRANSACTION_SUMMARY_PARSERS_ = { const TRANSACTION_SUMMARY_PARSERS = {
'http://www.opengis.net/wfs': { 'http://www.opengis.net/wfs': {
'totalInserted': makeObjectPropertySetter( 'totalInserted': makeObjectPropertySetter(
XSD.readNonNegativeInteger), XSD.readNonNegativeInteger),
@@ -281,20 +279,18 @@ WFS.TRANSACTION_SUMMARY_PARSERS_ = {
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {Object|undefined} Transaction Summary. * @return {Object|undefined} Transaction Summary.
* @private
*/ */
WFS.readTransactionSummary_ = function(node, objectStack) { function readTransactionSummary(node, objectStack) {
return pushParseAndPop( return pushParseAndPop(
{}, WFS.TRANSACTION_SUMMARY_PARSERS_, node, objectStack); {}, TRANSACTION_SUMMARY_PARSERS, node, objectStack);
}; }
/** /**
* @const * @const
* @type {Object.<string, Object.<string, ol.XmlParser>>} * @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/ */
WFS.OGC_FID_PARSERS_ = { const OGC_FID_PARSERS = {
'http://www.opengis.net/ogc': { 'http://www.opengis.net/ogc': {
'FeatureId': makeArrayPusher(function(node, objectStack) { 'FeatureId': makeArrayPusher(function(node, objectStack) {
return node.getAttribute('fid'); return node.getAttribute('fid');
@@ -306,21 +302,19 @@ WFS.OGC_FID_PARSERS_ = {
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @private
*/ */
WFS.fidParser_ = function(node, objectStack) { function fidParser(node, objectStack) {
parseNode(WFS.OGC_FID_PARSERS_, node, objectStack); parseNode(OGC_FID_PARSERS, node, objectStack);
}; }
/** /**
* @const * @const
* @type {Object.<string, Object.<string, ol.XmlParser>>} * @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/ */
WFS.INSERT_RESULTS_PARSERS_ = { const INSERT_RESULTS_PARSERS = {
'http://www.opengis.net/wfs': { 'http://www.opengis.net/wfs': {
'Feature': WFS.fidParser_ 'Feature': fidParser
} }
}; };
@@ -329,25 +323,23 @@ WFS.INSERT_RESULTS_PARSERS_ = {
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {Array.<string>|undefined} Insert results. * @return {Array.<string>|undefined} Insert results.
* @private
*/ */
WFS.readInsertResults_ = function(node, objectStack) { function readInsertResults(node, objectStack) {
return pushParseAndPop( return pushParseAndPop(
[], WFS.INSERT_RESULTS_PARSERS_, node, objectStack); [], INSERT_RESULTS_PARSERS, node, objectStack);
}; }
/** /**
* @const * @const
* @type {Object.<string, Object.<string, ol.XmlParser>>} * @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/ */
WFS.TRANSACTION_RESPONSE_PARSERS_ = { const TRANSACTION_RESPONSE_PARSERS = {
'http://www.opengis.net/wfs': { 'http://www.opengis.net/wfs': {
'TransactionSummary': makeObjectPropertySetter( 'TransactionSummary': makeObjectPropertySetter(
WFS.readTransactionSummary_, 'transactionSummary'), readTransactionSummary, 'transactionSummary'),
'InsertResults': makeObjectPropertySetter( 'InsertResults': makeObjectPropertySetter(
WFS.readInsertResults_, 'insertIds') readInsertResults, 'insertIds')
} }
}; };
@@ -373,15 +365,14 @@ WFS.prototype.readTransactionResponseFromDocument = function(doc) {
WFS.prototype.readTransactionResponseFromNode = function(node) { WFS.prototype.readTransactionResponseFromNode = function(node) {
return pushParseAndPop( return pushParseAndPop(
/** @type {ol.WFSTransactionResponse} */({}), /** @type {ol.WFSTransactionResponse} */({}),
WFS.TRANSACTION_RESPONSE_PARSERS_, node, []); TRANSACTION_RESPONSE_PARSERS, node, []);
}; };
/** /**
* @type {Object.<string, Object.<string, ol.XmlSerializer>>} * @type {Object.<string, Object.<string, ol.XmlSerializer>>}
* @private
*/ */
WFS.QUERY_SERIALIZERS_ = { const QUERY_SERIALIZERS = {
'http://www.opengis.net/wfs': { 'http://www.opengis.net/wfs': {
'PropertyName': makeChildAppender(XSD.writeStringTextNode) 'PropertyName': makeChildAppender(XSD.writeStringTextNode)
} }
@@ -392,9 +383,8 @@ WFS.QUERY_SERIALIZERS_ = {
* @param {Node} node Node. * @param {Node} node Node.
* @param {ol.Feature} feature Feature. * @param {ol.Feature} feature Feature.
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private
*/ */
WFS.writeFeature_ = function(node, feature, objectStack) { function writeFeature(node, feature, objectStack) {
const context = objectStack[objectStack.length - 1]; const context = objectStack[objectStack.length - 1];
const featureType = context['featureType']; const featureType = context['featureType'];
const featureNS = context['featureNS']; const featureNS = context['featureNS'];
@@ -406,31 +396,29 @@ WFS.writeFeature_ = function(node, feature, objectStack) {
} else { } else {
GML3.prototype.writeFeatureElement(child, feature, objectStack); GML3.prototype.writeFeatureElement(child, feature, objectStack);
} }
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {number|string} fid Feature identifier. * @param {number|string} fid Feature identifier.
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private
*/ */
WFS.writeOgcFidFilter_ = function(node, fid, objectStack) { function writeOgcFidFilter(node, fid, objectStack) {
const filter = createElementNS(WFS.OGCNS, 'Filter'); const filter = createElementNS(WFS.OGCNS, 'Filter');
const child = createElementNS(WFS.OGCNS, 'FeatureId'); const child = createElementNS(WFS.OGCNS, 'FeatureId');
filter.appendChild(child); filter.appendChild(child);
child.setAttribute('fid', fid); child.setAttribute('fid', fid);
node.appendChild(filter); node.appendChild(filter);
}; }
/** /**
* @param {string|undefined} featurePrefix The prefix of the feature. * @param {string|undefined} featurePrefix The prefix of the feature.
* @param {string} featureType The type of the feature. * @param {string} featureType The type of the feature.
* @returns {string} The value of the typeName property. * @returns {string} The value of the typeName property.
* @private
*/ */
WFS.getTypeName_ = function(featurePrefix, featureType) { function getTypeName(featurePrefix, featureType) {
featurePrefix = featurePrefix ? featurePrefix : featurePrefix = featurePrefix ? featurePrefix :
WFS.FEATURE_PREFIX; WFS.FEATURE_PREFIX;
const prefix = featurePrefix + ':'; const prefix = featurePrefix + ':';
@@ -440,28 +428,41 @@ WFS.getTypeName_ = function(featurePrefix, featureType) {
} else { } else {
return prefix + featureType; return prefix + featureType;
} }
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {ol.Feature} feature Feature. * @param {ol.Feature} feature Feature.
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private
*/ */
WFS.writeDelete_ = function(node, feature, objectStack) { function writeDelete(node, feature, objectStack) {
const context = objectStack[objectStack.length - 1]; const context = objectStack[objectStack.length - 1];
assert(feature.getId() !== undefined, 26); // Features must have an id set assert(feature.getId() !== undefined, 26); // Features must have an id set
const featureType = context['featureType']; const featureType = context['featureType'];
const featurePrefix = context['featurePrefix']; const featurePrefix = context['featurePrefix'];
const featureNS = context['featureNS']; const featureNS = context['featureNS'];
const typeName = WFS.getTypeName_(featurePrefix, featureType); const typeName = getTypeName(featurePrefix, featureType);
node.setAttribute('typeName', typeName); node.setAttribute('typeName', typeName);
setAttributeNS(node, WFS.XMLNS, 'xmlns:' + featurePrefix, setAttributeNS(node, WFS.XMLNS, 'xmlns:' + featurePrefix,
featureNS); featureNS);
const fid = feature.getId(); const fid = feature.getId();
if (fid !== undefined) { if (fid !== undefined) {
WFS.writeOgcFidFilter_(node, fid, objectStack); writeOgcFidFilter(node, fid, objectStack);
}
}
/**
* @type {Object.<string, Object.<string, ol.XmlSerializer>>}
*/
const TRANSACTION_SERIALIZERS = {
'http://www.opengis.net/wfs': {
'Insert': makeChildAppender(writeFeature),
'Update': makeChildAppender(writeUpdate),
'Delete': makeChildAppender(writeDelete),
'Property': makeChildAppender(writeProperty),
'Native': makeChildAppender(writeNative)
} }
}; };
@@ -470,15 +471,14 @@ WFS.writeDelete_ = function(node, feature, objectStack) {
* @param {Node} node Node. * @param {Node} node Node.
* @param {ol.Feature} feature Feature. * @param {ol.Feature} feature Feature.
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private
*/ */
WFS.writeUpdate_ = function(node, feature, objectStack) { function writeUpdate(node, feature, objectStack) {
const context = objectStack[objectStack.length - 1]; const context = objectStack[objectStack.length - 1];
assert(feature.getId() !== undefined, 27); // Features must have an id set assert(feature.getId() !== undefined, 27); // Features must have an id set
const featureType = context['featureType']; const featureType = context['featureType'];
const featurePrefix = context['featurePrefix']; const featurePrefix = context['featurePrefix'];
const featureNS = context['featureNS']; const featureNS = context['featureNS'];
const typeName = WFS.getTypeName_(featurePrefix, featureType); const typeName = getTypeName(featurePrefix, featureType);
const geometryName = feature.getGeometryName(); const geometryName = feature.getGeometryName();
node.setAttribute('typeName', typeName); node.setAttribute('typeName', typeName);
setAttributeNS(node, WFS.XMLNS, 'xmlns:' + featurePrefix, setAttributeNS(node, WFS.XMLNS, 'xmlns:' + featurePrefix,
@@ -500,21 +500,20 @@ WFS.writeUpdate_ = function(node, feature, objectStack) {
pushSerializeAndPop(/** @type {ol.XmlNodeStackItem} */ ( pushSerializeAndPop(/** @type {ol.XmlNodeStackItem} */ (
{'gmlVersion': context['gmlVersion'], node: node, {'gmlVersion': context['gmlVersion'], node: node,
'hasZ': context['hasZ'], 'srsName': context['srsName']}), 'hasZ': context['hasZ'], 'srsName': context['srsName']}),
WFS.TRANSACTION_SERIALIZERS_, TRANSACTION_SERIALIZERS,
makeSimpleNodeFactory('Property'), values, makeSimpleNodeFactory('Property'), values,
objectStack); objectStack);
WFS.writeOgcFidFilter_(node, fid, objectStack); writeOgcFidFilter(node, fid, objectStack);
} }
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Object} pair Property name and value. * @param {Object} pair Property name and value.
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private
*/ */
WFS.writeProperty_ = function(node, pair, objectStack) { function writeProperty(node, pair, objectStack) {
const name = createElementNS(WFS.WFSNS, 'Name'); const name = createElementNS(WFS.WFSNS, 'Name');
const context = objectStack[objectStack.length - 1]; const context = objectStack[objectStack.length - 1];
const gmlVersion = context['gmlVersion']; const gmlVersion = context['gmlVersion'];
@@ -535,7 +534,7 @@ WFS.writeProperty_ = function(node, pair, objectStack) {
XSD.writeStringTextNode(value, pair.value); XSD.writeStringTextNode(value, pair.value);
} }
} }
}; }
/** /**
@@ -543,9 +542,8 @@ WFS.writeProperty_ = function(node, pair, objectStack) {
* @param {{vendorId: string, safeToIgnore: boolean, value: string}} * @param {{vendorId: string, safeToIgnore: boolean, value: string}}
* nativeElement The native element. * nativeElement The native element.
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private
*/ */
WFS.writeNative_ = function(node, nativeElement, objectStack) { function writeNative(node, nativeElement, objectStack) {
if (nativeElement.vendorId) { if (nativeElement.vendorId) {
node.setAttribute('vendorId', nativeElement.vendorId); node.setAttribute('vendorId', nativeElement.vendorId);
} }
@@ -555,20 +553,34 @@ WFS.writeNative_ = function(node, nativeElement, objectStack) {
if (nativeElement.value !== undefined) { if (nativeElement.value !== undefined) {
XSD.writeStringTextNode(node, nativeElement.value); XSD.writeStringTextNode(node, nativeElement.value);
} }
}; }
/** /**
* @type {Object.<string, Object.<string, ol.XmlSerializer>>} * @type {Object.<string, Object.<string, ol.XmlSerializer>>}
* @private
*/ */
WFS.TRANSACTION_SERIALIZERS_ = { const GETFEATURE_SERIALIZERS = {
'http://www.opengis.net/wfs': { 'http://www.opengis.net/wfs': {
'Insert': makeChildAppender(WFS.writeFeature_), 'Query': makeChildAppender(writeQuery)
'Update': makeChildAppender(WFS.writeUpdate_), },
'Delete': makeChildAppender(WFS.writeDelete_), 'http://www.opengis.net/ogc': {
'Property': makeChildAppender(WFS.writeProperty_), 'During': makeChildAppender(writeDuringFilter),
'Native': makeChildAppender(WFS.writeNative_) 'And': makeChildAppender(writeLogicalFilter),
'Or': makeChildAppender(writeLogicalFilter),
'Not': makeChildAppender(writeNotFilter),
'BBOX': makeChildAppender(writeBboxFilter),
'Contains': makeChildAppender(writeContainsFilter),
'Intersects': makeChildAppender(writeIntersectsFilter),
'Within': makeChildAppender(writeWithinFilter),
'PropertyIsEqualTo': makeChildAppender(writeComparisonFilter),
'PropertyIsNotEqualTo': makeChildAppender(writeComparisonFilter),
'PropertyIsLessThan': makeChildAppender(writeComparisonFilter),
'PropertyIsLessThanOrEqualTo': makeChildAppender(writeComparisonFilter),
'PropertyIsGreaterThan': makeChildAppender(writeComparisonFilter),
'PropertyIsGreaterThanOrEqualTo': makeChildAppender(writeComparisonFilter),
'PropertyIsNull': makeChildAppender(writeIsNullFilter),
'PropertyIsBetween': makeChildAppender(writeIsBetweenFilter),
'PropertyIsLike': makeChildAppender(writeIsLikeFilter)
} }
}; };
@@ -577,9 +589,8 @@ WFS.TRANSACTION_SERIALIZERS_ = {
* @param {Node} node Node. * @param {Node} node Node.
* @param {string} featureType Feature type. * @param {string} featureType Feature type.
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private
*/ */
WFS.writeQuery_ = function(node, featureType, objectStack) { function writeQuery(node, featureType, objectStack) {
const context = /** @type {Object} */ (objectStack[objectStack.length - 1]); const context = /** @type {Object} */ (objectStack[objectStack.length - 1]);
const featurePrefix = context['featurePrefix']; const featurePrefix = context['featurePrefix'];
const featureNS = context['featureNS']; const featureNS = context['featureNS'];
@@ -588,7 +599,7 @@ WFS.writeQuery_ = function(node, featureType, objectStack) {
let typeName; let typeName;
// If feature prefix is not defined, we must not use the default prefix. // If feature prefix is not defined, we must not use the default prefix.
if (featurePrefix) { if (featurePrefix) {
typeName = WFS.getTypeName_(featurePrefix, featureType); typeName = getTypeName(featurePrefix, featureType);
} else { } else {
typeName = featureType; typeName = featureType;
} }
@@ -603,101 +614,95 @@ WFS.writeQuery_ = function(node, featureType, objectStack) {
const item = /** @type {ol.XmlNodeStackItem} */ (assign({}, context)); const item = /** @type {ol.XmlNodeStackItem} */ (assign({}, context));
item.node = node; item.node = node;
pushSerializeAndPop(item, pushSerializeAndPop(item,
WFS.QUERY_SERIALIZERS_, QUERY_SERIALIZERS,
makeSimpleNodeFactory('PropertyName'), propertyNames, makeSimpleNodeFactory('PropertyName'), propertyNames,
objectStack); objectStack);
const filter = context['filter']; const filter = context['filter'];
if (filter) { if (filter) {
const child = createElementNS(WFS.OGCNS, 'Filter'); const child = createElementNS(WFS.OGCNS, 'Filter');
node.appendChild(child); node.appendChild(child);
WFS.writeFilterCondition_(child, filter, objectStack); writeFilterCondition(child, filter, objectStack);
} }
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {ol.format.filter.Filter} filter Filter. * @param {ol.format.filter.Filter} filter Filter.
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private
*/ */
WFS.writeFilterCondition_ = function(node, filter, objectStack) { function writeFilterCondition(node, filter, objectStack) {
/** @type {ol.XmlNodeStackItem} */ /** @type {ol.XmlNodeStackItem} */
const item = {node: node}; const item = {node: node};
pushSerializeAndPop(item, pushSerializeAndPop(item,
WFS.GETFEATURE_SERIALIZERS_, GETFEATURE_SERIALIZERS,
makeSimpleNodeFactory(filter.getTagName()), makeSimpleNodeFactory(filter.getTagName()),
[filter], objectStack); [filter], objectStack);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {ol.format.filter.Bbox} filter Filter. * @param {ol.format.filter.Bbox} filter Filter.
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private
*/ */
WFS.writeBboxFilter_ = function(node, filter, objectStack) { function writeBboxFilter(node, filter, objectStack) {
const context = objectStack[objectStack.length - 1]; const context = objectStack[objectStack.length - 1];
context['srsName'] = filter.srsName; context['srsName'] = filter.srsName;
WFS.writeOgcPropertyName_(node, filter.geometryName); writeOgcPropertyName(node, filter.geometryName);
GML3.prototype.writeGeometryElement(node, filter.extent, objectStack); GML3.prototype.writeGeometryElement(node, filter.extent, objectStack);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {ol.format.filter.Contains} filter Filter. * @param {ol.format.filter.Contains} filter Filter.
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private
*/ */
WFS.writeContainsFilter_ = function(node, filter, objectStack) { function writeContainsFilter(node, filter, objectStack) {
const context = objectStack[objectStack.length - 1]; const context = objectStack[objectStack.length - 1];
context['srsName'] = filter.srsName; context['srsName'] = filter.srsName;
WFS.writeOgcPropertyName_(node, filter.geometryName); writeOgcPropertyName(node, filter.geometryName);
GML3.prototype.writeGeometryElement(node, filter.geometry, objectStack); GML3.prototype.writeGeometryElement(node, filter.geometry, objectStack);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {ol.format.filter.Intersects} filter Filter. * @param {ol.format.filter.Intersects} filter Filter.
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private
*/ */
WFS.writeIntersectsFilter_ = function(node, filter, objectStack) { function writeIntersectsFilter(node, filter, objectStack) {
const context = objectStack[objectStack.length - 1]; const context = objectStack[objectStack.length - 1];
context['srsName'] = filter.srsName; context['srsName'] = filter.srsName;
WFS.writeOgcPropertyName_(node, filter.geometryName); writeOgcPropertyName(node, filter.geometryName);
GML3.prototype.writeGeometryElement(node, filter.geometry, objectStack); GML3.prototype.writeGeometryElement(node, filter.geometry, objectStack);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {ol.format.filter.Within} filter Filter. * @param {ol.format.filter.Within} filter Filter.
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private
*/ */
WFS.writeWithinFilter_ = function(node, filter, objectStack) { function writeWithinFilter(node, filter, objectStack) {
const context = objectStack[objectStack.length - 1]; const context = objectStack[objectStack.length - 1];
context['srsName'] = filter.srsName; context['srsName'] = filter.srsName;
WFS.writeOgcPropertyName_(node, filter.geometryName); writeOgcPropertyName(node, filter.geometryName);
GML3.prototype.writeGeometryElement(node, filter.geometry, objectStack); GML3.prototype.writeGeometryElement(node, filter.geometry, objectStack);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {ol.format.filter.During} filter Filter. * @param {ol.format.filter.During} filter Filter.
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private
*/ */
WFS.writeDuringFilter_ = function(node, filter, objectStack) { function writeDuringFilter(node, filter, objectStack) {
const valueReference = createElementNS(WFS.FESNS, 'ValueReference'); const valueReference = createElementNS(WFS.FESNS, 'ValueReference');
XSD.writeStringTextNode(valueReference, filter.propertyName); XSD.writeStringTextNode(valueReference, filter.propertyName);
@@ -709,190 +714,150 @@ WFS.writeDuringFilter_ = function(node, filter, objectStack) {
const begin = createElementNS(GMLBase.GMLNS, 'begin'); const begin = createElementNS(GMLBase.GMLNS, 'begin');
timePeriod.appendChild(begin); timePeriod.appendChild(begin);
WFS.writeTimeInstant_(begin, filter.begin); writeTimeInstant(begin, filter.begin);
const end = createElementNS(GMLBase.GMLNS, 'end'); const end = createElementNS(GMLBase.GMLNS, 'end');
timePeriod.appendChild(end); timePeriod.appendChild(end);
WFS.writeTimeInstant_(end, filter.end); writeTimeInstant(end, filter.end);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {ol.format.filter.LogicalNary} filter Filter. * @param {ol.format.filter.LogicalNary} filter Filter.
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private
*/ */
WFS.writeLogicalFilter_ = function(node, filter, objectStack) { function writeLogicalFilter(node, filter, objectStack) {
/** @type {ol.XmlNodeStackItem} */ /** @type {ol.XmlNodeStackItem} */
const item = {node: node}; const item = {node: node};
const conditions = filter.conditions; const conditions = filter.conditions;
for (let i = 0, ii = conditions.length; i < ii; ++i) { for (let i = 0, ii = conditions.length; i < ii; ++i) {
const condition = conditions[i]; const condition = conditions[i];
pushSerializeAndPop(item, pushSerializeAndPop(item,
WFS.GETFEATURE_SERIALIZERS_, GETFEATURE_SERIALIZERS,
makeSimpleNodeFactory(condition.getTagName()), makeSimpleNodeFactory(condition.getTagName()),
[condition], objectStack); [condition], objectStack);
} }
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {ol.format.filter.Not} filter Filter. * @param {ol.format.filter.Not} filter Filter.
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private
*/ */
WFS.writeNotFilter_ = function(node, filter, objectStack) { function writeNotFilter(node, filter, objectStack) {
/** @type {ol.XmlNodeStackItem} */ /** @type {ol.XmlNodeStackItem} */
const item = {node: node}; const item = {node: node};
const condition = filter.condition; const condition = filter.condition;
pushSerializeAndPop(item, pushSerializeAndPop(item,
WFS.GETFEATURE_SERIALIZERS_, GETFEATURE_SERIALIZERS,
makeSimpleNodeFactory(condition.getTagName()), makeSimpleNodeFactory(condition.getTagName()),
[condition], objectStack); [condition], objectStack);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {ol.format.filter.ComparisonBinary} filter Filter. * @param {ol.format.filter.ComparisonBinary} filter Filter.
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private
*/ */
WFS.writeComparisonFilter_ = function(node, filter, objectStack) { function writeComparisonFilter(node, filter, objectStack) {
if (filter.matchCase !== undefined) { if (filter.matchCase !== undefined) {
node.setAttribute('matchCase', filter.matchCase.toString()); node.setAttribute('matchCase', filter.matchCase.toString());
} }
WFS.writeOgcPropertyName_(node, filter.propertyName); writeOgcPropertyName(node, filter.propertyName);
WFS.writeOgcLiteral_(node, '' + filter.expression); writeOgcLiteral(node, '' + filter.expression);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {ol.format.filter.IsNull} filter Filter. * @param {ol.format.filter.IsNull} filter Filter.
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private
*/ */
WFS.writeIsNullFilter_ = function(node, filter, objectStack) { function writeIsNullFilter(node, filter, objectStack) {
WFS.writeOgcPropertyName_(node, filter.propertyName); writeOgcPropertyName(node, filter.propertyName);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {ol.format.filter.IsBetween} filter Filter. * @param {ol.format.filter.IsBetween} filter Filter.
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private
*/ */
WFS.writeIsBetweenFilter_ = function(node, filter, objectStack) { function writeIsBetweenFilter(node, filter, objectStack) {
WFS.writeOgcPropertyName_(node, filter.propertyName); writeOgcPropertyName(node, filter.propertyName);
const lowerBoundary = createElementNS(WFS.OGCNS, 'LowerBoundary'); const lowerBoundary = createElementNS(WFS.OGCNS, 'LowerBoundary');
node.appendChild(lowerBoundary); node.appendChild(lowerBoundary);
WFS.writeOgcLiteral_(lowerBoundary, '' + filter.lowerBoundary); writeOgcLiteral(lowerBoundary, '' + filter.lowerBoundary);
const upperBoundary = createElementNS(WFS.OGCNS, 'UpperBoundary'); const upperBoundary = createElementNS(WFS.OGCNS, 'UpperBoundary');
node.appendChild(upperBoundary); node.appendChild(upperBoundary);
WFS.writeOgcLiteral_(upperBoundary, '' + filter.upperBoundary); writeOgcLiteral(upperBoundary, '' + filter.upperBoundary);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {ol.format.filter.IsLike} filter Filter. * @param {ol.format.filter.IsLike} filter Filter.
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private
*/ */
WFS.writeIsLikeFilter_ = function(node, filter, objectStack) { function writeIsLikeFilter(node, filter, objectStack) {
node.setAttribute('wildCard', filter.wildCard); node.setAttribute('wildCard', filter.wildCard);
node.setAttribute('singleChar', filter.singleChar); node.setAttribute('singleChar', filter.singleChar);
node.setAttribute('escapeChar', filter.escapeChar); node.setAttribute('escapeChar', filter.escapeChar);
if (filter.matchCase !== undefined) { if (filter.matchCase !== undefined) {
node.setAttribute('matchCase', filter.matchCase.toString()); node.setAttribute('matchCase', filter.matchCase.toString());
} }
WFS.writeOgcPropertyName_(node, filter.propertyName); writeOgcPropertyName(node, filter.propertyName);
WFS.writeOgcLiteral_(node, '' + filter.pattern); writeOgcLiteral(node, '' + filter.pattern);
}; }
/** /**
* @param {string} tagName Tag name. * @param {string} tagName Tag name.
* @param {Node} node Node. * @param {Node} node Node.
* @param {string} value Value. * @param {string} value Value.
* @private
*/ */
WFS.writeOgcExpression_ = function(tagName, node, value) { function writeOgcExpression(tagName, node, value) {
const property = createElementNS(WFS.OGCNS, tagName); const property = createElementNS(WFS.OGCNS, tagName);
XSD.writeStringTextNode(property, value); XSD.writeStringTextNode(property, value);
node.appendChild(property); node.appendChild(property);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {string} value PropertyName value. * @param {string} value PropertyName value.
* @private
*/ */
WFS.writeOgcPropertyName_ = function(node, value) { function writeOgcPropertyName(node, value) {
WFS.writeOgcExpression_('PropertyName', node, value); writeOgcExpression('PropertyName', node, value);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {string} value PropertyName value. * @param {string} value PropertyName value.
* @private
*/ */
WFS.writeOgcLiteral_ = function(node, value) { function writeOgcLiteral(node, value) {
WFS.writeOgcExpression_('Literal', node, value); writeOgcExpression('Literal', node, value);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {string} time PropertyName value. * @param {string} time PropertyName value.
* @private
*/ */
WFS.writeTimeInstant_ = function(node, time) { function writeTimeInstant(node, time) {
const timeInstant = createElementNS(GMLBase.GMLNS, 'TimeInstant'); const timeInstant = createElementNS(GMLBase.GMLNS, 'TimeInstant');
node.appendChild(timeInstant); node.appendChild(timeInstant);
const timePosition = createElementNS(GMLBase.GMLNS, 'timePosition'); const timePosition = createElementNS(GMLBase.GMLNS, 'timePosition');
timeInstant.appendChild(timePosition); timeInstant.appendChild(timePosition);
XSD.writeStringTextNode(timePosition, time); XSD.writeStringTextNode(timePosition, time);
}; }
/**
* @type {Object.<string, Object.<string, ol.XmlSerializer>>}
* @private
*/
WFS.GETFEATURE_SERIALIZERS_ = {
'http://www.opengis.net/wfs': {
'Query': makeChildAppender(WFS.writeQuery_)
},
'http://www.opengis.net/ogc': {
'During': makeChildAppender(WFS.writeDuringFilter_),
'And': makeChildAppender(WFS.writeLogicalFilter_),
'Or': makeChildAppender(WFS.writeLogicalFilter_),
'Not': makeChildAppender(WFS.writeNotFilter_),
'BBOX': makeChildAppender(WFS.writeBboxFilter_),
'Contains': makeChildAppender(WFS.writeContainsFilter_),
'Intersects': makeChildAppender(WFS.writeIntersectsFilter_),
'Within': makeChildAppender(WFS.writeWithinFilter_),
'PropertyIsEqualTo': makeChildAppender(WFS.writeComparisonFilter_),
'PropertyIsNotEqualTo': makeChildAppender(WFS.writeComparisonFilter_),
'PropertyIsLessThan': makeChildAppender(WFS.writeComparisonFilter_),
'PropertyIsLessThanOrEqualTo': makeChildAppender(WFS.writeComparisonFilter_),
'PropertyIsGreaterThan': makeChildAppender(WFS.writeComparisonFilter_),
'PropertyIsGreaterThanOrEqualTo': makeChildAppender(WFS.writeComparisonFilter_),
'PropertyIsNull': makeChildAppender(WFS.writeIsNullFilter_),
'PropertyIsBetween': makeChildAppender(WFS.writeIsBetweenFilter_),
'PropertyIsLike': makeChildAppender(WFS.writeIsLikeFilter_)
}
};
/** /**
@@ -904,7 +869,7 @@ WFS.GETFEATURE_SERIALIZERS_ = {
*/ */
WFS.writeFilter = function(filter) { WFS.writeFilter = function(filter) {
const child = createElementNS(WFS.OGCNS, 'Filter'); const child = createElementNS(WFS.OGCNS, 'Filter');
WFS.writeFilterCondition_(child, filter, []); writeFilterCondition(child, filter, []);
return child; return child;
}; };
@@ -913,17 +878,16 @@ WFS.writeFilter = function(filter) {
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<string>} featureTypes Feature types. * @param {Array.<string>} featureTypes Feature types.
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private
*/ */
WFS.writeGetFeature_ = function(node, featureTypes, objectStack) { function writeGetFeature(node, featureTypes, objectStack) {
const context = /** @type {Object} */ (objectStack[objectStack.length - 1]); const context = /** @type {Object} */ (objectStack[objectStack.length - 1]);
const item = /** @type {ol.XmlNodeStackItem} */ (assign({}, context)); const item = /** @type {ol.XmlNodeStackItem} */ (assign({}, context));
item.node = node; item.node = node;
pushSerializeAndPop(item, pushSerializeAndPop(item,
WFS.GETFEATURE_SERIALIZERS_, GETFEATURE_SERIALIZERS,
makeSimpleNodeFactory('Query'), featureTypes, makeSimpleNodeFactory('Query'), featureTypes,
objectStack); objectStack);
}; }
/** /**
@@ -985,7 +949,7 @@ WFS.prototype.writeGetFeature = function(options) {
}; };
assert(Array.isArray(options.featureTypes), assert(Array.isArray(options.featureTypes),
11); // `options.featureTypes` should be an Array 11); // `options.featureTypes` should be an Array
WFS.writeGetFeature_(node, /** @type {!Array.<string>} */ (options.featureTypes), [context]); writeGetFeature(node, /** @type {!Array.<string>} */ (options.featureTypes), [context]);
return node; return node;
}; };
@@ -1028,7 +992,7 @@ WFS.prototype.writeTransaction = function(inserts, updates, deletes,
'gmlVersion': gmlVersion, 'hasZ': options.hasZ, 'srsName': options.srsName}; 'gmlVersion': gmlVersion, 'hasZ': options.hasZ, 'srsName': options.srsName};
assign(obj, baseObj); assign(obj, baseObj);
pushSerializeAndPop(obj, pushSerializeAndPop(obj,
WFS.TRANSACTION_SERIALIZERS_, TRANSACTION_SERIALIZERS,
makeSimpleNodeFactory('Insert'), inserts, makeSimpleNodeFactory('Insert'), inserts,
objectStack); objectStack);
} }
@@ -1038,7 +1002,7 @@ WFS.prototype.writeTransaction = function(inserts, updates, deletes,
'gmlVersion': gmlVersion, 'hasZ': options.hasZ, 'srsName': options.srsName}; 'gmlVersion': gmlVersion, 'hasZ': options.hasZ, 'srsName': options.srsName};
assign(obj, baseObj); assign(obj, baseObj);
pushSerializeAndPop(obj, pushSerializeAndPop(obj,
WFS.TRANSACTION_SERIALIZERS_, TRANSACTION_SERIALIZERS,
makeSimpleNodeFactory('Update'), updates, makeSimpleNodeFactory('Update'), updates,
objectStack); objectStack);
} }
@@ -1046,7 +1010,7 @@ WFS.prototype.writeTransaction = function(inserts, updates, deletes,
pushSerializeAndPop({node: node, 'featureNS': options.featureNS, pushSerializeAndPop({node: node, 'featureNS': options.featureNS,
'featureType': options.featureType, 'featurePrefix': featurePrefix, 'featureType': options.featureType, 'featurePrefix': featurePrefix,
'gmlVersion': gmlVersion, 'srsName': options.srsName}, 'gmlVersion': gmlVersion, 'srsName': options.srsName},
WFS.TRANSACTION_SERIALIZERS_, TRANSACTION_SERIALIZERS,
makeSimpleNodeFactory('Delete'), deletes, makeSimpleNodeFactory('Delete'), deletes,
objectStack); objectStack);
} }
@@ -1054,7 +1018,7 @@ WFS.prototype.writeTransaction = function(inserts, updates, deletes,
pushSerializeAndPop({node: node, 'featureNS': options.featureNS, pushSerializeAndPop({node: node, 'featureNS': options.featureNS,
'featureType': options.featureType, 'featurePrefix': featurePrefix, 'featureType': options.featureType, 'featurePrefix': featurePrefix,
'gmlVersion': gmlVersion, 'srsName': options.srsName}, 'gmlVersion': gmlVersion, 'srsName': options.srsName},
WFS.TRANSACTION_SERIALIZERS_, TRANSACTION_SERIALIZERS,
makeSimpleNodeFactory('Native'), options.nativeElements, makeSimpleNodeFactory('Native'), options.nativeElements,
objectStack); objectStack);
} }
+600 -612
View File
File diff suppressed because it is too large Load Diff
+302 -390
View File
@@ -8,6 +8,7 @@ import XSD from '../format/XSD.js';
import {makeArrayPusher, makeObjectPropertyPusher, makeObjectPropertySetter, import {makeArrayPusher, makeObjectPropertyPusher, makeObjectPropertySetter,
makeStructureNS, pushParseAndPop} from '../xml.js'; makeStructureNS, pushParseAndPop} from '../xml.js';
/** /**
* @classdesc * @classdesc
* Format for reading WMS capabilities data * Format for reading WMS capabilities data
@@ -29,6 +30,242 @@ const WMSCapabilities = function() {
inherits(WMSCapabilities, XML); inherits(WMSCapabilities, XML);
/**
* @const
* @type {Array.<string>}
*/
const NAMESPACE_URIS = [
null,
'http://www.opengis.net/wms'
];
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'Service': makeObjectPropertySetter(readService),
'Capability': makeObjectPropertySetter(readCapability)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const CAPABILITY_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'Request': makeObjectPropertySetter(readRequest),
'Exception': makeObjectPropertySetter(readException),
'Layer': makeObjectPropertySetter(readCapabilityLayer)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const SERVICE_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'Name': makeObjectPropertySetter(XSD.readString),
'Title': makeObjectPropertySetter(XSD.readString),
'Abstract': makeObjectPropertySetter(XSD.readString),
'KeywordList': makeObjectPropertySetter(readKeywordList),
'OnlineResource': makeObjectPropertySetter(XLink.readHref),
'ContactInformation': makeObjectPropertySetter(readContactInformation),
'Fees': makeObjectPropertySetter(XSD.readString),
'AccessConstraints': makeObjectPropertySetter(XSD.readString),
'LayerLimit': makeObjectPropertySetter(XSD.readNonNegativeInteger),
'MaxWidth': makeObjectPropertySetter(XSD.readNonNegativeInteger),
'MaxHeight': makeObjectPropertySetter(XSD.readNonNegativeInteger)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const CONTACT_INFORMATION_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'ContactPersonPrimary': makeObjectPropertySetter(readContactPersonPrimary),
'ContactPosition': makeObjectPropertySetter(XSD.readString),
'ContactAddress': makeObjectPropertySetter(readContactAddress),
'ContactVoiceTelephone': makeObjectPropertySetter(XSD.readString),
'ContactFacsimileTelephone': makeObjectPropertySetter(XSD.readString),
'ContactElectronicMailAddress': makeObjectPropertySetter(XSD.readString)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const CONTACT_PERSON_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'ContactPerson': makeObjectPropertySetter(XSD.readString),
'ContactOrganization': makeObjectPropertySetter(XSD.readString)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const CONTACT_ADDRESS_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'AddressType': makeObjectPropertySetter(XSD.readString),
'Address': makeObjectPropertySetter(XSD.readString),
'City': makeObjectPropertySetter(XSD.readString),
'StateOrProvince': makeObjectPropertySetter(XSD.readString),
'PostCode': makeObjectPropertySetter(XSD.readString),
'Country': makeObjectPropertySetter(XSD.readString)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const EXCEPTION_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'Format': makeArrayPusher(XSD.readString)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const LAYER_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'Name': makeObjectPropertySetter(XSD.readString),
'Title': makeObjectPropertySetter(XSD.readString),
'Abstract': makeObjectPropertySetter(XSD.readString),
'KeywordList': makeObjectPropertySetter(readKeywordList),
'CRS': makeObjectPropertyPusher(XSD.readString),
'EX_GeographicBoundingBox': makeObjectPropertySetter(readEXGeographicBoundingBox),
'BoundingBox': makeObjectPropertyPusher(readBoundingBox),
'Dimension': makeObjectPropertyPusher(readDimension),
'Attribution': makeObjectPropertySetter(readAttribution),
'AuthorityURL': makeObjectPropertyPusher(readAuthorityURL),
'Identifier': makeObjectPropertyPusher(XSD.readString),
'MetadataURL': makeObjectPropertyPusher(readMetadataURL),
'DataURL': makeObjectPropertyPusher(readFormatOnlineresource),
'FeatureListURL': makeObjectPropertyPusher(readFormatOnlineresource),
'Style': makeObjectPropertyPusher(readStyle),
'MinScaleDenominator': makeObjectPropertySetter(XSD.readDecimal),
'MaxScaleDenominator': makeObjectPropertySetter(XSD.readDecimal),
'Layer': makeObjectPropertyPusher(readLayer)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const ATTRIBUTION_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'Title': makeObjectPropertySetter(XSD.readString),
'OnlineResource': makeObjectPropertySetter(XLink.readHref),
'LogoURL': makeObjectPropertySetter(readSizedFormatOnlineresource)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const EX_GEOGRAPHIC_BOUNDING_BOX_PARSERS =
makeStructureNS(NAMESPACE_URIS, {
'westBoundLongitude': makeObjectPropertySetter(XSD.readDecimal),
'eastBoundLongitude': makeObjectPropertySetter(XSD.readDecimal),
'southBoundLatitude': makeObjectPropertySetter(XSD.readDecimal),
'northBoundLatitude': makeObjectPropertySetter(XSD.readDecimal)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const REQUEST_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'GetCapabilities': makeObjectPropertySetter(readOperationType),
'GetMap': makeObjectPropertySetter(readOperationType),
'GetFeatureInfo': makeObjectPropertySetter(readOperationType)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const OPERATIONTYPE_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'Format': makeObjectPropertyPusher(XSD.readString),
'DCPType': makeObjectPropertyPusher(readDCPType)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const DCPTYPE_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'HTTP': makeObjectPropertySetter(readHTTP)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const HTTP_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'Get': makeObjectPropertySetter(readFormatOnlineresource),
'Post': makeObjectPropertySetter(readFormatOnlineresource)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const STYLE_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'Name': makeObjectPropertySetter(XSD.readString),
'Title': makeObjectPropertySetter(XSD.readString),
'Abstract': makeObjectPropertySetter(XSD.readString),
'LegendURL': makeObjectPropertyPusher(readSizedFormatOnlineresource),
'StyleSheetURL': makeObjectPropertySetter(readFormatOnlineresource),
'StyleURL': makeObjectPropertySetter(readFormatOnlineresource)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const FORMAT_ONLINERESOURCE_PARSERS =
makeStructureNS(NAMESPACE_URIS, {
'Format': makeObjectPropertySetter(XSD.readString),
'OnlineResource': makeObjectPropertySetter(XLink.readHref)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const KEYWORDLIST_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'Keyword': makeArrayPusher(XSD.readString)
});
/** /**
* Read a WMS capabilities document. * Read a WMS capabilities document.
* *
@@ -60,30 +297,28 @@ WMSCapabilities.prototype.readFromNode = function(node) {
this.version = node.getAttribute('version').trim(); this.version = node.getAttribute('version').trim();
const wmsCapabilityObject = pushParseAndPop({ const wmsCapabilityObject = pushParseAndPop({
'version': this.version 'version': this.version
}, WMSCapabilities.PARSERS_, node, []); }, PARSERS, node, []);
return wmsCapabilityObject ? wmsCapabilityObject : null; return wmsCapabilityObject ? wmsCapabilityObject : null;
}; };
/** /**
* @private
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {Object|undefined} Attribution object. * @return {Object|undefined} Attribution object.
*/ */
WMSCapabilities.readAttribution_ = function(node, objectStack) { function readAttribution(node, objectStack) {
return pushParseAndPop( return pushParseAndPop(
{}, WMSCapabilities.ATTRIBUTION_PARSERS_, node, objectStack); {}, ATTRIBUTION_PARSERS, node, objectStack);
}; }
/** /**
* @private
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {Object} Bounding box object. * @return {Object} Bounding box object.
*/ */
WMSCapabilities.readBoundingBox_ = function(node, objectStack) { function readBoundingBox(node, objectStack) {
const extent = [ const extent = [
XSD.readDecimalString(node.getAttribute('minx')), XSD.readDecimalString(node.getAttribute('minx')),
XSD.readDecimalString(node.getAttribute('miny')), XSD.readDecimalString(node.getAttribute('miny')),
@@ -101,19 +336,18 @@ WMSCapabilities.readBoundingBox_ = function(node, objectStack) {
'extent': extent, 'extent': extent,
'res': resolutions 'res': resolutions
}; };
}; }
/** /**
* @private
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {ol.Extent|undefined} Bounding box object. * @return {ol.Extent|undefined} Bounding box object.
*/ */
WMSCapabilities.readEXGeographicBoundingBox_ = function(node, objectStack) { function readEXGeographicBoundingBox(node, objectStack) {
const geographicBoundingBox = pushParseAndPop( const geographicBoundingBox = pushParseAndPop(
{}, {},
WMSCapabilities.EX_GEOGRAPHIC_BOUNDING_BOX_PARSERS_, EX_GEOGRAPHIC_BOUNDING_BOX_PARSERS,
node, objectStack); node, objectStack);
if (!geographicBoundingBox) { if (!geographicBoundingBox) {
return undefined; return undefined;
@@ -134,108 +368,100 @@ WMSCapabilities.readEXGeographicBoundingBox_ = function(node, objectStack) {
westBoundLongitude, southBoundLatitude, westBoundLongitude, southBoundLatitude,
eastBoundLongitude, northBoundLatitude eastBoundLongitude, northBoundLatitude
]; ];
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @private
* @return {Object|undefined} Capability object. * @return {Object|undefined} Capability object.
*/ */
WMSCapabilities.readCapability_ = function(node, objectStack) { function readCapability(node, objectStack) {
return pushParseAndPop( return pushParseAndPop(
{}, WMSCapabilities.CAPABILITY_PARSERS_, node, objectStack); {}, CAPABILITY_PARSERS, node, objectStack);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @private
* @return {Object|undefined} Service object. * @return {Object|undefined} Service object.
*/ */
WMSCapabilities.readService_ = function(node, objectStack) { function readService(node, objectStack) {
return pushParseAndPop( return pushParseAndPop(
{}, WMSCapabilities.SERVICE_PARSERS_, node, objectStack); {}, SERVICE_PARSERS, node, objectStack);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @private
* @return {Object|undefined} Contact information object. * @return {Object|undefined} Contact information object.
*/ */
WMSCapabilities.readContactInformation_ = function(node, objectStack) { function readContactInformation(node, objectStack) {
return pushParseAndPop( return pushParseAndPop(
{}, WMSCapabilities.CONTACT_INFORMATION_PARSERS_, {}, CONTACT_INFORMATION_PARSERS,
node, objectStack); node, objectStack);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @private
* @return {Object|undefined} Contact person object. * @return {Object|undefined} Contact person object.
*/ */
WMSCapabilities.readContactPersonPrimary_ = function(node, objectStack) { function readContactPersonPrimary(node, objectStack) {
return pushParseAndPop( return pushParseAndPop(
{}, WMSCapabilities.CONTACT_PERSON_PARSERS_, {}, CONTACT_PERSON_PARSERS,
node, objectStack); node, objectStack);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @private
* @return {Object|undefined} Contact address object. * @return {Object|undefined} Contact address object.
*/ */
WMSCapabilities.readContactAddress_ = function(node, objectStack) { function readContactAddress(node, objectStack) {
return pushParseAndPop( return pushParseAndPop(
{}, WMSCapabilities.CONTACT_ADDRESS_PARSERS_, {}, CONTACT_ADDRESS_PARSERS,
node, objectStack); node, objectStack);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @private
* @return {Array.<string>|undefined} Format array. * @return {Array.<string>|undefined} Format array.
*/ */
WMSCapabilities.readException_ = function(node, objectStack) { function readException(node, objectStack) {
return pushParseAndPop( return pushParseAndPop(
[], WMSCapabilities.EXCEPTION_PARSERS_, node, objectStack); [], EXCEPTION_PARSERS, node, objectStack);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @private
* @return {Object|undefined} Layer object. * @return {Object|undefined} Layer object.
*/ */
WMSCapabilities.readCapabilityLayer_ = function(node, objectStack) { function readCapabilityLayer(node, objectStack) {
return pushParseAndPop( return pushParseAndPop(
{}, WMSCapabilities.LAYER_PARSERS_, node, objectStack); {}, LAYER_PARSERS, node, objectStack);
}; }
/** /**
* @private
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {Object|undefined} Layer object. * @return {Object|undefined} Layer object.
*/ */
WMSCapabilities.readLayer_ = function(node, objectStack) { function readLayer(node, objectStack) {
const parentLayerObject = /** @type {Object.<string,*>} */ const parentLayerObject = /** @type {Object.<string,*>} */
(objectStack[objectStack.length - 1]); (objectStack[objectStack.length - 1]);
const layerObject = pushParseAndPop( const layerObject = pushParseAndPop(
{}, WMSCapabilities.LAYER_PARSERS_, node, objectStack); {}, LAYER_PARSERS, node, objectStack);
if (!layerObject) { if (!layerObject) {
return undefined; return undefined;
@@ -300,16 +526,15 @@ WMSCapabilities.readLayer_ = function(node, objectStack) {
}); });
return layerObject; return layerObject;
}; }
/** /**
* @private
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {Object} Dimension object. * @return {Object} Dimension object.
*/ */
WMSCapabilities.readDimension_ = function(node, objectStack) { function readDimension(node, objectStack) {
const dimensionObject = { const dimensionObject = {
'name': node.getAttribute('name'), 'name': node.getAttribute('name'),
'units': node.getAttribute('units'), 'units': node.getAttribute('units'),
@@ -323,79 +548,73 @@ WMSCapabilities.readDimension_ = function(node, objectStack) {
'values': XSD.readString(node) 'values': XSD.readString(node)
}; };
return dimensionObject; return dimensionObject;
}; }
/** /**
* @private
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {Object|undefined} Online resource object. * @return {Object|undefined} Online resource object.
*/ */
WMSCapabilities.readFormatOnlineresource_ = function(node, objectStack) { function readFormatOnlineresource(node, objectStack) {
return pushParseAndPop( return pushParseAndPop(
{}, WMSCapabilities.FORMAT_ONLINERESOURCE_PARSERS_, {}, FORMAT_ONLINERESOURCE_PARSERS,
node, objectStack); node, objectStack);
}; }
/** /**
* @private
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {Object|undefined} Request object. * @return {Object|undefined} Request object.
*/ */
WMSCapabilities.readRequest_ = function(node, objectStack) { function readRequest(node, objectStack) {
return pushParseAndPop( return pushParseAndPop(
{}, WMSCapabilities.REQUEST_PARSERS_, node, objectStack); {}, REQUEST_PARSERS, node, objectStack);
}; }
/** /**
* @private
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {Object|undefined} DCP type object. * @return {Object|undefined} DCP type object.
*/ */
WMSCapabilities.readDCPType_ = function(node, objectStack) { function readDCPType(node, objectStack) {
return pushParseAndPop( return pushParseAndPop(
{}, WMSCapabilities.DCPTYPE_PARSERS_, node, objectStack); {}, DCPTYPE_PARSERS, node, objectStack);
}; }
/** /**
* @private
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {Object|undefined} HTTP object. * @return {Object|undefined} HTTP object.
*/ */
WMSCapabilities.readHTTP_ = function(node, objectStack) { function readHTTP(node, objectStack) {
return pushParseAndPop( return pushParseAndPop(
{}, WMSCapabilities.HTTP_PARSERS_, node, objectStack); {}, HTTP_PARSERS, node, objectStack);
}; }
/** /**
* @private
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {Object|undefined} Operation type object. * @return {Object|undefined} Operation type object.
*/ */
WMSCapabilities.readOperationType_ = function(node, objectStack) { function readOperationType(node, objectStack) {
return pushParseAndPop( return pushParseAndPop(
{}, WMSCapabilities.OPERATIONTYPE_PARSERS_, node, objectStack); {}, OPERATIONTYPE_PARSERS, node, objectStack);
}; }
/** /**
* @private
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {Object|undefined} Online resource object. * @return {Object|undefined} Online resource object.
*/ */
WMSCapabilities.readSizedFormatOnlineresource_ = function(node, objectStack) { function readSizedFormatOnlineresource(node, objectStack) {
const formatOnlineresource = const formatOnlineresource =
WMSCapabilities.readFormatOnlineresource_(node, objectStack); readFormatOnlineresource(node, objectStack);
if (formatOnlineresource) { if (formatOnlineresource) {
const size = [ const size = [
XSD.readNonNegativeIntegerString(node.getAttribute('width')), XSD.readNonNegativeIntegerString(node.getAttribute('width')),
@@ -405,368 +624,61 @@ WMSCapabilities.readSizedFormatOnlineresource_ = function(node, objectStack) {
return formatOnlineresource; return formatOnlineresource;
} }
return undefined; return undefined;
}; }
/** /**
* @private
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {Object|undefined} Authority URL object. * @return {Object|undefined} Authority URL object.
*/ */
WMSCapabilities.readAuthorityURL_ = function(node, objectStack) { function readAuthorityURL(node, objectStack) {
const authorityObject = const authorityObject =
WMSCapabilities.readFormatOnlineresource_(node, objectStack); readFormatOnlineresource(node, objectStack);
if (authorityObject) { if (authorityObject) {
authorityObject['name'] = node.getAttribute('name'); authorityObject['name'] = node.getAttribute('name');
return authorityObject; return authorityObject;
} }
return undefined; return undefined;
}; }
/** /**
* @private
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {Object|undefined} Metadata URL object. * @return {Object|undefined} Metadata URL object.
*/ */
WMSCapabilities.readMetadataURL_ = function(node, objectStack) { function readMetadataURL(node, objectStack) {
const metadataObject = const metadataObject =
WMSCapabilities.readFormatOnlineresource_(node, objectStack); readFormatOnlineresource(node, objectStack);
if (metadataObject) { if (metadataObject) {
metadataObject['type'] = node.getAttribute('type'); metadataObject['type'] = node.getAttribute('type');
return metadataObject; return metadataObject;
} }
return undefined; return undefined;
}; }
/** /**
* @private
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {Object|undefined} Style object. * @return {Object|undefined} Style object.
*/ */
WMSCapabilities.readStyle_ = function(node, objectStack) { function readStyle(node, objectStack) {
return pushParseAndPop( return pushParseAndPop(
{}, WMSCapabilities.STYLE_PARSERS_, node, objectStack); {}, STYLE_PARSERS, node, objectStack);
}; }
/** /**
* @private
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {Array.<string>|undefined} Keyword list. * @return {Array.<string>|undefined} Keyword list.
*/ */
WMSCapabilities.readKeywordList_ = function(node, objectStack) { function readKeywordList(node, objectStack) {
return pushParseAndPop( return pushParseAndPop(
[], WMSCapabilities.KEYWORDLIST_PARSERS_, node, objectStack); [], KEYWORDLIST_PARSERS, node, objectStack);
}; }
/**
* @const
* @private
* @type {Array.<string>}
*/
WMSCapabilities.NAMESPACE_URIS_ = [
null,
'http://www.opengis.net/wms'
];
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
WMSCapabilities.PARSERS_ = makeStructureNS(
WMSCapabilities.NAMESPACE_URIS_, {
'Service': makeObjectPropertySetter(
WMSCapabilities.readService_),
'Capability': makeObjectPropertySetter(
WMSCapabilities.readCapability_)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
WMSCapabilities.CAPABILITY_PARSERS_ = makeStructureNS(
WMSCapabilities.NAMESPACE_URIS_, {
'Request': makeObjectPropertySetter(
WMSCapabilities.readRequest_),
'Exception': makeObjectPropertySetter(
WMSCapabilities.readException_),
'Layer': makeObjectPropertySetter(
WMSCapabilities.readCapabilityLayer_)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
WMSCapabilities.SERVICE_PARSERS_ = makeStructureNS(
WMSCapabilities.NAMESPACE_URIS_, {
'Name': makeObjectPropertySetter(XSD.readString),
'Title': makeObjectPropertySetter(XSD.readString),
'Abstract': makeObjectPropertySetter(XSD.readString),
'KeywordList': makeObjectPropertySetter(
WMSCapabilities.readKeywordList_),
'OnlineResource': makeObjectPropertySetter(
XLink.readHref),
'ContactInformation': makeObjectPropertySetter(
WMSCapabilities.readContactInformation_),
'Fees': makeObjectPropertySetter(XSD.readString),
'AccessConstraints': makeObjectPropertySetter(
XSD.readString),
'LayerLimit': makeObjectPropertySetter(
XSD.readNonNegativeInteger),
'MaxWidth': makeObjectPropertySetter(
XSD.readNonNegativeInteger),
'MaxHeight': makeObjectPropertySetter(
XSD.readNonNegativeInteger)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
WMSCapabilities.CONTACT_INFORMATION_PARSERS_ = makeStructureNS(
WMSCapabilities.NAMESPACE_URIS_, {
'ContactPersonPrimary': makeObjectPropertySetter(
WMSCapabilities.readContactPersonPrimary_),
'ContactPosition': makeObjectPropertySetter(
XSD.readString),
'ContactAddress': makeObjectPropertySetter(
WMSCapabilities.readContactAddress_),
'ContactVoiceTelephone': makeObjectPropertySetter(
XSD.readString),
'ContactFacsimileTelephone': makeObjectPropertySetter(
XSD.readString),
'ContactElectronicMailAddress': makeObjectPropertySetter(
XSD.readString)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
WMSCapabilities.CONTACT_PERSON_PARSERS_ = makeStructureNS(
WMSCapabilities.NAMESPACE_URIS_, {
'ContactPerson': makeObjectPropertySetter(
XSD.readString),
'ContactOrganization': makeObjectPropertySetter(
XSD.readString)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
WMSCapabilities.CONTACT_ADDRESS_PARSERS_ = makeStructureNS(
WMSCapabilities.NAMESPACE_URIS_, {
'AddressType': makeObjectPropertySetter(XSD.readString),
'Address': makeObjectPropertySetter(XSD.readString),
'City': makeObjectPropertySetter(XSD.readString),
'StateOrProvince': makeObjectPropertySetter(
XSD.readString),
'PostCode': makeObjectPropertySetter(XSD.readString),
'Country': makeObjectPropertySetter(XSD.readString)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
WMSCapabilities.EXCEPTION_PARSERS_ = makeStructureNS(
WMSCapabilities.NAMESPACE_URIS_, {
'Format': makeArrayPusher(XSD.readString)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
WMSCapabilities.LAYER_PARSERS_ = makeStructureNS(
WMSCapabilities.NAMESPACE_URIS_, {
'Name': makeObjectPropertySetter(XSD.readString),
'Title': makeObjectPropertySetter(XSD.readString),
'Abstract': makeObjectPropertySetter(XSD.readString),
'KeywordList': makeObjectPropertySetter(
WMSCapabilities.readKeywordList_),
'CRS': makeObjectPropertyPusher(XSD.readString),
'EX_GeographicBoundingBox': makeObjectPropertySetter(
WMSCapabilities.readEXGeographicBoundingBox_),
'BoundingBox': makeObjectPropertyPusher(
WMSCapabilities.readBoundingBox_),
'Dimension': makeObjectPropertyPusher(
WMSCapabilities.readDimension_),
'Attribution': makeObjectPropertySetter(
WMSCapabilities.readAttribution_),
'AuthorityURL': makeObjectPropertyPusher(
WMSCapabilities.readAuthorityURL_),
'Identifier': makeObjectPropertyPusher(XSD.readString),
'MetadataURL': makeObjectPropertyPusher(
WMSCapabilities.readMetadataURL_),
'DataURL': makeObjectPropertyPusher(
WMSCapabilities.readFormatOnlineresource_),
'FeatureListURL': makeObjectPropertyPusher(
WMSCapabilities.readFormatOnlineresource_),
'Style': makeObjectPropertyPusher(
WMSCapabilities.readStyle_),
'MinScaleDenominator': makeObjectPropertySetter(
XSD.readDecimal),
'MaxScaleDenominator': makeObjectPropertySetter(
XSD.readDecimal),
'Layer': makeObjectPropertyPusher(
WMSCapabilities.readLayer_)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
WMSCapabilities.ATTRIBUTION_PARSERS_ = makeStructureNS(
WMSCapabilities.NAMESPACE_URIS_, {
'Title': makeObjectPropertySetter(XSD.readString),
'OnlineResource': makeObjectPropertySetter(
XLink.readHref),
'LogoURL': makeObjectPropertySetter(
WMSCapabilities.readSizedFormatOnlineresource_)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
WMSCapabilities.EX_GEOGRAPHIC_BOUNDING_BOX_PARSERS_ =
makeStructureNS(WMSCapabilities.NAMESPACE_URIS_, {
'westBoundLongitude': makeObjectPropertySetter(
XSD.readDecimal),
'eastBoundLongitude': makeObjectPropertySetter(
XSD.readDecimal),
'southBoundLatitude': makeObjectPropertySetter(
XSD.readDecimal),
'northBoundLatitude': makeObjectPropertySetter(
XSD.readDecimal)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
WMSCapabilities.REQUEST_PARSERS_ = makeStructureNS(
WMSCapabilities.NAMESPACE_URIS_, {
'GetCapabilities': makeObjectPropertySetter(
WMSCapabilities.readOperationType_),
'GetMap': makeObjectPropertySetter(
WMSCapabilities.readOperationType_),
'GetFeatureInfo': makeObjectPropertySetter(
WMSCapabilities.readOperationType_)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
WMSCapabilities.OPERATIONTYPE_PARSERS_ = makeStructureNS(
WMSCapabilities.NAMESPACE_URIS_, {
'Format': makeObjectPropertyPusher(XSD.readString),
'DCPType': makeObjectPropertyPusher(
WMSCapabilities.readDCPType_)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
WMSCapabilities.DCPTYPE_PARSERS_ = makeStructureNS(
WMSCapabilities.NAMESPACE_URIS_, {
'HTTP': makeObjectPropertySetter(
WMSCapabilities.readHTTP_)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
WMSCapabilities.HTTP_PARSERS_ = makeStructureNS(
WMSCapabilities.NAMESPACE_URIS_, {
'Get': makeObjectPropertySetter(
WMSCapabilities.readFormatOnlineresource_),
'Post': makeObjectPropertySetter(
WMSCapabilities.readFormatOnlineresource_)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
WMSCapabilities.STYLE_PARSERS_ = makeStructureNS(
WMSCapabilities.NAMESPACE_URIS_, {
'Name': makeObjectPropertySetter(XSD.readString),
'Title': makeObjectPropertySetter(XSD.readString),
'Abstract': makeObjectPropertySetter(XSD.readString),
'LegendURL': makeObjectPropertyPusher(
WMSCapabilities.readSizedFormatOnlineresource_),
'StyleSheetURL': makeObjectPropertySetter(
WMSCapabilities.readFormatOnlineresource_),
'StyleURL': makeObjectPropertySetter(
WMSCapabilities.readFormatOnlineresource_)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
WMSCapabilities.FORMAT_ONLINERESOURCE_PARSERS_ =
makeStructureNS(WMSCapabilities.NAMESPACE_URIS_, {
'Format': makeObjectPropertySetter(XSD.readString),
'OnlineResource': makeObjectPropertySetter(
XLink.readHref)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
WMSCapabilities.KEYWORDLIST_PARSERS_ = makeStructureNS(
WMSCapabilities.NAMESPACE_URIS_, {
'Keyword': makeArrayPusher(XSD.readString)
});
export default WMSCapabilities; export default WMSCapabilities;
+4 -6
View File
@@ -51,17 +51,15 @@ inherits(WMSGetFeatureInfo, XMLFeature);
/** /**
* @const * @const
* @type {string} * @type {string}
* @private
*/ */
WMSGetFeatureInfo.featureIdentifier_ = '_feature'; const featureIdentifier = '_feature';
/** /**
* @const * @const
* @type {string} * @type {string}
* @private
*/ */
WMSGetFeatureInfo.layerIdentifier_ = '_layer'; const layerIdentifier = '_layer';
/** /**
@@ -102,7 +100,7 @@ WMSGetFeatureInfo.prototype.readFeatures_ = function(node, objectStack) {
} }
const context = objectStack[0]; const context = objectStack[0];
const toRemove = WMSGetFeatureInfo.layerIdentifier_; const toRemove = layerIdentifier;
const layerName = layer.localName.replace(toRemove, ''); const layerName = layer.localName.replace(toRemove, '');
if (this.layers_ && !includes(this.layers_, layerName)) { if (this.layers_ && !includes(this.layers_, layerName)) {
@@ -110,7 +108,7 @@ WMSGetFeatureInfo.prototype.readFeatures_ = function(node, objectStack) {
} }
const featureType = layerName + const featureType = layerName +
WMSGetFeatureInfo.featureIdentifier_; featureIdentifier;
context['featureType'] = featureType; context['featureType'] = featureType;
context['featureNS'] = this.featureNS_; context['featureNS'] = this.featureNS_;
+199 -262
View File
@@ -31,6 +31,168 @@ const WMTSCapabilities = function() {
inherits(WMTSCapabilities, XML); inherits(WMTSCapabilities, XML);
/**
* @const
* @type {Array.<string>}
*/
const NAMESPACE_URIS = [
null,
'http://www.opengis.net/wmts/1.0'
];
/**
* @const
* @type {Array.<string>}
*/
const OWS_NAMESPACE_URIS = [
null,
'http://www.opengis.net/ows/1.1'
];
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'Contents': makeObjectPropertySetter(readContents)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const CONTENTS_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'Layer': makeObjectPropertyPusher(readLayer),
'TileMatrixSet': makeObjectPropertyPusher(readTileMatrixSet)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const LAYER_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'Style': makeObjectPropertyPusher(readStyle),
'Format': makeObjectPropertyPusher(XSD.readString),
'TileMatrixSetLink': makeObjectPropertyPusher(readTileMatrixSetLink),
'Dimension': makeObjectPropertyPusher(readDimensions),
'ResourceURL': makeObjectPropertyPusher(readResourceUrl)
}, makeStructureNS(OWS_NAMESPACE_URIS, {
'Title': makeObjectPropertySetter(XSD.readString),
'Abstract': makeObjectPropertySetter(XSD.readString),
'WGS84BoundingBox': makeObjectPropertySetter(readWgs84BoundingBox),
'Identifier': makeObjectPropertySetter(XSD.readString)
}));
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const STYLE_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'LegendURL': makeObjectPropertyPusher(readLegendUrl)
}, makeStructureNS(OWS_NAMESPACE_URIS, {
'Title': makeObjectPropertySetter(XSD.readString),
'Identifier': makeObjectPropertySetter(XSD.readString)
}));
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const TMS_LINKS_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'TileMatrixSet': makeObjectPropertySetter(XSD.readString),
'TileMatrixSetLimits': makeObjectPropertySetter(readTileMatrixLimitsList)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const TMS_LIMITS_LIST_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'TileMatrixLimits': makeArrayPusher(readTileMatrixLimits)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const TMS_LIMITS_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'TileMatrix': makeObjectPropertySetter(XSD.readString),
'MinTileRow': makeObjectPropertySetter(XSD.readNonNegativeInteger),
'MaxTileRow': makeObjectPropertySetter(XSD.readNonNegativeInteger),
'MinTileCol': makeObjectPropertySetter(XSD.readNonNegativeInteger),
'MaxTileCol': makeObjectPropertySetter(XSD.readNonNegativeInteger)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const DIMENSION_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'Default': makeObjectPropertySetter(XSD.readString),
'Value': makeObjectPropertyPusher(XSD.readString)
}, makeStructureNS(OWS_NAMESPACE_URIS, {
'Identifier': makeObjectPropertySetter(XSD.readString)
}));
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const WGS84_BBOX_READERS = makeStructureNS(
OWS_NAMESPACE_URIS, {
'LowerCorner': makeArrayPusher(readCoordinates),
'UpperCorner': makeArrayPusher(readCoordinates)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const TMS_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'WellKnownScaleSet': makeObjectPropertySetter(XSD.readString),
'TileMatrix': makeObjectPropertyPusher(readTileMatrix)
}, makeStructureNS(OWS_NAMESPACE_URIS, {
'SupportedCRS': makeObjectPropertySetter(XSD.readString),
'Identifier': makeObjectPropertySetter(XSD.readString)
}));
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
*/
const TM_PARSERS = makeStructureNS(
NAMESPACE_URIS, {
'TopLeftCorner': makeObjectPropertySetter(readCoordinates),
'ScaleDenominator': makeObjectPropertySetter(XSD.readDecimal),
'TileWidth': makeObjectPropertySetter(XSD.readNonNegativeInteger),
'TileHeight': makeObjectPropertySetter(XSD.readNonNegativeInteger),
'MatrixWidth': makeObjectPropertySetter(XSD.readNonNegativeInteger),
'MatrixHeight': makeObjectPropertySetter(XSD.readNonNegativeInteger)
}, makeStructureNS(OWS_NAMESPACE_URIS, {
'Identifier': makeObjectPropertySetter(XSD.readString)
}));
/** /**
* Read a WMTS capabilities document. * Read a WMTS capabilities document.
* *
@@ -66,56 +228,52 @@ WMTSCapabilities.prototype.readFromNode = function(node) {
} }
WMTSCapabilityObject['version'] = version; WMTSCapabilityObject['version'] = version;
WMTSCapabilityObject = pushParseAndPop(WMTSCapabilityObject, WMTSCapabilityObject = pushParseAndPop(WMTSCapabilityObject,
WMTSCapabilities.PARSERS_, node, []); PARSERS, node, []);
return WMTSCapabilityObject ? WMTSCapabilityObject : null; return WMTSCapabilityObject ? WMTSCapabilityObject : null;
}; };
/** /**
* @private
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {Object|undefined} Attribution object. * @return {Object|undefined} Attribution object.
*/ */
WMTSCapabilities.readContents_ = function(node, objectStack) { function readContents(node, objectStack) {
return pushParseAndPop({}, return pushParseAndPop({},
WMTSCapabilities.CONTENTS_PARSERS_, node, objectStack); CONTENTS_PARSERS, node, objectStack);
}; }
/** /**
* @private
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {Object|undefined} Layers object. * @return {Object|undefined} Layers object.
*/ */
WMTSCapabilities.readLayer_ = function(node, objectStack) { function readLayer(node, objectStack) {
return pushParseAndPop({}, return pushParseAndPop({},
WMTSCapabilities.LAYER_PARSERS_, node, objectStack); LAYER_PARSERS, node, objectStack);
}; }
/** /**
* @private
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {Object|undefined} Tile Matrix Set object. * @return {Object|undefined} Tile Matrix Set object.
*/ */
WMTSCapabilities.readTileMatrixSet_ = function(node, objectStack) { function readTileMatrixSet(node, objectStack) {
return pushParseAndPop({}, return pushParseAndPop({},
WMTSCapabilities.TMS_PARSERS_, node, objectStack); TMS_PARSERS, node, objectStack);
}; }
/** /**
* @private
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {Object|undefined} Style object. * @return {Object|undefined} Style object.
*/ */
WMTSCapabilities.readStyle_ = function(node, objectStack) { function readStyle(node, objectStack) {
const style = pushParseAndPop({}, const style = pushParseAndPop({},
WMTSCapabilities.STYLE_PARSERS_, node, objectStack); STYLE_PARSERS, node, objectStack);
if (!style) { if (!style) {
return undefined; return undefined;
} }
@@ -123,41 +281,38 @@ WMTSCapabilities.readStyle_ = function(node, objectStack) {
style['isDefault'] = isDefault; style['isDefault'] = isDefault;
return style; return style;
}; }
/** /**
* @private
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {Object|undefined} Tile Matrix Set Link object. * @return {Object|undefined} Tile Matrix Set Link object.
*/ */
WMTSCapabilities.readTileMatrixSetLink_ = function(node, function readTileMatrixSetLink(node,
objectStack) { objectStack) {
return pushParseAndPop({}, return pushParseAndPop({},
WMTSCapabilities.TMS_LINKS_PARSERS_, node, objectStack); TMS_LINKS_PARSERS, node, objectStack);
}; }
/** /**
* @private
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {Object|undefined} Dimension object. * @return {Object|undefined} Dimension object.
*/ */
WMTSCapabilities.readDimensions_ = function(node, objectStack) { function readDimensions(node, objectStack) {
return pushParseAndPop({}, return pushParseAndPop({},
WMTSCapabilities.DIMENSION_PARSERS_, node, objectStack); DIMENSION_PARSERS, node, objectStack);
}; }
/** /**
* @private
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {Object|undefined} Resource URL object. * @return {Object|undefined} Resource URL object.
*/ */
WMTSCapabilities.readResourceUrl_ = function(node, objectStack) { function readResourceUrl(node, objectStack) {
const format = node.getAttribute('format'); const format = node.getAttribute('format');
const template = node.getAttribute('template'); const template = node.getAttribute('template');
const resourceType = node.getAttribute('resourceType'); const resourceType = node.getAttribute('resourceType');
@@ -172,46 +327,43 @@ WMTSCapabilities.readResourceUrl_ = function(node, objectStack) {
resource['resourceType'] = resourceType; resource['resourceType'] = resourceType;
} }
return resource; return resource;
}; }
/** /**
* @private
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {Object|undefined} WGS84 BBox object. * @return {Object|undefined} WGS84 BBox object.
*/ */
WMTSCapabilities.readWgs84BoundingBox_ = function(node, objectStack) { function readWgs84BoundingBox(node, objectStack) {
const coordinates = pushParseAndPop([], const coordinates = pushParseAndPop([],
WMTSCapabilities.WGS84_BBOX_READERS_, node, objectStack); WGS84_BBOX_READERS, node, objectStack);
if (coordinates.length != 2) { if (coordinates.length != 2) {
return undefined; return undefined;
} }
return boundingExtent(coordinates); return boundingExtent(coordinates);
}; }
/** /**
* @private
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {Object|undefined} Legend object. * @return {Object|undefined} Legend object.
*/ */
WMTSCapabilities.readLegendUrl_ = function(node, objectStack) { function readLegendUrl(node, objectStack) {
const legend = {}; const legend = {};
legend['format'] = node.getAttribute('format'); legend['format'] = node.getAttribute('format');
legend['href'] = XLink.readHref(node); legend['href'] = XLink.readHref(node);
return legend; return legend;
}; }
/** /**
* @private
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {Object|undefined} Coordinates object. * @return {Object|undefined} Coordinates object.
*/ */
WMTSCapabilities.readCoordinates_ = function(node, objectStack) { function readCoordinates(node, objectStack) {
const coordinates = XSD.readString(node).split(' '); const coordinates = XSD.readString(node).split(' ');
if (!coordinates || coordinates.length != 2) { if (!coordinates || coordinates.length != 2) {
return undefined; return undefined;
@@ -222,257 +374,42 @@ WMTSCapabilities.readCoordinates_ = function(node, objectStack) {
return undefined; return undefined;
} }
return [x, y]; return [x, y];
}; }
/** /**
* @private
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {Object|undefined} TileMatrix object. * @return {Object|undefined} TileMatrix object.
*/ */
WMTSCapabilities.readTileMatrix_ = function(node, objectStack) { function readTileMatrix(node, objectStack) {
return pushParseAndPop({}, return pushParseAndPop({},
WMTSCapabilities.TM_PARSERS_, node, objectStack); TM_PARSERS, node, objectStack);
}; }
/** /**
* @private
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {Object|undefined} TileMatrixSetLimits Object. * @return {Object|undefined} TileMatrixSetLimits Object.
*/ */
WMTSCapabilities.readTileMatrixLimitsList_ = function(node, function readTileMatrixLimitsList(node,
objectStack) { objectStack) {
return pushParseAndPop([], return pushParseAndPop([],
WMTSCapabilities.TMS_LIMITS_LIST_PARSERS_, node, TMS_LIMITS_LIST_PARSERS, node,
objectStack); objectStack);
}; }
/** /**
* @private
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {Object|undefined} TileMatrixLimits Array. * @return {Object|undefined} TileMatrixLimits Array.
*/ */
WMTSCapabilities.readTileMatrixLimits_ = function(node, objectStack) { function readTileMatrixLimits(node, objectStack) {
return pushParseAndPop({}, return pushParseAndPop({},
WMTSCapabilities.TMS_LIMITS_PARSERS_, node, objectStack); TMS_LIMITS_PARSERS, node, objectStack);
}; }
/**
* @const
* @private
* @type {Array.<string>}
*/
WMTSCapabilities.NAMESPACE_URIS_ = [
null,
'http://www.opengis.net/wmts/1.0'
];
/**
* @const
* @private
* @type {Array.<string>}
*/
WMTSCapabilities.OWS_NAMESPACE_URIS_ = [
null,
'http://www.opengis.net/ows/1.1'
];
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
WMTSCapabilities.PARSERS_ = makeStructureNS(
WMTSCapabilities.NAMESPACE_URIS_, {
'Contents': makeObjectPropertySetter(
WMTSCapabilities.readContents_)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
WMTSCapabilities.CONTENTS_PARSERS_ = makeStructureNS(
WMTSCapabilities.NAMESPACE_URIS_, {
'Layer': makeObjectPropertyPusher(
WMTSCapabilities.readLayer_),
'TileMatrixSet': makeObjectPropertyPusher(
WMTSCapabilities.readTileMatrixSet_)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
WMTSCapabilities.LAYER_PARSERS_ = makeStructureNS(
WMTSCapabilities.NAMESPACE_URIS_, {
'Style': makeObjectPropertyPusher(
WMTSCapabilities.readStyle_),
'Format': makeObjectPropertyPusher(
XSD.readString),
'TileMatrixSetLink': makeObjectPropertyPusher(
WMTSCapabilities.readTileMatrixSetLink_),
'Dimension': makeObjectPropertyPusher(
WMTSCapabilities.readDimensions_),
'ResourceURL': makeObjectPropertyPusher(
WMTSCapabilities.readResourceUrl_)
}, makeStructureNS(WMTSCapabilities.OWS_NAMESPACE_URIS_, {
'Title': makeObjectPropertySetter(
XSD.readString),
'Abstract': makeObjectPropertySetter(
XSD.readString),
'WGS84BoundingBox': makeObjectPropertySetter(
WMTSCapabilities.readWgs84BoundingBox_),
'Identifier': makeObjectPropertySetter(
XSD.readString)
}));
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
WMTSCapabilities.STYLE_PARSERS_ = makeStructureNS(
WMTSCapabilities.NAMESPACE_URIS_, {
'LegendURL': makeObjectPropertyPusher(
WMTSCapabilities.readLegendUrl_)
}, makeStructureNS(WMTSCapabilities.OWS_NAMESPACE_URIS_, {
'Title': makeObjectPropertySetter(
XSD.readString),
'Identifier': makeObjectPropertySetter(
XSD.readString)
}));
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
WMTSCapabilities.TMS_LINKS_PARSERS_ = makeStructureNS(
WMTSCapabilities.NAMESPACE_URIS_, {
'TileMatrixSet': makeObjectPropertySetter(
XSD.readString),
'TileMatrixSetLimits': makeObjectPropertySetter(
WMTSCapabilities.readTileMatrixLimitsList_)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
WMTSCapabilities.TMS_LIMITS_LIST_PARSERS_ = makeStructureNS(
WMTSCapabilities.NAMESPACE_URIS_, {
'TileMatrixLimits': makeArrayPusher(
WMTSCapabilities.readTileMatrixLimits_)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
WMTSCapabilities.TMS_LIMITS_PARSERS_ = makeStructureNS(
WMTSCapabilities.NAMESPACE_URIS_, {
'TileMatrix': makeObjectPropertySetter(
XSD.readString),
'MinTileRow': makeObjectPropertySetter(
XSD.readNonNegativeInteger),
'MaxTileRow': makeObjectPropertySetter(
XSD.readNonNegativeInteger),
'MinTileCol': makeObjectPropertySetter(
XSD.readNonNegativeInteger),
'MaxTileCol': makeObjectPropertySetter(
XSD.readNonNegativeInteger)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
WMTSCapabilities.DIMENSION_PARSERS_ = makeStructureNS(
WMTSCapabilities.NAMESPACE_URIS_, {
'Default': makeObjectPropertySetter(
XSD.readString),
'Value': makeObjectPropertyPusher(
XSD.readString)
}, makeStructureNS(WMTSCapabilities.OWS_NAMESPACE_URIS_, {
'Identifier': makeObjectPropertySetter(
XSD.readString)
}));
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
WMTSCapabilities.WGS84_BBOX_READERS_ = makeStructureNS(
WMTSCapabilities.OWS_NAMESPACE_URIS_, {
'LowerCorner': makeArrayPusher(
WMTSCapabilities.readCoordinates_),
'UpperCorner': makeArrayPusher(
WMTSCapabilities.readCoordinates_)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
WMTSCapabilities.TMS_PARSERS_ = makeStructureNS(
WMTSCapabilities.NAMESPACE_URIS_, {
'WellKnownScaleSet': makeObjectPropertySetter(
XSD.readString),
'TileMatrix': makeObjectPropertyPusher(
WMTSCapabilities.readTileMatrix_)
}, makeStructureNS(WMTSCapabilities.OWS_NAMESPACE_URIS_, {
'SupportedCRS': makeObjectPropertySetter(
XSD.readString),
'Identifier': makeObjectPropertySetter(
XSD.readString)
}));
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
WMTSCapabilities.TM_PARSERS_ = makeStructureNS(
WMTSCapabilities.NAMESPACE_URIS_, {
'TopLeftCorner': makeObjectPropertySetter(
WMTSCapabilities.readCoordinates_),
'ScaleDenominator': makeObjectPropertySetter(
XSD.readDecimal),
'TileWidth': makeObjectPropertySetter(
XSD.readNonNegativeInteger),
'TileHeight': makeObjectPropertySetter(
XSD.readNonNegativeInteger),
'MatrixWidth': makeObjectPropertySetter(
XSD.readNonNegativeInteger),
'MatrixHeight': makeObjectPropertySetter(
XSD.readNonNegativeInteger)
}, makeStructureNS(WMTSCapabilities.OWS_NAMESPACE_URIS_, {
'Identifier': makeObjectPropertySetter(
XSD.readString)
}));
export default WMTSCapabilities; export default WMTSCapabilities;
+4 -12
View File
@@ -103,13 +103,11 @@ describe('ol.format.MVT', function() {
name: 'layer1' name: 'layer1'
} }
}; };
const readRawGeometry_ = MVT.readRawGeometry_; format.readRawGeometry_ = function({}, rawFeature, flatCoordinates, ends) {
MVT.readRawGeometry_ = function({}, rawFeature, flatCoordinates, ends) {
flatCoordinates.push(0, 0); flatCoordinates.push(0, 0);
ends.push(2); ends.push(2);
}; };
const feature = format.createFeature_({}, rawFeature); const feature = format.createFeature_({}, rawFeature);
MVT.readRawGeometry_ = readRawGeometry_;
const geometry = feature.getGeometry(); const geometry = feature.getGeometry();
expect(geometry).to.be.a(Point); expect(geometry).to.be.a(Point);
expect(feature.get('myGeom')).to.equal(geometry); expect(feature.get('myGeom')).to.equal(geometry);
@@ -127,14 +125,12 @@ describe('ol.format.MVT', function() {
name: 'layer1' name: 'layer1'
} }
}; };
const readRawGeometry_ = MVT.readRawGeometry_; format.readRawGeometry_ = function({}, rawFeature, flatCoordinates, ends) {
MVT.readRawGeometry_ = function({}, rawFeature, flatCoordinates, ends) {
flatCoordinates.push(0, 0, 3, 0, 3, 3, 3, 0, 0, 0); flatCoordinates.push(0, 0, 3, 0, 3, 3, 3, 0, 0, 0);
flatCoordinates.push(1, 1, 1, 2, 2, 2, 2, 1, 1, 1); flatCoordinates.push(1, 1, 1, 2, 2, 2, 2, 1, 1, 1);
ends.push(10, 20); ends.push(10, 20);
}; };
const feature = format.createFeature_({}, rawFeature); const feature = format.createFeature_({}, rawFeature);
MVT.readRawGeometry_ = readRawGeometry_;
const geometry = feature.getGeometry(); const geometry = feature.getGeometry();
expect(geometry).to.be.a(Polygon); expect(geometry).to.be.a(Polygon);
}); });
@@ -150,14 +146,12 @@ describe('ol.format.MVT', function() {
name: 'layer1' name: 'layer1'
} }
}; };
const readRawGeometry_ = MVT.readRawGeometry_; format.readRawGeometry_ = function({}, rawFeature, flatCoordinates, ends) {
MVT.readRawGeometry_ = function({}, rawFeature, flatCoordinates, ends) {
flatCoordinates.push(0, 0, 1, 0, 1, 1, 1, 0, 0, 0); flatCoordinates.push(0, 0, 1, 0, 1, 1, 1, 0, 0, 0);
flatCoordinates.push(1, 1, 2, 1, 2, 2, 2, 1, 1, 1); flatCoordinates.push(1, 1, 2, 1, 2, 2, 2, 1, 1, 1);
ends.push(10, 20); ends.push(10, 20);
}; };
const feature = format.createFeature_({}, rawFeature); const feature = format.createFeature_({}, rawFeature);
MVT.readRawGeometry_ = readRawGeometry_;
const geometry = feature.getGeometry(); const geometry = feature.getGeometry();
expect(geometry).to.be.a(MultiPolygon); expect(geometry).to.be.a(MultiPolygon);
}); });
@@ -173,10 +167,9 @@ describe('ol.format.MVT', function() {
name: 'layer1' name: 'layer1'
} }
}; };
const readRawGeometry_ = MVT.readRawGeometry_;
let createdFlatCoordinates; let createdFlatCoordinates;
let createdEnds; let createdEnds;
MVT.readRawGeometry_ = function({}, rawFeature, flatCoordinates, ends) { format.readRawGeometry_ = function({}, rawFeature, flatCoordinates, ends) {
flatCoordinates.push(0, 0, 1, 0, 1, 1, 1, 0, 0, 0); flatCoordinates.push(0, 0, 1, 0, 1, 1, 1, 0, 0, 0);
flatCoordinates.push(1, 1, 2, 1, 2, 2, 2, 1, 1, 1); flatCoordinates.push(1, 1, 2, 1, 2, 2, 2, 1, 1, 1);
createdFlatCoordinates = flatCoordinates; createdFlatCoordinates = flatCoordinates;
@@ -184,7 +177,6 @@ describe('ol.format.MVT', function() {
createdEnds = ends; createdEnds = ends;
}; };
const feature = format.createFeature_({}, rawFeature); const feature = format.createFeature_({}, rawFeature);
MVT.readRawGeometry_ = readRawGeometry_;
expect(feature).to.be.a(RenderFeature); expect(feature).to.be.a(RenderFeature);
expect(feature.getType()).to.be('Polygon'); expect(feature.getType()).to.be('Polygon');
expect(feature.getFlatCoordinates()).to.equal(createdFlatCoordinates); expect(feature.getFlatCoordinates()).to.equal(createdFlatCoordinates);