@@ -186,11 +186,24 @@ export class WebMap extends ol.Observable {
186
186
return ;
187
187
}
188
188
189
- that . addBaseMap ( mapInfo ) ;
190
- if ( ! mapInfo . layers || mapInfo . layers . length === 0 ) {
191
- that . sendMapToUser ( 0 ) ;
189
+ if ( mapInfo . baseLayer && mapInfo . baseLayer . layerType === 'MAPBOXSTYLE' ) {
190
+ // 添加矢量瓦片服务作为底图
191
+ that . addMVTBaseMap ( mapInfo ) . then ( ( ) => {
192
+ if ( ! mapInfo . layers || mapInfo . layers . length === 0 ) {
193
+ that . sendMapToUser ( 0 ) ;
194
+ } else {
195
+ that . addLayers ( mapInfo ) ;
196
+ }
197
+ that . createView ( mapInfo ) ;
198
+ } ) ;
192
199
} else {
193
- that . addLayers ( mapInfo ) ;
200
+ that . addBaseMap ( mapInfo ) ;
201
+ if ( ! mapInfo . layers || mapInfo . layers . length === 0 ) {
202
+ that . sendMapToUser ( 0 ) ;
203
+ } else {
204
+ that . addLayers ( mapInfo ) ;
205
+ }
206
+ that . createView ( mapInfo ) ;
194
207
}
195
208
} ) . catch ( function ( error ) {
196
209
that . errorCallback && that . errorCallback ( error , 'getMapFaild' , that . map ) ;
@@ -320,6 +333,36 @@ export class WebMap extends ol.Observable {
320
333
this . map . addLayer ( labelLayer ) ;
321
334
}
322
335
}
336
+
337
+ /**
338
+ * @private
339
+ * @function ol.supermap.WebMap.prototype.addMVTBaseMap
340
+ * @description 添加矢量瓦片服务底图
341
+ * @param {object } mapInfo - 地图信息
342
+ */
343
+ addMVTBaseMap ( mapInfo ) {
344
+ // 获取地图详细信息
345
+ return this . getMBStyle ( mapInfo ) . then ( baseLayerInfo => {
346
+ // 创建图层
347
+ return this . createMVTLayer ( baseLayerInfo ) . then ( layer => {
348
+ let layerID = Util . newGuid ( 8 ) ;
349
+ if ( baseLayerInfo . name ) {
350
+ layer . setProperties ( {
351
+ name : baseLayerInfo . name ,
352
+ layerID : layerID ,
353
+ layerType : 'VECTOR_TILE'
354
+ } ) ;
355
+ }
356
+
357
+ //否则没有ID,对不上号
358
+ baseLayerInfo . layer = layer ;
359
+ baseLayerInfo . layerID = layerID ;
360
+
361
+ this . map . addLayer ( layer ) ;
362
+ } ) ;
363
+ } ) ;
364
+ }
365
+
323
366
/**
324
367
* @private
325
368
* @function ol.supermap.WebMap.prototype.createView
@@ -328,7 +371,7 @@ export class WebMap extends ol.Observable {
328
371
*/
329
372
createView ( options ) {
330
373
let oldcenter = options . center ,
331
- zoom = options . level || 1 ,
374
+ zoom = options . level !== undefined ? options . level : 1 ,
332
375
extent ,
333
376
projection = this . baseProjection ;
334
377
let center = [ ] ;
@@ -348,11 +391,11 @@ export class WebMap extends ol.Observable {
348
391
349
392
// 计算当前最大分辨率
350
393
let maxResolution ;
351
- if ( options . baseLayer && options . baseLayer . layerType === "TILE" && extent && extent . length === 4 ) {
394
+ if ( options . baseLayer && [ 'TILE' , 'MAPBOXSTYLE' ] . includes ( options . baseLayer . layerType ) && extent && extent . length === 4 ) {
352
395
let width = extent [ 2 ] - extent [ 0 ] ;
353
396
let height = extent [ 3 ] - extent [ 1 ] ;
354
- let maxResolution1 = width / 256 ;
355
- let maxResolution2 = height / 256 ;
397
+ let maxResolution1 = width / 512 ;
398
+ let maxResolution2 = height / 512 ;
356
399
maxResolution = Math . max ( maxResolution1 , maxResolution2 ) ;
357
400
}
358
401
@@ -3188,6 +3231,100 @@ export class WebMap extends ol.Observable {
3188
3231
} ) ;
3189
3232
} )
3190
3233
}
3234
+
3235
+ /**
3236
+ * @private
3237
+ * @function ol.supermap.WebMap.prototype.getMBStyle
3238
+ * @description 生成图层信息
3239
+ * @param {object } mapInfo - 地图信息
3240
+ */
3241
+ getMBStyle ( mapInfo ) {
3242
+ let baseLayer = mapInfo . baseLayer ,
3243
+ url = baseLayer . dataSource . url ,
3244
+ layerInfo = { } ;
3245
+ return FetchRequest . get ( url ) . then ( result => {
3246
+ return result . json ( ) ;
3247
+ } ) . then ( styles => {
3248
+ let extent = styles . metadata . mapbounds ;
3249
+ baseLayer . extent = extent ; // 这里把extent保存一下
3250
+
3251
+ layerInfo . projection = mapInfo . projection ,
3252
+ layerInfo . epsgCode = mapInfo . projection ,
3253
+ layerInfo . visible = baseLayer . visible ,
3254
+ layerInfo . name = baseLayer . name ,
3255
+ layerInfo . url = url ,
3256
+ layerInfo . sourceType = 'VECTOR_TILE' ,
3257
+ layerInfo . layerType = 'VECTOR_TILE' ,
3258
+ layerInfo . styles = styles ,
3259
+ layerInfo . extent = extent ,
3260
+ layerInfo . bounds = {
3261
+ bottom : extent [ 1 ] ,
3262
+ left : extent [ 0 ] ,
3263
+ leftBottom : { x : extent [ 0 ] , y : extent [ 1 ] } ,
3264
+ right : extent [ 2 ] ,
3265
+ rightTop : { x : extent [ 2 ] , y : extent [ 3 ] } ,
3266
+ top : extent [ 3 ]
3267
+ }
3268
+ return layerInfo ;
3269
+ } )
3270
+ }
3271
+
3272
+ /**
3273
+ * @private
3274
+ * @function ol.supermap.WebMap.prototype.createMVTLayer
3275
+ * @description 创建矢量瓦片图层
3276
+ * @param {object } mapInfo - 图层信息
3277
+ */
3278
+ createMVTLayer ( layerInfo ) {
3279
+ let styles = layerInfo . styles ;
3280
+ let resolutions = this . getMVTResolutions ( layerInfo . bounds ) ;
3281
+ // 创建MapBoxStyle样式
3282
+ let mapboxStyles = new ol . supermap . MapboxStyles ( {
3283
+ style : styles ,
3284
+ source : styles . name ,
3285
+ resolutions,
3286
+ map : this . map
3287
+ } ) ;
3288
+ return new Promise ( ( resolve ) => {
3289
+ mapboxStyles . on ( 'styleloaded' , function ( ) {
3290
+ let url = Object . values ( styles . sources ) [ 0 ] . tiles [ 0 ] ;
3291
+ let layer = new ol . layer . VectorTile ( {
3292
+ //设置避让参数
3293
+ declutter : true ,
3294
+ source : new ol . source . VectorTile ( {
3295
+ url,
3296
+ projection : layerInfo . projection ,
3297
+ format : new ol . format . MVT ( {
3298
+ featureClass : ol . Feature
3299
+ } ) ,
3300
+ wrapX : false
3301
+ } ) ,
3302
+ style : mapboxStyles . featureStyleFuntion ,
3303
+ visible : layerInfo . visible
3304
+ } ) ;
3305
+ resolve ( layer ) ;
3306
+ } )
3307
+ } )
3308
+ }
3309
+
3310
+ /**
3311
+ * @private
3312
+ * @function ol.supermap.WebMap.prototype.getMVTResolutions
3313
+ * @description 创建矢量瓦片图层
3314
+ * @param {array } extent - 瓦片范围
3315
+ * @param {number } numbers - 缩放层级数
3316
+ */
3317
+ getMVTResolutions ( extent , numbers = 22 ) {
3318
+ let { left, right, top, bottom } = extent ;
3319
+ let dx = right - left ;
3320
+ let dy = top - bottom ;
3321
+ let calcArgs = dx - dy > 0 ? dx : dy ;
3322
+ let resolutions = [ calcArgs / 512 ] ;
3323
+ for ( let i = 1 ; i < numbers ; i ++ ) {
3324
+ resolutions . push ( resolutions [ i - 1 ] / 2 )
3325
+ }
3326
+ return resolutions ;
3327
+ }
3191
3328
}
3192
3329
3193
3330
ol . supermap . WebMap = WebMap ;
0 commit comments