geoportal-access-lib
Version:
French Geoportal resources access library
227 lines (198 loc) • 7.07 kB
JavaScript
import Logger from "../../../Utils/LoggerByDefault";
import Address from "./model/Address";
import GeocodeFilterExtension from "./GeocodeFilterExtension";
/**
* @classdesc
* Requête de geocodage direct
*
* ```
* XSD
* Geocodage direct (balise xsd) :
* element ref="RequestHeader" [ (attribute name="clientName" attribute name="clientPassword" attribute name="sessionID" attribute name="srsName" attribute name="MSID") ]
* element name="Request" attribute name="methodName" attribute name="version" attribute name="requestID" [ attribute name="maximumResponses" ]
* element name="GeocodeRequest" attribute name="returnFreeForm"
* element ref="xls:Address"
* ```
*
* @example
* // creation de l'objet Geocode an ajoutant un objet Address
* req = new GeocodeRequest ();
* req.returnFreeForm = true; // TODO !
* req.addAddress (new Address ({
* location : "saint mandé",
* type : ['PositionOfInterest'],
* filter : {
* (...)
* }
* }));
* req.toString();
* // out ->
* // <GeocodeRequest>
* // <Address countryCode="PositionOfInterest">
* // <freeFormAddress>saint mandé</freeFormAddress>
* // </Address>
* // </GeocodeRequest>
*
* // creation de l'objet Geocode avec les options uniquement
* req = new GeocodeRequest ({
* location : "saint mandé",
* returnFreeForm : true,
* filterOptions : {
* type : ['PositionOfInterest'],
* (...)
* }
* });
* req.toString();
* // out ->
* // <GeocodeRequest>
* // <Address countryCode="PositionOfInterest">
* // <freeFormAddress>saint mandé</freeFormAddress>
* // </Address>
* // </GeocodeRequest>
* @constructor
*
* @alias Gp.Formats.XLS.LocationUtilityService.GeocodeRequest
* @param {Object} options - options
* @param {Object} options.location - location
* @param {String} options.returnFreeForm - returnFreeForm
* @param {String} options.filterOptions - filtres
* @param {Function} options.onsuccess - function callback success (TODO)
* @param {Function} options.onerror - function callback error (TODO)
*
* @private
*/
function GeocodeRequest (options) {
this.logger = Logger.getLogger();
this.logger.trace("[Constructeur GeocodeRequest ()]");
if (!(this instanceof GeocodeRequest)) {
throw new TypeError("GeocodeRequest constructor cannot be called as a function.");
}
// options par defaut
this.options = options || {};
// et on ajoute les options en paramètre aux options par défaut
for (var opt in options) {
if (options.hasOwnProperty(opt)) {
this.options[opt] = options[opt];
}
}
// TODO
// gestion de l'option 'returnFreeForm' si elle n'est pas renseignée dans les options !
/**
* Nom de la classe (heritage)
*/
this.CLASSNAME = "GeocodeRequest";
}
GeocodeRequest.prototype = {
/**
* @lends module:GeocodeRequest#
*/
/**
* request (out)
* @type {String}
*/
strRequest : null,
/**
* Addresse
* @type {Address}
*/
oAddress : null,
/**
* Filter
* @type {GeocodeFilterExtension}
*/
oFilter : null,
/**
* Template de la requête.
* substitution des valeurs suivantes :
* __ADDRESS__, __RETURNFREEFORM__
*/
template : "<GeocodeRequest returnFreeForm=\"__RETURNFREEFORM__\">" +
"__ADDRESS__" +
"</GeocodeRequest>",
/**
* Ajout d'un objet de type Adresse
*
* @param {Object} oAddress - Adresse
*/
addAddress : function (oAddress) {
if (oAddress instanceof Address) {
this.oAddress = oAddress;
}
},
/**
* Ajout d'un objet de type GeocodeFilterExtension
*
* @param {Object} oFilter - GeocodeFilterExtension
*/
addFilter : function (oFilter) {
// FIXME gestion des filtres à partir des tables de geocodages
if (oFilter instanceof GeocodeFilterExtension) {
this.oFilter = oFilter;
}
},
/**
* Constructeur (alias)
*/
constructor : GeocodeRequest,
/**
* toString
*
* @returns {String} requête
*/
toString : function () {
var template = "";
template = this.template;
// soit on a déjà un objet Address instancié,
// sinon, on le fabrique via les options
if (!this.oAddress) {
var settings = {};
settings.location = this.options.location;
settings.type = this.options.filterOptions.type || ["StreetAddress"];
settings.filter = this.options.filterOptions;
delete settings.filter.type; // on ne met pas le 'type' dans les filtres...
// gestion des filtres
if (this.oFilter) {
// on reconstruit les filtres
settings.filter = {};
// on determine la liste des filtres possibles
// pour chaque table de geocodage en param
for (var idx in settings.type) {
var filter = settings.type[idx];
var oFilter = this.oFilter.getFilter(filter);
if (!oFilter) {
this.logger.warn("Le filtre '" + filter + "' n'existe pas !?");
continue;
}
var mFilter = this.options.filterOptions;
// correspondances des attributs de filtres possibles avec ceux qui sont en options
var attributs = oFilter.attributesList;
for (var idxe = 0; idxe < attributs.length; idxe++) {
var key = attributs[idxe];
if (mFilter[key]) {
var matchingKey = oFilter.serviceAttributes[idxe];
oFilter.placeAttributes[matchingKey] = mFilter[key];
this.logger.trace("Selection du filtre '" + key + "' sur le type '" + filter + "'.");
}
}
// ajout des valeurs des filtres
var places = oFilter.placeAttributes;
for (var kplace in places) {
if (places.hasOwnProperty(kplace)) {
settings.filter[kplace] = places[kplace];
}
}
}
}
this.oAddress = new Address(settings);
if (!this.oAddress) {
throw new Error("La construction de l'adresse n'est pas correctement definie !?");
}
}
// FIXME gestion des filtres pour un objet Address déjà instancié ?
template = template.replace(/__ADDRESS__/g, this.oAddress.toString());
template = template.replace(/__RETURNFREEFORM__/g, (this.options.returnFreeForm) ? "true" : "false");
this.strRequest = template;
return this.strRequest;
}
};
export default GeocodeRequest;