geoportal-access-lib
Version:
French Geoportal resources access library
392 lines (362 loc) • 16.1 kB
JavaScript
/**
* Fonction retournant un objet contenant des clés de lecture (readers)
* qui permettent de parser des réponses XML du service Altimétrique du Géoportail
* (calcul altimétrique simple ou profil altimétrique d'une courbe),
* lorsque le paramètre output = xml,
* afin de récupérer les élévations retournées.
*
* @module AltiResponseReader
* @alias Gp.Services.Alti.Formats.AltiResponseReader
* @private
*/
// import Logger from "../../../Utils/LoggerByDefault";
import AltiResponse from "../Response/model/AltiResponse";
import Elevation from "../Response/model/Elevation";
import Measure from "../Response/model/Measure";
/**
*
* Objet AltiResponseReader
*
* @member {Object} AltiResponseReader
*
* @property {Object} AltiResponseReader.READERS - Objet contenant des fonctions de lecture, appelées "readers"
* dont chaque clé correspond au nom d'un tag du XML que l'on souhaite lire
* et la valeur associée est une fonction (node, data)
* où node est un noeud du document DOM
* et data est un objet où l'on stocke les informations lues dans le XML.
*
* @property {Method} AltiResponseReader.READERS.elevations - Lecture d'un noeud "elevations" de la réponse XML
* du service alti, correspondant logiquement à la racine du document
* (contient un ou plusieurs childNodes correspondant chacun à une élévation retournée)
*
* @property {Method} AltiResponseReader.READERS.elevation - Lecture d'un noeud "elevation" de la réponse xml du service alti.
* (contient un ou 4 childNode (s) correspondant à l'altitude (z) et éventuellement lat, lon, et acc)
*
* @property {Method} AltiResponseReader.READERS.lat - Lecture d'un noeud "lat" de la réponse xml du service alti.
* (contient une valeur de latitude, qui est un flottant)
*
* @property {Method} AltiResponseReader.READERS.lon - Lecture d'un noeud "lon" de la réponse xml du service alti.
* (contient une valeur de longitude, qui est un flottant)
*
* @property {Method} AltiResponseReader.READERS.z - Lecture d'un noeud "z" de la réponse xml du service alti.
* (contient une valeur d'altitude, qui est un flottant)
*
* @property {Method} AltiResponseReader.READERS.acc - Lecture d'un noeud "acc" de la réponse xml du service alti.
* (contient une valeur de précision, qui est un flottant)
*
* @property {Method} AltiResponseReader.READERS.measures - Lecture d'un noeud "measures" de la réponse xml du service alti.
* (contient une valeur de précision, qui est un flottant)
*
* @property {Method} AltiResponseReader.READERS.source_name - Lecture d'un noeud "source_name" de la réponse xml du service alti.
* (pour remplir l'éventuel objet measure)
*
* @property {Method} AltiResponseReader.READERS.source_mesure - Lecture d'un noeud "source_mesure" de la réponse xml du service alti.
* (pour remplir l'éventuel objet measure)
*
* @property {Method} AltiResponseReader.READERS.exceptionreport - Lecture d'un noeud "ExceptionReport" de la réponse xml du service alti.
*
* @property {Method} AltiResponseReader.READERS.exception - Lecture d'un noeud "Exception" de la réponse xml du service alti.
*
* @property {Method} AltiResponseReader.read - Méthode permettant de lancer la lecture d'une réponse XML du service altimétrique,
* à l'aide des readers de la classe.
*
*/
var AltiResponseReader = {};
AltiResponseReader.READERS = {
/**
* Lecture d'un noeud "elevations" de la réponse XML du service alti, correspondant logiquement à la racine du document
* (contient un ou plusieurs childNodes correspondant chacun à une élévation retournée)
*
* @param {DOMElement} root - racine de la réponse XML
* @static
* @memberof AltiResponseReader
* @returns {Object} Retourne un objet de type AltiResponse
*/
elevations : function (root) {
// INFO : on passe en paramètre l'objet en entrée elevations, vide, à remplir.
var altiResponse = new AltiResponse();
if (root.hasChildNodes()) {
var children = root.childNodes;
var child;
var elevation;
for (var i = 0; i < children.length; i++) {
child = children[i];
if (AltiResponseReader.READERS[child.nodeName]) {
elevation = AltiResponseReader.READERS[child.nodeName](child);
altiResponse.elevations.push(elevation);
}
}
}
return altiResponse;
},
/**
* Lecture d'un noeud "elevation" de la réponse xml du service alti.
* (contient un ou 5 childNode (s) correspondant à l'altitude (z) et éventuellement lat, lon, acc et measures)
*
* @param {DOMElement} node - noeud elevation à lire pour récupérer les informations de l'élévation retournée (z [, lon, lat, acc, measures])
* @return {Array} elevationResponse - format de la réponse en sortie, instance de AltiResponse
* @static
* @memberof AltiResponseReader
*/
elevation : function (node) {
var elevation = new Elevation();
if (node.hasChildNodes()) {
var children = node.childNodes;
var child;
for (var i = 0; i < children.length; i++) {
child = children[i];
if (AltiResponseReader.READERS[child.nodeName]) {
// INFO : on passe en paramètre l'objet en entrée elevation, vide, à remplir.
AltiResponseReader.READERS[child.nodeName](child, elevation);
}
}
}
return elevation;
},
/**
* Lecture d'un noeud "lat" de la réponse xml du service alti.
* (contient une valeur de latitude, qui est un flottant)
*
* @param {DOMElement} node - noeud à lire pour récupérer la latitude
* @param {Object} elevation - objet dans lequel stocker la latitude retournée
* @static
* @memberof AltiResponseReader
*/
lat : function (node, elevation) {
var textNode = node.firstChild;
if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE
elevation.lat = parseFloat(textNode.nodeValue);
} else {
throw new Error("Erreur dans la lecture de la réponse du service : latitude attendue mais absente");
}
},
/**
* Lecture d'un noeud "lon" de la réponse xml du service alti.
* (contient une valeur de longitude, qui est un flottant)
*
* @param {DOMElement} node - noeud à lire pour récupérer la longitude
* @param {Object} elevation - objet dans lequel stocker la longitude retournée
* @static
* @memberof AltiResponseReader
*/
lon : function (node, elevation) {
var textNode = node.firstChild;
if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE
elevation.lon = parseFloat(textNode.nodeValue);
} else {
throw new Error("Erreur dans la lecture de la réponse du service : longitude attendue mais absente");
}
},
/**
* Lecture d'un noeud "z" de la réponse xml du service alti.
* (contient une valeur d'altitude, qui est un flottant)
*
* @param {DOMElement} node - noeud à lire pour récupérer l'altitude
* @param {Object} elevationObject - objet dans lequel stocker l'altitude retournée : elevation ou measure
* @static
* @memberof AltiResponseReader
*/
z : function (node, elevationObject) {
var textNode = node.firstChild;
if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE
if (elevationObject) {
elevationObject.z = parseFloat(textNode.nodeValue);
} else {
elevationObject = new Elevation();
elevationObject.z = parseFloat(textNode.nodeValue);
return elevationObject;
}
} else {
throw new Error("Erreur dans la lecture de la réponse du service : altitude attendue mais absente");
}
},
/**
* Lecture d'un noeud "acc" de la réponse xml du service alti.
* (contient une valeur de précision, qui est un flottant)
*
* @param {DOMElement} node - noeud à lire pour récupérer la précision
* @param {Object} elevationObject - objet dans lequel stocker la précision retournée : elevation ou measure
* @static
* @memberof AltiResponseReader
*/
acc : function (node, elevationObject) {
var textNode = node.firstChild;
if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE
elevationObject.acc = parseFloat(textNode.nodeValue);
} else {
throw new Error("Erreur dans la lecture de la réponse du service : précision (acc) attendue mais absente");
}
},
/**
* Lecture d'un noeud "source_name" de la réponse xml du service alti.
* (contient le nom de la source, qui est un string)
*
* @param {DOMElement} node - noeud à lire pour récupérer la précision
* @param {Object} measure - objet dans lequel stocker le nom de la source retourné
* @static
* @memberof AltiResponseReader
*/
source_name : function (node, measure) {
var textNode = node.firstChild;
if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE
measure.source_name = textNode.nodeValue;
} else {
throw new Error("Erreur dans la lecture de la réponse du service : source_name attendue mais absente");
}
},
/**
* Lecture d'un noeud "source_measure" de la réponse xml du service alti.
* (contient le nom de la mesure, qui est un string)
*
* @param {DOMElement} node - noeud à lire pour récupérer la précision
* @param {Object} measure - objet dans lequel stocker le nom de la source retourné
* @static
* @memberof AltiResponseReader
*/
source_measure : function (node, measure) {
var textNode = node.firstChild;
if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE
measure.source_measure = textNode.nodeValue;
} else {
throw new Error("Erreur dans la lecture de la réponse du service : source_measure attendue mais absente");
}
},
/**
* Lecture d'un noeud "measures" et de ses enfants "measure" de la réponse xml du service alti.
* (contient une valeur de précision, qui est un flottant)
*
* @param {DOMElement} node - noeud à lire pour récupérer la précision
* @param {Object} elevation - objet dans lequel stocker la précision retournée
* @static
* @memberof AltiResponseReader
*/
measures : function (node, elevation) {
elevation.measures = [];
var measure;
if (node.hasChildNodes()) {
var children = node.childNodes;
var measureNode;
var measureChildren;
for (var i = 0; i < children.length; i++) {
measure = new Measure();
measureNode = children[i];
measureChildren = measureNode.childNodes;
for (var j = 0; j < measureChildren.length; j++) {
if (AltiResponseReader.READERS[measureChildren[j].nodeName]) {
// INFO : on passe en paramètre l'objet en entrée elevation, vide, à remplir.
AltiResponseReader.READERS[measureChildren[j].nodeName](measureChildren[j], measure);
} else {
throw new Error("Erreur dans la lecture de la réponse du service : measures attendues mais absentes");
}
}
elevation.measures.push(measure);
}
}
},
/**
* Lecture d'un noeud "ExceptionReport" de la réponse xml du service alti.
*
* @param {DOMElement} node - noeud à lire pour récupérer l'exception
* @return {Object} exceptionReport - objet contenant l'exception
* @static
* @memberof AltiResponseReader
*/
exceptionreport : function (node) {
var response = {};
if (node.hasChildNodes()) {
var children = node.childNodes;
var child;
for (var i = 0; i < children.length; i++) {
child = children[i];
if (child.nodeName === "Exception") {
response.exceptionReport = AltiResponseReader.READERS.exception(child);
}
}
}
return response;
},
/**
* Lecture d'un noeud "Exception" de la réponse xml du service alti.
*
* @param {DOMElement} node - noeud à lire pour récupérer l'exception
* @return {Object} exceptionReport - objet contenant l'exception, avec deux attributs :
* {String} exceptionReport.exceptionCode - qui contient l'identifiant du code de l'exception
* {String} exceptionReport.exception - qui contient le message de l'exception
* @static
* @memberof AltiResponseReader
*/
exception : function (node) {
var exceptionReport = {};
// get exception code
var exceptionCode = node.getAttribute("exceptionCode");
if (exceptionCode) {
exceptionReport.exceptionCode = exceptionCode;
}
// get exception message
var textNode = node.firstChild;
if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE
exceptionReport.exception = textNode.nodeValue;
}
return exceptionReport;
},
/**
* Lecture d'un noeud "Error" de la réponse xml du service alti.
*
* @param {DOMElement} node - noeud à lire pour récupérer l'exception
* @return {Object} error - objet contenant l'exception
* @static
*/
error : function (node) {
var response = {
error : {}
};
// get error code and description
if (node.hasChildNodes()) {
var children = node.childNodes;
var child;
for (var i = 0; i < children.length; i++) {
child = children[i];
var textNode;
// get error code
if (child.nodeType === 1 && child.nodeName === "code") { // 1 === node.ELEMENT_NODE
textNode = child.firstChild;
if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE
response.error.code = textNode.nodeValue;
}
}
// get error description
if (child.nodeType === 1 && child.nodeName === "description") { // 1 === node.ELEMENT_NODE
textNode = child.firstChild;
if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE
response.error.description = textNode.nodeValue;
}
}
}
}
return response;
}
};
/**
* Méthode permettant de lancer la lecture d'une réponse XML du service altimétrique,
* à l'aide des readers de la classe.
*
* @method AltiResponseReader.read
* @param {DOMElement} root - racine de la réponse XML à lire
* @static
* @memberof AltiResponseReader
*/
AltiResponseReader.read = function (root) {
if (root.nodeName === "elevations") {
var altiResponse = AltiResponseReader.READERS.elevations(root);
return altiResponse;
} else if (root.nodeName === "ExceptionReport") {
var exceptionReport = AltiResponseReader.READERS.exceptionreport(root);
return exceptionReport;
} else if (root.nodeName === "error") {
var error = AltiResponseReader.READERS.error(root);
return error;
} else {
throw new Error("Erreur lors de la lecture de la réponse : elle n'est pas au format attendu.");
}
};
export default AltiResponseReader;