赣州市洪水风险预警系统二维版本
xiebin
2023-03-02 b39483c96ae572121d3c619c0b9d37634e682cc4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
define([
        "dojo/Evented",
        "dojo/on",
        "dojo/dom",
        "dojo/_base/declare",
        "dojo/dom-construct",
        "dojo/dom-style",
        "dojo/_base/lang",
        "dojo/dom-class",
        "esri/domUtils",
        "esri/InfoWindowBase",
        "base/utils/GeometryUtil",
        "controls/Queryinfowindow/InfoTemplate"
    ],
    function(
        Evented,
        on,
        dom,
        declare,
        domConstruct,
        domStyle,
        lang,
        domClass,
        domUtils,
        InfoWindowBase,
        GeometryUtil,
        InfoTemplate
    ) {
        return declare([InfoWindowBase, Evented], {
 
            isContentShowing: false,
            _location: null,
            _pointerDiv: null,
            _items: [],
            _nextButton: null,
            _preButton: null,
            _countSpan: null,
            titleField: "title",
            contentField: "content",
            _currentGraphic: null,
            _currentIndex: 0,
            _correctButton: null,
            width: 355,
            height: 210,
            infoTemplate: null,
            constructor: function(parameters) {
                var csspath = require.toUrl("controls/Queryinfowindow/InfoWindow.css");
                dojo.create("link", {
                        href: csspath,
                        type: 'text/css',
                        rel: 'stylesheet'
                    },
                    document.getElementsByTagName('head')[0]);
                lang.mixin(this, parameters);
 
                this.offsetX = 0;
                this.offsetX = 0;
 
                domClass.add(this.domNode, "custom-infoWindow");
                this._controlbar = domConstruct.create("div", {
                    "class": "custom-infoWindow-controlbar"
                }, this.domNode);
                this._title = domConstruct.create("span", {
                    "class": "custom-infoWindow-title"
                }, this._controlbar);
                this._closeButton = domConstruct.create("span", {
                    "class": "custom-infoWindow-closebutton",
                    "title": "关闭"
                }, this._controlbar);
                domConstruct.create("span", {
                    "class": "custom-infoWindow-split"
                }, this._controlbar);
                this._correctButton = domConstruct.create("span", {
                    "class": "custom-infoWindow-correctbutton",
                    "title": "纠错"
                }, this._controlbar);
                this._content = domConstruct.create("div", {
                    "class": "custom-infoWindow-content"
                }, this.domNode);
                this._pointerDiv = domConstruct.create("div", {
                    "class": "custom-infoWindow-pointer"
                }, this.domNode);
                this._nextButton = domConstruct.create("span", {
                    "class": "custom-infoWindow-nextbutton",
                    "title": "下一条"
                }, this._controlbar);
                this._countSpan = domConstruct.create("span", {
                    "class": "custom-infoWindow-count",
                    "innerHTML": "1/20"
                }, this._controlbar);
                this._preButton = domConstruct.create("span", {
                    "class": "custom-infoWindow-prebutton",
                    "title": "上一条"
                }, this._controlbar);
                on(this._closeButton, "click", lang.hitch(this, function() {
                    this.hide();
                }));
                on(this._preButton, "click", lang.hitch(this, function() {
                    if (this._currentIndex > 0) {
                        this._currentIndex--;
                        this.showItem(this._items[this._currentIndex]);
                        this._countSpan.innerHTML = (this._currentIndex + 1) + "/" + this._items.length;
                    }
                }));
                on(this._nextButton, "click", lang.hitch(this, function() {
                    if (this._currentIndex < this._items.length - 1) {
                        this._currentIndex++;
                        this.showItem(this._items[this._currentIndex]);
                        this._countSpan.innerHTML = (this._currentIndex + 1) + "/" + this._items.length;
                    }
                }));
                domUtils.hide(this.domNode);
                this.isShowing = false;
                this.setItems([]);
                this.resize(this.width, this.height);
            },
            setMap: function(map) {
                this.inherited(arguments);
                if (!this.domNode.parentNode) {
                    domConstruct.place(this.domNode, dom.byId(map.id));
                }
                this.infoTemplate = new InfoTemplate();
                domConstruct.place(this.infoTemplate.domNode, this._content);
                this.infoTemplate.startup();
                map.on("pan-start", lang.hitch(this, function() {
                    //this.hide();
                }));
                map.on("zoom-start", lang.hitch(this, function() {
                    //this.hide();
                }));
                map.on("pan", lang.hitch(this, function(evt) {
                    if (this.isShowing) {
                        this._show(this._location, evt.delta.x, evt.delta.y);
                    }
                }));
                map.on("pan-end", lang.hitch(this, function() {
                    if (this.isShowing) {
                        this._show(this._location);
                    }
 
                }));
                map.on("zoom-end", lang.hitch(this, function() {
                    if (this.isShowing) {
                        this._show(this._location);
                    }
                }));
 
            },
            setTitle: function(title) {
                var thisWidth = domStyle.get(this.domNode, "width");
                domStyle.set(this._title, "maxWidth", (thisWidth - 40).toString() + "px");
                this.place(title, this._title);
 
            },
            setContent: function(content, width, height) {
                this.infoTemplate.reset();
                this.infoTemplate.setContent(content);
                if (width !== undefined && height !== undefined) {
                    this.resize(width, height);
                } else {
                    this.resize(355, 210);
                }
            },
            setTitleAndContent: function(title, content, showTab, width, height) {
                //this.place(content, this._content);
 
                this.setContent(content, width, height);
                this.setTitle(title);
                if (showTab !== undefined) {
                    if (!showTab) {
                        this.infoTemplate.hideTab();
                    }
                }
            },
            setTab: function(type) {
                this.infoTemplate.switchTab(type);
            },
            setGraphic: function(graphic) {
                this.infoTemplate.setGraphic(graphic);
            },
            getGraphic: function(graphic) {
                return this.infoTemplate.getGraphic();
            },
            show: function(location, offsexX, offsetY) {
                if (offsexX)
                    this.offsetX = offsexX;
                else
                    this.offsetX = 0;
                if (offsetY)
                    this.offsetY = offsetY;
                else
                    this.offsetY = 0;
                this._show(location);
            },
            _show: function(location, dx, dy) {
                if (!location) {
                    return;
                }
                if (location.type && location.type != "point") {
                    location = GeometryUtil.getCenter(location);
                }
                this._location = location;
                if (location.spatialReference) {
                    location = this.map.toScreen(location);
                }
                var position = this._getPosition(location.x, location.y)
                if (dx) {
                    location.x = location.x + dx;
                }
                if (dy) {
                    location.y = location.y + dy
                }
                location.x += this.offsetX;
                location.y += this.offsetY;
                this._positionWindow(position, location)
                    //display the info window
                domUtils.show(this.domNode);
                this.isShowing = true;
                this.onShow();
            },
            hide: function() {
                domUtils.hide(this.domNode);
                this.isShowing = false;
                this.onHide();
 
            },
            resize: function(width, height) {
                this.width = width;
                this.height = height;
                if (!this.domNode) {
                    return;
                }
                //          domStyle.set(this._content,{
                //            "width": width + "px"
                //          });
                //          domStyle.set(this._controlbar,{
                //            "width": width + "px"
                //          });
                domStyle.set(this.domNode, {
                    "width": width + "px",
                    "height": (height + 30).toString() + "px"
                });
                if (this.isShowing) {
                    this._show(this._location);
                }
 
            },
            destroy: function() {
                domConstruct.destroy(this.domNode);
                this._closeButton = this._title = this._content = null;
            },
 
            _positionWindow: function(arg, location) {
                var thisWidth = domStyle.get(this.domNode, "width");
                var thisHeight = domStyle.get(this.domNode, "height");
                domClass.remove(this._pointerDiv);
                domClass.add(this._pointerDiv, "custom-infoWindow-pointer");
                switch (arg) {
                    case "topLeft":
                        domStyle.set(this.domNode, {
                            "left": (location.x - 12) + "px",
                            "top": location.y + 10 + "px"
                        });
                        domClass.add(this._pointerDiv, "pointer-top");
                        domStyle.set(this._pointerDiv, {
                            "left": "3px",
                            "top": "-9px"
                        });
                        break;
                    case "topRight":
                        domStyle.set(this.domNode, {
                            "left": (location.x - thisWidth + 11) + "px",
                            "top": location.y + 10 + "px"
                        });
                        domClass.add(this._pointerDiv, "pointer-top");
                        domStyle.set(this._pointerDiv, {
                            "left": (thisWidth - 19) + "px",
                            "top": "-9px"
                        });
                        break;
                    case "top":
                        domStyle.set(this.domNode, {
                            "left": (location.x - thisWidth / 2) + "px",
                            "top": location.y + 10 + "px"
                        });
                        domClass.add(this._pointerDiv, "pointer-top");
                        domStyle.set(this._pointerDiv, {
                            "left": (thisWidth / 2 - 8) + "px",
                            "top": "-9px"
                        });
                        break;
                    case "left":
                        domStyle.set(this.domNode, {
                            "left": location.x + 12 + "px",
                            "top": (location.y - thisHeight / 2 - 15) + "px"
                        });
                        domClass.add(this._pointerDiv, "pointer-left");
                        domStyle.set(this._pointerDiv, {
                            "left": "-10px",
                            "top": (thisHeight / 2 + 5) + "px"
                        });
                        break;
                    case "right":
                        domStyle.set(this.domNode, {
                            "left": (location.x - (thisWidth + 12)) + "px",
                            "top": (location.y - thisHeight / 2 - 15) + "px"
                        });
                        domClass.add(this._pointerDiv, "pointer-right");
                        domStyle.set(this._pointerDiv, {
                            "left": (thisWidth - 8) + "px",
                            "top": (thisHeight / 2 + 5) + "px"
                        });
                        break;
                    case "bottomLeft":
                        domStyle.set(this.domNode, {
                            "left": (location.x - 12) + "px",
                            "top": (location.y - thisHeight - 12) + "px"
                        });
                        domClass.add(this._pointerDiv, "pointer-bottom");
                        domStyle.set(this._pointerDiv, {
                            "left": "3px",
                            "top": (thisHeight - 8) + "px"
                        });
                        break;
                    case "bottomRight":
                        domStyle.set(this.domNode, {
                            "left": (location.x - thisWidth + 11) + "px",
                            "top": (location.y - thisHeight - 12) + "px"
                        });
                        domClass.add(this._pointerDiv, "pointer-bottom");
                        domStyle.set(this._pointerDiv, {
                            "left": (thisWidth - 20) + "px",
                            "top": (thisHeight - 8) + "px"
                        });
                        break;
                        //                case "bottom":
                        //                    break;
                    default:
                        //默认pointer显示在下面
                        domStyle.set(this.domNode, {
                            "left": (location.x - thisWidth / 2) + "px",
                            "top": (location.y - thisHeight - 12) + "px"
                        });
                        domClass.add(this._pointerDiv, "pointer-bottom");
                        domStyle.set(this._pointerDiv, {
                            "left": (thisWidth / 2 - 10) + "px",
                            "top": (thisHeight - 8) + "px"
                        });
                        break;
                }
            },
 
            /**
             * 计算pointer处于的方位,左上、上、右上、左、默认、右、左下、下、右下
             * @param x 
             * @param y
             */
            _getPosition: function(x, y) {
 
                var widthPer = this.map.width / 4
                var heightPer = this.map.height / 4
                if (y < heightPer) {
                    if (x < widthPer) {
                        return "topLeft";
                    } else if (x > widthPer * 3) {
                        return "topRight";
                    } else {
                        return "top";
                    }
                }
                if (y >= heightPer && y < heightPer * 3) {
                    if (x < widthPer) {
                        return "left";
                    } else if (x > widthPer * 3) {
                        return "right";
                    } else {
                        return "default";
                    }
                }
                if (y > heightPer * 3) {
                    if (x < widthPer) {
                        return "bottomLeft";
                    } else if (x > widthPer * 3) {
                        return "bottomRight";
                    } else {
                        return "bottom";
                    }
                } else {
                    return "default";
                }
            },
            setItems: function(items) {
                this._items = items;
                if (!this.domNode)
                    return;
                var thisWidth = domStyle.get(this.domNode, "width");
                if (!items || items.length <= 1) {
                    //domStyle.set(this._content,"bottom","20px");
                    //domStyle.set(this._pageDiv,"display","none");
                    domStyle.set(this._title, "maxWidth", (thisWidth - 40).toString() + "px");
                    domStyle.set(this._nextButton, "display", "none");
                    domStyle.set(this._countSpan, "display", "none");
                    domStyle.set(this._preButton, "display", "none");
                    _currentIndex = 0;
                } else {
                    //有多个graphics
                    domStyle.set(this._title, "maxWidth", (thisWidth - 135).toString() + "px");
                    this.showItem(items[0]);
                    domStyle.set(this._nextButton, "display", "inline-block");
                    domStyle.set(this._countSpan, "display", "inline-block");
                    domStyle.set(this._preButton, "display", "inline-block");
                    this._countSpan.innerHTML = "1/" + this._items.length;
                    _currentIndex = 0;
                    return;
                }
                if (items.length == 1) {
                    //如果只有一个graphic
                    this.showItem(items[_currentIndex]);
                }
            },
            showItem: function(item) {
                if (item) {
                    if (item[this.titleField]) {
                        this._title.innerHTML = item[this.titleField];
                    } else {
                        this._title.innerHTML = "无标题";
                    }
                    if (item[this.contentField]) {
                        this.setContent(item[this.contentField]);
                    } else {
                        this.setContent("");
                    }
                }
                this._location = item.geometry;
                if (this.isShowing) {
                    this._show(this._location);
                }
                //            var maxWidth = domStyle.get(this._title,"maxWidth");
                //            if(maxWidth<this._title.offsetWidth)
                //            {
                //                this._title.title = graphic.attributes[this.titleField];
                //            }
                //            else
                //            {
                //                this._title.title = "";
                //            }
            }
 
        });
 
    });