33 * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/
44import L from "leaflet" ;
55import '../../core/Base' ;
6- import { SuperMap , CommonUtil as Util , CartoCSS , StringExt } from "@supermap/iclient-common" ;
7- import { DefaultStyle } from './CartoDefaultStyle' ;
8- import { CartoStyleMap , ServerStyleMap , CompOpMap } from './CartoStyleMap' ;
6+ import {
7+ SuperMap ,
8+ CommonUtil as Util ,
9+ CartoCSS ,
10+ StringExt
11+ } from "@supermap/iclient-common" ;
12+ import {
13+ DefaultStyle
14+ } from './CartoDefaultStyle' ;
15+ import {
16+ CartoStyleMap ,
17+ ServerStyleMap ,
18+ CompOpMap
19+ } from './CartoStyleMap' ;
920
1021/**
1122 * @class L.supermap.CartoCSSToLeaflet
@@ -67,11 +78,23 @@ export class CartoCSSToLeaflet {
6778 }
6879 var me = this ;
6980 style = style . replace ( / [ @ ] / gi, "___" ) ;
70- style = style . replace ( / \\ # / gi, "___" ) ;
71- for ( var attr in me . layersInfo ) {
81+ style = style . replace ( / \\ # / gi, "\#" ) ;
82+
83+ var cachedLayer = { } ;
84+ me . layersInfo && Object . keys ( me . layersInfo ) . sort ( ) . forEach ( function ( attr ) {
7285 var newAttr = attr . replace ( / [ @ # \s ] / gi, "___" ) ;
73- style = style . replace ( attr . replace ( / [ # ] / gi, "\\#" ) , newAttr ) ;
74- }
86+ var to = attr ;
87+ var keys = Object . keys ( cachedLayer ) ;
88+ for ( let index = keys . length ; index > - 1 ; index -- ) {
89+ if ( attr . indexOf ( keys [ index ] ) > - 1 ) {
90+ to = attr . replace ( keys [ index ] , cachedLayer [ keys [ index ] ] ) ;
91+ break ;
92+ }
93+ }
94+ to = to . replace ( / [ # ] / gi, "\#" ) ;
95+ cachedLayer [ attr ] = newAttr ;
96+ style = style . replace ( new RegExp ( to , "g" ) , newAttr ) ;
97+ } )
7598 style = style . replace ( / [ # ] / gi, "\n#" ) ;
7699 //将zoom转化为scale,以免引起混淆
77100 style = style . replace ( / \[ z o o m / gi, "[scale" ) ;
@@ -256,11 +279,11 @@ export class CartoCSSToLeaflet {
256279 var value = _shader . getValue ( attributes , zoom , true ) ;
257280 if ( ( value !== null ) && prop ) {
258281 if ( prop === "fontSize" ) {
259- if ( fromServer ) {
260- value *= 0.8
261- }
262- fontSize = value + "px" ;
263- style . fontSize = fontSize ;
282+ if ( fromServer ) {
283+ value *= 0.8
284+ }
285+ fontSize = value + "px" ;
286+ style . fontSize = fontSize ;
264287 } else if ( prop === "fontName" ) {
265288 fontName = value ;
266289 style . fontName = fontName ;
@@ -319,7 +342,7 @@ export class CartoCSSToLeaflet {
319342 //设置文本的尺寸(对应fontHeight属性)和行高,行高iserver不支持,默认5像素
320343 //固定大小的时候单位是毫米
321344 if ( shader . fontHeight ) {
322- var text_h = shader . fontHeight * SuperMap . DOTS_PER_INCH * SuperMap . INCHES_PER_UNIT [ "mm" ] * 0.85 ; //毫米转像素,服务端的字体貌似要稍微小一点
345+ var text_h = shader . fontHeight * SuperMap . DOTS_PER_INCH * SuperMap . INCHES_PER_UNIT [ "mm" ] * 0.85 ; //毫米转像素,服务端的字体貌似要稍微小一点
323346 style . fontSize = text_h + "px" ;
324347 style . textHeight = text_h ;
325348 }
@@ -339,16 +362,16 @@ export class CartoCSSToLeaflet {
339362 }
340363 style . weight = shader . outline ? shader . outlineWidth : 0 ;
341364 if ( shader . backColor ) {
342- style . color = "rgba(" + shader . backColor . red + ","
343- + shader . backColor . green + ","
344- + shader . backColor . blue
345- + ",1)" ;
365+ style . color = "rgba(" + shader . backColor . red + "," +
366+ shader . backColor . green + "," +
367+ shader . backColor . blue +
368+ ",1)" ;
346369 }
347370 if ( shader . foreColor ) {
348- style . fillColor = "rgba(" + shader . foreColor . red + ","
349- + shader . foreColor . green + ","
350- + shader . foreColor . blue
351- + ",1)" ;
371+ style . fillColor = "rgba(" + shader . foreColor . red + "," +
372+ shader . foreColor . green + "," +
373+ shader . foreColor . blue +
374+ ",1)" ;
352375 }
353376 style . rotation = shader . rotation || 0 ;
354377 return style ;
@@ -364,55 +387,55 @@ export class CartoCSSToLeaflet {
364387 var leafletStyle = obj . leafletStyle ;
365388 switch ( obj . type ) {
366389 case "number" :
367- {
368- let value = shader [ attr ] ;
369- if ( obj . unit ) {
370- value = value * SuperMap . DOTS_PER_INCH * SuperMap . INCHES_PER_UNIT [ obj . unit ] * 2.5 ;
390+ {
391+ let value = shader [ attr ] ;
392+ if ( obj . unit ) {
393+ value = value * SuperMap . DOTS_PER_INCH * SuperMap . INCHES_PER_UNIT [ obj . unit ] * 2.5 ;
394+ }
395+ style [ leafletStyle ] = value ;
396+ break ;
371397 }
372- style [ leafletStyle ] = value ;
373- break ;
374- }
375398
376399 case "color" :
377- {
378- var color = shader [ attr ] ;
379- let value , alpha = 1 ;
380- if ( leafletStyle === "fillColor" ) {
381- if ( fillSymbolID === 0 || fillSymbolID === 1 ) {
382- //当fillSymbolID为0时,用颜色填充,为1是无填充,即为透明填充,alpha通道为0
383- alpha = 1 - fillSymbolID ;
384- value = "rgba(" + color . red + "," + color . green + "," + color . blue + "," + alpha + ")" ;
385- }
386- } else if ( leafletStyle === "color" ) {
387- if ( lineSymbolID === 0 || lineSymbolID === 5 ) {
388- //对于lineSymbolID为0时,线为实线,为lineSymbolID为5时,为无线模式,即线为透明,即alpha通道为0
389- alpha = lineSymbolID === 0 ? 1 : 0 ;
390- } else {
391- //以下几种linePattern分别模拟了桌面的SymbolID为1~4几种符号的linePattern
392- var linePattern = [ 1 , 0 ] ;
393- switch ( lineSymbolID ) {
394- case 1 :
395- linePattern = [ 9.7 , 3.7 ] ;
396- break ;
397- case 2 :
398- linePattern = [ 3.7 , 3.7 ] ;
399- break ;
400- case 3 :
401- linePattern = [ 9.7 , 3.7 , 2.3 , 3.7 ] ;
402- break ;
403- case 4 :
404- linePattern = [ 9.7 , 3.7 , 2.3 , 3.7 , 2.3 , 3.7 ] ;
405- break ;
406- default :
407- break
400+ {
401+ var color = shader [ attr ] ;
402+ let value , alpha = 1 ;
403+ if ( leafletStyle === "fillColor" ) {
404+ if ( fillSymbolID === 0 || fillSymbolID === 1 ) {
405+ //当fillSymbolID为0时,用颜色填充,为1是无填充,即为透明填充,alpha通道为0
406+ alpha = 1 - fillSymbolID ;
407+ value = "rgba(" + color . red + "," + color . green + "," + color . blue + "," + alpha + ")" ;
408+ }
409+ } else if ( leafletStyle === "color" ) {
410+ if ( lineSymbolID === 0 || lineSymbolID === 5 ) {
411+ //对于lineSymbolID为0时,线为实线,为lineSymbolID为5时,为无线模式,即线为透明,即alpha通道为0
412+ alpha = lineSymbolID === 0 ? 1 : 0 ;
413+ } else {
414+ //以下几种linePattern分别模拟了桌面的SymbolID为1~4几种符号的linePattern
415+ var linePattern = [ 1 , 0 ] ;
416+ switch ( lineSymbolID ) {
417+ case 1 :
418+ linePattern = [ 9.7 , 3.7 ] ;
419+ break ;
420+ case 2 :
421+ linePattern = [ 3.7 , 3.7 ] ;
422+ break ;
423+ case 3 :
424+ linePattern = [ 9.7 , 3.7 , 2.3 , 3.7 ] ;
425+ break ;
426+ case 4 :
427+ linePattern = [ 9.7 , 3.7 , 2.3 , 3.7 , 2.3 , 3.7 ] ;
428+ break ;
429+ default :
430+ break
431+ }
432+ style . lineDasharray = linePattern ;
408433 }
409- style . lineDasharray = linePattern ;
434+ value = "rgba(" + color . red + "," + color . green + "," + color . blue + "," + alpha + ")" ;
410435 }
411- value = "rgba(" + color . red + "," + color . green + "," + color . blue + "," + alpha + ")" ;
436+ style [ leafletStyle ] = value ;
437+ break ;
412438 }
413- style [ leafletStyle ] = value ;
414- break ;
415- }
416439 default :
417440 break ;
418441 }
0 commit comments