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

добавлена библиотека для работы с openlayers 3+
author cin
date Mon, 21 Aug 2017 17:47:00 +0300
parents
children
comparison
equal deleted inserted replaced
7:9c0943c68a90 8:f0035923ff3e
1 define([
2 "dijit/layout/ContentPane",
3 "dojo/_base/declare",
4 "dojo/Deferred",
5 "dojo/dom-construct",
6 "dojo/dom-class",
7 "dojo/on",
8 "dojo/promise/all",
9 "dojo/when",
10 "implab/safe",
11 "ol",
12 "./listen",
13 "./IdentifyGroup",
14 "./_ToolBase",
15 "./PopupContainer"
16 ],
17
18 function (
19 ContentPane,
20 declare,
21 Deffered,
22 domConstruct,
23 domClass,
24 on,
25 promiseAll,
26 when,
27 safe,
28 ol,
29 listen,
30 IdentifyGroup,
31 _ToolBase,
32 PopupContainer) {
33 return declare([_ToolBase], {
34 /**
35 * массив обработчиков openLayers, которые необходимо удалить при
36 * деактивации
37 */
38 _handlers: null,
39 /**
40 * widget карты
41 */
42 _map: null,
43 /**
44 * openLayers map
45 */
46 _olMap: null,
47 /**
48 * Массив overlays содержащих popupContainers
49 */
50 _popupOverlays: null,
51 /**
52 * Массив popups контейнеров
53 */
54 _popupContainers: null,
55 /**
56 * Режим работы инструмента идентификации
57 *
58 * @value {String} "single"||"multiple"
59 */
60 mode: null,
61 /**
62 * Режимы
63 */
64 appManager: null,
65
66 constructor: function (options) {
67 safe.argumentNotNull(options, "options");
68 safe.argumentNotNull(options.map, "options.map");
69 safe.argumentNotNull(options.appManager, "options.appManager");
70
71 this._map = options.map;
72 this._olMap = options.map.olMap;
73 this._popupContainers = [];
74 this._popupOverlays = [];
75 this._handlers = [];
76
77 this.appManager = options.appManager;
78 this.mode = options.mode || "single";
79 },
80 /**
81 */
82 createPopupContent: function (groupWidgets) {
83 var contentWidget = new ContentPane();
84 groupWidgets.forEach(function (groupWidget) {
85 if (groupWidget && !groupWidget.isEmpty()) {
86 contentWidget.addChild(groupWidget);
87 }
88 });
89 return contentWidget;
90 },
91
92 /**
93 * Возвращает обещание на получение объекта с результатом идентификации
94 * по всем видимым режимам и информационным слоям @ options {Object} @ pixel
95 * {Object} - информация о точке идентификации @ coordinate {Array} -
96 * координаты точки иденификации
97 */
98 getGroupsFromVisibleModules: function (options) {
99 var promises = [];
100 var modules = this.appManager.getVisibleModules();
101 modules.forEach(function (module) {
102 promises.push.apply(promises, module
103 .getIdentifyResult(options));
104 });
105
106 return promiseAll(promises).then(
107 function (results) {
108 console.log("promise all groups = ", results);
109 return results;
110 });
111 },
112
113 identifyPosition: function (position) {
114 var me = this, i;
115 var popupContainer = null,
116 popupOverlay = null;
117 if (me.mode == "multiple") {
118 // TODO: создать popupContainer и popupOverlay
119 popupContainer = new PopupContainer({
120 map: me._olMap
121 });
122 on(popupContainer, "close", function () {
123 var index = me._popupContainers.indexOf(me);
124 me._popupContainers.splice(index, 1);
125
126 });
127 me._popupContainers.push(popupContainer);
128
129 popupOverlay = new ol.Overlay({
130 element: popupContainer.domNode,
131 autoPan: true,
132 autoPanAnimation: {
133 duration: 250
134 }
135 });
136 me._popupOverlays.push(popupOverlay);
137 me._olMap.addOverlay(popupOverlay);
138
139 } else {
140 if (me._popupContainers.length > 0) {
141 // Берем первый
142 popupContainer = me._popupContainers[0];
143 // Все остальные удалить
144 if (me._popupContainers.length > 1) {
145 for (i = 1; i < me._popupContainers.length; i++) {
146 me._popupContainers[i].destroyRecursive();
147 }
148 me._popupContainers.splice(
149 1,
150 me._popupContainers.length - 1);
151 }
152 } else {
153 // Создаем новый
154 popupContainer = new PopupContainer({
155 map: me._olMap
156 });
157 on(popupContainer, "close", function () {
158 var index = me._popupContainers.indexOf(me);
159 me._popupContainers.splice(index, 1);
160
161 });
162 me._popupContainers.push(popupContainer);
163 }
164 if (me._popupOverlays.length > 0) {
165 // Берем первый и помещаем в него popup
166 popupOverlay = me._popupOverlays[0];
167 popupOverlay.setElement(popupContainer.domNode);
168 // Все остальные удалить
169 if (me._popupOverlays.length > 1) {
170 for (i = 1; i < me._popupOverlays.length; i++) {
171 me._olMap.removeOverlay(me._popupOverlays[i]);
172 }
173 me._popupOverlays.splice(
174 1,
175 me._popupOverlays.length - 1)
176 }
177 } else {
178 // Создаем новый и помещаем в него popup
179 popupOverlay = new ol.Overlay({
180 element: popupContainer.domNode,
181 autoPan: true,
182 autoPanAnimation: {
183 duration: 250
184 }
185 });
186 me._popupOverlays.push(popupOverlay);
187 me._olMap.addOverlay(popupOverlay);
188 }
189 }
190
191 popupContainer.destroyDescendants();
192
193 popupOverlay.setPosition(position.coordinate);
194
195 popupContainer.showOverlay();
196
197 when(me.getGroupsFromVisibleModules(position), function (data) {
198 var contentWidget = me.createPopupContent(data);
199 popupContainer.show(contentWidget, "only");
200 popupContainer.hideOverlay();
201 });
202 },
203 /**
204 * Скрыть все popups
205 */
206 hideAllPopups: function () {
207 var me = this, i;
208 for (i = 0; i < this._popupContainers.length; i++) {
209 this._popupContainers[i].destroyRecursive();
210 }
211 this._popupContainers.splice(0, this._popupContainers.length);
212
213 for (i = 0; i < this._popupOverlays.length; i++) {
214 this._olMap.removeOverlay(this._popupOverlays[i]);
215 }
216 this._popupOverlays.splice(0, this._popupOverlays.length)
217 },
218
219 onActivating: function () {
220 var me = this;
221 // Обработчик для события "singleclick" по карте
222 var handler = listen(this._olMap, 'singleclick', function (evt) {
223 if (evt.originalEvent.ctrlKey) {
224 me.mode = "multiple";
225 } else {
226 me.mode = "single";
227 }
228 me.identifyPosition({
229 pixel: evt.pixel,
230 coordinate: evt.coordinate
231 });
232 });
233 this._handlers.push(handler);
234 },
235
236 onDeactivating: function () {
237 var me = this;
238 me._handlers.forEach(function (handler) {
239 if (handler.remove)
240 handler.remove();
241
242 });
243 this.hideAllPopups();
244 },
245 })
246 });