diff src/djol/IdentificationTool.js @ 8:f0035923ff3e

добавлена библиотека для работы с openlayers 3+
author cin
date Mon, 21 Aug 2017 17:47:00 +0300
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/djol/IdentificationTool.js	Mon Aug 21 17:47:00 2017 +0300
@@ -0,0 +1,246 @@
+define([
+        "dijit/layout/ContentPane",
+        "dojo/_base/declare",
+        "dojo/Deferred",
+        "dojo/dom-construct",
+        "dojo/dom-class",
+        "dojo/on",
+        "dojo/promise/all",
+        "dojo/when",
+        "implab/safe",
+        "ol",
+        "./listen",
+        "./IdentifyGroup",
+        "./_ToolBase",
+        "./PopupContainer"
+    ],
+
+    function (
+        ContentPane,
+        declare,
+        Deffered,
+        domConstruct,
+        domClass,
+        on,
+        promiseAll,
+        when,
+        safe,
+        ol,
+        listen,
+        IdentifyGroup,
+        _ToolBase,
+        PopupContainer) {
+        return declare([_ToolBase], {
+            /**
+             * массив обработчиков openLayers, которые необходимо удалить при
+             * деактивации
+             */
+            _handlers: null,
+            /**
+             * widget карты
+             */
+            _map: null,
+            /**
+             * openLayers map
+             */
+            _olMap: null,
+            /**
+             * Массив overlays содержащих popupContainers
+             */
+            _popupOverlays: null,
+            /**
+             * Массив popups контейнеров
+             */
+            _popupContainers: null,
+            /**
+             * Режим работы инструмента идентификации
+             * 
+             * @value {String} "single"||"multiple"
+             */
+            mode: null,
+            /**
+             * Режимы
+             */
+            appManager: null,
+
+            constructor: function (options) {
+                safe.argumentNotNull(options, "options");
+                safe.argumentNotNull(options.map, "options.map");
+                safe.argumentNotNull(options.appManager, "options.appManager");
+
+                this._map = options.map;
+                this._olMap = options.map.olMap;
+                this._popupContainers = [];
+                this._popupOverlays = [];
+                this._handlers = [];
+
+                this.appManager = options.appManager;
+                this.mode = options.mode || "single";
+            },
+            /** 
+             */
+            createPopupContent: function (groupWidgets) {
+                var contentWidget = new ContentPane();
+                groupWidgets.forEach(function (groupWidget) {
+                    if (groupWidget && !groupWidget.isEmpty()) {
+                        contentWidget.addChild(groupWidget);
+                    }
+                });
+                return contentWidget;
+            },
+
+            /**
+             * Возвращает обещание на получение объекта с результатом идентификации
+             * по всем видимым режимам и информационным слоям @ options {Object} @ pixel
+             * {Object} - информация о точке идентификации @ coordinate {Array} -
+             * координаты точки иденификации
+             */
+            getGroupsFromVisibleModules: function (options) {
+                var promises = [];
+                var modules = this.appManager.getVisibleModules();
+                modules.forEach(function (module) {
+                    promises.push.apply(promises, module
+                        .getIdentifyResult(options));
+                });
+
+                return promiseAll(promises).then(
+                    function (results) {
+                        console.log("promise all groups = ", results);
+                        return results;
+                    });
+            },
+
+            identifyPosition: function (position) {
+                var me = this, i;
+                var popupContainer = null,
+                    popupOverlay = null;
+                if (me.mode == "multiple") {
+                    // TODO: создать popupContainer и popupOverlay
+                    popupContainer = new PopupContainer({
+                        map: me._olMap
+                    });
+                    on(popupContainer, "close", function () {
+                        var index = me._popupContainers.indexOf(me);
+                        me._popupContainers.splice(index, 1);
+
+                    });
+                    me._popupContainers.push(popupContainer);
+
+                    popupOverlay = new ol.Overlay({
+                        element: popupContainer.domNode,
+                        autoPan: true,
+                        autoPanAnimation: {
+                            duration: 250
+                        }
+                    });
+                    me._popupOverlays.push(popupOverlay);
+                    me._olMap.addOverlay(popupOverlay);
+
+                } else {
+                    if (me._popupContainers.length > 0) {
+                        // Берем первый
+                        popupContainer = me._popupContainers[0];
+                        // Все остальные удалить
+                        if (me._popupContainers.length > 1) {
+                            for (i = 1; i < me._popupContainers.length; i++) {
+                                me._popupContainers[i].destroyRecursive();
+                            }
+                            me._popupContainers.splice(
+                                1,
+                                me._popupContainers.length - 1);
+                        }
+                    } else {
+                        // Создаем новый
+                        popupContainer = new PopupContainer({
+                            map: me._olMap
+                        });
+                        on(popupContainer, "close", function () {
+                            var index = me._popupContainers.indexOf(me);
+                            me._popupContainers.splice(index, 1);
+
+                        });
+                        me._popupContainers.push(popupContainer);
+                    }
+                    if (me._popupOverlays.length > 0) {
+                        // Берем первый и помещаем в него popup
+                        popupOverlay = me._popupOverlays[0];
+                        popupOverlay.setElement(popupContainer.domNode);
+                        // Все остальные удалить
+                        if (me._popupOverlays.length > 1) {
+                            for (i = 1; i < me._popupOverlays.length; i++) {
+                                me._olMap.removeOverlay(me._popupOverlays[i]);
+                            }
+                            me._popupOverlays.splice(
+                                1,
+                                me._popupOverlays.length - 1)
+                        }
+                    } else {
+                        // Создаем новый и помещаем в него popup
+                        popupOverlay = new ol.Overlay({
+                            element: popupContainer.domNode,
+                            autoPan: true,
+                            autoPanAnimation: {
+                                duration: 250
+                            }
+                        });
+                        me._popupOverlays.push(popupOverlay);
+                        me._olMap.addOverlay(popupOverlay);
+                    }
+                }
+
+                popupContainer.destroyDescendants();
+
+                popupOverlay.setPosition(position.coordinate);
+
+                popupContainer.showOverlay();
+
+                when(me.getGroupsFromVisibleModules(position), function (data) {
+                    var contentWidget = me.createPopupContent(data);
+                    popupContainer.show(contentWidget, "only");
+                    popupContainer.hideOverlay();
+                });
+            },
+            /**
+             * Скрыть все popups
+             */
+            hideAllPopups: function () {
+                var me = this, i;
+                for (i = 0; i < this._popupContainers.length; i++) {
+                    this._popupContainers[i].destroyRecursive();
+                }
+                this._popupContainers.splice(0, this._popupContainers.length);
+
+                for (i = 0; i < this._popupOverlays.length; i++) {
+                    this._olMap.removeOverlay(this._popupOverlays[i]);
+                }
+                this._popupOverlays.splice(0, this._popupOverlays.length)
+            },
+
+            onActivating: function () {
+                var me = this;
+                // Обработчик для события "singleclick" по карте
+                var handler = listen(this._olMap, 'singleclick', function (evt) {
+                    if (evt.originalEvent.ctrlKey) {
+                        me.mode = "multiple";
+                    } else {
+                        me.mode = "single";
+                    }
+                    me.identifyPosition({
+                        pixel: evt.pixel,
+                        coordinate: evt.coordinate
+                    });
+                });
+                this._handlers.push(handler);
+            },
+
+            onDeactivating: function () {
+                var me = this;
+                me._handlers.forEach(function (handler) {
+                    if (handler.remove)
+                        handler.remove();
+
+                });
+                this.hideAllPopups();
+            },
+        })
+    });
\ No newline at end of file