1
1
/* Copyright© 2000 - 2019 SuperMap Software Co.Ltd. All rights reserved.
2
2
* This program are made available under the terms of the Apache License, Version 2.0
3
3
* which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/
4
- import ol from 'openlayers' ;
5
- import {
6
- FetchRequest ,
7
- CommonUtil
8
- } from "@supermap/iclient-common" ;
9
- import {
10
- olExtends
11
- } from './olExtends'
12
-
4
+ import ol from "openlayers" ;
5
+ import { FetchRequest , CommonUtil } from "@supermap/iclient-common" ;
6
+ import { olExtends } from "./olExtends" ;
7
+ import remove from "lodash.remove" ;
13
8
14
9
/**
15
10
* @class ol.supermap.MapboxStyles
@@ -58,41 +53,42 @@ export class MapboxStyles extends ol.Observable {
58
53
super ( ) ;
59
54
options = options || { } ;
60
55
this . spriteRegEx = / ^ ( .* ) ( \? .* ) $ / ;
61
- this . defaultFont = [ "DIN Offc Pro Medium" ,
62
- "Arial Unicode MS Regular"
63
- ] ;
56
+ this . defaultFont = [ "DIN Offc Pro Medium" , "Arial Unicode MS Regular" ] ;
64
57
this . map = options . map ;
65
58
this . source = options . source ;
66
- this . styleTarget = options . style || options . url + '/tileFeature/vectorstyles.json?type=MapBox_GL&styleonly=true' ;
59
+ this . styleTarget =
60
+ options . style || options . url + "/tileFeature/vectorstyles.json?type=MapBox_GL&styleonly=true" ;
67
61
this . resolutions = options . resolutions ;
68
- this . selectedStyle = options . selectedStyle || function ( ) {
69
- return new ol . style . Style ( {
70
- fill : new ol . style . Fill ( {
71
- color : 'rgba(255, 0, 0, 1)'
72
- } ) ,
73
- stroke : new ol . style . Stroke ( {
74
- color : 'rgba(255, 0, 0, 1)' ,
75
- width : 10
76
- } ) ,
77
- text : new ol . style . Text ( {
78
- font : 'normal 400 11.19px "Microsoft YaHei"' ,
79
- placement : 'point' ,
80
- fill : new ol . style . Fill ( {
81
- color : 'blue'
82
- } )
83
- } ) ,
84
- image : new ol . style . Circle ( {
85
- radius : 5 ,
62
+ this . selectedObjects = [ ] ;
63
+ this . selectedStyle =
64
+ options . selectedStyle ||
65
+ function ( ) {
66
+ return new ol . style . Style ( {
86
67
fill : new ol . style . Fill ( {
87
- color : 'blue'
68
+ color : "rgba(255, 0, 0, 1)"
69
+ } ) ,
70
+ stroke : new ol . style . Stroke ( {
71
+ color : "rgba(255, 0, 0, 1)" ,
72
+ width : 10
73
+ } ) ,
74
+ text : new ol . style . Text ( {
75
+ font : 'normal 400 11.19px "Microsoft YaHei"' ,
76
+ placement : "point" ,
77
+ fill : new ol . style . Fill ( {
78
+ color : "blue"
79
+ } )
80
+ } ) ,
81
+ image : new ol . style . Circle ( {
82
+ radius : 5 ,
83
+ fill : new ol . style . Fill ( {
84
+ color : "blue"
85
+ } )
88
86
} )
89
- } )
90
- } )
91
- }
87
+ } ) ;
88
+ } ;
92
89
this . layersBySourceLayer = { } ;
93
90
olExtends ( this . map ) ;
94
91
this . _loadStyle ( this . styleTarget ) ;
95
-
96
92
}
97
93
/**
98
94
* @function ol.supermap.MapboxStyles.prototype.getStyleFunction
@@ -114,34 +110,89 @@ export class MapboxStyles extends ol.Observable {
114
110
const layers = [ ] ;
115
111
for ( let index = 0 ; index < this . _mbStyle . layers . length ; index ++ ) {
116
112
const layer = this . _mbStyle . layers [ index ] ;
117
- if ( layer [ ' source-layer' ] !== sourceLayer ) {
113
+ if ( layer [ " source-layer" ] !== sourceLayer ) {
118
114
continue ;
119
115
}
120
116
layers . push ( layer ) ;
121
-
122
117
}
123
118
this . layersBySourceLayer [ sourceLayer ] = layers ;
124
119
return layers ;
125
120
}
126
121
/**
127
122
* @function ol.supermap.MapboxStyles.prototype.setSelectedId
128
- * @description 设置选中要素,该要素将会用 `selectedStyle` 样式绘制。
123
+ * @description 设置选中要素,该要素将会用 `selectedStyle` 样式绘制。调用该方法后需要调用 `ol.layer.VectorTile` 的 `changed`,才能生效。
129
124
* @param {number } selectedId - 要素ID。
130
125
* @param {string } sourceLayer - 要素所在图层名称。
131
126
*/
132
127
setSelectedId ( selectedId , sourceLayer ) {
133
- this . selectedObject = {
134
- selectedId : selectedId ,
128
+ this . selectedObjects = [ ] ;
129
+ this . selectedObjects . push ( {
130
+ id : selectedId ,
135
131
sourceLayer : sourceLayer
136
- } ;
132
+ } ) ;
133
+ }
134
+ /**
135
+ * @typedef {Object } ol.supermap.MapboxStyles.selectedObject
136
+ * @description 要选择的要素对象。
137
+ * @property {number } selectedId - 要素ID。
138
+ * @property {string } sourceLayer - 要素所在图层名称。
139
+ */
140
+
141
+ /**
142
+ * @function ol.supermap.MapboxStyles.prototype.setSelectedObjects
143
+ * @version 10.x.x
144
+ * @description 设置选中要素或要素数组,该要素将会用 `selectedStyle` 样式绘制。调用该方法后需要调用 `ol.layer.VectorTile` 的 `changed`,才能生效。
145
+ * @param {ol.supermap.MapboxStyles.selectedObject|Array.<ol.supermap.MapboxStyles.selectedObject> } addSelectedObjects - 选择的要素或要素数组。
146
+ */
147
+ setSelectedObjects ( selectedObjects ) {
148
+ if ( ! Array . isArray ( selectedObjects ) ) {
149
+ selectedObjects = [ selectedObjects ] ;
150
+ }
151
+ this . selectedObjects = [ ] ;
152
+ this . selectedObjects = selectedObjects ;
153
+ }
154
+ /**
155
+ * @function ol.supermap.MapboxStyles.prototype.addSelectedObjects
156
+ * @version 10.x.x
157
+ * @description 增加选中的要素或要素数组,该要素将会用 `selectedStyle` 样式绘制。调用该方法后需要调用 `ol.layer.VectorTile` 的 `changed`,才能生效。
158
+ * @param {ol.supermap.MapboxStyles.selectedObject|Array.<ol.supermap.MapboxStyles.selectedObject> } addSelectedObjects - 选择的要素或要素数组。
159
+ */
160
+ addSelectedObjects ( selectedObjects ) {
161
+ if ( ! Array . isArray ( selectedObjects ) ) {
162
+ selectedObjects = [ selectedObjects ] ;
163
+ }
164
+ this . selectedObjects . push ( ...selectedObjects ) ;
165
+ }
166
+ /**
167
+ * @function ol.supermap.MapboxStyles.prototype.clearSelectedObjects
168
+ * @version 10.x.x
169
+ * @description 清空选中状态。调用该方法后需要调用 `ol.layer.VectorTile` 的 `changed`,才能生效。
170
+ */
171
+ removeSelectedObjects ( selectedObjects ) {
172
+ if ( ! Array . isArray ( selectedObjects ) ) {
173
+ selectedObjects = [ selectedObjects ] ;
174
+ }
175
+ selectedObjects . forEach ( element => {
176
+ remove ( this . selectedObjects , obj => {
177
+ return element . id === obj . id && element . sourceLayer === obj . sourceLayer ;
178
+ } ) ;
179
+ } ) ;
180
+ }
181
+ /**
182
+ * @function ol.supermap.MapboxStyles.prototype.clearSelectedObjects
183
+ * @version 10.x.x
184
+ * @description 清空选中状态。调用该方法后需要调用 `ol.layer.VectorTile` 的 `changed`,才能生效。
185
+ */
186
+ clearSelectedObjects ( ) {
187
+ this . selectedObjects = [ ] ;
137
188
}
138
189
/**
139
190
* @function ol.supermap.MapboxStyles.prototype.updateStyles
140
191
* @description 更新图层样式。
141
192
* @param {Object } layerStyles - 图层样式或图层样式数组。
142
193
*/
143
194
updateStyles ( layerStyles ) {
144
- if ( Object . prototype . toString . call ( layerStyles ) !== ' [object Array]' ) {
195
+ if ( Object . prototype . toString . call ( layerStyles ) !== " [object Array]" ) {
145
196
layerStyles = [ layerStyles ] ;
146
197
}
147
198
const layerObj = { } ;
@@ -155,7 +206,7 @@ export class MapboxStyles extends ol.Observable {
155
206
if ( count >= layerStyles . length ) {
156
207
break ;
157
208
}
158
- const newLayerStyle = layerObj [ oldLayerStyle . id ]
209
+ const newLayerStyle = layerObj [ oldLayerStyle . id ] ;
159
210
if ( ! newLayerStyle ) {
160
211
continue ;
161
212
}
@@ -179,38 +230,38 @@ export class MapboxStyles extends ol.Observable {
179
230
this . _mbStyle = style ;
180
231
this . _resolve ( ) ;
181
232
} else {
182
- FetchRequest . get ( style ) . then ( response =>
183
- response . json ( ) ) . then ( mbStyle => {
184
- this . _mbStyle = mbStyle ;
185
- this . _resolve ( )
186
- } ) ;
233
+ FetchRequest . get ( style )
234
+ . then ( response => response . json ( ) )
235
+ . then ( mbStyle => {
236
+ this . _mbStyle = mbStyle ;
237
+ this . _resolve ( ) ;
238
+ } ) ;
187
239
}
188
240
}
189
241
_resolve ( ) {
190
- if ( ! this . source ) {
242
+ if ( ! this . source ) {
191
243
this . source = Object . keys ( this . _mbStyle . sources ) [ 0 ] ;
192
244
}
193
245
if ( this . _mbStyle . sprite ) {
194
246
const spriteScale = window . devicePixelRatio >= 1.5 ? 0.5 : 1 ;
195
- const sizeFactor = spriteScale == 0.5 ? ' @2x' : '' ;
247
+ const sizeFactor = spriteScale == 0.5 ? " @2x" : "" ;
196
248
//兼容一下iServer 等iServer修改
197
- this . _mbStyle . sprite = this . _mbStyle . sprite . replace ( ' @2x' , "" ) ;
198
- const spriteUrl = this . _toSpriteUrl ( this . _mbStyle . sprite , this . path , sizeFactor + ' .json' ) ;
249
+ this . _mbStyle . sprite = this . _mbStyle . sprite . replace ( " @2x" , "" ) ;
250
+ const spriteUrl = this . _toSpriteUrl ( this . _mbStyle . sprite , this . path , sizeFactor + " .json" ) ;
199
251
FetchRequest . get ( spriteUrl )
200
- . then ( response =>
201
- response . json ( ) ) . then ( spritesJson => {
252
+ . then ( response => response . json ( ) )
253
+ . then ( spritesJson => {
202
254
this . _spriteData = spritesJson ;
203
- this . _spriteImageUrl = this . _toSpriteUrl ( this . _mbStyle . sprite , this . path , sizeFactor + ' .png' ) ;
255
+ this . _spriteImageUrl = this . _toSpriteUrl ( this . _mbStyle . sprite , this . path , sizeFactor + " .png" ) ;
204
256
this . _spriteImage = null ;
205
257
const img = new Image ( ) ;
206
- img . crossOrigin = ' anonymous' ;
258
+ img . crossOrigin = " anonymous" ;
207
259
img . onload = ( ) => {
208
260
this . _spriteImage = img ;
209
261
this . _initStyleFunction ( ) ;
210
262
} ;
211
263
img . src = this . _spriteImageUrl ;
212
-
213
- } )
264
+ } ) ;
214
265
} else {
215
266
this . _initStyleFunction ( ) ;
216
267
}
@@ -230,7 +281,7 @@ export class MapboxStyles extends ol.Observable {
230
281
* @event ol.supermap.MapboxStyles#styleloaded
231
282
* @description 样式加载成功后触发。
232
283
*/
233
- this . dispatchEvent ( ' styleloaded' ) ;
284
+ this . dispatchEvent ( " styleloaded" ) ;
234
285
}
235
286
_createStyleFunction ( ) {
236
287
if ( this . map ) {
@@ -239,22 +290,31 @@ export class MapboxStyles extends ol.Observable {
239
290
this . featureStyleFuntion = this . _getStyleFunction ( ) ;
240
291
}
241
292
_getStyleFunction ( ) {
242
- this . fun = window . olms . stylefunction ( {
243
- setStyle : function ( ) { } ,
244
- set : function ( ) { } ,
245
- changed : function ( ) { }
246
- } , this . _mbStyle , this . source , this . resolutions , this . _spriteData , "" , this . _spriteImage ) ;
293
+ this . fun = window . olms . stylefunction (
294
+ { setStyle : function ( ) { } , set : function ( ) { } , changed : function ( ) { } } ,
295
+ this . _mbStyle ,
296
+ this . source ,
297
+ this . resolutions ,
298
+ this . _spriteData ,
299
+ "" ,
300
+ this . _spriteImage
301
+ ) ;
247
302
return ( feature , resolution ) => {
248
303
const style = this . fun ( feature , resolution ) ;
249
- if ( this . selectedObject && this . selectedObject . selectedId === feature . getId ( ) && this . selectedObject . sourceLayer === feature . get ( 'layer' ) ) {
304
+ if (
305
+ this . selectedObjects . length > 0 &&
306
+ this . selectedObjects . find ( element => {
307
+ return element . id === feature . getId ( ) && element . sourceLayer === feature . get ( "layer" ) ;
308
+ } )
309
+ ) {
250
310
const styleIndex = style && style [ 0 ] ? style [ 0 ] . getZIndex ( ) : 99999 ;
251
311
let selectStyles = this . selectedStyle ( feature , resolution ) ;
252
312
if ( ! Array . isArray ( selectStyles ) ) {
253
313
selectStyles = [ selectStyles ] ;
254
314
}
255
315
for ( let index = 0 ; index < selectStyles . length ; index ++ ) {
256
316
const selectStyle = selectStyles [ index ] ;
257
- if ( feature . getGeometry ( ) . getType ( ) === ' Point' && style [ 0 ] . getText ( ) && selectStyle . getText ( ) ) {
317
+ if ( feature . getGeometry ( ) . getType ( ) === " Point" && style [ 0 ] . getText ( ) && selectStyle . getText ( ) ) {
258
318
selectStyle . setFill ( null ) ;
259
319
selectStyle . setStroke ( null ) ;
260
320
selectStyle . setImage ( ) ;
@@ -263,14 +323,12 @@ export class MapboxStyles extends ol.Observable {
263
323
selectStyle . setZIndex ( styleIndex ) ;
264
324
}
265
325
return selectStyles ;
266
-
267
326
}
268
327
return style ;
269
- }
270
-
328
+ } ;
271
329
}
272
330
_withPath ( url , path ) {
273
- if ( path && url . indexOf ( ' http' ) != 0 ) {
331
+ if ( path && url . indexOf ( " http" ) != 0 ) {
274
332
url = path + url ;
275
333
}
276
334
return url ;
@@ -279,9 +337,7 @@ export class MapboxStyles extends ol.Observable {
279
337
_toSpriteUrl ( url , path , extension ) {
280
338
url = this . _withPath ( url , path ) ;
281
339
const parts = url . match ( this . spriteRegEx ) ;
282
- return parts ?
283
- parts [ 1 ] + extension + ( parts . length > 2 ? parts [ 2 ] : '' ) :
284
- url + extension ;
340
+ return parts ? parts [ 1 ] + extension + ( parts . length > 2 ? parts [ 2 ] : "" ) : url + extension ;
285
341
}
286
342
}
287
- ol . supermap . MapboxStyles = MapboxStyles ;
343
+ ol . supermap . MapboxStyles = MapboxStyles ;
0 commit comments