Retour à la documentation
define([
'dojo/_base/declare',
'dojo/_base/lang',
'dojo/_base/Color',
'spw/api/MapService',
'esri/layers/FeatureLayer',
'esri/request',
'esri/geometry/Point',
'esri/renderers/SimpleRenderer',
'esri/symbols/SimpleFillSymbol',
'esri/symbols/SimpleLineSymbol',
'esri/InfoTemplate',
'esri/layers/Field'
],
function(declare, lang, Color, MapService, FeatureLayer, esriRequest, Point,
SimpleRenderer, SimpleFillSymbol, SimpleLineSymbol, InfoTemplate,
Field) {
/**
* @class spw.api.StatMapService
* @classdesc Service du viewer permettant d'afficher des données statistiques
* @extends {spw.api.MapService}
*/
var StatMapService = declare('spw.api.StatMapService', [MapService], /** @lends spw.api.StatMapService.prototype */ {
/**
* Contient les données à prendre en compte lors du calcul du statLayer
*/
statLayerData: null,
/**
* Url du layer contenant les données liée au statLayer.
*/
dataLayerUrl: null,
/**
* Le layer contenant les données liée au statLayer.
*/
dataLayer: null,
/**
* Crée le layer Esri sur base de la configuration du MapService.
*/
createMapLayer: function() {
this.layer = new FeatureLayer(this.get('repartitionUrl'), {
mode: FeatureLayer.MODE_SNAPSHOT,
outFields: ["*"],
visible: true,
opacity: 0
});
this.layer.on("load", lang.hitch(this, function() {
var field = new Field({
name:"DATA_COUNT",
alias:"DataCount",
type:"esriFieldTypeInteger"
});
this.layer.fields.push(field);
if(this.get('dataLayerUrl')) {
this.dataLayer = new FeatureLayer(
this.get('dataLayerUrl'), {
//id: this.get('serviceId'),
mode: FeatureLayer.MODE_SNAPSHOT,
outFields: ["*"],
visible: true,
opacity: 0
});
this.spwMap.esriMap.addLayer(this.dataLayer);
this.dataLayer.on("update-end", lang.hitch(this, function() {
this.statLayerData = this.dataLayer.graphics;
this.refreshStatLayer();
}));
}
else if(this.get('dataObject')) {
var dataObject = this.get('dataObject');
esriRequest({
url: dataObject.url,//content: { f: "json" },
handleAs: dataObject.format/*,callbackParamName: "callback"*/
}).then(lang.hitch(this, function(data) {
if(data.evaluate) {
this.statLayerData = [];
var xRes = data.evaluate(dataObject.xCoordinatePath, data);
var yRes = data.evaluate(dataObject.yCoordinatePath, data);
var xResVal=xRes.iterateNext(), yResVal=yRes.iterateNext();
while(xResVal && yResVal) {
var pt = ProjectionManager.getInstance().transform(dataObject.srId,
this.spwMap.esriMap.spatialReference.wkid,
parseFloat(xResVal.innerHTML.replace(',', '.')),
parseFloat(yResVal.innerHTML.replace(',', '.')));
this.statLayerData.push({
geometry: new Point(pt.x, pt.y, this.spwMap.esriMap.spatialReference)
});
xResVal = xRes.iterateNext();
yResVal = yRes.iterateNext();
}
this.refreshStatLayer();
}
}), lang.hitch(this, function(){
// show error ?
}));
}
}));
},
/**
* Rafraîchit le layer
*/
refreshStatLayer: function(){
if(this.layer.graphics && this.layer.graphics == 0) {
var handler = this.layer.on('update-end', lang.hitch(this, function() {
handler.remove();
this.statLayerUpdateEnd();
}));
} else {
this.statLayerUpdateEnd();
}
},
/**
* Appelé après un update sur le service
*/
statLayerUpdateEnd: function() {
this.layer.setVisibility(false);
var features = this.layer.graphics;
var maxCount = 0;
var minCount = null;
array.forEach(features, lang.hitch(this, function(feature) {
var count = 0;
array.forEach(this.statLayerData, lang.hitch(this, function(data) {
if(feature.geometry.contains(data.geometry)){
++count;
}
}));
if(count > maxCount) {
maxCount = count;
}
if(minCount == null || count < minCount) {
minCount = count;
}
feature.attributes["DATA_COUNT"] = count;
}));
if(this.get('infoTemplate')) {
this.layer.setInfoTemplate(
new InfoTemplate(this.get('infoTemplate').title, this.get('infoTemplate').content));
}
if(this.get('renderer')){
var r = lang.mixin({ }, this.get('renderer'));
var renderer = new SimpleRenderer(new SimpleFillSymbol().setOutline(new SimpleLineSymbol().setWidth(0.5)));
lang.mixin(renderer, {label:r.title, description:r.description});
renderer.setColorInfo({
field: "DATA_COUNT",
minDataValue: minCount,
maxDataValue: maxCount,
colors: [
new Color(r.color1),
new Color(r.color2)
]
});
this.layer.setRenderer(renderer);
}
this.layer.redraw();
this.layer.setVisibility(true);
this.layerLoaded({
layer: this.layer
});
},
/**
* Ajoute le layer à la carte esri
*/
addToMap: function(esriMap) {
esriMap.addLayer(this.get('layer'));
},
/**
* Retire le layer de la carte esri
*/
removeFromMap: function(esriMap) {
if(this.dataLayer){
esriMap.removeLayer(this.dataLayer);
this.dataLayer = null;
}
},
/**
* Appelé lorsque le layer est chargé (nécessaire car il s'agit d'un FeatureLayer)
*/
layerLoaded: function(loadedEvent) {
var l = {};
for(var k in loadedEvent.layer) {
if (typeof(loadedEvent.layer[k]) !== 'function') {
l[k] = loadedEvent.layer[k];
}
}
this._mergeLayerInfo(lang.mixin(l, {
parentLayerId: -1,
id: loadedEvent.layer.layerId
}));
this._afterLayerLoaded();
}
});
return StatMapService;
});