Source: api/StatMapService.js

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;

});