From 327d0c5c8c62a4926f3f450a67bec80a6177b69d Mon Sep 17 00:00:00 2001 From: qiwei Date: Mon, 29 Sep 2025 16:20:24 +0800 Subject: [PATCH 01/46] =?UTF-8?q?update=20=E5=A4=84=E7=90=86=E5=AF=B9webma?= =?UTF-8?q?p=20crs=20=E7=9A=843857=204326=20=E6=8A=95=E5=BD=B1=E5=85=BC?= =?UTF-8?q?=E5=AE=B9=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/mapboxgl/mapping/webmap/CRSManager.js | 10 +++++++++- test/mapboxgl/mapping/WebMapV3Spec.js | 2 ++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/mapboxgl/mapping/webmap/CRSManager.js b/src/mapboxgl/mapping/webmap/CRSManager.js index f5e4bde861..6029596c8d 100644 --- a/src/mapboxgl/mapping/webmap/CRSManager.js +++ b/src/mapboxgl/mapping/webmap/CRSManager.js @@ -1,5 +1,11 @@ import mapboxgl from 'mapbox-gl'; +const equivalenceMap = { + 'EPSG:4490': 'EPSG:4326', + 'EPSG:4326': 'EPSG:4490', + 'EPSG:3857': 'EPSG:900913', + 'EPSG:900913': 'EPSG:3857' +}; export class CRSManager { constructor(proj4) { this.proj4 = proj4; @@ -7,7 +13,9 @@ export class CRSManager { } isSameProjection(map, epsgCode) { - return map.getCRS().epsgCode === epsgCode; + const mapEpsgCode = map.getCRS().epsgCode; + return mapEpsgCode === epsgCode || + (equivalenceMap[mapEpsgCode] === epsgCode && equivalenceMap[epsgCode] === mapEpsgCode); } getProj4() { diff --git a/test/mapboxgl/mapping/WebMapV3Spec.js b/test/mapboxgl/mapping/WebMapV3Spec.js index 84bb818fe6..48397fc36b 100644 --- a/test/mapboxgl/mapping/WebMapV3Spec.js +++ b/test/mapboxgl/mapping/WebMapV3Spec.js @@ -318,6 +318,8 @@ describe('mapboxgl-webmap3.0', () => { existedMap.on('load', function () { mapstudioWebmap.initializeMap(nextMapInfo, existedMap); }); + const isSameCrs = extendOptions.crsManager.isSameProjection(existedMap, 'EPSG:4326'); + expect(isSameCrs).toBe(true); mapstudioWebmap.on('mapcreatesucceeded', ({ map }) => { expect(mapstudioWebmap._appendLayers).toBe(true); expect(map).toEqual(existedMap); From cfdacf6e4c6b60fdea1ee634f57309763912f9b4 Mon Sep 17 00:00:00 2001 From: chenxianhui Date: Sat, 11 Oct 2025 11:16:19 +0800 Subject: [PATCH 02/46] =?UTF-8?q?ISVJ-10976=20=E6=94=AF=E6=8C=81dv?= =?UTF-8?q?=E9=9D=9E=E4=B8=93=E9=A2=98=E5=9B=BE=E5=B1=82=E7=9A=84=E5=9B=BE?= =?UTF-8?q?=E4=BE=8B=20review=20by=20xiongjj?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/mapping/WebMapV2.js | 12 +++++++++++- src/common/mapping/WebMapV2Base.js | 10 ++++++++++ test/mapboxgl/mapping/WebMapV2Spec.js | 23 +++++++++++++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/common/mapping/WebMapV2.js b/src/common/mapping/WebMapV2.js index 79d69c4611..5557e79009 100644 --- a/src/common/mapping/WebMapV2.js +++ b/src/common/mapping/WebMapV2.js @@ -575,6 +575,8 @@ export function createWebMapV2Extending(SuperClass, { MapManager, mapRepo, crsMa features = this.handleLayerFeatures(features, layerInfo); if (layerType === 'VECTOR') { + const styleGroups = this.getVectorStyleGroup(layerInfo); + this._initLegendConfigInfo(layerInfo, styleGroups); if (featureType === 'POINT') { if (style.type === 'SYMBOL_POINT') { this._createSymbolLayer(layerInfo, features); @@ -2633,11 +2635,18 @@ export function createWebMapV2Extending(SuperClass, { MapManager, mapRepo, crsMa this._addOverlayToMap({ type: 'LINE', source, layerID, parentLayerId, layerStyle: lineStyle, minzoom, maxzoom }); } + _getThemeField(layerInfo) { + if (layerInfo.layerType === 'VECTOR') { + return '' + } + return layerInfo.layerType === 'HEAT' ? layerInfo.themeSetting.weight : layerInfo.themeSetting.themeField + } + _initLegendConfigInfo(layerInfo, style) { const legendItem = { layerId: layerInfo.layerID, layerTitle: layerInfo.layerID, - themeField: layerInfo.layerType === 'HEAT' ? layerInfo.themeSetting.weight : layerInfo.themeSetting.themeField, + themeField: this._getThemeField(layerInfo), styleGroup: style }; @@ -2654,6 +2663,7 @@ export function createWebMapV2Extending(SuperClass, { MapManager, mapRepo, crsMa switch (layerInfo.layerType) { case 'UNIQUE': + case 'VECTOR': legendItem.styleGroup = legendItem.styleGroup.map((styleGroup) => { return { fieldValue: styleGroup.value, diff --git a/src/common/mapping/WebMapV2Base.js b/src/common/mapping/WebMapV2Base.js index bc227cbd41..7ffe806283 100644 --- a/src/common/mapping/WebMapV2Base.js +++ b/src/common/mapping/WebMapV2Base.js @@ -722,6 +722,16 @@ export function createWebMapV2BaseExtending(SuperClass = Events, fireField = 'tr return styleGroup; } + + getVectorStyleGroup(layerInfo) { + const color = layerInfo.style.fillColor || layerInfo.style.strokeColor; + const styleGroup = [{ + color: color, + style: layerInfo.style, + value: layerInfo.name + }] + return styleGroup; + } transformFeatures(features) { features && diff --git a/test/mapboxgl/mapping/WebMapV2Spec.js b/test/mapboxgl/mapping/WebMapV2Spec.js index fbc64ede6c..4fc86bd904 100644 --- a/test/mapboxgl/mapping/WebMapV2Spec.js +++ b/test/mapboxgl/mapping/WebMapV2Spec.js @@ -490,6 +490,29 @@ describe('mapboxgl_WebMapV2', () => { datavizWebmap.on('mapcreatesucceeded', callback); }); + it('vectorlayer should have legends', (done) => { + spyOn(FetchRequest, 'get').and.callFake((url) => { + if (url.indexOf('map.json') > -1) { + return Promise.resolve(new Response(JSON.stringify(vectorLayer_line))); + } else if (url.indexOf('1788054202/content.json?') > -1) { + return Promise.resolve(new Response(JSON.stringify(chart_content))); + } else if (url.indexOf('13136933/content.json?') > -1) { + return Promise.resolve(new Response(JSON.stringify(layerData_geojson['POINT_GEOJSON']))); + } else if (url.indexOf('portal.json') > -1) { + return Promise.resolve(new Response(JSON.stringify(iportal_serviceProxy))); + } else if (url.indexOf('web/datas/1920557079/content.json') > -1) { + return Promise.resolve(new Response(layerData_CSV)); + } + return Promise.resolve(new Response(JSON.stringify({}))); + }); + datavizWebmap = new WebMap(id, { ...commonOption, map: commonMap }, { ...commonMapOptions }); + const callback = function (data) { + expect(datavizWebmap.getLegends().length).toBe(1); + done(); + }; + datavizWebmap.on('mapcreatesucceeded', callback); + }); + it('add heatLayer', (done) => { spyOn(FetchRequest, 'get').and.callFake((url) => { if (url.indexOf('web/datas/1920557079/content.json') > -1) { From 0238f4441ae8863565bdb10af60058af4410bba5 Mon Sep 17 00:00:00 2001 From: luoxiao Date: Wed, 15 Oct 2025 14:00:03 +0800 Subject: [PATCH 03/46] [fix]ISVJ-10807 preferServer featureService webmap --- src/common/commontypes/Util.js | 12 + src/common/iServer/CommonServiceBase.js | 1 + src/common/iServer/FeatureService.js | 27 +- .../iServer/GetFeaturesByBoundsService.js | 1 + .../iServer/GetFeaturesByBufferService.js | 1 + .../iServer/GetFeaturesByGeometryService.js | 1 + src/common/iServer/GetFeaturesByIDsService.js | 1 + src/common/iServer/GetFeaturesBySQLService.js | 1 + src/common/iServer/GetFeaturesServiceBase.js | 257 +++++++++--------- src/common/mapping/WebMapBase.js | 1 + src/common/mapping/WebMapService.js | 2 + src/common/util/FetchRequest.js | 9 +- src/mapboxgl/mapping/WebMap.js | 1 + src/mapboxgl/services/FeatureService.js | 1 + test/mapboxgl/mapping/WebMapSpec.js | 34 +++ .../services/GetFeaturesByBoundsSpec.js | 54 ++-- .../services/GetFeaturesByBufferSpec.js | 45 +++ .../services/GetFeaturesByGeometrySpec.js | 46 ++++ .../mapboxgl/services/GetFeaturesByIDsSpec.js | 68 +++-- .../mapboxgl/services/GetFeaturesBySQLSpec.js | 82 +++++- 20 files changed, 464 insertions(+), 181 deletions(-) diff --git a/src/common/commontypes/Util.js b/src/common/commontypes/Util.js index 59803646a6..f5a37e021b 100644 --- a/src/common/commontypes/Util.js +++ b/src/common/commontypes/Util.js @@ -435,6 +435,18 @@ const Util = { return paramsArray.join('&'); }, + handleUrlSuffix(url, suffix = '.json') { + if (url.indexOf('?') < 0) { + url += suffix; + } else { + var urlArrays = url.split('?'); + if (urlArrays.length === 2) { + url = urlArrays[0] + suffix + '?' + urlArrays[1]; + } + } + return url + }, + /** * @memberOf CommonUtil * @description 给 URL 追加查询参数。 diff --git a/src/common/iServer/CommonServiceBase.js b/src/common/iServer/CommonServiceBase.js index d4407251da..6f778ac364 100644 --- a/src/common/iServer/CommonServiceBase.js +++ b/src/common/iServer/CommonServiceBase.js @@ -150,6 +150,7 @@ export class CommonServiceBase { options.headers = options.headers || me.headers; options.isInTheSameDomain = me.isInTheSameDomain; options.withoutFormatSuffix = options.scope.withoutFormatSuffix || false; + options.preferServer = options.preferServer || me.preferServer; //为url添加安全认证信息片段 options.url = SecurityManager.appendCredential(options.url); diff --git a/src/common/iServer/FeatureService.js b/src/common/iServer/FeatureService.js index 6f180b3519..9541acb7a6 100644 --- a/src/common/iServer/FeatureService.js +++ b/src/common/iServer/FeatureService.js @@ -17,7 +17,7 @@ const FEATURE_SERVICE_MAP = { bounds: GetFeaturesByBoundsService, buffer: GetFeaturesByBufferService, geometry: GetFeaturesByGeometryService -} +}; /** * @class FeatureService @@ -34,11 +34,11 @@ const FEATURE_SERVICE_MAP = { * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 * @param {Object} [options.headers] - 请求头。 + * @param {boolean} [options.preferServer=false] - 当resultFormat=DataFormat.GEOJSON时,使用服务器直接返回geojson。 * @extends {ServiceBase} * @usage */ export class FeatureService { - constructor(url, options) { this.url = url; this.options = options || {}; @@ -59,7 +59,8 @@ export class FeatureService { withCredentials: me.options.withCredentials, crossOrigin: me.options.crossOrigin, headers: me.options.headers, - format: resultFormat + format: resultFormat, + preferServer: me.options.preferServer }); return getFeaturesByIDsService.processAsync(params, callback); } @@ -79,7 +80,8 @@ export class FeatureService { withCredentials: me.options.withCredentials, crossOrigin: me.options.crossOrigin, headers: me.options.headers, - format: me._processFormat(resultFormat) + format: me._processFormat(resultFormat), + preferServer: me.options.preferServer }); return getFeaturesByBoundsService.processAsync(params, callback); } @@ -99,7 +101,8 @@ export class FeatureService { withCredentials: me.options.withCredentials, crossOrigin: me.options.crossOrigin, headers: me.options.headers, - format: me._processFormat(resultFormat) + format: me._processFormat(resultFormat), + preferServer: me.options.preferServer }); return getFeatureService.processAsync(params, callback); } @@ -119,7 +122,8 @@ export class FeatureService { withCredentials: me.options.withCredentials, crossOrigin: me.options.crossOrigin, headers: me.options.headers, - format: me._processFormat(resultFormat) + format: me._processFormat(resultFormat), + preferServer: me.options.preferServer }); return getFeatureBySQLService.processAsync(params, callback); } @@ -139,7 +143,8 @@ export class FeatureService { withCredentials: me.options.withCredentials, crossOrigin: me.options.crossOrigin, headers: me.options.headers, - format: me._processFormat(resultFormat) + format: me._processFormat(resultFormat), + preferServer: me.options.preferServer }); return getFeaturesByGeometryService.processAsync(params, callback); } @@ -159,7 +164,7 @@ export class FeatureService { url = me.url, dataSourceName = params.dataSourceName, dataSetName = params.dataSetName; - url = CommonUtil.urlPathAppend(url, "datasources/" + dataSourceName + "/datasets/" + dataSetName); + url = CommonUtil.urlPathAppend(url, 'datasources/' + dataSourceName + '/datasets/' + dataSetName); var editFeatureService = new EditFeaturesService(url, { proxy: me.options.proxy, @@ -182,7 +187,7 @@ export class FeatureService { url = me.url, dataSourceName = params.dataSourceName, dataSetName = params.dataSetName; - url = CommonUtil.urlPathAppend(url, "datasources/" + dataSourceName + "/datasets/" + dataSetName); + url = CommonUtil.urlPathAppend(url, 'datasources/' + dataSourceName + '/datasets/' + dataSetName); var editFeatureService = new EditFeaturesService(url, { proxy: me.options.proxy, withCredentials: me.options.withCredentials, @@ -207,7 +212,7 @@ export class FeatureService { url = me.url, dataSourceName = params.dataSourceName, dataSetName = params.dataSetName; - url = CommonUtil.urlPathAppend(url, "datasources/" + dataSourceName + "/datasets/" + dataSetName); + url = CommonUtil.urlPathAppend(url, 'datasources/' + dataSourceName + '/datasets/' + dataSetName); var featureAttachmentsService = new FeatureAttachmentsService(url, { proxy: me.options.proxy, withCredentials: me.options.withCredentials, @@ -233,7 +238,7 @@ export class FeatureService { url = me.url, dataSourceName = params.dataSourceName, dataSetName = params.dataSetName; - url = CommonUtil.urlPathAppend(url, "datasources/" + dataSourceName + "/datasets/" + dataSetName); + url = CommonUtil.urlPathAppend(url, 'datasources/' + dataSourceName + '/datasets/' + dataSetName); var featureAttachmentsService = new FeatureAttachmentsService(url, { proxy: me.options.proxy, withCredentials: me.options.withCredentials, diff --git a/src/common/iServer/GetFeaturesByBoundsService.js b/src/common/iServer/GetFeaturesByBoundsService.js index 39953436ae..e2e7ec15bf 100644 --- a/src/common/iServer/GetFeaturesByBoundsService.js +++ b/src/common/iServer/GetFeaturesByBoundsService.js @@ -17,6 +17,7 @@ import {GetFeaturesByBoundsParameters} from './GetFeaturesByBoundsParameters'; * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON、GeoJSON、FGB 三种格式。参数格式为 "ISERVER","GEOJSON","FGB"。 * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 * @param {Object} [options.headers] - 请求头。 + * @param {boolean} [options.preferServer=false] - 当options.format=DataFormat.GEOJSON时,使用服务器直接返回geojson。 * @example * var myGetFeaturesByBoundsService = new SuperMa.GetFeaturesByBoundsService(url); * @usage diff --git a/src/common/iServer/GetFeaturesByBufferService.js b/src/common/iServer/GetFeaturesByBufferService.js index e96000e35b..9906ec99fa 100644 --- a/src/common/iServer/GetFeaturesByBufferService.js +++ b/src/common/iServer/GetFeaturesByBufferService.js @@ -16,6 +16,7 @@ import {GetFeaturesByBufferParameters} from './GetFeaturesByBufferParameters'; * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON、GeoJSON、FGB 三种格式。参数格式为 "ISERVER","GEOJSON","FGB"。 * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 * @param {Object} [options.headers] - 请求头。 + * @param {boolean} [options.preferServer=false] - 当options.format=DataFormat.GEOJSON时,使用服务器直接返回geojson。 * @extends {GetFeaturesServiceBase} * @example * var myGetFeaturesByBufferService = new GetFeaturesByBufferService(url); diff --git a/src/common/iServer/GetFeaturesByGeometryService.js b/src/common/iServer/GetFeaturesByGeometryService.js index 7c1e46c6ea..cc42770789 100644 --- a/src/common/iServer/GetFeaturesByGeometryService.js +++ b/src/common/iServer/GetFeaturesByGeometryService.js @@ -16,6 +16,7 @@ import {GetFeaturesByGeometryParameters} from './GetFeaturesByGeometryParameters * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON、GeoJSON、FGB 三种格式。参数格式为 "ISERVER","GEOJSON","FGB"。 * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 * @param {Object} [options.headers] - 请求头。 + * @param {boolean} [options.preferServer=false] - 当options.format=DataFormat.GEOJSON时,使用服务器直接返回geojson。 * @extends {GetFeaturesServiceBase} * @example * var myService = new GetFeaturesByGeometryService(url); diff --git a/src/common/iServer/GetFeaturesByIDsService.js b/src/common/iServer/GetFeaturesByIDsService.js index 9ac2cd86a1..bb2ffc1b13 100644 --- a/src/common/iServer/GetFeaturesByIDsService.js +++ b/src/common/iServer/GetFeaturesByIDsService.js @@ -16,6 +16,7 @@ import {GetFeaturesByIDsParameters} from './GetFeaturesByIDsParameters'; * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON、GeoJSON、FGB 三种格式。参数格式为 "ISERVER","GEOJSON","FGB"。 * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 * @param {Object} [options.headers] - 请求头。 + * @param {boolean} [options.preferServer=false] - 当options.format=DataFormat.GEOJSON时,使用服务器直接返回geojson。 * @extends {GetFeaturesServiceBase} * @example * var myGetFeaturesByIDsService = new GetFeaturesByIDsService(url); diff --git a/src/common/iServer/GetFeaturesBySQLService.js b/src/common/iServer/GetFeaturesBySQLService.js index d4216034d2..d04327e138 100644 --- a/src/common/iServer/GetFeaturesBySQLService.js +++ b/src/common/iServer/GetFeaturesBySQLService.js @@ -17,6 +17,7 @@ import {GetFeaturesBySQLParameters} from './GetFeaturesBySQLParameters'; * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON、GeoJSON、FGB 三种格式。参数格式为 "ISERVER","GEOJSON","FGB"。 * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 * @param {Object} [options.headers] - 请求头。 + * @param {boolean} [options.preferServer=false] - 当options.format=DataFormat.GEOJSON时,使用服务器直接返回geojson。 * @extends {GetFeaturesServiceBase} * @example * var myGetFeaturesBySQLService = new GetFeaturesBySQLService(url); diff --git a/src/common/iServer/GetFeaturesServiceBase.js b/src/common/iServer/GetFeaturesServiceBase.js index d3c3db5021..dc09bb0f1d 100644 --- a/src/common/iServer/GetFeaturesServiceBase.js +++ b/src/common/iServer/GetFeaturesServiceBase.js @@ -1,10 +1,10 @@ /* Copyright© 2000 - 2025 SuperMap Software Co.Ltd. All rights reserved. * This program are made available under the terms of the Apache License, Version 2.0 * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ -import {Util} from '../commontypes/Util'; -import {DataFormat} from '../REST'; -import {CommonServiceBase} from './CommonServiceBase'; -import {GeoJSON} from '../format/GeoJSON'; +import { Util } from '../commontypes/Util'; +import { DataFormat } from '../REST'; +import { CommonServiceBase } from './CommonServiceBase'; +import { GeoJSON } from '../format/GeoJSON'; /** * @class GetFeaturesServiceBase @@ -19,65 +19,65 @@ import {GeoJSON} from '../format/GeoJSON'; * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON、GeoJSON、FGB 三种格式。参数格式为 "ISERVER","GEOJSON","FGB"。 * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 * @param {Object} [options.headers] - 请求头。 + * @param {boolean} [options.preferServer=false] - 当options.format=DataFormat.GEOJSON时,使用服务器直接返回geojson。 * @example * var myService = new GetFeaturesServiceBase(url); * @usage */ export class GetFeaturesServiceBase extends CommonServiceBase { - constructor(url, options) { - super(url, options); - options = options || {}; - - /** - * @member {boolean} [GetFeaturesServiceBase.prototype.returnContent=true] - * @description 是否立即返回新创建资源的表述还是返回新资源的 URI。 - * 如果为 true,则直接返回新创建资源,即查询结果的表述。 - * 如果为 false,则返回的是查询结果资源的 URI。 - */ - this.returnContent = true; - - /** - * @member {boolean} [GetFeaturesServiceBase.prototype.returnFeaturesOnly=false] - * @description 是否仅返回要素信息。 - */ - this.returnFeaturesOnly = false; - - /** - * @member {number} [GetFeaturesServiceBase.prototype.fromIndex=0] - * @description 查询结果的最小索引号。如果该值大于查询结果的最大索引号,则查询结果为空。 - */ - this.fromIndex = 0; - - /** - * @member {number} [GetFeaturesServiceBase.prototype.toIndex=19] - * @description 查询结果的最大索引号。 - * 如果该值大于查询结果的最大索引号,则以查询结果的最大索引号为终止索引号。 - */ - this.toIndex = 19; - - /** - * @member {number} [GetFeaturesServiceBase.prototype.hasGeometry=true] - * @description 返回结果是否包含 Geometry。 - */ - this.hasGeometry = true; - - /** - * @member {number} [GetFeaturesServiceBase.prototype.maxFeatures=1000] - * @description 进行 SQL 查询时,用于设置服务端返回查询结果条目数量。 - */ - this.maxFeatures = null; - - /** - * @member {string} [GetFeaturesServiceBase.prototype.format=DataFormat.GEOJSON] - * @description 查询结果返回格式,目前支持 iServerJSON、GeoJSON、FGB 三种格式。 - * 参数格式为 "ISERVER","GEOJSON","FGB"。 - */ - this.format = DataFormat.GEOJSON; - - Util.extend(this, options); - this.url = Util.urlPathAppend(this.url, 'featureResults'); - this.CLASS_NAME = "SuperMap.GetFeaturesServiceBase"; + super(url, options); + options = options || {}; + + /** + * @member {boolean} [GetFeaturesServiceBase.prototype.returnContent=true] + * @description 是否立即返回新创建资源的表述还是返回新资源的 URI。 + * 如果为 true,则直接返回新创建资源,即查询结果的表述。 + * 如果为 false,则返回的是查询结果资源的 URI。 + */ + this.returnContent = true; + + /** + * @member {boolean} [GetFeaturesServiceBase.prototype.returnFeaturesOnly=false] + * @description 是否仅返回要素信息。 + */ + this.returnFeaturesOnly = false; + + /** + * @member {number} [GetFeaturesServiceBase.prototype.fromIndex=0] + * @description 查询结果的最小索引号。如果该值大于查询结果的最大索引号,则查询结果为空。 + */ + this.fromIndex = 0; + + /** + * @member {number} [GetFeaturesServiceBase.prototype.toIndex=19] + * @description 查询结果的最大索引号。 + * 如果该值大于查询结果的最大索引号,则以查询结果的最大索引号为终止索引号。 + */ + this.toIndex = 19; + + /** + * @member {number} [GetFeaturesServiceBase.prototype.hasGeometry=true] + * @description 返回结果是否包含 Geometry。 + */ + this.hasGeometry = true; + + /** + * @member {number} [GetFeaturesServiceBase.prototype.maxFeatures=1000] + * @description 进行 SQL 查询时,用于设置服务端返回查询结果条目数量。 + */ + this.maxFeatures = null; + + /** + * @member {string} [GetFeaturesServiceBase.prototype.format=DataFormat.GEOJSON] + * @description 查询结果返回格式,目前支持 iServerJSON、GeoJSON、FGB 三种格式。 + * 参数格式为 "ISERVER","GEOJSON","FGB"。 + */ + this.format = DataFormat.GEOJSON; + + Util.extend(this, options); + this.url = Util.urlPathAppend(this.url, 'featureResults'); + this.CLASS_NAME = 'SuperMap.GetFeaturesServiceBase'; } /** @@ -85,14 +85,14 @@ export class GetFeaturesServiceBase extends CommonServiceBase { * @description 释放资源,将引用资源的属性置空。 */ destroy() { - super.destroy(); - var me = this; - me.returnContent = null; - me.fromIndex = null; - me.toIndex = null; - me.maxFeatures = null; - me.format = null; - me.hasGeometry = null; + super.destroy(); + var me = this; + me.returnContent = null; + me.fromIndex = null; + me.toIndex = null; + me.maxFeatures = null; + me.format = null; + me.hasGeometry = null; } /** @@ -103,52 +103,57 @@ export class GetFeaturesServiceBase extends CommonServiceBase { * @returns {Promise} Promise 对象。 */ processAsync(params, callback) { - if (!params) { - return; - } - var me = this, - jsonParameters = null, - firstPara = true; - - me.returnContent = params.returnContent; - me.returnFeaturesOnly = params.returnFeaturesOnly; - me.fromIndex = params.fromIndex; - me.toIndex = params.toIndex; - me.maxFeatures = params.maxFeatures; - me.hasGeometry = params.hasGeometry; - if (me.returnContent) { - firstPara = false; + if (!params) { + return; + } + var me = this, + jsonParameters = null, + firstPara = true; + me.returnContent = params.returnContent; + me.returnFeaturesOnly = params.returnFeaturesOnly; + me.fromIndex = params.fromIndex; + me.toIndex = params.toIndex; + me.maxFeatures = params.maxFeatures; + me.hasGeometry = params.hasGeometry; + if (me.returnContent) { + firstPara = false; + } + var isValidNumber = me.fromIndex != null && me.toIndex != null && !isNaN(me.fromIndex) && !isNaN(me.toIndex); + if (isValidNumber && me.fromIndex >= 0 && me.toIndex >= 0 && !firstPara) { + me.url = Util.urlAppend(me.url, `fromIndex=${me.fromIndex}&toIndex=${me.toIndex}`); + } + + if (me.returnContent) { + if (!params.returnCountOnly && !params.returnDatasetInfoOnly && !params.returnFeaturesOnly) { + console.warn( + 'recommend set returnFeaturesOnly config to true to imporve performance. if need get Total amount and Dataset information. FeatureService provide getFeaturesCount and getFeaturesDatasetInfo method' + ); } - var isValidNumber = me.fromIndex != null && me.toIndex != null && !isNaN(me.fromIndex) && !isNaN(me.toIndex); - if (isValidNumber && me.fromIndex >= 0 && me.toIndex >= 0 && !firstPara) { - me.url = Util.urlAppend(me.url, `fromIndex=${me.fromIndex}&toIndex=${me.toIndex}`); + if (params.returnCountOnly) { + me.url = Util.urlAppend(me.url, 'returnCountOnly=' + params.returnCountOnly); } - if (me.returnContent) { - if (!params.returnCountOnly && !params.returnDatasetInfoOnly && !params.returnFeaturesOnly) { - console.warn('recommend set returnFeaturesOnly config to true to imporve performance. if need get Total amount and Dataset information. FeatureService provide getFeaturesCount and getFeaturesDatasetInfo method'); - } - if (params.returnCountOnly) { - me.url = Util.urlAppend(me.url, "returnCountOnly=" + params.returnCountOnly) - } - - if (params.returnDatasetInfoOnly) { - me.url = Util.urlAppend(me.url, "returnDatasetInfoOnly=" + params.returnDatasetInfoOnly) - } - - if (params.returnFeaturesOnly) { - me.url = Util.urlAppend(me.url, "returnFeaturesOnly=" + params.returnFeaturesOnly) - } - } - - jsonParameters = me.getJsonParameters(params); - return me.request({ - method: "POST", - data: jsonParameters, - scope: me, - success: callback, - failure: callback - }); + if (params.returnDatasetInfoOnly) { + me.url = Util.urlAppend(me.url, 'returnDatasetInfoOnly=' + params.returnDatasetInfoOnly); + } + if (params.returnFeaturesOnly) { + me.url = Util.urlAppend(me.url, 'returnFeaturesOnly=' + params.returnFeaturesOnly); + } + } + + if (me.preferServer && me.format === DataFormat.GEOJSON) { + me.url = Util.handleUrlSuffix(me.url, '.geojson'); + me.withoutFormatSuffix = true; + } + + jsonParameters = me.getJsonParameters(params); + return me.request({ + method: 'POST', + data: jsonParameters, + scope: me, + success: callback, + failure: callback + }); } /** @@ -159,25 +164,29 @@ export class GetFeaturesServiceBase extends CommonServiceBase { * @return {Object} 转换结果。 */ transformResult(result, options) { - var me = this; - result = Util.transformResult(result); - var geoJSONFormat = new GeoJSON(); - if (me.format === DataFormat.GEOJSON && result.features) { - result.features = geoJSONFormat.toGeoJSON(result.features); - } - if (me.returnFeaturesOnly && Array.isArray(result)) { - let succeed = result.succeed; - let features = geoJSONFormat.toGeoJSON(result); - result = { - succeed, - features - }; - } - return { result, options }; + var me = this; + result = Util.transformResult(result); + var geoJSONFormat = new GeoJSON(); + if (me.preferServer && me.format === DataFormat.GEOJSON) { + const succeed = result.succeed; + delete result.succeed; + return { result: { succeed, features: result }, options }; + } + if (me.format === DataFormat.GEOJSON && result.features) { + result.features = geoJSONFormat.toGeoJSON(result.features); + } + if (me.returnFeaturesOnly && Array.isArray(result)) { + let succeed = result.succeed; + let features = geoJSONFormat.toGeoJSON(result); + result = { + succeed, + features + }; + } + return { result, options }; } dataFormat() { return [DataFormat.GEOJSON, DataFormat.ISERVER, DataFormat.FGB]; } - } diff --git a/src/common/mapping/WebMapBase.js b/src/common/mapping/WebMapBase.js index 5912e536a3..081fe8b69f 100644 --- a/src/common/mapping/WebMapBase.js +++ b/src/common/mapping/WebMapBase.js @@ -28,6 +28,7 @@ const WORLD_WIDTH = 360; * @param {boolean} [options.isSuperMapOnline] - 是否是 SuperMap Online 地图。 * @param {string} [options.iportalServiceProxyUrlPrefix] - iportal的代理服务地址前缀。 * @param {string|boolean} [options.proxy] - HTTP 请求代理地址 。布尔值表示使用 iPortal 默认代理地址。 + * @param {boolean} [options.preferServer=false] - iServer rest/data服务, 使用服务器直接返回geojson。 * @param {Object} mapOptions - 地图参数。 * @param {Array} [mapOptions.center] - 中心点。 * @param {number} [mapOptions.zoom] - 缩放级别。 diff --git a/src/common/mapping/WebMapService.js b/src/common/mapping/WebMapService.js index 229ca1f60b..d98b9def11 100644 --- a/src/common/mapping/WebMapService.js +++ b/src/common/mapping/WebMapService.js @@ -42,6 +42,7 @@ export class WebMapService { this.excludePortalProxyUrl = options.excludePortalProxyUrl; this.iportalServiceProxyUrl = options.iportalServiceProxyUrlPrefix; this.proxy = options.proxy; + this.preferServer = options.preferServer || false; this.proxyOptions = { data: 'apps/viewer/getUrlResource.json?url=', image: 'apps/viewer/getUrlResource.png?url=' @@ -1224,6 +1225,7 @@ export class WebMapService { let options = { proxy, withCredentials: this.handleWithCredentials(proxy, url, false), + preferServer: this.preferServer, eventListeners: { processCompleted: getFeaturesEventArgs => { let result = getFeaturesEventArgs.result; diff --git a/src/common/util/FetchRequest.js b/src/common/util/FetchRequest.js index ef4c3db091..703d11eeb4 100644 --- a/src/common/util/FetchRequest.js +++ b/src/common/util/FetchRequest.js @@ -514,14 +514,7 @@ export var FetchRequest = { } if (url.indexOf('.json') === -1 && !options.withoutFormatSuffix) { - if (url.indexOf('?') < 0) { - url += '.json'; - } else { - var urlArrays = url.split('?'); - if (urlArrays.length === 2) { - url = urlArrays[0] + '.json?' + urlArrays[1]; - } - } + url = Util.handleUrlSuffix(url); } if (options && options.proxy) { if (typeof options.proxy === 'function') { diff --git a/src/mapboxgl/mapping/WebMap.js b/src/mapboxgl/mapping/WebMap.js index 3595948d4b..9859762232 100644 --- a/src/mapboxgl/mapping/WebMap.js +++ b/src/mapboxgl/mapping/WebMap.js @@ -49,6 +49,7 @@ import { GraticuleLayer } from '../overlay/GraticuleLayer'; * @param {boolean} [options.isSuperMapOnline] - 是否是 SuperMap Online 地图。 * @param {string} [options.iportalServiceProxyUrlPrefix] - iportal的代理服务地址前缀。 * @param {string|boolean} [options.proxy] - HTTP 请求代理地址 。布尔值表示使用 iPortal 默认代理地址。 + * @param {boolean} [options.preferServer=false] - 当图层数据来源为SuperMap iServer RestData服务, 使用服务器直接返回geojson。 * @param {Object} mapOptions - 地图参数。 * @param {Array} [mapOptions.center] - 中心点。 * @param {number} [mapOptions.zoom] - 缩放级别。 diff --git a/src/mapboxgl/services/FeatureService.js b/src/mapboxgl/services/FeatureService.js index 6b957d5ac7..d2f9461ffe 100644 --- a/src/mapboxgl/services/FeatureService.js +++ b/src/mapboxgl/services/FeatureService.js @@ -27,6 +27,7 @@ import { FeatureService as CommonFeatureService } from '@supermapgis/iclient-com * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 * @param {Object} [options.headers] - 请求头。 + * @param {boolean} [options.preferServer] - 当resultFormat=DataFormat.GEOJSON时,使用服务器直接返回geojson。 * @usage */ export class FeatureService extends ServiceBase { diff --git a/test/mapboxgl/mapping/WebMapSpec.js b/test/mapboxgl/mapping/WebMapSpec.js index 32a74957ca..1d38969303 100644 --- a/test/mapboxgl/mapping/WebMapSpec.js +++ b/test/mapboxgl/mapping/WebMapSpec.js @@ -732,6 +732,40 @@ describe('mapboxgl_WebMap', () => { }); }); + it('createThemeLayer_SUPERMAPREST_DATA preferServer', (done) => { + let options = { + server: server, + preferServer: true + }; + spyOn(FetchRequest, 'get').and.callFake((url) => { + if (url.indexOf('web/config/portal.json') > -1) { + return Promise.resolve(new Response(JSON.stringify(iportal_serviceProxy))); + } + if (url.indexOf('map.json') > -1) { + var mapJson = datavizWebMap_RestData; + return Promise.resolve(new Response(mapJson)); + } + return Promise.resolve(); + }); + spyOn(FetchRequest, 'post').and.callFake((url) => { + expect(url).toBe('http://fakeiserver/iserver/services/data-jingjin/rest/data/featureResults.geojson?returnFeaturesOnly=true&returnContent=true'); + return Promise.resolve(new Response(JSON.stringify(JSON.parse(markerData2.content)))); + }); + var datavizWebmap = new WebMap(id, options); + + datavizWebmap.on('mapcreatesucceeded', function () { + expect(datavizWebmap.credentialKey).toBeUndefined(); + expect(datavizWebmap.credentialValue).toBeUndefined(); + + var map = datavizWebmap.map; + expect(map.getZoom()).toBeCloseTo(9, 0.001); + expect(map.getCenter()).toEqual(new mapboxgl.LngLat(116.8995771532053, 39.700527641334965)); + expect(datavizWebmap.mapParams.title).toBe('RestData'); + expect(datavizWebmap.mapParams.description).toBe(''); + done(); + }); + }); + it('WMS', (done) => { let options = { server: server diff --git a/test/mapboxgl/services/GetFeaturesByBoundsSpec.js b/test/mapboxgl/services/GetFeaturesByBoundsSpec.js index c88acc9bab..d8e7ae708a 100644 --- a/test/mapboxgl/services/GetFeaturesByBoundsSpec.js +++ b/test/mapboxgl/services/GetFeaturesByBoundsSpec.js @@ -63,26 +63,40 @@ describe('mapboxgl_FeatureService_getFeaturesByBounds', () => { done(); }); }); - it('GetFeaturesByBoundsParameters:targetEpsgCode', done => { - var sw = new mapboxgl.LngLat(-20, -20); - var ne = new mapboxgl.LngLat(20, 20); - var lngLatBounds = new mapboxgl.LngLatBounds(sw, ne); - var boundsParam = new GetFeaturesByBoundsParameters({ - datasetNames: ['World:Capitals'], - bounds: lngLatBounds, - targetEpsgCode: 4326 - }); - var service = new FeatureService(url); - spyOn(FetchRequest, 'commit').and.callFake((method, testUrl, params, options) => { - var paramsObj = JSON.parse(params.replace(/'/g, '"')); - expect(paramsObj.targetEpsgCode).toEqual(4326); - return Promise.resolve(new Response(JSON.stringify(getFeaturesResultJson))); - }); - service.getFeaturesByBounds(boundsParam, result => { - serviceResult = result; - boundsParam.destroy(); - done(); - }); + it('getFeaturesByBounds preferServer', done => { + var sw = new mapboxgl.LngLat(-20, -20); + var ne = new mapboxgl.LngLat(20, 20); + var lngLatBounds = new mapboxgl.LngLatBounds(sw, ne); + var boundsParam = new GetFeaturesByBoundsParameters({ + datasetNames: ['World:Capitals'], + bounds: lngLatBounds, + fromIndex: 1, + toIndex: 3 + }); + var service = new FeatureService(url, { preferServer: true }); + spyOn(FetchRequest, 'commit').and.callFake((method, testUrl, params, options) => { + expect(method).toBe('POST'); + expect(testUrl).toBe(url + '/featureResults.geojson?fromIndex=1&toIndex=3&returnContent=true'); + var paramsObj = JSON.parse(params.replace(/'/g, '"')); + expect(paramsObj.datasetNames[0]).toBe('World:Capitals'); + expect(paramsObj.getFeatureMode).toBe('BOUNDS'); + expect(paramsObj.spatialQueryMode).toBe('CONTAIN'); + expect(options).not.toBeNull(); + expect(options.withoutFormatSuffix).toBe(true); + return Promise.resolve(new Response(JSON.stringify(getFeaturesBySQLService.result.features))); + }); + service.getFeaturesByBounds(boundsParam, testResult => { + serviceResult = testResult; + expect(service).not.toBeNull(); + expect(serviceResult.type).toBe('processCompleted'); + expect(serviceResult.object.format).toBe('GEOJSON'); + var result = serviceResult.result; + expect(result.succeed).toBe(true); + expect(result.features.type).toEqual('FeatureCollection'); + expect(serviceResult.object.preferServer).toBe(true); + boundsParam.destroy(); + done(); + }); }); it('GetFeaturesByBoundsParameters:targetPrj', done => { var sw = new mapboxgl.LngLat(-20, -20); diff --git a/test/mapboxgl/services/GetFeaturesByBufferSpec.js b/test/mapboxgl/services/GetFeaturesByBufferSpec.js index 8dce24e577..5965e44ccd 100644 --- a/test/mapboxgl/services/GetFeaturesByBufferSpec.js +++ b/test/mapboxgl/services/GetFeaturesByBufferSpec.js @@ -72,6 +72,51 @@ describe('mapboxgl_FeatureService_getFeaturesByBuffer', () => { done(); }); }); + it('getFeaturesByBuffer_geometry preferServer', done => { + var queryBufferGeometry = { + type: 'Polygon', + coordinates: [ + [ + [-20, 20], + [-20, -20], + [20, -20], + [20, 20], + [-20, 20] + ] + ] + }; + var bufferParam = new GetFeaturesByBufferParameters({ + datasetNames: ['World:Capitals'], + bufferDistance: 10, + geometry: queryBufferGeometry, + fromIndex: 1, + toIndex: 3 + }); + var service = new FeatureService(url, { preferServer: true }); + spyOn(FetchRequest, 'commit').and.callFake((method, testUrl, params, options) => { + expect(method).toBe('POST'); + expect(testUrl).toBe(url + '/featureResults.geojson?fromIndex=1&toIndex=3&returnContent=true'); + var paramsObj = JSON.parse(params.replace(/'/g, '"')); + expect(paramsObj.datasetNames[0]).toBe('World:Capitals'); + expect(paramsObj.bufferDistance).toEqual(10); + expect(paramsObj.getFeatureMode).toBe('BUFFER'); + expect(options.withoutFormatSuffix).toBe(true); + expect(options).not.toBeNull(); + return Promise.resolve(new Response(JSON.stringify(getFeaturesBySQLService.result.features))); + }); + service.getFeaturesByBuffer(bufferParam, testResult => { + serviceResult = testResult; + expect(service).not.toBeNull(); + expect(serviceResult.type).toBe('processCompleted'); + expect(serviceResult.object.format).toBe('GEOJSON'); + var result = serviceResult.result; + expect(result.succeed).toBe(true); + expect(serviceResult.result.features.type).toEqual('FeatureCollection'); + expect(serviceResult.object.preferServer).toBe(true); + bufferParam.destroy(); + done(); + }); + }); it('GetFeaturesByBufferParameters:targetEpsgCode', done => { var queryBufferGeometry = { type: 'Polygon', diff --git a/test/mapboxgl/services/GetFeaturesByGeometrySpec.js b/test/mapboxgl/services/GetFeaturesByGeometrySpec.js index d052d64bfb..755b73f37c 100644 --- a/test/mapboxgl/services/GetFeaturesByGeometrySpec.js +++ b/test/mapboxgl/services/GetFeaturesByGeometrySpec.js @@ -73,6 +73,52 @@ describe('mapboxgl_FeatureService_getFeaturesByGeometry', () => { } }); }); + it('getFeaturesByGeometry preferServer', done => { + var queryPolygonGeometry = { + type: 'Polygon', + coordinates: [ + [ + [0, 0], + [-10, 30], + [-30, 0], + [0, 0] + ] + ] + }; + var geometryParam = new GetFeaturesByGeometryParameters({ + datasetNames: ['World:Countries'], + geometry: queryPolygonGeometry, + spatialQueryMode: 'INTERSECT' + }); + var service = new FeatureService(url, { preferServer: true }); + spyOn(FetchRequest, 'commit').and.callFake((method, testUrl, params, options) => { + expect(method).toBe('POST'); + expect(testUrl).toBe(url + '/featureResults.geojson?fromIndex=0&toIndex=19&returnContent=true'); + var paramsObj = JSON.parse(params.replace(/'/g, '"')); + expect(paramsObj.datasetNames[0]).toBe('World:Countries'); + expect(paramsObj.spatialQueryMode).toBe('INTERSECT'); + expect(options.withoutFormatSuffix).toBe(true); + expect(options).not.toBeNull(); + return Promise.resolve(new Response(JSON.stringify(getFeaturesBySQLService.result.features))); + }); + service.getFeaturesByGeometry(geometryParam, result => { + serviceResult = result; + try { + expect(service).not.toBeNull(); + expect(serviceResult).not.toBeNull(); + expect(serviceResult.type).toBe('processCompleted'); + expect(serviceResult.result.succeed).toBe(true); + expect(serviceResult.options.data).toContain('World:Countries'); + expect(serviceResult.object.preferServer).toBe(true); + expect(serviceResult.result.features.type).toBe('FeatureCollection'); + done(); + } catch (e) { + console.log("'getFeaturesByGeometry preferServer'案例失败" + e.name + ':' + e.message); + expect(false).toBeTruthy(); + done(); + } + }); + }); it('GetFeaturesByGeometryParameters:targetEpsgCode', done => { var queryPolygonGeometry = { type: 'Polygon', diff --git a/test/mapboxgl/services/GetFeaturesByIDsSpec.js b/test/mapboxgl/services/GetFeaturesByIDsSpec.js index 34e691e884..7d3eeeb2dc 100644 --- a/test/mapboxgl/services/GetFeaturesByIDsSpec.js +++ b/test/mapboxgl/services/GetFeaturesByIDsSpec.js @@ -20,19 +20,65 @@ describe('mapboxgl_FeatureService_getFeaturesByIDs', () => { //数据集ID查询服务 it('getFeaturesByIDs', done => { + var idsParam = new GetFeaturesByIDsParameters({ + IDs: [247], + datasetNames: ['World:Countries'] + }); + var service = new FeatureService(url); + spyOn(FetchRequest, 'commit').and.callFake((method, testUrl, params, options) => { + expect(method).toBe('POST'); + expect(testUrl).toBe(url + '/featureResults?fromIndex=0&toIndex=19&returnContent=true'); + var paramsObj = JSON.parse(params.replace(/'/g, '"')); + expect(paramsObj.datasetNames[0]).toBe('World:Countries'); + expect(paramsObj.getFeatureMode).toBe('ID'); + expect(options).not.toBeNull(); + return Promise.resolve(new Response(JSON.stringify(getFeaturesResultJson))); + }); + service.getFeaturesByIDs(idsParam, result => { + serviceResult = result; + try { + expect(service).not.toBeNull(); + expect(serviceResult).not.toBeNull(); + expect(serviceResult.type).toBe('processCompleted'); + expect(serviceResult.result.succeed).toBe(true); + expect(serviceResult.options.data).toContain('World:Countries'); + expect(serviceResult.result.featureCount).toEqual(1); + expect(serviceResult.result.totalCount).toEqual(serviceResult.result.featureCount); + expect(serviceResult.result.features.type).toEqual('FeatureCollection'); + expect(serviceResult.result.features.features[0].id).toEqual(127); + expect(serviceResult.result.features.features[0].type).toEqual('Feature'); + expect(serviceResult.result.features.features[0].geometry.type).toEqual('MultiPolygon'); + var coordinates = serviceResult.result.features.features[0].geometry.coordinates; + expect(coordinates.length).toBeGreaterThan(0); + for (var i = 0; i < coordinates.length; i++) { + expect(coordinates[i][0].length).toBeGreaterThan(0); + for (var j = 0; j < coordinates[i][0].length; j++) { + expect(coordinates[i][0][j].length).toEqual(2); + } + } + done(); + } catch (e) { + console.log("'getFeaturesByIDs'案例失败" + e.name + ':' + e.message); + expect(false).toBeTruthy(); + done(); + } + }); + }); + it('getFeaturesByIDs preferServer', done => { var idsParam = new GetFeaturesByIDsParameters({ IDs: [247], datasetNames: ['World:Countries'] }); - var service = new FeatureService(url); + var service = new FeatureService(url, { preferServer: true }); spyOn(FetchRequest, 'commit').and.callFake((method, testUrl, params, options) => { expect(method).toBe('POST'); - expect(testUrl).toBe(url + '/featureResults?fromIndex=0&toIndex=19&returnContent=true'); + expect(testUrl).toBe(url + '/featureResults.geojson?fromIndex=0&toIndex=19&returnContent=true'); var paramsObj = JSON.parse(params.replace(/'/g, '"')); expect(paramsObj.datasetNames[0]).toBe('World:Countries'); expect(paramsObj.getFeatureMode).toBe('ID'); expect(options).not.toBeNull(); - return Promise.resolve(new Response(JSON.stringify(getFeaturesResultJson))); + expect(options.withoutFormatSuffix).toBe(true); + return Promise.resolve(new Response(JSON.stringify(getFeaturesBySQLService.result.features))); }); service.getFeaturesByIDs(idsParam, result => { serviceResult = result; @@ -41,24 +87,12 @@ describe('mapboxgl_FeatureService_getFeaturesByIDs', () => { expect(serviceResult).not.toBeNull(); expect(serviceResult.type).toBe('processCompleted'); expect(serviceResult.result.succeed).toBe(true); + expect(serviceResult.object.preferServer).toBe(true); expect(serviceResult.options.data).toContain('World:Countries'); - expect(serviceResult.result.featureCount).toEqual(1); - expect(serviceResult.result.totalCount).toEqual(serviceResult.result.featureCount); expect(serviceResult.result.features.type).toEqual('FeatureCollection'); - expect(serviceResult.result.features.features[0].id).toEqual(127); - expect(serviceResult.result.features.features[0].type).toEqual('Feature'); - expect(serviceResult.result.features.features[0].geometry.type).toEqual('MultiPolygon'); - var coordinates = serviceResult.result.features.features[0].geometry.coordinates; - expect(coordinates.length).toBeGreaterThan(0); - for (var i = 0; i < coordinates.length; i++) { - expect(coordinates[i][0].length).toBeGreaterThan(0); - for (var j = 0; j < coordinates[i][0].length; j++) { - expect(coordinates[i][0][j].length).toEqual(2); - } - } done(); } catch (e) { - console.log("'getFeaturesByIDs'案例失败" + e.name + ':' + e.message); + console.log("'getFeaturesByIDs preferServer'案例失败" + e.name + ':' + e.message); expect(false).toBeTruthy(); done(); } diff --git a/test/mapboxgl/services/GetFeaturesBySQLSpec.js b/test/mapboxgl/services/GetFeaturesBySQLSpec.js index 048320f797..0531fbc8bc 100644 --- a/test/mapboxgl/services/GetFeaturesBySQLSpec.js +++ b/test/mapboxgl/services/GetFeaturesBySQLSpec.js @@ -26,7 +26,87 @@ describe('mapboxgl_FeatureService_getFeaturesBySQL', () => { expect(getFeaturesBySQLService.options.headers).not.toBeNull(); }); - //数据集SQL查询服务 + it('getFeaturesBySQL geojson preferServer true', done => { + var sqlParam = new GetFeaturesBySQLParameters({ + queryParameter: { + name: 'Countries@World', + attributeFilter: 'SMID = 247' + }, + datasetNames: ['World:Countries'] + }); + var service = new FeatureService(url, { preferServer: true }); + spyOn(FetchRequest, 'commit').and.callFake((method, testUrl, params, options) => { + expect(method).toBe('POST'); + expect(testUrl).toBe(url + '/featureResults.geojson?fromIndex=0&toIndex=19&returnContent=true'); + var paramsObj = JSON.parse(params.replace(/'/g, '"')); + expect(paramsObj.datasetNames[0]).toBe('World:Countries'); + expect(paramsObj.getFeatureMode).toBe('SQL'); + expect(options).not.toBeNull(); + expect(options.withoutFormatSuffix).toBe(true); + return Promise.resolve(new Response(JSON.stringify(getFeaturesBySQLService.result.features))); + }); + service.getFeaturesBySQL(sqlParam, result => { + serviceResult = result; + + try { + expect(service).not.toBeNull(); + expect(serviceResult).not.toBeNull(); + expect(serviceResult.type).toBe('processCompleted'); + expect(serviceResult.result.succeed).toBe(true); + expect(serviceResult.object.preferServer).toBe(true); + expect(serviceResult.result.features.type).toBe('FeatureCollection'); + expect(serviceResult.options.data).toContain('Countries@World'); + expect(serviceResult.options.data).toContain('SMID = 247'); + done(); + } catch (e) { + console.log("'getFeaturesBySQL prefreServer'案例失败" + e.name + ':' + e.message); + expect(false).toBeTruthy(); + done(); + } + }); + }); + + it('getFeaturesBySQL iserver preferServer true', done => { + var sqlParam = new GetFeaturesBySQLParameters({ + queryParameter: { + name: 'Countries@World', + attributeFilter: 'SMID = 247' + }, + datasetNames: ['World:Countries'] + }); + var service = new FeatureService(url, { preferServer: true }); + spyOn(FetchRequest, 'commit').and.callFake((method, testUrl, params, options) => { + expect(method).toBe('POST'); + expect(testUrl).toBe(url + '/featureResults?fromIndex=0&toIndex=19&returnContent=true'); + var paramsObj = JSON.parse(params.replace(/'/g, '"')); + expect(paramsObj.datasetNames[0]).toBe('World:Countries'); + expect(paramsObj.getFeatureMode).toBe('SQL'); + expect(options).not.toBeNull(); + expect(options.withoutFormatSuffix).toBe(false); + return Promise.resolve(new Response(JSON.stringify(getFeaturesResultJson))); + }); + service.getFeaturesBySQL(sqlParam, result => { + serviceResult = result; + try { + expect(service).not.toBeNull(); + expect(serviceResult).not.toBeNull(); + expect(serviceResult.type).toBe('processCompleted'); + expect(serviceResult.result.succeed).toBe(true); + expect(serviceResult.object.preferServer).toBe(true); + expect(serviceResult.result.features).not.toBeNull(); + expect(serviceResult.options.data).toContain('Countries@World'); + expect(serviceResult.options.data).toContain('SMID = 247'); + expect(serviceResult.result.featureCount).toEqual(1); + expect(serviceResult.result.totalCount).toEqual(1); + done(); + } catch (e) { + console.log("'getFeaturesBySQL prefreServer'案例失败" + e.name + ':' + e.message); + expect(false).toBeTruthy(); + done(); + } + }, 'ISERVER'); + }); + it('getFeaturesBySQL', done => { var sqlParam = new GetFeaturesBySQLParameters({ queryParameter: { From 694f0d7ad8866c27a656e88180c8882aaee7d20e Mon Sep 17 00:00:00 2001 From: chenxianhui Date: Thu, 4 Dec 2025 10:49:33 +0800 Subject: [PATCH 04/46] =?UTF-8?q?[update]=20=E6=9B=B4=E6=96=B0http?= =?UTF-8?q?=E4=B8=BAhttps?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../clientcomputation/ClientComputationView.js | 2 +- .../dataservicequery/DataServiceQueryView.js | 2 +- .../distributedanalysis/DistributedAnalysisView.js | 2 +- src/openlayers/mapping/Tianditu.js | 10 +++++----- src/openlayers/mapping/WebMap.js | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/leaflet/components/clientcomputation/ClientComputationView.js b/src/leaflet/components/clientcomputation/ClientComputationView.js index c3c0008d3f..9d919c3701 100644 --- a/src/leaflet/components/clientcomputation/ClientComputationView.js +++ b/src/leaflet/components/clientcomputation/ClientComputationView.js @@ -308,7 +308,7 @@ export var ClientComputationView = ComponentsViewBase.extend({ let analysisingBtn = L.DomUtil.create('div', 'component-analysis__analysisbtn--analysising', analysingContainer); let svgContainer = L.DomUtil.create('div', 'component-analysis__svg-container', analysisingBtn); svgContainer.id = 'analyse_background'; - svgContainer.innerHTML = ` + svgContainer.innerHTML = ` diff --git a/src/leaflet/components/dataservicequery/DataServiceQueryView.js b/src/leaflet/components/dataservicequery/DataServiceQueryView.js index 0b8fa53736..d9bbc681e5 100644 --- a/src/leaflet/components/dataservicequery/DataServiceQueryView.js +++ b/src/leaflet/components/dataservicequery/DataServiceQueryView.js @@ -231,7 +231,7 @@ export var DataServiceQueryView = ComponentsViewBase.extend({ let analysingContainer = L.DomUtil.create('div', 'component-analysis__analysisbtn--analysing-container hidden', runBtn); let analysisingBtn = L.DomUtil.create('div', 'component-analysis__analysisbtn--analysising component-servicequery__querybtn--querying', analysingContainer); let svgContainer = L.DomUtil.create('div', 'component-analysis__svg-container', analysisingBtn); - svgContainer.innerHTML = ` + svgContainer.innerHTML = ` diff --git a/src/leaflet/components/distributedanalysis/DistributedAnalysisView.js b/src/leaflet/components/distributedanalysis/DistributedAnalysisView.js index 81767b0799..43b40f05b8 100644 --- a/src/leaflet/components/distributedanalysis/DistributedAnalysisView.js +++ b/src/leaflet/components/distributedanalysis/DistributedAnalysisView.js @@ -274,7 +274,7 @@ export var DistributedAnalysisView = ComponentsViewBase.extend({ let analysisingBtn = L.DomUtil.create('div', 'component-analysis__analysisbtn--analysising', analysingContainer); analysisingBtn.style.width = '200px'; let svgContainer = L.DomUtil.create('div', 'component-analysis__svg-container', analysisingBtn); - svgContainer.innerHTML = ` + svgContainer.innerHTML = ` diff --git a/src/openlayers/mapping/Tianditu.js b/src/openlayers/mapping/Tianditu.js index 5584e216dc..08e88dcfb0 100644 --- a/src/openlayers/mapping/Tianditu.js +++ b/src/openlayers/mapping/Tianditu.js @@ -12,8 +12,8 @@ import WMTSTileGrid from 'ol/tilegrid/WMTS'; * @classdesc 天地图图层源。 * @modulecategory Mapping * @param {Object} opt_options - 参数。 - * @param {string} [opt_options.url='http://t{0-7}.tianditu.gov.cn/{layer}_{proj}/wmts?'] - 服务地址。 - * @param {string} opt_options.key - 天地图服务密钥。详见{@link http://lbs.tianditu.gov.cn/server/MapService.html} + * @param {string} [opt_options.url='https://t{0-7}.tianditu.gov.cn/{layer}_{proj}/wmts?'] - 服务地址。 + * @param {string} opt_options.key - 天地图服务密钥。详见{@link https://lbs.tianditu.gov.cn/server/MapService.html} * @param {string} [opt_options.layerType='vec'] - 图层类型。(vec:矢量图层,img:影像图层,ter:地形图层) * @param {string} [opt_options.attributions] - 版权描述信息。 * @param {number} [opt_options.cacheSize = 2048] - 缓冲大小。 @@ -39,14 +39,14 @@ export class Tianditu extends WMTS { "img": 18 } var options = opt_options || {}; - var attributions = options.attributions || "Map Data with " + + var attributions = options.attributions || "Map Data with " + "© SuperMap iClient" options.layerType = options.layerType || "vec"; options.layerType = options.isLabel ? layerLabelMap[options.layerType] : options.layerType; options.matrixSet = (options.projection === 'EPSG:4326' || options.projection === 'EPSG:4490') ? "c" : "w"; if (!options.url && !options.urls) { - options.url = "http://t{0-7}.tianditu.gov.cn/{layer}_{proj}/wmts?" + options.url = "https://t{0-7}.tianditu.gov.cn/{layer}_{proj}/wmts?" } if (options.key) { options.url = `${options.url}tk=${options.key}`; diff --git a/src/openlayers/mapping/WebMap.js b/src/openlayers/mapping/WebMap.js index 0fc4bcf2ca..1cbf9143dc 100644 --- a/src/openlayers/mapping/WebMap.js +++ b/src/openlayers/mapping/WebMap.js @@ -1138,7 +1138,7 @@ export class WebMap extends Observable { } break; case 'OSM': - baseLayerInfo.url = 'http://{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png'; + baseLayerInfo.url = 'https://{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png'; baseLayerInfo.epsgCode = 'EPSG:3857'; baseLayerInfo.minZoom = 1; baseLayerInfo.maxZoom = 19; From 3607ec92f01e8fddc4591cb04d78cc33dca89c3b Mon Sep 17 00:00:00 2001 From: chenxianhui Date: Thu, 11 Dec 2025 15:29:08 +0800 Subject: [PATCH 05/46] =?UTF-8?q?[fix]=E8=BF=98=E5=8E=9F=E9=83=A8=E5=88=86?= =?UTF-8?q?http?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/clientcomputation/ClientComputationView.js | 2 +- src/leaflet/components/dataservicequery/DataServiceQueryView.js | 2 +- .../components/distributedanalysis/DistributedAnalysisView.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/leaflet/components/clientcomputation/ClientComputationView.js b/src/leaflet/components/clientcomputation/ClientComputationView.js index 9d919c3701..c3c0008d3f 100644 --- a/src/leaflet/components/clientcomputation/ClientComputationView.js +++ b/src/leaflet/components/clientcomputation/ClientComputationView.js @@ -308,7 +308,7 @@ export var ClientComputationView = ComponentsViewBase.extend({ let analysisingBtn = L.DomUtil.create('div', 'component-analysis__analysisbtn--analysising', analysingContainer); let svgContainer = L.DomUtil.create('div', 'component-analysis__svg-container', analysisingBtn); svgContainer.id = 'analyse_background'; - svgContainer.innerHTML = ` + svgContainer.innerHTML = ` diff --git a/src/leaflet/components/dataservicequery/DataServiceQueryView.js b/src/leaflet/components/dataservicequery/DataServiceQueryView.js index d9bbc681e5..0b8fa53736 100644 --- a/src/leaflet/components/dataservicequery/DataServiceQueryView.js +++ b/src/leaflet/components/dataservicequery/DataServiceQueryView.js @@ -231,7 +231,7 @@ export var DataServiceQueryView = ComponentsViewBase.extend({ let analysingContainer = L.DomUtil.create('div', 'component-analysis__analysisbtn--analysing-container hidden', runBtn); let analysisingBtn = L.DomUtil.create('div', 'component-analysis__analysisbtn--analysising component-servicequery__querybtn--querying', analysingContainer); let svgContainer = L.DomUtil.create('div', 'component-analysis__svg-container', analysisingBtn); - svgContainer.innerHTML = ` + svgContainer.innerHTML = ` diff --git a/src/leaflet/components/distributedanalysis/DistributedAnalysisView.js b/src/leaflet/components/distributedanalysis/DistributedAnalysisView.js index 43b40f05b8..81767b0799 100644 --- a/src/leaflet/components/distributedanalysis/DistributedAnalysisView.js +++ b/src/leaflet/components/distributedanalysis/DistributedAnalysisView.js @@ -274,7 +274,7 @@ export var DistributedAnalysisView = ComponentsViewBase.extend({ let analysisingBtn = L.DomUtil.create('div', 'component-analysis__analysisbtn--analysising', analysingContainer); analysisingBtn.style.width = '200px'; let svgContainer = L.DomUtil.create('div', 'component-analysis__svg-container', analysisingBtn); - svgContainer.innerHTML = ` + svgContainer.innerHTML = ` From e67558562a57651aca8bbc1ab2cc2607959bb997 Mon Sep 17 00:00:00 2001 From: Huzhipeng Date: Thu, 25 Dec 2025 18:28:08 +0800 Subject: [PATCH 06/46] =?UTF-8?q?[update]=20=E5=9B=BE=E4=BE=8B=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E9=9D=A2=E8=BD=AE=E5=BB=93=E5=AE=BD=E5=BA=A6=EF=BC=8C?= =?UTF-8?q?=E5=85=BC=E5=AE=B9=E6=96=B0=E6=97=A7=E7=89=88=E6=9C=AC=20(revie?= =?UTF-8?q?w=20by=20zq)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/mapping/WebMapV3.js | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/common/mapping/WebMapV3.js b/src/common/mapping/WebMapV3.js index 4197fec9c9..563060be03 100644 --- a/src/common/mapping/WebMapV3.js +++ b/src/common/mapping/WebMapV3.js @@ -67,8 +67,9 @@ const LEGEND_CSS_DEFAULT = { opacity: 1, backgroundColor: '#FFFFFF', marginLeft: '1px', - outline: '1px solid transparent', - outlineColor: '#FFFFFF' + outlineStyle: 'none', + outlineColor: '#FFFFFF', + outlineWidth: '0.5px' }, [LEGEND_RENDER_TYPE.FILLEXTRUSION]: { width: '20px', @@ -108,7 +109,7 @@ const LEGEND_STYLE_KEYS = { [LEGEND_RENDER_TYPE.POINT]: ['symbolsContent', 'size', 'color', 'opacity'], [LEGEND_RENDER_TYPE.BUILTINSYMBOL]: ['symbolsContent', 'size', 'color', 'opacity'], [LEGEND_RENDER_TYPE.LINE]: ['width', 'color', 'opacity', 'lineDasharray', 'symbolsContent'], - [LEGEND_RENDER_TYPE.FILL]: ['color', 'opacity', 'antialias', 'outlineColor', 'symbolsContent'], + [LEGEND_RENDER_TYPE.FILL]: ['color', 'opacity', 'antialias' ,'outline', 'outlineColor', 'outlineWidth', 'symbolsContent'], [LEGEND_RENDER_TYPE.FILLEXTRUSION]: ['color', 'opacity', 'symbolsContent'], [LEGEND_RENDER_TYPE.ANIMATEPOINT]: ['color', 'opacity', 'size', 'speed', 'rings'], [LEGEND_RENDER_TYPE.ANIMATELINE]: ['color', 'opacity', 'width', 'textureBlend', 'symbolsContent', 'iconStep'], @@ -757,9 +758,17 @@ export function createWebMapV3Extending(SuperClass, { MapManager, mapRepo, crsMa if (keys) { const simpleKeys = keys.filter((k) => styleSetting[k] && styleSetting[k].type === 'simple'); simpleKeys.forEach((k) => { - if (k === 'outlineColor' && !(styleSetting['antialias'] || {}).value) { - return; - } + const isOutlineKey = k === 'outlineColor' || k === 'outlineWidth'; + const hasOutline = + styleSetting && + ( + (styleSetting.outline && styleSetting.outline.value === true) || + (styleSetting.antialias && styleSetting.antialias.value === true) + ); + + if (isOutlineKey && !hasOutline) { + return; + } simpleStyle[k] = (styleSetting[k] || {}).value; }); } @@ -1233,9 +1242,7 @@ export function createWebMapV3Extending(SuperClass, { MapManager, mapRepo, crsMa cssStyle[key] = defaultStyle[key]; } }); - if (cssStyle.outlineColor) { - Object.assign(cssStyle, { outline: defaultStyle.outline, marginLeft: '1px' }); - } + Object.assign(cssStyle, { outlineStyle: (customValue.antialias || customValue.outline) ? 'solid' : 'none'}); if (this._spriteDatas[symbolId]) { return this._getSpriteStyle(symbolId, { ...cssStyle, backgroundColor: 'transparent' }); } From 453621652e81f2447288901baafa11bfa3c55df3 Mon Sep 17 00:00:00 2001 From: xiongjj Date: Mon, 29 Dec 2025 17:58:02 +0800 Subject: [PATCH 07/46] =?UTF-8?q?=E3=80=90fix=E3=80=91ISVJ-11302;=20review?= =?UTF-8?q?=20by=20luox?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/mapping/WebMapService.js | 10 +- src/common/mapping/WebMapV2.js | 27 ++-- test/common/mapping/WebMapServiceSpec.js | 2 +- test/mapboxgl/mapping/WebMapV2Spec.js | 194 +++++++++++++++++++++++ 4 files changed, 217 insertions(+), 16 deletions(-) diff --git a/src/common/mapping/WebMapService.js b/src/common/mapping/WebMapService.js index d98b9def11..c963971500 100644 --- a/src/common/mapping/WebMapService.js +++ b/src/common/mapping/WebMapService.js @@ -809,7 +809,7 @@ export class WebMapService { return this._getDatasetsInfo(serviceUrl, datasetName).then(info => { // 判断是否和底图坐标系一直 if (info.epsgCode == baseProjection.split('EPSG:')[1]) { - return FetchRequest.get(`${info.url}/tilefeature.mvt`) + return FetchRequest.get(Util.urlPathAppend(info.url, '/tilefeature.mvt')) .then(function (response) { return response.json(); }) @@ -887,7 +887,7 @@ export class WebMapService { _getDatasetsInfo(serviceUrl, datasetName) { return this._getDatasources(serviceUrl).then(datasourceName => { // 判断mvt服务是否可用 - let url = `${serviceUrl}/data/datasources/${datasourceName}/datasets/${datasetName}`; + let url = Util.urlPathAppend(serviceUrl, `/data/datasources/${datasourceName}/datasets/${datasetName}`); const proxy = this.handleProxy(); url = this.handleParentRes(url); return FetchRequest.get(url, null, { @@ -911,7 +911,7 @@ export class WebMapService { _getDatasources(url) { const proxy = this.handleProxy(); - let serviceUrl = `${url}/data/datasources.json`; + let serviceUrl = Util.urlPathAppend(url, '/data/datasources.json'); serviceUrl = this.handleParentRes(serviceUrl); return FetchRequest.get(serviceUrl, null, { withCredentials: this.handleWithCredentials(proxy, serviceUrl, false), @@ -1160,7 +1160,7 @@ export class WebMapService { _getTileLayerInfo(url, baseProjection) { const proxy = this.handleProxy(); let epsgCode = baseProjection.split('EPSG:')[1]; - let serviceUrl = `${url}/maps.json`; + let serviceUrl = Util.urlPathAppend(url, '/maps.json'); serviceUrl = this.handleParentRes(serviceUrl); return FetchRequest.get(serviceUrl, null, { withCredentials: this.handleWithCredentials(proxy, serviceUrl, this.withCredentials), @@ -1174,7 +1174,7 @@ export class WebMapService { if (mapInfo) { mapInfo.forEach(info => { let promise = FetchRequest.get( - `${info.path}.json?prjCoordSys=${JSON.stringify({ epsgCode: epsgCode })}`, + Util.urlAppend(Util.handleUrlSuffix(info.path, '.json'), `prjCoordSys=${JSON.stringify({ epsgCode: epsgCode })}`), null, { withCredentials: this.withCredentials, diff --git a/src/common/mapping/WebMapV2.js b/src/common/mapping/WebMapV2.js index 5557e79009..d70ec4a958 100644 --- a/src/common/mapping/WebMapV2.js +++ b/src/common/mapping/WebMapV2.js @@ -124,7 +124,7 @@ export function createWebMapV2Extending(SuperClass, { MapManager, mapRepo, crsMa } async _registerMapCRS(mapInfo) { - const { projection, extent, baseLayer = {} } = mapInfo; + const { projection, extent = { leftBottom: {}, rightTop: {} }, baseLayer = {} } = mapInfo; const epsgCode = toEpsgCode(projection); let crs = { name: epsgCode, @@ -136,7 +136,7 @@ export function createWebMapV2Extending(SuperClass, { MapManager, mapRepo, crsMa case 'MAPBOXSTYLE': { let url = baseLayer.dataSource.url; if (url.indexOf('/restjsr/') > -1 && !/\/style\.json$/.test(url)) { - url += '/style.json'; + url = Util.urlPathAppend(url, '/style.json'); } const res = await this.webMapService.getMapBoxStyle(url); if (res && res.metadata && res.metadata.indexbounds) { @@ -147,7 +147,7 @@ export function createWebMapV2Extending(SuperClass, { MapManager, mapRepo, crsMa case 'TILE': { // 获取地图的wkt if (!crs.wkt) { - crs.wkt = await this.getEpsgCodeWKT(`${baseLayer.url}/prjCoordSys.wkt`, { + crs.wkt = await this.getEpsgCodeWKT(Util.urlPathAppend(baseLayer.url, '/prjCoordSys.wkt'), { withoutFormatSuffix: true, withCredentials: this.webMapService.handleWithCredentials('', baseLayer.url, false) }); @@ -398,7 +398,7 @@ export function createWebMapV2Extending(SuperClass, { MapManager, mapRepo, crsMa _createMVTBaseLayer(layerInfo, addedCallback) { let url = layerInfo.dataSource.url; if (url.indexOf('/restjsr/') > -1 && !/\/style\.json$/.test(url)) { - url += '/style.json'; + url = Util.urlPathAppend(url, '/style.json'); } const withoutFormatSuffix = url.indexOf('/restjsr/') === -1; this.webMapService @@ -853,11 +853,17 @@ export function createWebMapV2Extending(SuperClass, { MapManager, mapRepo, crsMa const url = layerInfo.url; const layerId = layerInfo.layerID || layerInfo.name; const { minzoom, maxzoom } = layerInfo; + let requestUrl = url; + if (layerInfo.credential && layerInfo.credential.token) { + const token = layerInfo.credential.token; + requestUrl = Util.urlAppend(requestUrl, `token=${token}`); + } const reqOptions = { withoutFormatSuffix: true, - withCredentials: this.webMapService.handleWithCredentials('', url, false) + withCredentials: this.webMapService.handleWithCredentials('', requestUrl, false) }; - let res = await this.getBounds(`${url}.json`, reqOptions) + const boundsRequestUrl = Util.handleUrlSuffix(requestUrl, '.json'); + let res = await this.getBounds(boundsRequestUrl, reqOptions) let bounds = null; if (res && res.bounds) { bounds = this._getBoundList(res); @@ -877,13 +883,14 @@ export function createWebMapV2Extending(SuperClass, { MapManager, mapRepo, crsMa top ]; } else { - res = await this.getBounds(`${url}.json?prjCoordSys=${JSON.stringify({ epsgCode: 4326 })}`, reqOptions) + const nextBoundsRequestUrl = Util.urlAppend(boundsRequestUrl, `prjCoordSys=${JSON.stringify({ epsgCode: 4326 })}`) + res = await this.getBounds(nextBoundsRequestUrl, reqOptions) bounds = this._getBoundList(res); } } } this._addBaselayer({ - url: [url], + url: [requestUrl], layerID: layerId, visibility: layerInfo.visible, minzoom, @@ -2890,7 +2897,7 @@ export function createWebMapV2Extending(SuperClass, { MapManager, mapRepo, crsMa height: 256 }; - url += this._getParamString(options, url) + '&tilematrix={z}&tilerow={y}&tilecol={x}'; + url = Util.urlAppend(url, this._getParamString(options, url) + '&tilematrix={z}&tilerow={y}&tilecol={x}') const tiandituUrl = url.replace('{layer}', layerType).replace('{proj}', tilematrixSet); const tiandituUrlArr = []; @@ -2904,7 +2911,7 @@ export function createWebMapV2Extending(SuperClass, { MapManager, mapRepo, crsMa if (isLabel) { const labelLayer = layerLabelMap[layerType]; options.layer = labelLayer; - labelUrl += this._getParamString(options, labelUrl) + '&tilematrix={z}&tilerow={y}&tilecol={x}'; + labelUrl = Util.urlAppend(labelUrl, this._getParamString(options, labelUrl) + '&tilematrix={z}&tilerow={y}&tilecol={x}'); labelUrl = labelUrl.replace('{layer}', labelLayer).replace('{proj}', tilematrixSet); const labelUrlArr = []; for (let i = 0; i < 8; i++) { diff --git a/test/common/mapping/WebMapServiceSpec.js b/test/common/mapping/WebMapServiceSpec.js index 539a232675..f957f77714 100644 --- a/test/common/mapping/WebMapServiceSpec.js +++ b/test/common/mapping/WebMapServiceSpec.js @@ -434,7 +434,7 @@ describe('WebMapServiceSpec.js', () => { if (url.includes('/web/datas/123')) { return Promise.resolve(new Response(JSON.stringify(result1))); } - if (url.includes('/data/datasources/captial/datasets/test?parentResType=MAP&parentResId=123/tilefeature.mvt')) { + if (url.includes('/data/datasources/captial/datasets/test/tilefeature.mvt?parentResType=MAP&parentResId=123')) { return Promise.resolve(new Response(JSON.stringify(result2))); } if (url.includes('/data/datasources/captial/datasets/test?parentResType=MAP&parentResId=123')) { diff --git a/test/mapboxgl/mapping/WebMapV2Spec.js b/test/mapboxgl/mapping/WebMapV2Spec.js index 4fc86bd904..6be3d42bcb 100644 --- a/test/mapboxgl/mapping/WebMapV2Spec.js +++ b/test/mapboxgl/mapping/WebMapV2Spec.js @@ -3880,6 +3880,157 @@ describe('mapboxgl_WebMapV2', () => { }); }); + it('overlay is TILE which carried credential token', (done) => { + const wkt4496 = `PROJCS["GK Zone 18 (CGCS2000)",GEOGCS["GCS_China_2000",DATUM["D_China_2000",SPHEROID["CGCS2000",6378137.0,298.257222101,AUTHORITY["EPSG","7044"]]],PRIMEM["Greenwich",0.0,AUTHORITY["EPSG","8901"]],UNIT["DEGREE",0.017453292519943295],AUTHORITY["EPSG","4490"]],PROJECTION["Transverse_Mercator",AUTHORITY["EPSG","9807"]],PARAMETER["False_Easting",1.85E7],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",105.0],PARAMETER["Latitude_Of_Origin",0.0],PARAMETER["Scale_Factor",1.0],UNIT["METER",1.0],AUTHORITY["EPSG","4496"]]`; + const nextMapInfo = { + ...dynamicProjectionMapInfo, + layers: dynamicProjectionMapInfo.layers.map(item => { + return { + ...item, + credential: { + "token": "pBRw08Vs3-vfgqDi76tpvOYKCnLYFZ35exKFMMFV5vQ-3CWn80_xIZ_rweYxOe9t3ot0ahD2Y5Uymh50-YeyzzQkel0Ong.." + } + } + }) + }; + spyOn(FetchRequest, 'get').and.callFake((url) => { + if (url.indexOf('portal.json') > -1) { + return Promise.resolve(new Response(JSON.stringify(iportal_serviceProxy))); + } + if (url.indexOf('123/map.json') > -1) { + return Promise.resolve(new Response(JSON.stringify(nextMapInfo))); + } + if (url.indexOf(`prjCoordSys=${JSON.stringify({ epsgCode: 4326 })}`) > -1) { + expect(url).toContain(`token=${nextMapInfo.layers[0].credential.token}`); + return Promise.resolve( + new Response( + JSON.stringify({ + prjCoordSys: { epsgCode: 4326 }, + bounds: { + top: 2.3755571276430945, + left: 113.5091647206238, + bottom: 2.087888705520514, + leftBottom: { + x: 113.5091647206238, + y: 2.087888705520514 + }, + right: 113.84235808224173, + rightTop: { + x: 113.84235808224173, + y: 2.3755571276430945 + } + } + }) + ) + ); + } + if (url.indexOf(`test.json`) > -1) { + expect(url).toContain(`token=${nextMapInfo.layers[0].credential.token}`); + return Promise.resolve( + new Response( + JSON.stringify({ + prjCoordSys: { epsgCode: 4496 }, + bounds: { + top: 262679.13362826034, + left: 25493.744181281887, + bottom: 230878.98887457885, + leftBottom: { + x: 25493.744181281887, + y: 230878.98887457885 + }, + right: 62548.98751319852, + rightTop: { + x: 62548.98751319852, + y: 262679.13362826034 + } + } + }) + ) + ); + } + if (url.indexOf(`China_Dark.json`) > -1) { + return Promise.resolve( + new Response( + JSON.stringify({ + prjCoordSys: { epsgCode: -1 }, + bounds: { + top: 20037508.342789087, + left: -20037508.342789248, + bottom: -25819498.513543323, + leftBottom: { + x: -20037508.342789248, + y: -25819498.513543323 + }, + right: 20037508.342789244, + rightTop: { + x: 20037508.342789244, + y: 20037508.342789087 + } + } + }) + ) + ); + } + if (url.indexOf(`china.json`) > -1) { + expect(url).toContain(`token=${nextMapInfo.layers[0].credential.token}`); + return Promise.resolve( + new Response( + JSON.stringify({ + prjCoordSys: { epsgCode: 3857 }, + bounds: { + top: 5127400.782113583, + left: 10607760.850223977, + bottom: 2755785.4693220854, + leftBottom: { + x: 10607760.850223977, + y: 2755785.4693220854 + }, + right: 12979376.163015474, + rightTop: { + x: 12979376.163015474, + y: 5127400.782113583 + } + } + }) + ) + ); + } + if (url.indexOf('prjCoordSys.wkt')) { + return Promise.resolve(new Response(wkt4496)); + } + }); + datavizWebmap = new WebMap('123', { + target: 'map', + serverUrl: 'http://fake/fakeiportal', + withCredentials: false + }); + datavizWebmap.on('mapcreatesucceeded', ({ map }) => { + const style = map.getStyle(); + expect(map.getStyle().layers.length).toBe(3); + const expectedBaselayerBounds = [-180.00000000000006, -88, 180.00000000000003, 85.05112877980648]; + const actualBaselayerBounds = style.sources['中国暗色地图'].bounds; + expect(actualBaselayerBounds.length).toBe(expectedBaselayerBounds.length); + actualBaselayerBounds.forEach((val, i) => { + expect(val).toBeCloseTo(expectedBaselayerBounds[i], 6); + }); + const expectedOverlayer1Bounds = [95.29113702040888, 24.019508369205386, 116.5957198557339, 41.77544139596302]; + const actualOverlayer1Bounds = style.sources.china.bounds; + expect(actualOverlayer1Bounds.length).toBe(expectedOverlayer1Bounds.length); + actualOverlayer1Bounds.forEach((val, i) => { + expect(val).toBeCloseTo(expectedOverlayer1Bounds[i], 6); + }); + expect(style.sources.china.tiles[0]).toContain(`token=${nextMapInfo.layers[0].credential.token}`); + const expectedOverlayer2Bounds = [113.5091647206238, 2.087888705520514, 113.84235808224173, 2.3755571276430945]; + const actualOverlayer2Bounds = style.sources.test.bounds; + expect(actualOverlayer2Bounds.length).toBe(expectedOverlayer2Bounds.length); + actualOverlayer2Bounds.forEach((val, i) => { + expect(val).toBeCloseTo(expectedOverlayer2Bounds[i], 6); + }); + expect(style.sources.test.tiles[0]).toContain(`token=${nextMapInfo.layers[0].credential.token}`); + done(); + }); + }); + it('baselayer is ZXY_TILE, calc zoomBase with resolutions, minScale 0', (done) => { spyOn(FetchRequest, 'get').and.callFake((url) => { if (url.indexOf('portal.json') > -1) { @@ -4127,4 +4278,47 @@ describe('mapboxgl_WebMapV2', () => { done(); }); }); + + it('baselayer is MAPBOXSTYLE when mapInfo has no extent', (done) => { + const mapInfo = { + "maxScale": "1:144447.92746805", + "baseLayer": { + "layerType": "MAPBOXSTYLE", + "name": "Capital@World33font", + "dataSource": { + "type": "EXTERNAL", + "url": "http://localhost:8195/portalproxy/ad4c697aec15c20c/iserver/services/map-mvt-CapitalWorld33font/restjsr/v1/vectortile/maps/Capital%40World33font" + } + }, + "projection": "EPSG:4326", + "minScale": "1:591658710.909131", + "title": "Capital@World33font", + "version": "2.3.0", + } + spyOn(FetchRequest, 'get').and.callFake((url) => { + if (url.indexOf('portal.json') > -1) { + return Promise.resolve(new Response(JSON.stringify(iportal_serviceProxy))); + } + if (url.indexOf('123/map.json') > -1) { + return Promise.resolve( + new Response( + JSON.stringify(mapInfo) + ) + ); + } + if (url.indexOf('/style.json')) { + return Promise.resolve(new Response(JSON.stringify(vectorTile_style))); + } + return Promise.resolve(new Response(JSON.stringify({}))); + }); + datavizWebmap = new WebMap('123', { + target: 'map', + serverUrl: 'http://fake/fakeiportal', + withCredentials: false + }); + datavizWebmap.on('mapcreatesucceeded', ({ map }) => { + expect(map).not.toBeUndefined(); + done(); + }); + }); }); From d2b8f2c967d1c9e21f730933b52528f2e658f543 Mon Sep 17 00:00:00 2001 From: songyumeng Date: Wed, 7 Jan 2026 17:28:51 +0800 Subject: [PATCH 08/46] =?UTF-8?q?=E3=80=90fix=E3=80=91ol=20WebMap=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=9F=A2=E9=87=8F=E7=93=A6=E7=89=87=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=20=20=E4=B8=8D=E9=9C=80=E8=A6=81=E8=AF=BB=E5=8F=96?= =?UTF-8?q?=E5=9C=B0=E5=9B=BE=E7=9A=84visiblescales?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/openlayers/mapping/WebMap.js | 28 ++++++---- test/openlayers/mapping/WebMapSpec.js | 3 +- test/resources/WebMapV5.js | 79 +++++++++++++++++++++++++++ 3 files changed, 99 insertions(+), 11 deletions(-) diff --git a/src/openlayers/mapping/WebMap.js b/src/openlayers/mapping/WebMap.js index 1cbf9143dc..f18b733fe3 100644 --- a/src/openlayers/mapping/WebMap.js +++ b/src/openlayers/mapping/WebMap.js @@ -839,7 +839,10 @@ export class WebMap extends Observable { layerType: 'VECTOR_TILE' }); } - layerInfo.visibleScale && this.setVisibleScales(layer, layerInfo.visibleScale); + // 后续逻辑非需要visibleScales 否则修改很复杂 + layerInfo.visibleScales = layer.getSource().getTileGrid().getResolutions().map((res) => { + return Util.resolutionToScale(res, 96, layerInfo.coordUnit || 'm'); + }); //否则没有ID,对不上号 layerInfo.layer = layer; layerInfo.layerID = layerID; @@ -5178,17 +5181,17 @@ export class WebMap extends Observable { createVisibleResolution(visibleScales, indexbounds, bounds, coordUnit) { let visibleResolution = []; // 1 设置了地图visibleScales的情况 - if (visibleScales && visibleScales.length > 0) { - visibleResolution = visibleScales.map((scale) => { - let value = 1 / scale; - let res = this.getResFromScale(value, coordUnit); - return res; - }); - } else { + // if (visibleScales && visibleScales.length > 0) { + // visibleResolution = visibleScales.map((scale) => { + // let value = 1 / scale; + // let res = this.getResFromScale(value, coordUnit); + // return res; + // }); + // } else { // 2 地图的bounds let envelope = this.getEnvelope(indexbounds, bounds); visibleResolution = this.getStyleResolutions(envelope); - } + // } return visibleResolution; } @@ -5229,7 +5232,7 @@ export class WebMap extends Observable { ); const envelope = this.getEnvelope(indexbounds, layerInfo.bounds); const styleResolutions = this.getStyleResolutions(envelope); - // const origin = [envelope.left, envelope.top]; + const origin = [envelope.left, envelope.top]; let baseUrl = layerInfo.url; let paramUrl = baseUrl.split('?')[1]; if (layerInfo.dataSource.type === 'ARCGIS_VECTORTILE') { @@ -5273,6 +5276,11 @@ export class WebMap extends Observable { style: styles, withCredentials, projection: layerInfo.projection, + tileGrid: new TileGrid({ + resolutions: styleResolutions, + origin, + tileSize: 512 + }), format: new MVT({ featureClass: olRenderFeature }), diff --git a/test/openlayers/mapping/WebMapSpec.js b/test/openlayers/mapping/WebMapSpec.js index f79b459ebb..3a850e396c 100644 --- a/test/openlayers/mapping/WebMapSpec.js +++ b/test/openlayers/mapping/WebMapSpec.js @@ -1542,7 +1542,7 @@ describe('openlayers_WebMap', () => { return Promise.resolve(new Response(JSON.stringify(datavizWebMap_MVT))); } if (url.indexOf('vectorstyles.json') > -1) { - return Promise.resolve(new Response(JSON.stringify(vectorTile_style))); + return Promise.resolve(new Response(JSON.stringify(vectorTile_style_3857))); } if (url.indexOf('http://fake/iserver/services/map-China100/rest/maps/China.json') > -1) { return Promise.resolve(new Response(JSON.stringify(mapInfo2))); @@ -1556,6 +1556,7 @@ describe('openlayers_WebMap', () => { expect(datavizWebmap.server).toBe(server); expect(datavizWebmap.errorCallback).toBeDefined(); expect(datavizWebmap.map.getLayers().getArray()[0] instanceof olLayer.VectorTile).toBeTrue(); + expect(datavizWebmap.map.getView().getResolutionForZoom(datavizWebmap.map.getView().getZoom())).toBeCloseTo(9783.93962050256,0.1); done(); } }); diff --git a/test/resources/WebMapV5.js b/test/resources/WebMapV5.js index 27c9ebfe21..9b8db6bb38 100644 --- a/test/resources/WebMapV5.js +++ b/test/resources/WebMapV5.js @@ -1033,6 +1033,85 @@ var vectorTile_style = { zoom: 0, version: 8 }; +var vectorTile_style_3857 = { + "metadata": { + "mapcenter": [ + 11523496.17829781, + 3735091.5117932605 + ], + "indexbounds": [ + -20037508.342789244, + -20037508.342789244, + 20037508.342789244, + 20037508.342789244 + ], + "mapscale": 2.455671966265e-8, + "epsgcode": 0, + "topscale": 3.3803271432053097e-9, + "mapbounds": [ + 8009146.115071949, + 382872.01868254057, + 15037846.241523674, + 7087311.00490398 + ] + }, + "sources": { + "PopulationDistribution": { + "tiles": [ + "http://172.16.14.44:8090/iserver/services/map-Population/rest/maps/PopulationDistribution/tileFeature.mvt?returnAttributes=true&width=512&height=512&x={x}&y={y}&z={z}" + ], + "bounds": [ + -180, + -90, + 180, + 90 + ], + "type": "vector" + } + }, + "center": [ + 103.51732743457816, + 31.784770965138264 + ], + "name": "PopulationDistribution", + "layers": [ + { + "paint": { + "background-color": "rgba(255,255,255,1.00)" + }, + "id": "background", + "type": "background" + }, + { + "layout": { + "visibility": "visible" + }, + "filter": [ + "all", + [ + "==", + "$type", + "Polygon" + ] + ], + "metadata": { + "layer:caption": "Country_R@Population", + "layer:name": "Country_R@Population#1" + }, + "maxzoom": 24, + "paint": { + "fill-color": 'red', + }, + "id": "Country_R@Population#1_unique_(0_24)", + "source": "PopulationDistribution", + "source-layer": "Country_R@Population", + "type": "fill", + "minzoom": 0 + }, + ], + "zoom": 2.8, + "version": 8 +}; var vectorTile_style_relative = { layers: [ From f7837cffd09950e061a25cb2a20d5106e24d297b Mon Sep 17 00:00:00 2001 From: Huzhipeng Date: Fri, 16 Jan 2026 17:26:41 +0800 Subject: [PATCH 09/46] =?UTF-8?q?[update]=20=E6=96=B0=E5=A2=9EmapboxFilter?= =?UTF-8?q?=E8=BD=ACSQL=E6=88=96=E8=80=85XML=E6=9F=A5=E8=AF=A2=E8=AF=AD?= =?UTF-8?q?=E5=8F=A5=E7=9A=84=E6=96=B9=E6=B3=95=20(review=20by=20zq)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/mapping/utils/util.js | 290 ++++++++++++++++++++++++++++++- 1 file changed, 289 insertions(+), 1 deletion(-) diff --git a/src/common/mapping/utils/util.js b/src/common/mapping/utils/util.js index 9f0a67afb4..24be8de7e4 100644 --- a/src/common/mapping/utils/util.js +++ b/src/common/mapping/utils/util.js @@ -216,4 +216,292 @@ export function getLayerCatalogRenderLayers(parts, catalogId, layersOnMap) { export function getMainLayerFromCatalog(layerParts, catalogId, layersOnMap) { const renderLayers = getLayerCatalogRenderLayers(layerParts, catalogId, layersOnMap); return layersOnMap.find(item => item.id === renderLayers[0]); -} \ No newline at end of file +} +// 要判断一下是否是二维数组的filter +function isSimpleComparison(filter) { + if (!filter || !Array.isArray(filter)) { + return false; + } + const [operator, ...operands] = filter; + + const simpleOps = ['==', '!=', '>', '>=', '<', '<=', 'in', '!in', 'has', '!has']; + const logicalOps = ['all', 'any', 'none']; + if (simpleOps.includes(operator)) { + // has / !has:只要求一个字段名 + if (operator === 'has' || operator === '!has') { + // 排除这种: ['has', ['get', 'name']] + return typeof operands[0] === 'string'; + } + // in / !in:field + 至少一个值 + if (operator === 'in' || operator === '!in') { + if (typeof operands[0] !== 'string') { return false; } + return operands.length > 1; + } + // 普通比较:field + value + return operands.length === 2 && typeof operands[0] === 'string'; + } + if (logicalOps.includes(operator)) { + if (operands.length === 0) { return false; } + return operands.every((item) => isSimpleComparison(item)); + } + return false; +} + +// 处理类似"O'Reilly"这种字符串,在SQL语句中需要转,单引号需要处理 +function formatValue(value) { + if (typeof value === 'string') { + return `'${value.replace(/'/g, "''")}'`; + } + return String(value); +} + +// 判断空值 +function isNullvalue(value) { + return [null, '', undefined].includes(value); +} + +function mapboxFilterToCqlFilter(filter) { + if (!isSimpleComparison(filter)) { + return ''; + } + const [operator, ...operands] = filter; + const field = operands[0]; + let value; + switch (operator) { + case '>': + case '>=': + case '<': + case '<=': { + value = operands[1]; + return `${field} ${operator} ${formatValue(value)}`; + } + case '==': { + value = operands[1]; + if (isNullvalue(value)) { + return `${field} IS NULL`; + } + return `${field} == ${formatValue(value)}`; + } + case '!=': { + value = operands[1]; + if (isNullvalue(value)) { + return `${field} IS NOT NULL`; + } + return `${field} <> ${formatValue(value)}`; + } + case 'in': { + const values = operands.slice(1); + return `${field} IN (${values.map((v) => formatValue(v)).join(', ')})`; + } + case '!in': { + const values = operands.slice(1); + return `${field} NOT IN (${values.map((v) => formatValue(v)).join(', ')})`; + } + // TODO + // case 'has': { + // const field = operands[0]; + // return tableFieldNames?.includes(field) ? '1=1' : '1=0'; + // } + // case '!has': { + // const field = operands[0]; + // return tableFieldNames?.includes(field) ? '1=0' : '1=1'; + // } + case 'all': { + return operands + .map((item) => mapboxFilterToCqlFilter(item)) + .filter(Boolean) + .map((item) => `${item}`) + .join(' AND '); + } + case 'any': { + return operands + .map((item) => mapboxFilterToCqlFilter(item)) + .filter(Boolean) + .map((item) => `(${item})`) + .join(' OR '); + } + case 'none': { + return operands + .map((item) => mapboxFilterToCqlFilter(item)) + .filter(Boolean) + .map((item) => `NOT (${item})`) + .join(' AND '); + } + default: + return ''; + } +} + +// none的情况下,全部用Not一个一个包裹,会报错(应该是接口问题),反转即可 +function negateComparison(filter) { + const op = filter[0]; + const args = filter.slice(1); + switch (op) { + case '==': + return mapboxFilterToWfsFilter(['!=', ...args]); + case '!=': + return mapboxFilterToWfsFilter(['==', ...args]); + case '>': + return mapboxFilterToWfsFilter(['<=', ...args]); + case '>=': + return mapboxFilterToWfsFilter(['<', ...args]); + case '<': + return mapboxFilterToWfsFilter(['>=', ...args]); + case '<=': + return mapboxFilterToWfsFilter(['>', ...args]); + case 'in': + return mapboxFilterToWfsFilter(['!in', ...args]); + case '!in': + return mapboxFilterToWfsFilter(['in', ...args]); + // case 'has': + // return mapboxFilterToWfsFilter(['!has', ...args], fieldNames, tableFieldNames); + // case '!has': + // return mapboxFilterToWfsFilter(['has', ...args], fieldNames, tableFieldNames); + default: + return ''; + } +} + +function mapboxFilterToWfsFilterBody(filter) { + if (!isSimpleComparison(filter)) { + return ''; + } + const [operator, ...operands] = filter; + const fieldRef = (field) => `${field}`; + const literal = (value) => `${value}`; + switch (operator) { + case '==': { + const [field, value] = operands; + if (isNullvalue(value)) { + return ` + + ${fieldRef(field)} +`; + } + return ` + + ${fieldRef(field)} + ${literal(value)} +`; + } + case '!=': { + const [field, value] = operands; + if (isNullvalue(value)) { + return ` + + ${fieldRef(field)} +`; + } + return ` + + ${fieldRef(field)} + ${literal(value)} +`; + } + case '>': + return ` + + ${fieldRef(operands[0])} + ${literal(operands[1])} +`; + case '>=': + return ` + + ${fieldRef(operands[0])} + ${literal(operands[1])} +`; + case '<': + return ` + + ${fieldRef(operands[0])} + ${literal(operands[1])} +`; + case '<=': + return ` + + ${fieldRef(operands[0])} + ${literal(operands[1])} +`; + case 'in': { + const field = operands[0]; + const values = operands.slice(1); + return ` +${values + .map( + (v) => ` + + ${fieldRef(field)} + ${literal(v)} + ` + ) + .join('')}`; + } + case '!in': { + const field = operands[0]; + const values = operands.slice(1); + return ` +${values + .map( + (v) => ` + + ${fieldRef(field)} + ${literal(v)} + ` + ) + .join('')}`; + } + // TODO,has条件暂时是用null判断,不准确 + // case 'has': { ... } + // case '!has': { ... } + case 'all': { + const children = operands + .map((item) => mapboxFilterToWfsFilterBody(item).trim()) + .filter(Boolean); + return children.length + ? ` + + ${children.join('')} +` + : ''; + } + case 'any': { + const children = operands + .map((item) => mapboxFilterToWfsFilterBody(item).trim()) + .filter(Boolean); + return children.length + ? ` + + ${children.join('')} +` + : ''; + } + case 'none': { + const children = operands.map((item) => negateComparison(item).trim()).filter(Boolean); + return children.length + ? ` + + ${children.join('')} +` + : ''; + } + default: + return ''; + } +} + +function mapboxFilterToWfsFilter(filter) { + const body = mapboxFilterToWfsFilterBody(filter); + if (!body) { return ''; } + return `${body} +`; +} + +export function mapboxFilterToQueryFilter(filter, type = 'SQL') { + if (type === 'SQL') { + return mapboxFilterToCqlFilter(filter); + } + if (type === 'XML') { + return mapboxFilterToWfsFilter(filter); + } + return ''; +} From 407cdf51d625d287ea988a0e316513d19e598e7c Mon Sep 17 00:00:00 2001 From: Huzhipeng Date: Mon, 19 Jan 2026 15:15:44 +0800 Subject: [PATCH 10/46] =?UTF-8?q?[bug]=20=E4=BF=AE=E5=A4=8DmapboxFilterToQ?= =?UTF-8?q?ueryFilter=E6=96=B9=E6=B3=95=E6=B2=A1=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=20=20=20=20=20=20=20fix=20ut=20?= =?UTF-8?q?=EF=BC=88review=20by=20chenxianhui=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/index.common.js | 6 +- src/common/mapping/utils/util.js | 290 +--------------------------- src/common/util/FilterCondition.js | 292 ++++++++++++++++++++++++++++- src/common/util/index.js | 4 +- test/test-main-common.js | 1 + 5 files changed, 300 insertions(+), 293 deletions(-) diff --git a/src/common/index.common.js b/src/common/index.common.js index 91806d7664..02f51e52d5 100644 --- a/src/common/index.common.js +++ b/src/common/index.common.js @@ -338,7 +338,8 @@ import { conversionDegree, EncryptRequest, getServiceKey, - GeometryAnalysis + GeometryAnalysis, + mapboxFilterToQueryFilter } from './util'; import { CartoCSS, ThemeStyle } from './style'; import { @@ -511,7 +512,8 @@ export { getMeterPerMapUnit, getWrapNum, conversionDegree, - GeometryAnalysis + GeometryAnalysis, + mapboxFilterToQueryFilter }; export { IManager, IManagerCreateNodeParam, IManagerServiceBase }; export { diff --git a/src/common/mapping/utils/util.js b/src/common/mapping/utils/util.js index 24be8de7e4..9f0a67afb4 100644 --- a/src/common/mapping/utils/util.js +++ b/src/common/mapping/utils/util.js @@ -216,292 +216,4 @@ export function getLayerCatalogRenderLayers(parts, catalogId, layersOnMap) { export function getMainLayerFromCatalog(layerParts, catalogId, layersOnMap) { const renderLayers = getLayerCatalogRenderLayers(layerParts, catalogId, layersOnMap); return layersOnMap.find(item => item.id === renderLayers[0]); -} -// 要判断一下是否是二维数组的filter -function isSimpleComparison(filter) { - if (!filter || !Array.isArray(filter)) { - return false; - } - const [operator, ...operands] = filter; - - const simpleOps = ['==', '!=', '>', '>=', '<', '<=', 'in', '!in', 'has', '!has']; - const logicalOps = ['all', 'any', 'none']; - if (simpleOps.includes(operator)) { - // has / !has:只要求一个字段名 - if (operator === 'has' || operator === '!has') { - // 排除这种: ['has', ['get', 'name']] - return typeof operands[0] === 'string'; - } - // in / !in:field + 至少一个值 - if (operator === 'in' || operator === '!in') { - if (typeof operands[0] !== 'string') { return false; } - return operands.length > 1; - } - // 普通比较:field + value - return operands.length === 2 && typeof operands[0] === 'string'; - } - if (logicalOps.includes(operator)) { - if (operands.length === 0) { return false; } - return operands.every((item) => isSimpleComparison(item)); - } - return false; -} - -// 处理类似"O'Reilly"这种字符串,在SQL语句中需要转,单引号需要处理 -function formatValue(value) { - if (typeof value === 'string') { - return `'${value.replace(/'/g, "''")}'`; - } - return String(value); -} - -// 判断空值 -function isNullvalue(value) { - return [null, '', undefined].includes(value); -} - -function mapboxFilterToCqlFilter(filter) { - if (!isSimpleComparison(filter)) { - return ''; - } - const [operator, ...operands] = filter; - const field = operands[0]; - let value; - switch (operator) { - case '>': - case '>=': - case '<': - case '<=': { - value = operands[1]; - return `${field} ${operator} ${formatValue(value)}`; - } - case '==': { - value = operands[1]; - if (isNullvalue(value)) { - return `${field} IS NULL`; - } - return `${field} == ${formatValue(value)}`; - } - case '!=': { - value = operands[1]; - if (isNullvalue(value)) { - return `${field} IS NOT NULL`; - } - return `${field} <> ${formatValue(value)}`; - } - case 'in': { - const values = operands.slice(1); - return `${field} IN (${values.map((v) => formatValue(v)).join(', ')})`; - } - case '!in': { - const values = operands.slice(1); - return `${field} NOT IN (${values.map((v) => formatValue(v)).join(', ')})`; - } - // TODO - // case 'has': { - // const field = operands[0]; - // return tableFieldNames?.includes(field) ? '1=1' : '1=0'; - // } - // case '!has': { - // const field = operands[0]; - // return tableFieldNames?.includes(field) ? '1=0' : '1=1'; - // } - case 'all': { - return operands - .map((item) => mapboxFilterToCqlFilter(item)) - .filter(Boolean) - .map((item) => `${item}`) - .join(' AND '); - } - case 'any': { - return operands - .map((item) => mapboxFilterToCqlFilter(item)) - .filter(Boolean) - .map((item) => `(${item})`) - .join(' OR '); - } - case 'none': { - return operands - .map((item) => mapboxFilterToCqlFilter(item)) - .filter(Boolean) - .map((item) => `NOT (${item})`) - .join(' AND '); - } - default: - return ''; - } -} - -// none的情况下,全部用Not一个一个包裹,会报错(应该是接口问题),反转即可 -function negateComparison(filter) { - const op = filter[0]; - const args = filter.slice(1); - switch (op) { - case '==': - return mapboxFilterToWfsFilter(['!=', ...args]); - case '!=': - return mapboxFilterToWfsFilter(['==', ...args]); - case '>': - return mapboxFilterToWfsFilter(['<=', ...args]); - case '>=': - return mapboxFilterToWfsFilter(['<', ...args]); - case '<': - return mapboxFilterToWfsFilter(['>=', ...args]); - case '<=': - return mapboxFilterToWfsFilter(['>', ...args]); - case 'in': - return mapboxFilterToWfsFilter(['!in', ...args]); - case '!in': - return mapboxFilterToWfsFilter(['in', ...args]); - // case 'has': - // return mapboxFilterToWfsFilter(['!has', ...args], fieldNames, tableFieldNames); - // case '!has': - // return mapboxFilterToWfsFilter(['has', ...args], fieldNames, tableFieldNames); - default: - return ''; - } -} - -function mapboxFilterToWfsFilterBody(filter) { - if (!isSimpleComparison(filter)) { - return ''; - } - const [operator, ...operands] = filter; - const fieldRef = (field) => `${field}`; - const literal = (value) => `${value}`; - switch (operator) { - case '==': { - const [field, value] = operands; - if (isNullvalue(value)) { - return ` - - ${fieldRef(field)} -`; - } - return ` - - ${fieldRef(field)} - ${literal(value)} -`; - } - case '!=': { - const [field, value] = operands; - if (isNullvalue(value)) { - return ` - - ${fieldRef(field)} -`; - } - return ` - - ${fieldRef(field)} - ${literal(value)} -`; - } - case '>': - return ` - - ${fieldRef(operands[0])} - ${literal(operands[1])} -`; - case '>=': - return ` - - ${fieldRef(operands[0])} - ${literal(operands[1])} -`; - case '<': - return ` - - ${fieldRef(operands[0])} - ${literal(operands[1])} -`; - case '<=': - return ` - - ${fieldRef(operands[0])} - ${literal(operands[1])} -`; - case 'in': { - const field = operands[0]; - const values = operands.slice(1); - return ` -${values - .map( - (v) => ` - - ${fieldRef(field)} - ${literal(v)} - ` - ) - .join('')}`; - } - case '!in': { - const field = operands[0]; - const values = operands.slice(1); - return ` -${values - .map( - (v) => ` - - ${fieldRef(field)} - ${literal(v)} - ` - ) - .join('')}`; - } - // TODO,has条件暂时是用null判断,不准确 - // case 'has': { ... } - // case '!has': { ... } - case 'all': { - const children = operands - .map((item) => mapboxFilterToWfsFilterBody(item).trim()) - .filter(Boolean); - return children.length - ? ` - - ${children.join('')} -` - : ''; - } - case 'any': { - const children = operands - .map((item) => mapboxFilterToWfsFilterBody(item).trim()) - .filter(Boolean); - return children.length - ? ` - - ${children.join('')} -` - : ''; - } - case 'none': { - const children = operands.map((item) => negateComparison(item).trim()).filter(Boolean); - return children.length - ? ` - - ${children.join('')} -` - : ''; - } - default: - return ''; - } -} - -function mapboxFilterToWfsFilter(filter) { - const body = mapboxFilterToWfsFilterBody(filter); - if (!body) { return ''; } - return `${body} -`; -} - -export function mapboxFilterToQueryFilter(filter, type = 'SQL') { - if (type === 'SQL') { - return mapboxFilterToCqlFilter(filter); - } - if (type === 'XML') { - return mapboxFilterToWfsFilter(filter); - } - return ''; -} +} \ No newline at end of file diff --git a/src/common/util/FilterCondition.js b/src/common/util/FilterCondition.js index 2979634d5d..603096e15f 100644 --- a/src/common/util/FilterCondition.js +++ b/src/common/util/FilterCondition.js @@ -56,4 +56,294 @@ function startsWithNumber(str) { return /^\d/.test(str); } -export { parseCondition, parseConditionFeature }; +// 要判断一下是否是二维数组的filter +function isSimpleComparison(filter) { + if (!filter || !Array.isArray(filter)) { + return false; + } + const [operator, ...operands] = filter; + + const simpleOps = ['==', '!=', '>', '>=', '<', '<=', 'in', '!in', 'has', '!has']; + const logicalOps = ['all', 'any', 'none']; + if (simpleOps.includes(operator)) { + // has / !has:只要求一个字段名 + if (operator === 'has' || operator === '!has') { + // 排除这种: ['has', ['get', 'name']] + return typeof operands[0] === 'string'; + } + // in / !in:field + 至少一个值 + if (operator === 'in' || operator === '!in') { + if (typeof operands[0] !== 'string') { return false; } + return operands.length > 1; + } + // 普通比较:field + value + return operands.length === 2 && typeof operands[0] === 'string'; + } + if (logicalOps.includes(operator)) { + if (operands.length === 0) { return false; } + return operands.every((item) => isSimpleComparison(item)); + } + return false; +} + +// 处理类似"O'Reilly"这种字符串,在SQL语句中需要转,单引号需要处理 +function formatValue(value) { + if (typeof value === 'string') { + return `'${value.replace(/'/g, "''")}'`; + } + return String(value); +} + +// 判断空值 +function isNullvalue(value) { + return [null, '', undefined].includes(value); +} + +function mapboxFilterToCqlFilter(filter) { + if (!isSimpleComparison(filter)) { + return ''; + } + const [operator, ...operands] = filter; + const field = operands[0]; + let value; + switch (operator) { + case '>': + case '>=': + case '<': + case '<=': { + value = operands[1]; + return `${field} ${operator} ${formatValue(value)}`; + } + case '==': { + value = operands[1]; + if (isNullvalue(value)) { + return `${field} IS NULL`; + } + return `${field} == ${formatValue(value)}`; + } + case '!=': { + value = operands[1]; + if (isNullvalue(value)) { + return `${field} IS NOT NULL`; + } + return `${field} <> ${formatValue(value)}`; + } + case 'in': { + const values = operands.slice(1); + return `${field} IN (${values.map((v) => formatValue(v)).join(', ')})`; + } + case '!in': { + const values = operands.slice(1); + return `${field} NOT IN (${values.map((v) => formatValue(v)).join(', ')})`; + } + // TODO + // case 'has': { + // const field = operands[0]; + // return tableFieldNames?.includes(field) ? '1=1' : '1=0'; + // } + // case '!has': { + // const field = operands[0]; + // return tableFieldNames?.includes(field) ? '1=0' : '1=1'; + // } + case 'all': { + return operands + .map((item) => mapboxFilterToCqlFilter(item)) + .filter(Boolean) + .map((item) => `${item}`) + .join(' AND '); + } + case 'any': { + return operands + .map((item) => mapboxFilterToCqlFilter(item)) + .filter(Boolean) + .map((item) => `(${item})`) + .join(' OR '); + } + case 'none': { + return operands + .map((item) => mapboxFilterToCqlFilter(item)) + .filter(Boolean) + .map((item) => `NOT (${item})`) + .join(' AND '); + } + default: + return ''; + } +} + +// none的情况下,全部用Not一个一个包裹,会报错(应该是接口问题),反转即可 +function negateComparison(filter) { + const op = filter[0]; + const args = filter.slice(1); + switch (op) { + case '==': + return mapboxFilterToWfsFilter(['!=', ...args]); + case '!=': + return mapboxFilterToWfsFilter(['==', ...args]); + case '>': + return mapboxFilterToWfsFilter(['<=', ...args]); + case '>=': + return mapboxFilterToWfsFilter(['<', ...args]); + case '<': + return mapboxFilterToWfsFilter(['>=', ...args]); + case '<=': + return mapboxFilterToWfsFilter(['>', ...args]); + case 'in': + return mapboxFilterToWfsFilter(['!in', ...args]); + case '!in': + return mapboxFilterToWfsFilter(['in', ...args]); + // case 'has': + // return mapboxFilterToWfsFilter(['!has', ...args], fieldNames, tableFieldNames); + // case '!has': + // return mapboxFilterToWfsFilter(['has', ...args], fieldNames, tableFieldNames); + default: + return ''; + } +} + +function mapboxFilterToWfsFilterBody(filter) { + if (!isSimpleComparison(filter)) { + return ''; + } + const [operator, ...operands] = filter; + const fieldRef = (field) => `${field}`; + const literal = (value) => `${value}`; + switch (operator) { + case '==': { + const [field, value] = operands; + if (isNullvalue(value)) { + return ` + + ${fieldRef(field)} +`; + } + return ` + + ${fieldRef(field)} + ${literal(value)} +`; + } + case '!=': { + const [field, value] = operands; + if (isNullvalue(value)) { + return ` + + ${fieldRef(field)} +`; + } + return ` + + ${fieldRef(field)} + ${literal(value)} +`; + } + case '>': + return ` + + ${fieldRef(operands[0])} + ${literal(operands[1])} +`; + case '>=': + return ` + + ${fieldRef(operands[0])} + ${literal(operands[1])} +`; + case '<': + return ` + + ${fieldRef(operands[0])} + ${literal(operands[1])} +`; + case '<=': + return ` + + ${fieldRef(operands[0])} + ${literal(operands[1])} +`; + case 'in': { + const field = operands[0]; + const values = operands.slice(1); + return ` +${values + .map( + (v) => ` + + ${fieldRef(field)} + ${literal(v)} + ` + ) + .join('')}`; + } + case '!in': { + const field = operands[0]; + const values = operands.slice(1); + return ` +${values + .map( + (v) => ` + + ${fieldRef(field)} + ${literal(v)} + ` + ) + .join('')}`; + } + // TODO,has条件暂时是用null判断,不准确 + // case 'has': { ... } + // case '!has': { ... } + case 'all': { + const children = operands + .map((item) => mapboxFilterToWfsFilterBody(item).trim()) + .filter(Boolean); + return children.length + ? ` + + ${children.join('')} +` + : ''; + } + case 'any': { + const children = operands + .map((item) => mapboxFilterToWfsFilterBody(item).trim()) + .filter(Boolean); + return children.length + ? ` + + ${children.join('')} +` + : ''; + } + case 'none': { + const children = operands.map((item) => negateComparison(item).trim()).filter(Boolean); + return children.length + ? ` + + ${children.join('')} +` + : ''; + } + default: + return ''; + } +} + +function mapboxFilterToWfsFilter(filter) { + const body = mapboxFilterToWfsFilterBody(filter); + if (!body) { return ''; } + return `${body} +`; +} + +function mapboxFilterToQueryFilter(filter, type = 'SQL') { + if (type === 'SQL') { + return mapboxFilterToCqlFilter(filter); + } + if (type === 'XML') { + return mapboxFilterToWfsFilter(filter); + } + return ''; +} + + +export { parseCondition, parseConditionFeature, mapboxFilterToQueryFilter }; diff --git a/src/common/util/index.js b/src/common/util/index.js index 927aa15e74..7f04e67f55 100644 --- a/src/common/util/index.js +++ b/src/common/util/index.js @@ -22,6 +22,7 @@ import { Polygon } from "../commontypes/geometry/Polygon"; import { LinearRing } from "../commontypes/geometry/LinearRing"; import { GeoJSON as GeoJSONFormat } from "../format/GeoJSON"; import { GeometryAnalysis } from './GeometryAnalysis'; +import { mapboxFilterToQueryFilter } from './FilterCondition'; function toSuperMapGeometry(geoJSON) { if (geoJSON && geoJSON.type) { @@ -83,5 +84,6 @@ export { getWrapNum, conversionDegree, extend, - GeometryAnalysis + GeometryAnalysis, + mapboxFilterToQueryFilter }; diff --git a/test/test-main-common.js b/test/test-main-common.js index f747cb2f08..09a89c3198 100644 --- a/test/test-main-common.js +++ b/test/test-main-common.js @@ -221,6 +221,7 @@ import './common/components/chart/ChartModelSpec.js'; import './common/components/chart/ChartViewModelSpec'; import './common/components/chart/ChartViewSpec'; import './common/util/FetchRequestSpec'; +import './common/util/FilterConditionSpec'; import './common/lang/LangSpec.js'; import './common/util/EncryptRequestSpec'; import './common/util/MapCalculateUtilSpec'; From 59f173607d26e8775ec1ddf6a52806d326ba1b39 Mon Sep 17 00:00:00 2001 From: Huzhipeng Date: Mon, 19 Jan 2026 17:10:45 +0800 Subject: [PATCH 11/46] [ut] fix ut --- test/common/util/FilterConditionSpec.js | 152 ++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 test/common/util/FilterConditionSpec.js diff --git a/test/common/util/FilterConditionSpec.js b/test/common/util/FilterConditionSpec.js new file mode 100644 index 0000000000..65151dec85 --- /dev/null +++ b/test/common/util/FilterConditionSpec.js @@ -0,0 +1,152 @@ +import { + mapboxFilterToQueryFilter +} from '../../../src/common/util/FilterCondition'; + +describe('FilterCondition', () => { + describe('mapboxFilterToQueryFilter - SQL', () => { + it('== 普通等值', () => { + const filter = ['==', 'name', 'Tom']; + const result = mapboxFilterToQueryFilter(filter, 'SQL'); + expect(result).toBe("name == 'Tom'"); + }); + + it('== null 转 IS NULL', () => { + const filter = ['==', 'name', null]; + const result = mapboxFilterToQueryFilter(filter, 'SQL'); + expect(result).toBe('name IS NULL'); + }); + + it('!= null 转 IS NOT NULL', () => { + const filter = ['!=', 'name', null]; + const result = mapboxFilterToQueryFilter(filter, 'SQL'); + expect(result).toBe('name IS NOT NULL'); + }); + + it('字符串单引号转义', () => { + const filter = ['==', 'publisher', "O'Reilly"]; + const result = mapboxFilterToQueryFilter(filter, 'SQL'); + expect(result).toBe("publisher == 'O''Reilly'"); + }); + + it('数值比较 >', () => { + const filter = ['>', 'age', 18]; + const result = mapboxFilterToQueryFilter(filter, 'SQL'); + expect(result).toBe('age > 18'); + }); + + it('in 操作符', () => { + const filter = ['in', 'status', 'A', 'B', 'C']; + const result = mapboxFilterToQueryFilter(filter, 'SQL'); + expect(result).toBe("status IN ('A', 'B', 'C')"); + }); + + it('!in 操作符', () => { + const filter = ['!in', 'status', 'A', 'B']; + const result = mapboxFilterToQueryFilter(filter, 'SQL'); + expect(result).toBe("status NOT IN ('A', 'B')"); + }); + + it('all (AND)', () => { + const filter = [ + 'all', + ['>', 'age', 18], + ['==', 'gender', 'M'] + ]; + const result = mapboxFilterToQueryFilter(filter, 'SQL'); + expect(result).toBe("age > 18 AND gender == 'M'"); + }); + + it('any (OR)', () => { + const filter = [ + 'any', + ['==', 'type', 'A'], + ['==', 'type', 'B'] + ]; + const result = mapboxFilterToQueryFilter(filter, 'SQL'); + expect(result).toBe("(type == 'A') OR (type == 'B')"); + }); + + it('none (NOT AND)', () => { + const filter = [ + 'none', + ['==', 'status', 'disabled'], + ['<', 'age', 10] + ]; + const result = mapboxFilterToQueryFilter(filter, 'SQL'); + expect(result).toBe("NOT (status == 'disabled') AND NOT (age < 10)"); + }); + + it('非法 filter 返回空字符串', () => { + const result = mapboxFilterToQueryFilter(['get', 'name'], 'SQL'); + expect(result).toBe(''); + }); + }); + + describe('mapboxFilterToQueryFilter - XML', () => { + it('== 普通等值', () => { + const filter = ['==', 'name', 'Tom']; + const result = mapboxFilterToQueryFilter(filter, 'XML'); + expect(result).toContain(''); + expect(result).toContain('name'); + expect(result).toContain('Tom'); + }); + + it('== null 转 PropertyIsNull', () => { + const filter = ['==', 'name', null]; + const result = mapboxFilterToQueryFilter(filter, 'XML'); + expect(result).toContain(''); + }); + + it('!= null 转 PropertyIsNotNull', () => { + const filter = ['!=', 'name', null]; + const result = mapboxFilterToQueryFilter(filter, 'XML'); + expect(result).toContain(''); + }); + + it('in 转 Or', () => { + const filter = ['in', 'type', 'A', 'B']; + const result = mapboxFilterToQueryFilter(filter, 'XML'); + expect(result).toContain(''); + const equalCount = (result.match(//g) || []).length; + expect(equalCount).toBe(2); + }); + it('!in 转 Not + Or', () => { + const filter = ['!in', 'type', 'A', 'B']; + const result = mapboxFilterToQueryFilter(filter, 'XML'); + expect(result).toContain(''); + expect(result).toContain(''); + }); + + it('all 转 And', () => { + const filter = [ + 'all', + ['>', 'age', 18], + ['==', 'gender', 'M'] + ]; + const result = mapboxFilterToQueryFilter(filter, 'XML'); + expect(result).toContain(''); + }); + + it('any 转 Or', () => { + const filter = [ + 'any', + ['==', 'type', 'A'], + ['==', 'type', 'B'] + ]; + const result = mapboxFilterToQueryFilter(filter, 'XML'); + expect(result).toContain(''); + }); + + it('none 使用反转比较', () => { + const filter = [ + 'none', + ['==', 'status', 'disabled'], + ['<', 'age', 10] + ]; + const result = mapboxFilterToQueryFilter(filter, 'XML'); + // == → != , < → >= + expect(result).toContain('PropertyIsNotEqualTo'); + expect(result).toContain('PropertyIsGreaterThanOrEqualTo'); + }); + }); +}); From 966dde47adf711c7c982c34de2dddb4f63db6fc4 Mon Sep 17 00:00:00 2001 From: Huzhipeng Date: Thu, 22 Jan 2026 11:00:45 +0800 Subject: [PATCH 12/46] =?UTF-8?q?[update]=20getLayer=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E6=96=B0=E5=A2=9ElayerName=E5=92=8Cfilter=E5=8F=82=E6=95=B0=20?= =?UTF-8?q?(review=20by=20xjj)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapping/utils/AppreciableLayerBase.js | 6 +- src/common/mapping/utils/SourceListModelV3.js | 4 +- src/common/util/FilterCondition.js | 2 +- .../mapping/utils/SourceListModelV3Spec.js | 837 +++++++++++++++++- test/common/util/FilterConditionSpec.js | 10 +- 5 files changed, 821 insertions(+), 38 deletions(-) diff --git a/src/common/mapping/utils/AppreciableLayerBase.js b/src/common/mapping/utils/AppreciableLayerBase.js index ec088a003a..aa6063ede4 100644 --- a/src/common/mapping/utils/AppreciableLayerBase.js +++ b/src/common/mapping/utils/AppreciableLayerBase.js @@ -260,7 +260,8 @@ export class AppreciableLayerBase extends Events { CLASS_NAME, CLASS_INSTANCE, reused, - metadata = layer.metadata || {} + metadata = layer.metadata || {}, + filter } = layerInfo; const sourceOnMap = this.map.getSource(layer.source); const fields = { @@ -279,7 +280,8 @@ export class AppreciableLayerBase extends Events { themeSetting, metadata, // top bottom auto - layerOrder: metadata.SM_Layer_Order || 'auto' + layerOrder: metadata.SM_Layer_Order || 'auto', + filter }; if (layer.sourceLayer) { fields.renderSource.sourceLayer = layer.sourceLayer; diff --git a/src/common/mapping/utils/SourceListModelV3.js b/src/common/mapping/utils/SourceListModelV3.js index 7ce035debd..637f3f7768 100644 --- a/src/common/mapping/utils/SourceListModelV3.js +++ b/src/common/mapping/utils/SourceListModelV3.js @@ -133,7 +133,8 @@ export class SourceListModelV3 extends AppreciableLayerBase { reused: layer.metadata && layer.metadata.reused }; const matchProjectCatalog = projectCataglogs.find((item) => item.id === layerCatalog.id) || {}; - const { msDatasetId, relationMsDatasetId } = matchProjectCatalog; + const { msDatasetId, relationMsDatasetId, filter, serviceLayerId } = matchProjectCatalog; + filter && (layerInfo.filter = filter); let dataSource = {}; if (msDatasetId) { for (const data of datas) { @@ -181,6 +182,7 @@ export class SourceListModelV3 extends AppreciableLayerBase { dataSource.url = `${serverUrl}/rest/maps`; dataSource.mapName = mapName; dataSource.type = 'REST_MAP'; + dataSource.layerName = serviceLayerId; } } layerInfo.dataSource = dataSource; diff --git a/src/common/util/FilterCondition.js b/src/common/util/FilterCondition.js index 603096e15f..d079f1027a 100644 --- a/src/common/util/FilterCondition.js +++ b/src/common/util/FilterCondition.js @@ -119,7 +119,7 @@ function mapboxFilterToCqlFilter(filter) { if (isNullvalue(value)) { return `${field} IS NULL`; } - return `${field} == ${formatValue(value)}`; + return `${field} = ${formatValue(value)}`; } case '!=': { value = operands[1]; diff --git a/test/common/mapping/utils/SourceListModelV3Spec.js b/test/common/mapping/utils/SourceListModelV3Spec.js index 3b99ac7d4a..9831a3fc6f 100644 --- a/test/common/mapping/utils/SourceListModelV3Spec.js +++ b/test/common/mapping/utils/SourceListModelV3Spec.js @@ -1,22 +1,23 @@ -import { SourceListModelV3 } from '../../../../src/common/mapping/utils/SourceListModelV3'; -import { isL7Layer } from '../../../../src/common/mapping/utils/L7LayerUtil'; +import { + SourceListModelV3 +} from '../../../../src/common/mapping/utils/SourceListModelV3'; +import { + isL7Layer +} from '../../../../src/common/mapping/utils/L7LayerUtil'; import '../../../resources/WebMapV3.js'; import cloneDeep from 'lodash.clonedeep'; - describe('SourceListV3', () => { let map, layers, sources, mockEvents, overlayLayersManager; const baseLayerInfo = { id: 'wmts100', title: 'wmts100', - layers: [ - { - id: 'wmts100', - type: 'raster', - source: 'wmts100', - minzoom: 0, - maxzoom: 12 - } - ], + layers: [{ + id: 'wmts100', + type: 'raster', + source: 'wmts100', + minzoom: 0, + maxzoom: 12 + }], sources: { wmts100: { type: 'raster', @@ -32,8 +33,7 @@ describe('SourceListV3', () => { }; const changeBaseLayerMapInfo = { metadata: { - layerCatalog: [ - { + layerCatalog: [{ visible: true, parts: ['北京市住宅小区'], id: 'layer_北京市住宅小区_1754359974753_24', @@ -42,8 +42,7 @@ describe('SourceListV3', () => { }, { visible: true, - children: [ - { + children: [{ visible: true, id: 'ms_TIANDITU_IMG_3857_label', title: 'ms_TIANDITU_IMG_3857_label', @@ -96,8 +95,7 @@ describe('SourceListV3', () => { version: '3.3.2', maxzoom: 19, name: '无标题地图-tianditu', - layers: [ - { + layers: [{ maxzoom: 19, id: 'TIANDITU_IMG_3857', source: 'TIANDITU_IMG_3857', @@ -138,8 +136,7 @@ describe('SourceListV3', () => { beforeEach(() => { mockEvents = {}; - layers = [ - { + layers = [{ id: 'background', type: 'background', layout: { @@ -170,7 +167,9 @@ describe('SourceListV3', () => { source: 'test-source', minzoom: 0, maxzoom: 12, - metadata: { parentLayerId: 'test-source' } + metadata: { + parentLayerId: 'test-source' + } }, { id: 'tracklayer-1-line', @@ -574,8 +573,221 @@ describe('SourceListV3', () => { "pitch": 0, "minzoom": 0 }; - const projInfo = {"catalogs":[{"visible":true,"catalogType":"group","children":[{"catalogType":"layer","relationMsDatasetId":"ms_Population:ProvinceCapital_P_1755679835391_71","serviceLayerId":"0.8","id":"layer_ProvinceCapital_P@Population#1_1755679838482_95","popupInfo":{"elements":[{"fieldName":"SmID","type":"FIELD"},{"fieldName":"SmX","type":"FIELD"},{"fieldName":"SmY","type":"FIELD"},{"fieldName":"SmLibTileID","type":"FIELD"},{"fieldName":"SmUserID","type":"FIELD"},{"fieldName":"SmGeometrySize","type":"FIELD"},{"fieldName":"SmGeoPosition","type":"FIELD"},{"fieldName":"Name","type":"FIELD"}],"title":"ProvinceCapital_P@Population#1"},"title":"ProvinceCapital_P@Population#1","layerSourceType":"WMSService","zoomRange":[0,24],"layersContent":["ProvinceCapital_P@Population#1_0.8"]}],"name":"PopulationDistribution_wms111","id":"group_PopulationDistribution_wms111_1755679838482_96"},{"visible":true,"catalogType":"group","children":[{"catalogType":"layer","relationMsDatasetId":"ms_Population:Province_L_1755679787206_46","serviceLayerId":"0.3","id":"layer_Province_L@Population_1755679795075_67","popupInfo":{"elements":[{"fieldName":"SmID","type":"FIELD"},{"fieldName":"SmLength","type":"FIELD"},{"fieldName":"SmSdriW","type":"FIELD"},{"fieldName":"SmSdriN","type":"FIELD"},{"fieldName":"SmSdriE","type":"FIELD"},{"fieldName":"SmSdriS","type":"FIELD"},{"fieldName":"SmUserID","type":"FIELD"},{"fieldName":"SmTopoError","type":"FIELD"},{"fieldName":"SmGeometrySize","type":"FIELD"},{"fieldName":"SmGeoPosition","type":"FIELD"},{"fieldName":"GB","type":"FIELD"}],"title":"Province_L@Population"},"title":"Province_L@Population","layerSourceType":"WMSService","zoomRange":[0,24],"layersContent":["Province_L@Population_0.3"]}],"name":"PopulationDistribution_wms111","id":"group_PopulationDistribution_wms111_1755679795075_68"}],"datas":[{"sourceType":"WFS","datasets":[{"datasetTitle":"Country_R","msDatasetId":"ms_Population:Country_R_1755679787206_42","datasetName":"Population:Country_R"},{"datasetTitle":"HeiHeTengChong_P","msDatasetId":"ms_Population:HeiHeTengChong_P_1755679787206_43","datasetName":"Population:HeiHeTengChong_P"},{"datasetTitle":"ProvinceCapital_P","msDatasetId":"ms_Population:ProvinceCapital_P_1755679787206_44","datasetName":"Population:ProvinceCapital_P"},{"datasetTitle":"BorderTest_L","msDatasetId":"ms_Population:BorderTest_L_1755679787206_45","datasetName":"Population:BorderTest_L"},{"datasetTitle":"Province_L","msDatasetId":"ms_Population:Province_L_1755679787206_46","datasetName":"Population:Province_L"},{"datasetTitle":"Island_R","msDatasetId":"ms_Population:Island_R_1755679787206_47","datasetName":"Population:Island_R"},{"datasetTitle":"PopDensity_R","msDatasetId":"ms_Population:PopDensity_R_1755679787206_48","datasetName":"Population:PopDensity_R"},{"datasetTitle":"Coastline_L","msDatasetId":"ms_Population:Coastline_L_1755679787206_49","datasetName":"Population:Coastline_L"},{"datasetTitle":"Buffer20000","msDatasetId":"ms_Population:Buffer20000_1755679787206_50","datasetName":"Population:Buffer20000"},{"datasetTitle":"Buffer35000","msDatasetId":"ms_Population:Buffer35000_1755679787206_51","datasetName":"Population:Buffer35000"},{"datasetTitle":"County_R","msDatasetId":"ms_Population:County_R_1755679787206_52","datasetName":"Population:County_R"},{"datasetTitle":"County_P","msDatasetId":"ms_Population:County_P_1755679787206_53","datasetName":"Population:County_P"}],"title":"示例 WFS 服务","url":"http://172.16.14.77:8090/iserver/services/data-Population-2/wfs200/gb18030"},{"sourceType":"WFS","withCredential":{"key": "token", "value": "test"},"datasets":[{"datasetTitle":"Country_R","msDatasetId":"ms_Population:Country_R_1755679835391_69","datasetName":"Population:Country_R"},{"datasetTitle":"HeiHeTengChong_P","msDatasetId":"ms_Population:HeiHeTengChong_P_1755679835391_70","datasetName":"Population:HeiHeTengChong_P"},{"datasetTitle":"ProvinceCapital_P","msDatasetId":"ms_Population:ProvinceCapital_P_1755679835391_71","datasetName":"Population:ProvinceCapital_P"},{"datasetTitle":"BorderTest_L","msDatasetId":"ms_Population:BorderTest_L_1755679835391_72","datasetName":"Population:BorderTest_L"},{"datasetTitle":"Province_L","msDatasetId":"ms_Population:Province_L_1755679835391_73","datasetName":"Population:Province_L"},{"datasetTitle":"Island_R","msDatasetId":"ms_Population:Island_R_1755679835391_74","datasetName":"Population:Island_R"},{"datasetTitle":"PopDensity_R","msDatasetId":"ms_Population:PopDensity_R_1755679835391_75","datasetName":"Population:PopDensity_R"},{"datasetTitle":"Coastline_L","msDatasetId":"ms_Population:Coastline_L_1755679835391_76","datasetName":"Population:Coastline_L"},{"datasetTitle":"Buffer20000","msDatasetId":"ms_Population:Buffer20000_1755679835391_77","datasetName":"Population:Buffer20000"},{"datasetTitle":"Buffer35000","msDatasetId":"ms_Population:Buffer35000_1755679835391_78","datasetName":"Population:Buffer35000"},{"datasetTitle":"County_R","msDatasetId":"ms_Population:County_R_1755679835391_79","datasetName":"Population:County_R"},{"datasetTitle":"County_P","msDatasetId":"ms_Population:County_P_1755679835391_80","datasetName":"Population:County_P"}],"title":"示例 WFS 服务","url":"http://172.16.14.77:8090/iserver/services/data-Population-2/wfs200/gb18030"}],"baseLayer":{"internetMapName":"CHINA_DARK","type":"INTERNET_MAP"},"version":"3.1.2"}; - + const projInfo = { + "catalogs": [{ + "visible": true, + "catalogType": "group", + "children": [{ + "catalogType": "layer", + "relationMsDatasetId": "ms_Population:ProvinceCapital_P_1755679835391_71", + "serviceLayerId": "0.8", + "id": "layer_ProvinceCapital_P@Population#1_1755679838482_95", + "popupInfo": { + "elements": [{ + "fieldName": "SmID", + "type": "FIELD" + }, { + "fieldName": "SmX", + "type": "FIELD" + }, { + "fieldName": "SmY", + "type": "FIELD" + }, { + "fieldName": "SmLibTileID", + "type": "FIELD" + }, { + "fieldName": "SmUserID", + "type": "FIELD" + }, { + "fieldName": "SmGeometrySize", + "type": "FIELD" + }, { + "fieldName": "SmGeoPosition", + "type": "FIELD" + }, { + "fieldName": "Name", + "type": "FIELD" + }], + "title": "ProvinceCapital_P@Population#1" + }, + "title": "ProvinceCapital_P@Population#1", + "layerSourceType": "WMSService", + "zoomRange": [0, 24], + "layersContent": ["ProvinceCapital_P@Population#1_0.8"] + }], + "name": "PopulationDistribution_wms111", + "id": "group_PopulationDistribution_wms111_1755679838482_96" + }, { + "visible": true, + "catalogType": "group", + "children": [{ + "catalogType": "layer", + "relationMsDatasetId": "ms_Population:Province_L_1755679787206_46", + "serviceLayerId": "0.3", + "id": "layer_Province_L@Population_1755679795075_67", + "popupInfo": { + "elements": [{ + "fieldName": "SmID", + "type": "FIELD" + }, { + "fieldName": "SmLength", + "type": "FIELD" + }, { + "fieldName": "SmSdriW", + "type": "FIELD" + }, { + "fieldName": "SmSdriN", + "type": "FIELD" + }, { + "fieldName": "SmSdriE", + "type": "FIELD" + }, { + "fieldName": "SmSdriS", + "type": "FIELD" + }, { + "fieldName": "SmUserID", + "type": "FIELD" + }, { + "fieldName": "SmTopoError", + "type": "FIELD" + }, { + "fieldName": "SmGeometrySize", + "type": "FIELD" + }, { + "fieldName": "SmGeoPosition", + "type": "FIELD" + }, { + "fieldName": "GB", + "type": "FIELD" + }], + "title": "Province_L@Population" + }, + "title": "Province_L@Population", + "layerSourceType": "WMSService", + "zoomRange": [0, 24], + "layersContent": ["Province_L@Population_0.3"] + }], + "name": "PopulationDistribution_wms111", + "id": "group_PopulationDistribution_wms111_1755679795075_68" + }], + "datas": [{ + "sourceType": "WFS", + "datasets": [{ + "datasetTitle": "Country_R", + "msDatasetId": "ms_Population:Country_R_1755679787206_42", + "datasetName": "Population:Country_R" + }, { + "datasetTitle": "HeiHeTengChong_P", + "msDatasetId": "ms_Population:HeiHeTengChong_P_1755679787206_43", + "datasetName": "Population:HeiHeTengChong_P" + }, { + "datasetTitle": "ProvinceCapital_P", + "msDatasetId": "ms_Population:ProvinceCapital_P_1755679787206_44", + "datasetName": "Population:ProvinceCapital_P" + }, { + "datasetTitle": "BorderTest_L", + "msDatasetId": "ms_Population:BorderTest_L_1755679787206_45", + "datasetName": "Population:BorderTest_L" + }, { + "datasetTitle": "Province_L", + "msDatasetId": "ms_Population:Province_L_1755679787206_46", + "datasetName": "Population:Province_L" + }, { + "datasetTitle": "Island_R", + "msDatasetId": "ms_Population:Island_R_1755679787206_47", + "datasetName": "Population:Island_R" + }, { + "datasetTitle": "PopDensity_R", + "msDatasetId": "ms_Population:PopDensity_R_1755679787206_48", + "datasetName": "Population:PopDensity_R" + }, { + "datasetTitle": "Coastline_L", + "msDatasetId": "ms_Population:Coastline_L_1755679787206_49", + "datasetName": "Population:Coastline_L" + }, { + "datasetTitle": "Buffer20000", + "msDatasetId": "ms_Population:Buffer20000_1755679787206_50", + "datasetName": "Population:Buffer20000" + }, { + "datasetTitle": "Buffer35000", + "msDatasetId": "ms_Population:Buffer35000_1755679787206_51", + "datasetName": "Population:Buffer35000" + }, { + "datasetTitle": "County_R", + "msDatasetId": "ms_Population:County_R_1755679787206_52", + "datasetName": "Population:County_R" + }, { + "datasetTitle": "County_P", + "msDatasetId": "ms_Population:County_P_1755679787206_53", + "datasetName": "Population:County_P" + }], + "title": "示例 WFS 服务", + "url": "http://172.16.14.77:8090/iserver/services/data-Population-2/wfs200/gb18030" + }, { + "sourceType": "WFS", + "withCredential": { + "key": "token", + "value": "test" + }, + "datasets": [{ + "datasetTitle": "Country_R", + "msDatasetId": "ms_Population:Country_R_1755679835391_69", + "datasetName": "Population:Country_R" + }, { + "datasetTitle": "HeiHeTengChong_P", + "msDatasetId": "ms_Population:HeiHeTengChong_P_1755679835391_70", + "datasetName": "Population:HeiHeTengChong_P" + }, { + "datasetTitle": "ProvinceCapital_P", + "msDatasetId": "ms_Population:ProvinceCapital_P_1755679835391_71", + "datasetName": "Population:ProvinceCapital_P" + }, { + "datasetTitle": "BorderTest_L", + "msDatasetId": "ms_Population:BorderTest_L_1755679835391_72", + "datasetName": "Population:BorderTest_L" + }, { + "datasetTitle": "Province_L", + "msDatasetId": "ms_Population:Province_L_1755679835391_73", + "datasetName": "Population:Province_L" + }, { + "datasetTitle": "Island_R", + "msDatasetId": "ms_Population:Island_R_1755679835391_74", + "datasetName": "Population:Island_R" + }, { + "datasetTitle": "PopDensity_R", + "msDatasetId": "ms_Population:PopDensity_R_1755679835391_75", + "datasetName": "Population:PopDensity_R" + }, { + "datasetTitle": "Coastline_L", + "msDatasetId": "ms_Population:Coastline_L_1755679835391_76", + "datasetName": "Population:Coastline_L" + }, { + "datasetTitle": "Buffer20000", + "msDatasetId": "ms_Population:Buffer20000_1755679835391_77", + "datasetName": "Population:Buffer20000" + }, { + "datasetTitle": "Buffer35000", + "msDatasetId": "ms_Population:Buffer35000_1755679835391_78", + "datasetName": "Population:Buffer35000" + }, { + "datasetTitle": "County_R", + "msDatasetId": "ms_Population:County_R_1755679835391_79", + "datasetName": "Population:County_R" + }, { + "datasetTitle": "County_P", + "msDatasetId": "ms_Population:County_P_1755679835391_80", + "datasetName": "Population:County_P" + }], + "title": "示例 WFS 服务", + "url": "http://172.16.14.77:8090/iserver/services/data-Population-2/wfs200/gb18030" + }], + "baseLayer": { + "internetMapName": "CHINA_DARK", + "type": "INTERNET_MAP" + }, + "version": "3.1.2" + }; + const sourceListModel = new SourceListModelV3({ map, mapInfo, @@ -587,10 +799,567 @@ describe('SourceListV3', () => { } }); const appreciableLayers = sourceListModel.getLayers(); - expect(appreciableLayers.find(l=>l.dataSource.type === 'WFS')).toBeTruthy(); + expect(appreciableLayers.find(l => l.dataSource.type === 'WFS')).toBeTruthy(); done(); }); + it('getLayers - filter', (done) => { + const mapInfo = { + "metadata": { + "layerCatalog": [{ + "visible": true, + "parts": [ + "BaseMap_R@Jingjin#1_unique_(0_24)" + ], + "id": "layer_BaseMap_R@Jingjin#1_1768977772124_306", + "title": "BaseMap_R@Jingjin#1", + "type": "composite" + }, + { + "visible": true, + "parts": [ + "ms_Captital_P_1768977260316_30" + ], + "id": "layer_Captital_P_1768977260317_32", + "title": "Captital_P", + "type": "composite" + }, + { + "visible": true, + "parts": [ + "四川发电站上月发电量" + ], + "id": "layer_四川发电站上月发电量_1768962856899_28", + "title": "四川发电站上月发电量", + "type": "composite" + }, + { + "visible": true, + "id": "OSM", + "title": "OpenStreetMap", + "type": "basic" + } + ] + }, + "sources": { + "ms_京津地区地图_1768977772122_222": { + "tiles": [ + "http://172.16.14.77:8090/iserver/services/map-Jingjin/rest/maps/京津地区地图/tileFeature.mvt?returnAttributes=true&width=512&height=512&x={x}&y={y}&z={z}" + ], + "bounds": [ + 114.58902605452259, + 37.76434929128856, + 119.51371730073062, + 42.31307532235788 + ], + "type": "vector" + }, + "OSM": { + "tiles": [ + "https://a.tile.openstreetmap.org/{z}/{x}/{y}.png" + ], + "tileSize": 256, + "attribution": "", + "bounds": [ + -180, + -90, + 180, + 90 + ], + "type": "raster" + }, + "ms_606692449_1768962856899_27": { + "tiles": [ + "http://172.16.15.136:8080/iportal/web/datas/606692449/structureddata/tiles/{z}/{x}/{y}.mvt?epsgCode=4326&returnedFieldNames=%5B%22smpid%22%2C%22%E5%BA%8F%E5%8F%B7%22%2C%22%E6%B0%B4%E7%94%B5%E7%AB%99%E5%90%8D%E7%A7%B0%22%2C%22%E6%89%80%E5%9C%A8%E7%9C%81%22%2C%22%E6%89%80%E5%9C%A8%E5%B8%82%E5%B7%9E%22%2C%22%E6%89%80%E5%9C%A8%E5%9C%B0%22%2C%22%E8%AF%A6%E7%BB%86%E5%9C%B0%E5%9D%80%22%2C%22X%22%2C%22Y%22%2C%22%E6%9C%88%E5%8F%91%E7%94%B5%E9%87%8F%22%2C%22%E6%B0%B4%E7%94%B5%E7%AB%99%E6%80%A7%E8%B4%A8%22%5D&geometryFieldName=geometry" + ], + "bounds": [ + 100.98842, + 26.28844000000001, + 108.25193, + 32.524739999999994 + ], + "type": "vector" + }, + "ms_Captital_P_ms_datasetId_1768977259887_27_1768977260316_31": { + "tiles": [ + "http://172.16.14.77:8090/iserver/services/data-Jingjin/rest/data/datasources/Jingjin/datasets/Captital_P/tileFeature.mvt?returnAttributes=true&width=512&height=512&x={x}&y={y}&z={z}" + ], + "bounds": [ + 116.407283, + 39.12096299445415, + 117.215268, + 39.90455699411283 + ], + "type": "vector" + } + }, + "crs": "EPSG:4326", + "center": [ + 117.05137167762655, + 40.03871230682322 + ], + "zoom": 7.059607301518861, + "glyphs": { + "ms_京津地区地图_1768977772122_222": "http://172.16.14.77:8090/iserver/services/map-Jingjin/rest/maps/%E4%BA%AC%E6%B4%A5%E5%9C%B0%E5%8C%BA%E5%9C%B0%E5%9B%BE/tileFeature/sdffonts/{fontstack}/{range}.pbf", + "ms_京津地区地图_1768977731355_29": "http://172.16.14.77:8090/iserver/services/map-Jingjin/rest/maps/%E4%BA%AC%E6%B4%A5%E5%9C%B0%E5%8C%BA%E5%9C%B0%E5%9B%BE/tileFeature/sdffonts/{fontstack}/{range}.pbf" + }, + "version": "3.3.3", + "rootUrl": "http://172.16.15.136:8080/iportal/", + "maxzoom": 19, + "name": "无标题地图", + "viewExtent": [ + 113.73601979634907, + 37.76434929128869, + 120.36672355890485, + 42.31307532235813 + ], + "layers": [{ + "maxzoom": 19, + "id": "OSM", + "source": "OSM", + "type": "raster", + "minzoom": 0 + }, + { + "filter": [ + "all", + [ + "<=", + "smpid", + 20 + ] + ], + "metadata": {}, + "maxzoom": 24, + "paint": { + "circle-color": "#EE4D5A", + "circle-opacity": 0.9, + "circle-translate-anchor": "map", + "circle-radius": 4, + "circle-translate": [ + 0, + 0 + ] + }, + "id": "四川发电站上月发电量", + "source": "ms_606692449_1768962856899_27", + "source-layer": "606692449$geometry", + "type": "circle", + "minzoom": 0 + }, + { + "filter": [ + "all", + [ + "!=", + "ADMINNAME", + "天津" + ] + ], + "metadata": {}, + "paint": { + "circle-color": "#EE4D5A", + "circle-opacity": 0.9, + "circle-translate-anchor": "map", + "circle-radius": 4, + "circle-translate": [ + 0, + 0 + ] + }, + "id": "ms_Captital_P_1768977260316_30", + "source": "ms_Captital_P_ms_datasetId_1768977259887_27_1768977260316_31", + "source-layer": "Captital_P@Jingjin", + "type": "circle" + }, + { + "filter": [ + "all", + [ + "==", + "ADMI", + 110101 + ] + ], + "layout": { + "visibility": "visible" + }, + "metadata": {}, + "maxzoom": 24, + "paint": { + "fill-pattern": [ + "match", + [ + "get", + "City" + ], + "北京市", + "fill_0_F4F3F0FF_FFFFFFFF_100", + "天津市", + "fill_0_FAF3F3FF_FFFFFFFF_100", + "fill_0_BDEBFFFF_FFFFFFFF_100" + ], + "fill-color": "#000000", + "fill-opacity": 0.999999, + "fill-antialias": true + }, + "id": "BaseMap_R@Jingjin#1_unique_(0_24)", + "source": "ms_京津地区地图_1768977772122_222", + "source-layer": "BaseMap_R@Jingjin", + "type": "fill", + "minzoom": 0 + } + ], + "sprite": "http://172.16.15.136:8080/iportal/web/maps/893537872/sprites/sprite", + "pitch": 0, + "minzoom": 0 + }; + const projInfo = { + "images": "http://172.16.15.136:8080/iportal/web/maps/893537872/sprites/sprite", + "catalogs": [{ + "filter": ["all", ["==", "ADMI", 110101]], + "visualization": { + "renderer": [{ + "symbolsContent": { + "field": ["City"], + "defaultValue": { + "symbolId": "fill_0_BDEBFFFF_FFFFFFFF_100", + "style": { + "paint": { + "fill-pattern": "fill_0_BDEBFFFF_FFFFFFFF_100" + } + } + }, + "values": [{ + "value": { + "symbolId": "fill_0_F4F3F0FF_FFFFFFFF_100", + "style": { + "paint": { + "fill-pattern": "fill_0_F4F3F0FF_FFFFFFFF_100" + } + } + }, + "key": "北京市" + }, { + "value": { + "symbolId": "fill_0_FAF3F3FF_FFFFFFFF_100", + "style": { + "paint": { + "fill-pattern": "fill_0_FAF3F3FF_FFFFFFFF_100" + } + } + }, + "key": "天津市" + }], + "type": "unique" + }, + "color": { + "type": "simple", + "value": "#000000" + }, + "antialias": { + "type": "simple", + "value": true + }, + "outlineColor": { + "type": "simple", + "value": "#FFFFFF" + }, + "opacity": { + "type": "simple", + "value": 1 + }, + "styleRenderMode": "mapboxgl" + }] + }, + "visible": true, + "catalogType": "layer", + "serviceLayerId": "BaseMap_R@Jingjin#1", + "id": "layer_BaseMap_R@Jingjin#1_1768977772124_306", + "popupInfo": { + "elements": [{ + "fieldName": "ADMI", + "type": "FIELD" + }, { + "fieldName": "City", + "type": "FIELD" + }, { + "fieldName": "NAME", + "type": "FIELD" + }, { + "fieldName": "NEWA", + "type": "FIELD" + }, { + "fieldName": "POP_1992", + "type": "FIELD" + }, { + "fieldName": "POP_1995", + "type": "FIELD" + }, { + "fieldName": "POP_1999", + "type": "FIELD" + }, { + "fieldName": "POP_DENSITY99", + "type": "FIELD" + }, { + "fieldName": "POP_RATE95", + "type": "FIELD" + }, { + "fieldName": "POP_RATE99", + "type": "FIELD" + }, { + "fieldName": "RURAL", + "type": "FIELD" + }, { + "fieldName": "SmArea", + "type": "FIELD" + }, { + "fieldName": "SmGeometrySize", + "type": "FIELD" + }, { + "fieldName": "SmID", + "type": "FIELD" + }, { + "fieldName": "SmPerimeter", + "type": "FIELD" + }, { + "fieldName": "SmSdriE", + "type": "FIELD" + }, { + "fieldName": "SmSdriN", + "type": "FIELD" + }, { + "fieldName": "SmSdriS", + "type": "FIELD" + }, { + "fieldName": "SmSdriW", + "type": "FIELD" + }, { + "fieldName": "SmUserID", + "type": "FIELD" + }, { + "fieldName": "URBAN", + "type": "FIELD" + }, { + "fieldName": "URBANRURAL", + "type": "FIELD" + }], + "title": "BaseMap_R@Jingjin#1" + }, + "serviceLayerGroupId": "未命名分组", + "title": "BaseMap_R@Jingjin#1", + "layerSourceType": "VectorTileService", + "zoomRange": [0, 24], + "layersContent": ["BaseMap_R@Jingjin#1_unique_(0_24)"] + }, { + "filter": ["all", ["!=", "ADMINNAME", "天津"]], + "visualization": { + "renderer": [{ + "symbolsContent": { + "type": "simple", + "value": { + "symbolId": "circle", + "style": { + "layout": { + "icon-image": "circle" + } + } + } + }, + "size": { + "type": "simple", + "value": 8 + }, + "color": { + "type": "simple", + "value": "#EE4D5A" + }, + "translateAnchor": { + "type": "simple", + "value": "map" + }, + "opacity": { + "type": "simple", + "value": 0.9 + }, + "translate": { + "type": "simple", + "value": [0, 0] + }, + "styleRenderMode": "mapboxgl" + }] + }, + "catalogType": "layer", + "msDatasetId": "ms_datasetId_1768977259887_27", + "bounds": [116.407283, 39.12096299445415, 117.215268, 39.90455699411283], + "id": "layer_Captital_P_1768977260317_32", + "popupInfo": { + "elements": [{ + "fieldName": "SmID", + "type": "FIELD" + }, { + "fieldName": "SmX", + "type": "FIELD" + }, { + "fieldName": "SmY", + "type": "FIELD" + }, { + "fieldName": "SmLibTileID", + "type": "FIELD" + }, { + "fieldName": "SmGeometrySize", + "type": "FIELD" + }, { + "fieldName": "SmUserID", + "type": "FIELD" + }, { + "fieldName": "ADMINNAME", + "type": "FIELD" + }, { + "fieldName": "ADMINCODE", + "type": "FIELD" + }], + "title": "Captital_P" + }, + "title": "Captital_P", + "layerSourceType": "DataService", + "zoomRange": [0, 24], + "layersContent": ["ms_Captital_P_1768977260316_30"] + }, { + "filter": ["all", ["<=", "smpid", 20]], + "visualization": { + "renderer": [{ + "symbolsContent": { + "type": "simple", + "value": { + "symbolId": "circle", + "style": { + "layout": { + "icon-image": "circle" + } + } + } + }, + "size": { + "type": "simple", + "value": 8 + }, + "color": { + "type": "simple", + "value": "#EE4D5A" + }, + "translateAnchor": { + "type": "simple", + "value": "map" + }, + "opacity": { + "type": "simple", + "value": 0.9 + }, + "translate": { + "type": "simple", + "value": [0, 0] + }, + "styleRenderMode": "mapboxgl" + }] + }, + "visible": true, + "catalogType": "layer", + "msDatasetId": "ms_datasetId_1768962856890_25", + "bounds": [100.98842, 26.28844000000001, 108.25193, 32.524739999999994], + "id": "layer_四川发电站上月发电量_1768962856899_28", + "popupInfo": { + "elements": [{ + "fieldName": "smpid", + "type": "FIELD" + }, { + "fieldName": "序号", + "type": "FIELD" + }, { + "fieldName": "水电站名称", + "type": "FIELD" + }, { + "fieldName": "所在省", + "type": "FIELD" + }, { + "fieldName": "所在市州", + "type": "FIELD" + }, { + "fieldName": "所在地", + "type": "FIELD" + }, { + "fieldName": "详细地址", + "type": "FIELD" + }, { + "fieldName": "X", + "type": "FIELD" + }, { + "fieldName": "Y", + "type": "FIELD" + }, { + "fieldName": "月发电量", + "type": "FIELD" + }, { + "fieldName": "水电站性质", + "type": "FIELD" + }, { + "fieldName": "geometry", + "type": "FIELD" + }], + "title": "四川发电站上月发电量" + }, + "title": "四川发电站上月发电量", + "layerSourceType": "Data", + "zoomRange": [0, 24], + "layersContent": ["四川发电站上月发电量"] + }], + "datas": [{ + "sourceType": "STRUCTURE_DATA", + "datasets": [{ + "datasetTitle": "四川发电站上月发电量", + "msDatasetId": "ms_datasetId_1768962856890_25", + "datasetId": "606692449", + "geometryField": "geometry" + }], + "title": "四川发电站上月发电量" + }, { + "sourceType": "REST_DATA", + "datasets": [{ + "datasetTitle": "Captital_P", + "msDatasetId": "ms_datasetId_1768977259887_27", + "datasetName": "Captital_P" + }], + "title": "Jingjin", + "url": "http://172.16.14.77:8090/iserver/services/data-Jingjin/rest/data/datasources/Jingjin" + }], + "baseLayer": { + "internetMapName": "OSM", + "type": "INTERNET_MAP", + "labelVisible": true + }, + "version": "3.1.2" + }; + const sourceListModel = new SourceListModelV3({ + map, + mapInfo, + mapResourceInfo: projInfo, + legendList: [], + l7LayerUtil: { + isL7Layer, + getL7MarkerLayers: () => ({}) + } + }); + const appreciableLayers = sourceListModel.getLayers(); + expect(appreciableLayers[1].filter).toEqual([ + "all", + [ + "<=", + "smpid", + 20 + ] + ]); + done(); + }); it('getLayerCatalog without group', (done) => { const mapInfo = JSON.parse(apstudioWebMap_layerData); const sourceListModel = new SourceListModelV3({ @@ -797,7 +1566,12 @@ describe('SourceListV3', () => { done(); } }); - sourceListModel.toggleLayerVisible({ type: 'group', title: 'emtpy-group', id: 'group1', children: [] }, false); + sourceListModel.toggleLayerVisible({ + type: 'group', + title: 'emtpy-group', + id: 'group1', + children: [] + }, false); }); it('setLayersVisible', (done) => { @@ -907,7 +1681,10 @@ describe('SourceListV3', () => { id: 'sameBaseLayer', layers: layers.slice(1, 3).map((item) => { const nextItem = Object.assign({}, item); - nextItem.metadata = { SM_Layer_Id: 'sameBaseLayer', title: `custom_${item.id}` }; + nextItem.metadata = { + SM_Layer_Id: 'sameBaseLayer', + title: `custom_${item.id}` + }; return nextItem; }), sources: { @@ -922,8 +1699,8 @@ describe('SourceListV3', () => { expect(map.getStyle().layers.some((item) => ['TIANDITU_IMG_3857', 'ms_TIANDITU_IMG_3857_label'].includes(item.id))).toBeTruthy(); expect( map - .getStyle() - .layers.some((item) => [/TIANDITU_IMG_3857_\d+$/, /ms_TIANDITU_IMG_3857_label_\d+$/].some((reg) => reg.test(item.id))) + .getStyle() + .layers.some((item) => [/TIANDITU_IMG_3857_\d+$/, /ms_TIANDITU_IMG_3857_label_\d+$/].some((reg) => reg.test(item.id))) ).toBeTruthy(); expect(map.getStyle().layers.some((item) => ['wmts100'].includes(item.id))).toBeFalsy(); layerList = sourceListModel.getLayerCatalog(); @@ -966,7 +1743,9 @@ describe('SourceListV3', () => { ...baseLayerInfo, layers: baseLayerInfo.layers.map((item) => ({ ...item, - metadata: { title: `custom_${item.id}`} + metadata: { + title: `custom_${item.id}` + } })) }; const nextBaseLayerInfo = sourceListModel.changeBaseLayer(baseLayerInfoCopy); diff --git a/test/common/util/FilterConditionSpec.js b/test/common/util/FilterConditionSpec.js index 65151dec85..d32e6aaa55 100644 --- a/test/common/util/FilterConditionSpec.js +++ b/test/common/util/FilterConditionSpec.js @@ -7,7 +7,7 @@ describe('FilterCondition', () => { it('== 普通等值', () => { const filter = ['==', 'name', 'Tom']; const result = mapboxFilterToQueryFilter(filter, 'SQL'); - expect(result).toBe("name == 'Tom'"); + expect(result).toBe("name = 'Tom'"); }); it('== null 转 IS NULL', () => { @@ -25,7 +25,7 @@ describe('FilterCondition', () => { it('字符串单引号转义', () => { const filter = ['==', 'publisher', "O'Reilly"]; const result = mapboxFilterToQueryFilter(filter, 'SQL'); - expect(result).toBe("publisher == 'O''Reilly'"); + expect(result).toBe("publisher = 'O''Reilly'"); }); it('数值比较 >', () => { @@ -53,7 +53,7 @@ describe('FilterCondition', () => { ['==', 'gender', 'M'] ]; const result = mapboxFilterToQueryFilter(filter, 'SQL'); - expect(result).toBe("age > 18 AND gender == 'M'"); + expect(result).toBe("age > 18 AND gender = 'M'"); }); it('any (OR)', () => { @@ -63,7 +63,7 @@ describe('FilterCondition', () => { ['==', 'type', 'B'] ]; const result = mapboxFilterToQueryFilter(filter, 'SQL'); - expect(result).toBe("(type == 'A') OR (type == 'B')"); + expect(result).toBe("(type = 'A') OR (type = 'B')"); }); it('none (NOT AND)', () => { @@ -73,7 +73,7 @@ describe('FilterCondition', () => { ['<', 'age', 10] ]; const result = mapboxFilterToQueryFilter(filter, 'SQL'); - expect(result).toBe("NOT (status == 'disabled') AND NOT (age < 10)"); + expect(result).toBe("NOT (status = 'disabled') AND NOT (age < 10)"); }); it('非法 filter 返回空字符串', () => { From 60721924e611df7aa831d0e7109d1f155952731f Mon Sep 17 00:00:00 2001 From: Huzhipeng Date: Wed, 28 Jan 2026 14:56:37 +0800 Subject: [PATCH 13/46] =?UTF-8?q?[update]=20mapboxFilterToCqlFilter?= =?UTF-8?q?=E8=BD=AC=E6=8D=A2=E9=80=BB=E8=BE=91=E4=B8=AD=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E5=8C=96=E5=AD=97=E6=AE=B5=E5=90=8D=E5=8A=A0=E5=85=A5=E5=8F=8C?= =?UTF-8?q?=E5=BC=95=E5=8F=B7=20(review=20by=20xjj)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/util/FilterCondition.js | 16 +++++----- test/common/util/FilterConditionSpec.js | 42 ++++++++++++------------- 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/common/util/FilterCondition.js b/src/common/util/FilterCondition.js index d079f1027a..66b373b111 100644 --- a/src/common/util/FilterCondition.js +++ b/src/common/util/FilterCondition.js @@ -99,12 +99,12 @@ function isNullvalue(value) { return [null, '', undefined].includes(value); } -function mapboxFilterToCqlFilter(filter) { +function mapboxFilterToCqlFilter(filter, dataType) { if (!isSimpleComparison(filter)) { return ''; } const [operator, ...operands] = filter; - const field = operands[0]; + const field = dataType === 'STRUCTURE_DATA' ? `"${operands[0]}"` : operands[0]; let value; switch (operator) { case '>': @@ -147,21 +147,21 @@ function mapboxFilterToCqlFilter(filter) { // } case 'all': { return operands - .map((item) => mapboxFilterToCqlFilter(item)) + .map((item) => mapboxFilterToCqlFilter(item, dataType)) .filter(Boolean) .map((item) => `${item}`) .join(' AND '); } case 'any': { return operands - .map((item) => mapboxFilterToCqlFilter(item)) + .map((item) => mapboxFilterToCqlFilter(item, dataType)) .filter(Boolean) .map((item) => `(${item})`) .join(' OR '); } case 'none': { return operands - .map((item) => mapboxFilterToCqlFilter(item)) + .map((item) => mapboxFilterToCqlFilter(item, dataType)) .filter(Boolean) .map((item) => `NOT (${item})`) .join(' AND '); @@ -170,7 +170,7 @@ function mapboxFilterToCqlFilter(filter) { return ''; } } - +// 暂时不考虑WFS // none的情况下,全部用Not一个一个包裹,会报错(应该是接口问题),反转即可 function negateComparison(filter) { const op = filter[0]; @@ -335,9 +335,9 @@ function mapboxFilterToWfsFilter(filter) { `; } -function mapboxFilterToQueryFilter(filter, type = 'SQL') { +function mapboxFilterToQueryFilter(filter, dataType, type = 'SQL') { if (type === 'SQL') { - return mapboxFilterToCqlFilter(filter); + return mapboxFilterToCqlFilter(filter, dataType); } if (type === 'XML') { return mapboxFilterToWfsFilter(filter); diff --git a/test/common/util/FilterConditionSpec.js b/test/common/util/FilterConditionSpec.js index d32e6aaa55..1b7d875147 100644 --- a/test/common/util/FilterConditionSpec.js +++ b/test/common/util/FilterConditionSpec.js @@ -4,45 +4,45 @@ import { describe('FilterCondition', () => { describe('mapboxFilterToQueryFilter - SQL', () => { - it('== 普通等值', () => { + it('== 普通等值 + 结构化', () => { const filter = ['==', 'name', 'Tom']; - const result = mapboxFilterToQueryFilter(filter, 'SQL'); - expect(result).toBe("name = 'Tom'"); + const result = mapboxFilterToQueryFilter(filter, 'STRUCTURE_DATA'); + expect(result).toBe(`"name" = 'Tom'`); }); it('== null 转 IS NULL', () => { const filter = ['==', 'name', null]; - const result = mapboxFilterToQueryFilter(filter, 'SQL'); + const result = mapboxFilterToQueryFilter(filter); expect(result).toBe('name IS NULL'); }); it('!= null 转 IS NOT NULL', () => { const filter = ['!=', 'name', null]; - const result = mapboxFilterToQueryFilter(filter, 'SQL'); + const result = mapboxFilterToQueryFilter(filter); expect(result).toBe('name IS NOT NULL'); }); it('字符串单引号转义', () => { const filter = ['==', 'publisher', "O'Reilly"]; - const result = mapboxFilterToQueryFilter(filter, 'SQL'); + const result = mapboxFilterToQueryFilter(filter); expect(result).toBe("publisher = 'O''Reilly'"); }); it('数值比较 >', () => { const filter = ['>', 'age', 18]; - const result = mapboxFilterToQueryFilter(filter, 'SQL'); + const result = mapboxFilterToQueryFilter(filter); expect(result).toBe('age > 18'); }); it('in 操作符', () => { const filter = ['in', 'status', 'A', 'B', 'C']; - const result = mapboxFilterToQueryFilter(filter, 'SQL'); + const result = mapboxFilterToQueryFilter(filter); expect(result).toBe("status IN ('A', 'B', 'C')"); }); it('!in 操作符', () => { const filter = ['!in', 'status', 'A', 'B']; - const result = mapboxFilterToQueryFilter(filter, 'SQL'); + const result = mapboxFilterToQueryFilter(filter); expect(result).toBe("status NOT IN ('A', 'B')"); }); @@ -52,7 +52,7 @@ describe('FilterCondition', () => { ['>', 'age', 18], ['==', 'gender', 'M'] ]; - const result = mapboxFilterToQueryFilter(filter, 'SQL'); + const result = mapboxFilterToQueryFilter(filter); expect(result).toBe("age > 18 AND gender = 'M'"); }); @@ -62,7 +62,7 @@ describe('FilterCondition', () => { ['==', 'type', 'A'], ['==', 'type', 'B'] ]; - const result = mapboxFilterToQueryFilter(filter, 'SQL'); + const result = mapboxFilterToQueryFilter(filter); expect(result).toBe("(type = 'A') OR (type = 'B')"); }); @@ -72,12 +72,12 @@ describe('FilterCondition', () => { ['==', 'status', 'disabled'], ['<', 'age', 10] ]; - const result = mapboxFilterToQueryFilter(filter, 'SQL'); + const result = mapboxFilterToQueryFilter(filter); expect(result).toBe("NOT (status = 'disabled') AND NOT (age < 10)"); }); it('非法 filter 返回空字符串', () => { - const result = mapboxFilterToQueryFilter(['get', 'name'], 'SQL'); + const result = mapboxFilterToQueryFilter(['get', 'name']); expect(result).toBe(''); }); }); @@ -85,7 +85,7 @@ describe('FilterCondition', () => { describe('mapboxFilterToQueryFilter - XML', () => { it('== 普通等值', () => { const filter = ['==', 'name', 'Tom']; - const result = mapboxFilterToQueryFilter(filter, 'XML'); + const result = mapboxFilterToQueryFilter(filter,'WFS', 'XML'); expect(result).toContain(''); expect(result).toContain('name'); expect(result).toContain('Tom'); @@ -93,26 +93,26 @@ describe('FilterCondition', () => { it('== null 转 PropertyIsNull', () => { const filter = ['==', 'name', null]; - const result = mapboxFilterToQueryFilter(filter, 'XML'); + const result = mapboxFilterToQueryFilter(filter,'WFS', 'XML'); expect(result).toContain(''); }); it('!= null 转 PropertyIsNotNull', () => { const filter = ['!=', 'name', null]; - const result = mapboxFilterToQueryFilter(filter, 'XML'); + const result = mapboxFilterToQueryFilter(filter,'WFS', 'XML'); expect(result).toContain(''); }); it('in 转 Or', () => { const filter = ['in', 'type', 'A', 'B']; - const result = mapboxFilterToQueryFilter(filter, 'XML'); + const result = mapboxFilterToQueryFilter(filter,'WFS', 'XML'); expect(result).toContain(''); const equalCount = (result.match(//g) || []).length; expect(equalCount).toBe(2); }); it('!in 转 Not + Or', () => { const filter = ['!in', 'type', 'A', 'B']; - const result = mapboxFilterToQueryFilter(filter, 'XML'); + const result = mapboxFilterToQueryFilter(filter,'WFS', 'XML'); expect(result).toContain(''); expect(result).toContain(''); }); @@ -123,7 +123,7 @@ describe('FilterCondition', () => { ['>', 'age', 18], ['==', 'gender', 'M'] ]; - const result = mapboxFilterToQueryFilter(filter, 'XML'); + const result = mapboxFilterToQueryFilter(filter,'WFS', 'XML'); expect(result).toContain(''); }); @@ -133,7 +133,7 @@ describe('FilterCondition', () => { ['==', 'type', 'A'], ['==', 'type', 'B'] ]; - const result = mapboxFilterToQueryFilter(filter, 'XML'); + const result = mapboxFilterToQueryFilter(filter,'WFS', 'XML'); expect(result).toContain(''); }); @@ -143,7 +143,7 @@ describe('FilterCondition', () => { ['==', 'status', 'disabled'], ['<', 'age', 10] ]; - const result = mapboxFilterToQueryFilter(filter, 'XML'); + const result = mapboxFilterToQueryFilter(filter,'WFS', 'XML'); // == → != , < → >= expect(result).toContain('PropertyIsNotEqualTo'); expect(result).toContain('PropertyIsGreaterThanOrEqualTo'); From 225be4ee29e57ab5d022c7f30558c291f771b9ea Mon Sep 17 00:00:00 2001 From: Huzhipeng Date: Mon, 2 Mar 2026 15:49:05 +0800 Subject: [PATCH 14/46] =?UTF-8?q?[bug]=20=E8=A7=A3=E5=86=B3ISVJ-11428=20?= =?UTF-8?q?=E3=80=9012i=E3=80=91iPortal=20dv=20=E6=B7=BB=E5=8A=A0wmts?= =?UTF-8?q?=E5=81=9A=E5=BA=95=E5=9B=BE=EF=BC=8C=E5=9C=A8=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E4=B8=8A=E5=9B=BE=E4=B8=AD=E6=9B=B4=E6=8D=A2=E5=BA=95=E5=9B=BE?= =?UTF-8?q?=E4=B8=8D=E6=88=90=E5=8A=9F=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8C?= =?UTF-8?q?iclient=E6=B6=89=E5=8F=8A=E5=88=86=E4=BA=AB=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=20ut=E6=9A=82=E6=97=B6=E6=B2=A1=E8=A1=A5=E5=85=85=EF=BC=8Col?= =?UTF-8?q?=E8=BF=99=E8=BE=B9ut=E5=8E=9F=E6=9C=AC=E5=B0=B1=E6=8A=A5?= =?UTF-8?q?=E9=94=99=20(review=20by=20zq)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- src/common/package.json | 2 +- src/openlayers/mapping/WebMap.js | 62 +++++++++++++++++++++++++------- 3 files changed, 51 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index 012f82a93b..9d20c0de19 100644 --- a/package.json +++ b/package.json @@ -149,7 +149,7 @@ "@turf/turf": "7.2.0", "canvg": "^4.0.3", "echarts": "5.5.0", - "fast-xml-parser": "^4.2.7", + "fast-xml-parser": "5.3.5", "fetch-ie8": "1.5.0", "fetch-jsonp": "1.1.3", "flatgeobuf": "3.31.1", diff --git a/src/common/package.json b/src/common/package.json index a8ba4fb2cc..27bda2e1c1 100644 --- a/src/common/package.json +++ b/src/common/package.json @@ -21,7 +21,7 @@ "@turf/meta": "^7.2.0", "canvg": "^4.0.3", "echarts": "5.5.0", - "fast-xml-parser": "^4.2.7", + "fast-xml-parser": "5.3.5", "fetch-ie8": "1.5.0", "fetch-jsonp": "1.1.3", "flatgeobuf": "3.31.1", diff --git a/src/openlayers/mapping/WebMap.js b/src/openlayers/mapping/WebMap.js index f18b733fe3..268c5ac774 100644 --- a/src/openlayers/mapping/WebMap.js +++ b/src/openlayers/mapping/WebMap.js @@ -29,7 +29,6 @@ import MouseWheelZoom from 'ol/interaction/MouseWheelZoom'; import * as olProj from 'ol/proj'; import * as olProj4 from 'ol/proj/proj4'; import * as olLayer from 'ol/layer'; -import WMTSCapabilities from 'ol/format/WMTSCapabilities'; import WMSCapabilities from 'ol/format/WMSCapabilities'; import TileGrid from 'ol/tilegrid/TileGrid'; import * as olTilegrid from 'ol/tilegrid'; @@ -49,6 +48,7 @@ import Text from 'ol/style/Text'; import Collection from 'ol/Collection'; import { containsCoordinate, getCenter } from 'ol/extent'; import difference from 'lodash.difference'; +import { XMLParser } from 'fast-xml-parser'; window.proj4 = proj4; window.Proj4js = proj4; @@ -70,6 +70,19 @@ const dpiConfig = { default: 96, // 常用dpi iServerWMTS: 90.7142857142857 // iserver使用的wmts图层dpi }; +// 以下路径统一转为array格式(fast-xml-parser插件在返回值数量为1时候返回obj,返回数量大于1时返回array) +const WMTS_ARRAY_NODE_PATHS = [ + 'Capabilities.Contents.Layer', + 'Capabilities.Contents.Layer.Format', + 'Capabilities.Contents.Layer.Style', + 'Capabilities.Contents.Layer.TileMatrixSetLink', + 'Capabilities.Contents.TileMatrixSet', + 'Capabilities.Contents.TileMatrixSet.TileMatrix', + 'Capabilities.OperationsMetadata.Operation', + 'Capabilities.OperationsMetadata.Operation.DCP.HTTP.Get', + 'Capabilities.OperationsMetadata.Operation.DCP.HTTP.Get.Constraint', + 'Capabilities.OperationsMetadata.Operation.DCP.HTTP.Get.Constraint.AllowedValues.Value' +]; /** * @class WebMap * @category iPortal/Online Resources Map @@ -667,9 +680,15 @@ export class WebMap extends Observable { * @param {Object} capabilitiesText - wmts信息 */ getWMTSScales(identifier, capabilitiesText) { - const format = new WMTSCapabilities(); - let capabilities = format.read(capabilitiesText); - + const parser = new XMLParser({ + attributeNamePrefix: '', + ignoreAttributes: false, + removeNSPrefix: true, + isArray: (name, jpath) => { + return WMTS_ARRAY_NODE_PATHS.includes(jpath); + } + }); + const capabilities = parser.parse(capabilitiesText).Capabilities; let content = capabilities.Contents; let tileMatrixSet = content.TileMatrixSet; let scales = []; @@ -1628,7 +1647,12 @@ export class WebMap extends Observable { } return this.getRequestUrl(url, proxy); } - + getBoundsFromConrner(lower, upper) { + const bottomLeft = lower.split(' '), + topRight = upper.split(' '); + const bounds = bottomLeft.concat(topRight); + return [+bounds[0], +bounds[1], +bounds[2], +bounds[3]]; + } /** * @private * @function WebMap.prototype.getWmtsInfo @@ -1648,8 +1672,15 @@ export class WebMap extends Observable { return response.text(); }) .then(function (capabilitiesText) { - const format = new WMTSCapabilities(); - let capabilities = format.read(capabilitiesText); + const parser = new XMLParser({ + attributeNamePrefix: '', + ignoreAttributes: false, + removeNSPrefix: true, + isArray: (name, jpath) => { + return WMTS_ARRAY_NODE_PATHS.includes(jpath); + } + }); + const capabilities = parser.parse(capabilitiesText).Capabilities; if (that.isValidResponse(capabilities)) { let content = capabilities.Contents; let tileMatrixSet = content.TileMatrixSet, @@ -1664,7 +1695,10 @@ export class WebMap extends Observable { idx = n; layer = layers[idx]; layerFormat = layer.Format[0]; - var layerBounds = layer.WGS84BoundingBox; + var WGS84BoundingBox = layer.WGS84BoundingBox; + var boundingBox = layer.BoundingBox; + let bbox = WGS84BoundingBox ? WGS84BoundingBox : boundingBox; + var layerBounds = that.getBoundsFromConrner(bbox.LowerCorner, bbox.UpperCorner) // tileMatrixSetLink = layer.TileMatrixSetLink; break; } @@ -1686,7 +1720,7 @@ export class WebMap extends Observable { matrixIds.push(tileMatrixSet[i].TileMatrix[h].Identifier); } //bug wmts出图需要加上origin,否则会出现出图不正确的情况。偏移或者瓦片出不了 - let origin = tileMatrixSet[i].TileMatrix[0].TopLeftCorner; + let origin = tileMatrixSet[i].TileMatrix[0].TopLeftCorner.split(' ').map(Number); layerInfo.origin = ['EPSG:4326', 'EPSG:4490'].indexOf(wmtsLayerEpsg) > -1 ? [origin[1], origin[0]] : origin; break; @@ -1694,7 +1728,7 @@ export class WebMap extends Observable { } let name = layerInfo.name, extent; - if (layerBounds) { + if(WGS84BoundingBox) { if (layerBounds[0] < -180) { layerBounds[0] = -180; } @@ -1708,11 +1742,13 @@ export class WebMap extends Observable { layerBounds[3] = 90; } extent = olProj.transformExtent(layerBounds, 'EPSG:4326', that.baseProjection); - } else { + } else if(boundingBox) { + extent = layerBounds; + } else { extent = olProj.get(that.baseProjection).getExtent(); - } + } layerInfo.tileUrl = that.getTileUrl( - capabilities.OperationsMetadata.GetTile.DCP.HTTP.Get, + capabilities.OperationsMetadata.Operation.find(o => o.name === 'GetTile').DCP.HTTP.Get, layer, layerFormat, isKvp From 423a8d0e6f40cbd8f41f8300f9195b7f084da819 Mon Sep 17 00:00:00 2001 From: songyumeng Date: Fri, 13 Mar 2026 16:09:29 +0800 Subject: [PATCH 15/46] =?UTF-8?q?=E3=80=90fix=E3=80=91mapboxgl=E9=87=8Clay?= =?UTF-8?q?er=E7=9A=84maxzoom=E5=BA=94=E8=AF=A5=E6=AF=94=E5=9C=B0=E5=9B=BE?= =?UTF-8?q?=E5=A4=A7=E4=B8=80=E7=BA=A7=20=20=E4=BD=86=E6=98=AFlayer?= =?UTF-8?q?=E6=9C=8924=E7=BA=A7=E7=9A=84=E9=99=90=E5=88=B6=EF=BC=8C?= =?UTF-8?q?=E6=89=80=E4=BB=A5map=E7=9A=84maxzoom=E6=9C=80=E5=A4=A7?= =?UTF-8?q?=E5=8F=AA=E8=83=BD=E6=98=AF23?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/mapping/WebMapV2.js | 2 +- test/mapboxgl/mapping/WebMapV22Spec.js | 729 +++++++++++++++++++++++++ test/tool/mock_mapboxgl_map.js | 2 + 3 files changed, 732 insertions(+), 1 deletion(-) create mode 100644 test/mapboxgl/mapping/WebMapV22Spec.js diff --git a/src/common/mapping/WebMapV2.js b/src/common/mapping/WebMapV2.js index d70ec4a958..cb588c6dd7 100644 --- a/src/common/mapping/WebMapV2.js +++ b/src/common/mapping/WebMapV2.js @@ -3104,7 +3104,7 @@ export function createWebMapV2Extending(SuperClass, { MapManager, mapRepo, crsMa const unit = crs.unit; const scaleBase = 1.0 / Util.getScaleFromResolutionDpi((extent[2] - extent[0]) / tileSize, 96, unit); const scaleDenominator = scale.split(':')[1]; - return Math.min(24, +Math.log2(scaleBase / +scaleDenominator).toFixed(2)); + return Math.min(23, +Math.log2(scaleBase / +scaleDenominator).toFixed(2)); } _updateLayer(layerInfo) { diff --git a/test/mapboxgl/mapping/WebMapV22Spec.js b/test/mapboxgl/mapping/WebMapV22Spec.js new file mode 100644 index 0000000000..1d6f910bc8 --- /dev/null +++ b/test/mapboxgl/mapping/WebMapV22Spec.js @@ -0,0 +1,729 @@ +import mapboxgl from 'mapbox-gl'; +import mbglmap, { CRS, proj4, revertCRS } from '../../tool/mock_mapboxgl_map.js'; +import { WebMap } from '../../../src/mapboxgl/mapping/WebMap.js'; +import * as MapManagerUtil from '../../../src/mapboxgl/mapping/webmap/MapManager.js'; +import { ArrayStatistic } from '@supermapgis/iclient-common/util/ArrayStatistic.js'; +import { FetchRequest } from '@supermapgis/iclient-common/util/FetchRequest.js'; +import '../../resources/WebMapV5.js'; +import { Canvg } from 'canvg'; + +describe('mapboxgl_WebMapV2_2', () => { + var originalTimeout, testDiv; + var server = 'http://fack:8190/iportal/'; + var id = 1788054202; + var datavizWebmap; + var commonMap; + var layerIdMapList = {}; + var sourceIdMapList = {}; + var commonOption = { + credentialKey: undefined, + credentialValue: undefined, + excludePortalProxyUrl: undefined, + iportalServiceProxyUrlPrefix: undefined, + isSuperMapOnline: undefined, + proxy: undefined, + server: 'http://fack:8190/iportal/', + target: 'map', + tiandituKey: undefined, + withCredentials: false + }; + var commonMapOptions = { + container: 'map', + style: { + version: 8, + sources: { + 'raster-tiles': { + type: 'raster', + tiles: ['https://test'], + tileSize: 256 + } + }, + layers: [ + { + id: 'simple-tiles', + type: 'raster', + source: 'raster-tiles', + minzoom: 5, + maxzoom: 20 + } + ] + }, + center: [120.143, 30.236], + zoom: 3, + bounds: { + getEast: () => 2, + getWest: () => -1, + getSouth: () => 2, + getNorth: () => -1 + } + }; + const serviceProxy = { + httpConnPoolInfo: null, + enableAccessStatistics: true, + scheme: null, + enableBuiltinProxy: true, + port: 8195, + proxyServerRootUrl: 'http://127.0.0.1:8195/portalproxy', + rootUrlPostfix: 'portalproxy', + enable: true, + httpsSetting: null, + cacheConfig: null + }; + const portalConfig = { serviceProxy: serviceProxy }; + var dataFlowServiceSpyTest; + beforeEach(() => { + spyOn(MapManagerUtil, 'default').and.callFake(mbglmap); + mapboxgl.CRS = CRS; + mapboxgl.proj4 = proj4; + commonMap = { + style: {}, + resize: jasmine.createSpy('resize').and.callFake(() => {}), + getZoom: () => { + return 2; + }, + getMaxZoom: () => { + return 22; + }, + setZoom: jasmine.createSpy('setZoom').and.callFake(() => {}), + setMaxZoom: jasmine.createSpy('setZoom').and.callFake(() => {}), + setCRS: jasmine.createSpy('setCRS').and.callFake(() => {}), + getCenter: () => { + return { + lng: 1, + lat: 2 + }; + }, + setCenter: jasmine.createSpy('setCenter').and.callFake(() => {}), + getBearing: () => 2, + setBearing: jasmine.createSpy('setBearing').and.callFake(() => {}), + getPitch: () => 2, + setPitch: jasmine.createSpy('setPitch').and.callFake(() => {}), + getStyle: () => { + let layers = []; + if (layerIdMapList) { + for (const key in layerIdMapList) { + layers.push(layerIdMapList[key]); + } + } + return { + sources: sourceIdMapList, + layers + }; + }, + addSource: (sourceId, sourceInfo) => { + sourceIdMapList[sourceId] = sourceInfo; + if (sourceInfo.type === 'geojson') { + sourceIdMapList[sourceId]._data = sourceInfo.data; + sourceIdMapList[sourceId].setData = (function (sourceId) { + return function (data) { + sourceIdMapList[sourceId]._data = data; + }; + })(sourceId); + } + if (sourceInfo.type === 'raster' && sourceInfo.rasterSource === 'iserver') { + sourceIdMapList[sourceId].clearTiles = jasmine.createSpy('test').and.callFake(() => {}); + sourceIdMapList[sourceId].update = jasmine.createSpy('update').and.callFake(() => {}); + } + }, + getSource: (sourceId) => { + return sourceIdMapList[sourceId]; + }, + removeSource: (sourceId) => { + delete sourceIdMapList[sourceId]; + }, + triggerRepaint: jasmine.createSpy('triggerRepaint').and.callFake(() => {}), + style: { + sourceCaches: sourceIdMapList + }, + getLayer: (layerId) => { + return layerIdMapList[layerId]; + }, + removeLayer: (layerId) => { + delete layerIdMapList[layerId]; + }, + getCRS: () => { + return { + epsgCode: 'EPSG:3857', + getExtent: () => jasmine.createSpy('getExtent') + }; + }, + getLayers: () => { + return Object.values(layerIdMapList); + }, + addLayer: (layerInfo) => { + layerIdMapList[layerInfo.id] = layerInfo; + if (typeof layerInfo.source === 'object') { + const source = Object.assign({}, layerInfo.source); + layerIdMapList[layerInfo.id].source = layerInfo.id; + commonMap.addSource(layerInfo.id, source); + } + if (commonMap.style) { + if (!commonMap.style._layers) { + commonMap.style._layers = {}; + } + commonMap.style._layers[layerInfo.id] = layerIdMapList[layerInfo.id]; + } + }, + moveLayer: jasmine.createSpy('moveLayer').and.callFake(() => {}), + overlayLayersManager: {}, + on: () => {}, + off: () => {}, + fire: () => {}, + setLayoutProperty: jasmine.createSpy('setLayoutProperty').and.callFake(() => {}), + setPaintProperty: jasmine.createSpy('test'), + addStyle: jasmine.createSpy('addStyle').and.callFake(() => {}), + remove: jasmine.createSpy('remove').and.callFake(() => {}), + setRenderWorldCopies: jasmine.createSpy('setRenderWorldCopies').and.callFake(() => {}), + setStyle: jasmine.createSpy('setStyle').and.callFake(() => {}), + loadImage: function (src, callback) { + callback(null, { width: 15 }); + }, + addImage: function () {}, + hasImage: function () { + return false; + } + }; + testDiv = window.document.createElement('div'); + testDiv.setAttribute('id', 'map'); + testDiv.style.styleFloat = 'left'; + testDiv.style.marginLeft = '8px'; + testDiv.style.marginTop = '50px'; + testDiv.style.width = '500px'; + testDiv.style.height = '500px'; + window.document.body.appendChild(testDiv); + originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL; + jasmine.DEFAULT_TIMEOUT_INTERVAL = 50000; + window.jsonsql = { query: () => [{}] }; + spyOn(Canvg, 'from').and.callFake((ctx, url, callback) => + Promise.resolve({ stop: jasmine.createSpy('stop'), start: jasmine.createSpy('start') }) + ); + window.geostats = class { + setSerie() {} + }; + window.EchartsLayer = class { + constructor() { + this.chart = { + setOption() {} + }; + } + + resize() {} + + remove() {} + }; + }); + afterEach(() => { + if (datavizWebmap) { + datavizWebmap.clean(); + datavizWebmap.map = null; + datavizWebmap = null; + } + sourceIdMapList = {}; + layerIdMapList = {}; + commonMap.style.sourceCaches = sourceIdMapList; + window.document.body.removeChild(testDiv); + jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout; + mapboxgl.CRS = undefined; + mapboxgl.proj4 = undefined; + window.jsonsql = undefined; + window.geostats = undefined; + window.EchartsLayer = undefined; + dataFlowServiceSpyTest = null; + revertCRS(); + }); + + it('ZXYTILE baseLayer 2326', (done) => { + let options = { + server: server + }; + + spyOn(FetchRequest, 'get').and.callFake((url) => { + if (url.indexOf('map.json') > -1) { + return Promise.resolve(new Response(JSON.stringify(xyzLayer2326))); + } + if (url.indexOf('portal.json') > -1) { + return Promise.resolve(new Response(JSON.stringify(portalConfig))); + } + console.log() + return Promise.resolve(new Response(JSON.stringify({}))); + }); + var datavizWebmap = new WebMap(id, options); + datavizWebmap.on('mapcreatesucceeded', (data) => { + expect(datavizWebmap.mapParams.title).toBe('zxy_2326'); + done(); + }); + }); + + it('createThemeLayerVectorSVG', (done) => { + let options = { + server: server + }; + const mapJSON = { + extent: { + leftBottom: { + x: -20037508.342789244, + y: -25819498.513543323 + }, + rightTop: { + x: 20037508.342789244, + y: 20037508.34258019 + } + }, + maxScale: '1:144447.9275', + level: 10.870999111120563, + center: { + x: 12934623.19688413, + y: 4857107.635483593 + }, + baseLayer: { + layerType: 'TILE', + name: '中国暗色地图', + url: 'https://maptiles.supermapol.com/iserver/services/map_China/rest/maps/China_Dark' + }, + layers: [ + { + layerType: 'UNIQUE', + visible: true, + themeSetting: { + themeField: 'SmID', + customSettings: { + 0: { + fillColor: '#3288bd', + strokeWidth: 1, + offsetX: 0, + offsetY: 0, + fillOpacity: 0.9, + type: 'BASIC_POINT', + radius: 8, + strokeColor: '#ffffff', + url: 'http://fack:8190/iportal/resources/portal/dataviz/markericon/symbol-input-51902.png', + strokeOpacity: 1 + }, + 1: { + fillColor: '#d53e4f', + strokeWidth: 1, + offsetX: 0, + offsetY: 0, + fillOpacity: 0.9, + type: 'SVG_POINT', + radius: 8, + strokeColor: '#ffffff', + url: 'http://fack:8190/iportal/resources/portal/dataviz/markericon/symbol-input-51902.svg', + strokeOpacity: 1 + }, + 2: { + fillColor: '#d6404f', + strokeWidth: 1, + offsetX: 0, + offsetY: 0, + fillOpacity: 0.9, + type: 'SVG_POINT', + radius: 8, + strokeColor: '#ffffff', + url: 'http://fack:8190/iportal/resources/portal/dataviz/markericon/symbol-input-44f49.svg', + strokeOpacity: 1 + }, + 3: { + fillColor: '#3489bb', + strokeWidth: 1, + offsetX: 0, + offsetY: 0, + fillOpacity: 0.9, + type: 'BASIC_POINT', + radius: 8, + strokeColor: '#ffffff', + strokeOpacity: 1 + } + }, + colors: ['#D53E4F', '#FC8D59', '#FEE08B', '#FFFFBF', '#E6F598', '#99D594', '#3288BD'] + }, + name: '北京市轨道交通站点(13)(2)', + featureType: 'POINT', + style: { + strokeWidth: 1, + offsetX: 0, + fillColor: '#3288bd', + offsetY: 0, + fillOpacity: 0.9, + radius: 8, + strokeColor: '#ffffff', + type: 'BASIC_POINT', + strokeOpacity: 1 + }, + projection: 'EPSG:4326', + enableFields: [ + 'SmID', + 'SmX', + 'SmY', + 'SmLibTileID', + '1111SmUserID', + 'SmGeometrySize', + 'SmGeoPosition', + '1111标准名称' + ], + dataSource: { + accessType: 'DIRECT', + type: 'PORTAL_DATA', + serverId: '301115524' + } + } + ], + description: '', + projection: 'EPSG:3857', + minScale: '1:591658710.91', + title: 'svg_custom', + version: '2.4.3', + rootUrl: 'http://fack:8190/iportal/' + }; + var features = { + type: 'FeatureCollection', + features: [ + { + geometry: { + type: 'Point', + coordinates: [116.36331703990744, 39.89942692791154] + }, + properties: { + SmID: '1', + SmX: '1.295350519989875E7', + SmY: '4851338.019912067', + SmLibTileID: '1', + '1111SmUserID': '0', + SmGeometrySize: '20', + SmGeoPosition: '393216', + '1111标准名称': '长椿街站' + }, + type: 'Feature' + }, + { + geometry: { + type: 'Point', + coordinates: [116.37438913096268, 39.89976329032906] + }, + properties: { + SmID: '2', + SmX: '1.2954737739437036E7', + SmY: '4851386.827488521', + SmLibTileID: '1', + '1111SmUserID': '0', + SmGeometrySize: '20', + SmGeoPosition: '393236', + '1111标准名称': '宣武门站' + }, + type: 'Feature' + }, + { + geometry: { + type: 'Point', + coordinates: [116.37438913096268, 39.89976329032906] + }, + properties: { + SmID: '3', + SmX: '1.2954737739437036E7', + SmY: '4851386.827488521', + SmLibTileID: '1', + '1111SmUserID': '0', + SmGeometrySize: '20', + SmGeoPosition: '393236', + '1111标准名称': '宣武门站' + }, + type: 'Feature' + }, + { + geometry: { + type: 'Point', + coordinates: [116.38435616441622, 39.9000638944286] + }, + properties: { + SmID: '0', + SmX: '1.2955847264525805E7', + SmY: '4851430.446588028', + SmLibTileID: '1', + '1111SmUserID': '0', + SmGeometrySize: '20', + SmGeoPosition: '393276', + '1111标准名称': '和平门站' + }, + type: 'Feature' + } + ] + }; + const dataJSON = { + fileName: '北京市轨道交通站点(13)(2).geojson', + type: 'GEOJSON', + lineNumber: null, + content: JSON.stringify(features) + }; + spyOn(FetchRequest, 'get').and.callFake((url) => { + if (url.indexOf('map.json') > -1) { + return Promise.resolve(new Response(JSON.stringify(mapJSON))); + } + if (url.indexOf('content.json') > -1) { + return Promise.resolve(new Response(JSON.stringify(dataJSON))); + } + if (url.indexOf('portal.json') > -1) { + return Promise.resolve(new Response(JSON.stringify(portalConfig))); + } + return Promise.resolve(new Response(JSON.stringify({}))); + }); + + var datavizWebmap = new WebMap(id, options); + // spyOn(datavizWebmap, 'createGraphicLayer'); + + datavizWebmap.on('mapcreatesucceeded', (data) => { + expect(datavizWebmap.map.getStyle().layers.length).toBe(3); + done(); + }); + }); + + it('createOverlayLayer_mvt', (done) => { + let options = { + server: server + }; + const mapJSON = { + extent: { + leftBottom: { + x: -20037508.3427892, + y: -20037508.3427892 + }, + rightTop: { + x: 20037508.3427892, + y: 20037508.3427892 + } + }, + maxScale: '1:144447.92746805', + level: 1, + center: { + x: -1.862645149230957e-9, + y: -2.60770320892334e-8 + }, + baseLayer: { + layerType: 'TILE', + name: '中国暗色地图', + url: 'https://maptiles.supermapol.com/iserver/services/map_China/rest/maps/China_Dark' + }, + layers: [ + { + layerType: 'MAPBOXSTYLE', + proxy: false, + visible: true, + name: 'China', + dataSource: { + type: 'ARCGIS_VECTORTILE', + url: 'http://fack:8090/iserver/services/map-china400/restjsr/v1/vectortile/maps/China' + } + } + ], + description: '', + projection: 'EPSG:3857', + minScale: '1:591658710.909131', + title: 'mvt问题', + version: '2.4.3', + rootUrl: 'http://fack:8190/iportal/' + }; + const vectorTile_style_arcgis = { + metadata: { + mapcenter: [-757640.0606130529, 3387809.2036870196], + indexbounds: [345754.3017317925, 2500241.087997996, 3374092.172217019, 5528578.958483222], + mapscale: 3.908743924597e-8, + epsgcode: 4548, + topscale: 4.4733009479210134e-8, + mapbounds: [-3351272.4427074995, 819239.9879898131, 1835992.3214813927, 5956378.419384226] + }, + sources: { + 'ChinaqxAlberts_4548@fl': { + url: './tileFeature.json', + bounds: [-180, -90, 180, 90], + type: 'vector' + }, + ChinaqxAlberts_tiles: { + tiles: ['./tileFeature.mvt'], + bounds: [-180, -90, 180, 90], + type: 'vector' + } + }, + center: [104.02637148052703, 29.96217012533226], + name: 'ChinaqxAlberts_4548@fl', + layers: [ + { + paint: { + 'background-color': 'rgba(255,255,255,1.00)' + }, + id: 'background', + type: 'background' + }, + { + layout: { + visibility: 'visible' + }, + metadata: { + 'layer:caption': 'ChinaqxAlberts_4548@fl', + 'layer:name': 'ChinaqxAlberts_4548@fl' + }, + maxzoom: 24, + paint: { + 'fill-color': 'rgba(151,191,242,1.00)', + 'fill-antialias': true + }, + id: 'ChinaqxAlberts_4548@fl(0_24)', + source: 'ChinaqxAlberts_4548@fl', + 'source-layer': 'ChinaqxAlberts_4548@fl', + type: 'fill', + minzoom: 0 + } + ], + zoom: 0, + version: 8 + }; + spyOn(FetchRequest, 'get').and.callFake((url) => { + if (url.indexOf('map.json') > -1) { + return Promise.resolve(new Response(JSON.stringify(mapJSON))); + } + if (url.indexOf('portal.json') > -1) { + return Promise.resolve(new Response(JSON.stringify(portalConfig))); + } + if (url.indexOf('/style.json')) { + return Promise.resolve(new Response(JSON.stringify(vectorTile_style_arcgis))); + } + console.log('FetchRequest', url); + return Promise.resolve(new Response(JSON.stringify({}))); + }); + + var datavizWebmap = new WebMap(id, options); + // spyOn(datavizWebmap, 'createGraphicLayer'); + + datavizWebmap.on('mapcreatesucceeded', (data) => { + try { + expect(datavizWebmap.map.getStyle().layers.length).toBe(2); + const originLayerInfo = datavizWebmap._handler._mapInfo.layers.find((layer) => { + return layer.layerID === 'China'; + }); + originLayerInfo.layerType = 'mvt'; + datavizWebmap.updateOverlayLayer( + { id: 'China' }, + { + featureType: 'MULTIPOLYGON', + info: { + url: 'http://fack:8090/iserver/services/map-china400/restjsr/v1/vectortile/maps/China' + } + } + ); + datavizWebmap.updateOverlayLayer( + { id: 'China' }, + { + featureType: 'LINESTRING', + info: { + url: 'http://fack:8090/iserver/services/map-china400/restjsr/v1/vectortile/maps/China' + } + } + ); + datavizWebmap.updateOverlayLayer( + { id: 'China' }, + { + featureType: 'POINT', + info: { url: 'http://fack:8090/iserver/services/map-china400/restjsr/v1/vectortile/maps/China' } + } + ); + done(); + } catch (error) { + console.log(error); + done(); + } + }); + }); + it('ISVJ-11511_maxzoom<=24', (done) => { + // mapboxgl map的maxzoom是闭区间 layer的mazzoom是开区间。layer maxzoom的最大值是24 + // 为保证地图在maxzoom=24时能正常显示,地图的maxzoom不能设置为24,否则会导致图层无法显示,所以地图的maxzoom最大只能设置为23。 + let options = { + server: server + }; + const mapJSON = { + "extent": { + "leftBottom": { + "x": 118.02310000000011, + "y": 27.044700000000034 + }, + "rightTop": { + "x": 122.94200000000001, + "y": 31.180900000000065 + } + }, + "maxScale": "1:0.9626322617192434", + "level": 1, + "center": { + "x": 120.48255000000006, + "y": 29.11280000000005 + }, + "baseLayer": { + "layerType": "TILE", + "name": "quxian", + "url": "http://fack:8090/iserver/services/map-shapefile-quxian/rest/maps/quxian" + }, + "layers": [], + "description": "", + "projection": "GEOGCS[\"China Geodetic Coordinate System 2000\", \r\n DATUM[\"China 2000\", \r\n SPHEROID[\"CGCS2000\", 6378137.0, 298.257222101, AUTHORITY[\"EPSG\",\"1024\"]], \r\n AUTHORITY[\"EPSG\",\"1043\"]], \r\n PRIMEM[\"Greenwich\", 0.0, AUTHORITY[\"EPSG\",\"8901\"]], \r\n UNIT[\"degree\", 0.017453292519943295], \r\n AXIS[\"lat\", NORTH], \r\n AXIS[\"lon\", EAST], \r\n AUTHORITY[\"EPSG\",\"4490\"]]", + "minScale": "1:4037572.3458580696", + "title": "maxzoom", + "version": "2.4.3", + "rootUrl": "http://fack:8190/iportal/" +}; + const restmapjson = { + "scale": 1.9900535920750805E-8, + "prjCoordSys": { + "epsgCode": 4490, + }, + "minScale": 0, + "visibleScales": [], + "dpi": 96, + "visibleScalesEnabled": false, + + "center": { + "x": 120.48255000000006, + "y": 29.11280000000005 + }, + "name": "quxian", + "bounds": { + "top": 31.180900000000065, + "left": 118.02310000000011, + "bottom": 27.044700000000034, + "leftBottom": { + "x": 118.02310000000011, + "y": 27.044700000000034 + }, + "right": 122.94200000000001, + "rightTop": { + "x": 122.94200000000001, + "y": 31.180900000000065 + } + } + +}; + spyOn(FetchRequest, 'get').and.callFake((url) => { + if (url.indexOf('map.json') > -1) { + return Promise.resolve(new Response(JSON.stringify(mapJSON))); + } + if (url.indexOf('portal.json') > -1) { + return Promise.resolve(new Response(JSON.stringify(portalConfig))); + } + if (url.indexOf('/quxian.json')> -1) { + return Promise.resolve(new Response(JSON.stringify(restmapjson))); + } + console.log('FetchRequest', url); + return Promise.resolve(new Response(JSON.stringify({}))); + }); + + var datavizWebmap = new WebMap(id, options); + + datavizWebmap.on('mapcreatesucceeded', (data) => { + try { + expect(datavizWebmap.map.getMaxZoom()).toBe(23); + expect(datavizWebmap.map.getStyle().layers.length).toBe(1); + expect(datavizWebmap.map.getStyle().layers[0].maxzoom).toBe(24); + done(); + } catch (error) { + console.log(error); + done(); + } + }); + }); +}); diff --git a/test/tool/mock_mapboxgl_map.js b/test/tool/mock_mapboxgl_map.js index 3afab25965..78794927ef 100644 --- a/test/tool/mock_mapboxgl_map.js +++ b/test/tool/mock_mapboxgl_map.js @@ -501,6 +501,8 @@ CRS.defaultWKTs = { }; CRS.EPSG3857 = new CRS('EPSG:3857', [-20037508.3427892, -20037508.3427892, 20037508.3427892, 20037508.3427892]); CRS.EPSG4326 = new CRS('EPSG:4326', [-180, -90, 180, 90]); +CRS.EPSG4490 = new CRS('EPSG:4490', [-180, -90, 180, 90]); + export default Map; From 06be14155ef887ad5efdbda8b9fe5081b1c5ba47 Mon Sep 17 00:00:00 2001 From: songyumeng Date: Fri, 13 Mar 2026 17:56:48 +0800 Subject: [PATCH 16/46] =?UTF-8?q?=E3=80=90fix=E3=80=91ut?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/mapboxgl/mapping/WebMapV22Spec.js | 24 ++++++++++++------------ test/tool/mock_mapboxgl_map.js | 1 - 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/test/mapboxgl/mapping/WebMapV22Spec.js b/test/mapboxgl/mapping/WebMapV22Spec.js index 1d6f910bc8..99ff581f5c 100644 --- a/test/mapboxgl/mapping/WebMapV22Spec.js +++ b/test/mapboxgl/mapping/WebMapV22Spec.js @@ -640,12 +640,12 @@ describe('mapboxgl_WebMapV2_2', () => { const mapJSON = { "extent": { "leftBottom": { - "x": 118.02310000000011, - "y": 27.044700000000034 + "x": -180, + "y": -90 }, "rightTop": { - "x": 122.94200000000001, - "y": 31.180900000000065 + "x": 180, + "y": 90 } }, "maxScale": "1:0.9626322617192434", @@ -683,17 +683,17 @@ describe('mapboxgl_WebMapV2_2', () => { }, "name": "quxian", "bounds": { - "top": 31.180900000000065, - "left": 118.02310000000011, - "bottom": 27.044700000000034, + "top": 90, + "left": -180, + "bottom": -90, "leftBottom": { - "x": 118.02310000000011, - "y": 27.044700000000034 + "x": -180, + "y": -90 }, - "right": 122.94200000000001, + "right": 180, "rightTop": { - "x": 122.94200000000001, - "y": 31.180900000000065 + "x": 180, + "y": 90 } } diff --git a/test/tool/mock_mapboxgl_map.js b/test/tool/mock_mapboxgl_map.js index 78794927ef..96b660429c 100644 --- a/test/tool/mock_mapboxgl_map.js +++ b/test/tool/mock_mapboxgl_map.js @@ -501,7 +501,6 @@ CRS.defaultWKTs = { }; CRS.EPSG3857 = new CRS('EPSG:3857', [-20037508.3427892, -20037508.3427892, 20037508.3427892, 20037508.3427892]); CRS.EPSG4326 = new CRS('EPSG:4326', [-180, -90, 180, 90]); -CRS.EPSG4490 = new CRS('EPSG:4490', [-180, -90, 180, 90]); From 8a96fc31252071328ad89e2db2cda47f90e64d65 Mon Sep 17 00:00:00 2001 From: luoxiao Date: Mon, 23 Mar 2026 20:40:31 +0800 Subject: [PATCH 17/46] =?UTF-8?q?[fix]=E5=B0=86webmapv3=20filter=20?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E6=88=90get=20xxxx?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/mapping/WebMapV3.js | 99 +++++ test/mapboxgl/mapping/WebMapV3Spec.js | 36 ++ test/resources/WebMapV3.js | 530 ++++++++++++++++++++++++++ 3 files changed, 665 insertions(+) diff --git a/src/common/mapping/WebMapV3.js b/src/common/mapping/WebMapV3.js index 563060be03..46b2699739 100644 --- a/src/common/mapping/WebMapV3.js +++ b/src/common/mapping/WebMapV3.js @@ -336,6 +336,30 @@ export function createWebMapV3Extending(SuperClass, { MapManager, mapRepo, crsMa } return epsgCode; } + _getFilterByCatalog(catalog, res = {}) { + const { catalogType, children } = catalog; + if(catalogType === 'group' && children) { + children.forEach(child => { + this._getFiltersByCatalog(child, res); + }) + } + if (catalogType === 'layer') { + const { filter, layersContent = [] } = catalog; + if (filter) { + layersContent.forEach(layerId => { + res[layerId] = filter; + }) + } + } + } + _getFiltersByCatalog(_mapResourceInfo = this._mapResourceInfo) { + const { catalogs = [] } = _mapResourceInfo; + const res = []; + catalogs.forEach((item) => { + this._getFilterByCatalog(item, res); + }) + return res; + } /** * @private @@ -363,6 +387,8 @@ export function createWebMapV3Extending(SuperClass, { MapManager, mapRepo, crsMa description: relatedInfo.description }; this._mapResourceInfo = JSON.parse(relatedInfo.projectInfo); + const catalogFilters = this._getFiltersByCatalog(); + this._changeMapInfoFilter(catalogFilters); this._createMapRelatedInfo(); this._addLayersToMap(); }) @@ -371,6 +397,79 @@ export function createWebMapV3Extending(SuperClass, { MapManager, mapRepo, crsMa console.error(error); }); } + /** + * @private + * @function WebMapV3.prototype._changeMapInfoFilter + * @description 更新地图图层的过滤器, 将filter的内容 ['==', 'Ctype', '']转换为['==', ['get', 'Ctype'], 'label'] + */ + _changeMapInfoFilter(catalogFilters = {}) { + const { layers =[]} = this._mapInfo; + layers.forEach(layer => { + if (layer.filter && catalogFilters[layer.id]) { + const catalogFilter = catalogFilters[layer.id]; + const matchKeys = this._collectMatchKeys(catalogFilter); + const filter = this._transformFilterByMatchKeys(layer.filter, matchKeys); + layer.filter = filter; + } + }) + this._mapInfo ={ + ...this._mapInfo, + layers + } + } + + _collectMatchKeys(filter) { + const keys = []; + const excludeKeys = ['$type', '$id', '$layer']; + if (!Array.isArray(filter)) {return keys;} + const traverse = (arr) => { + for (const item of arr) { + if (!Array.isArray(item)) {continue;} + if (item.length >= 3 && this._isComparisonOperator(item[0])) { + const prop = this._getPropertyKey(item[1]); + if (prop && !excludeKeys.includes(prop)) { + keys.push(prop); + continue; + } + if (typeof item[1] === 'string' && !excludeKeys.includes(item[1])) { + keys.push(item[1]); + } + } else { + traverse(item); + } + } + }; + traverse(filter); + return [...new Set(keys)]; + } + + _getPropertyKey(item) { + if (Array.isArray(item) && item.length === 2 && item[0] === 'get' && typeof item[1] === 'string') { + return item[1]; + } + return null; + } + + _transformFilterByMatchKeys(filter, matchKeys) { + if (!Array.isArray(filter)) { + return filter; + } + if (filter.length >= 3 && typeof filter[1] === 'string' && this._isComparisonOperator(filter[0])) { + if (matchKeys.includes(filter[1])) { + return [filter[0], ['get', filter[1]], ...filter.slice(2)]; + } + return filter; + } + if (filter.length >= 2 && typeof filter[1] !== 'string' && this._isComparisonOperator(filter[0])) { + const operands = filter.slice(1).map(item => this._transformFilterByMatchKeys(item, matchKeys)); + return [filter[0], ...operands]; + } + return filter.map(item => this._transformFilterByMatchKeys(item, matchKeys)); + } + + _isComparisonOperator(op) { + return ['==', '!=', '>', '<', '>=', '<=', 'in', '!in', 'all', 'any', 'none'].includes(op); + } /** * @private diff --git a/test/mapboxgl/mapping/WebMapV3Spec.js b/test/mapboxgl/mapping/WebMapV3Spec.js index 48397fc36b..d320ab4d8e 100644 --- a/test/mapboxgl/mapping/WebMapV3Spec.js +++ b/test/mapboxgl/mapping/WebMapV3Spec.js @@ -161,6 +161,42 @@ describe('mapboxgl-webmap3.0', () => { }); }); + it('filters mapinfo', (done) => { + spyOn(FetchRequest, 'get').and.callFake((url) => { + if (url.indexOf('web/config/portal.json') > -1) { + return Promise.resolve(new Response(JSON.stringify(iportal_serviceProxy))); + } + if (url.indexOf('map.json') > -1) { + return Promise.resolve(new Response(mapstudioWebMap_filters)); + } + if (url.indexOf('617580084.json') > -1) { + return Promise.resolve(new Response(msProjectINfo_filters)); + } + if (url.indexOf('/sprite') > -1) { + return Promise.resolve(new Response(msSpriteInfo)); + } + return Promise.resolve(); + }); + mapstudioWebmap = new WebMap(id, { + server: server + }); + + mapstudioWebmap.on('mapcreatesucceeded', ({ map }) => { + expect(map).not.toBeUndefined(); + expect(mapstudioWebmap.map).toEqual(map); + const style = map.getStyle(); + const webMapV3 = mapstudioWebmap._getWebMapInstance(); + const mapInfo = JSON.parse(mapstudioWebMap_symbol); + expect(style.layers.length).toBe(mapInfo.layers.length); + expect(webMapV3._mapInfo.layers[0].filter).toBe([]); + expect(webMapV3._mapInfo.layers[1].filter).toBe([]); + expect(webMapV3._mapInfo.layers[2].filter).toBe([]); + expect(webMapV3._mapInfo.layers[3].filter).toBe([]); + expect(webMapV3._mapInfo.layers[4].filter).toBe([]); + done(); + }); + }); + it('mapId is JSON', (done) => { spyOn(FetchRequest, 'get').and.callFake((url) => { if (url.indexOf('/sprite') > -1) { diff --git a/test/resources/WebMapV3.js b/test/resources/WebMapV3.js index 969661172c..6438001f88 100644 --- a/test/resources/WebMapV3.js +++ b/test/resources/WebMapV3.js @@ -3852,4 +3852,534 @@ var msProjectINfo_separate_layerCatalogId = JSON.stringify({ isDefaultBottomMap: false, status: null, favoriteCount: 0 +}); +var mapstudioWebMap_filters = JSON.stringify({ + metadata: { + layerCatalog: [ + { + visible: true, + id: 'ms_站点3_1713695373911_194', + title: '站点3', + type: 'basic' + }, + { + visible: true, + parts: [ + 'ms_composite_symbol_北京市轨道交通线路减_1712908151359_384', + 'ms_composite_symbol_北京市轨道交通线路减_1712908151359_385', + 'ms_composite_symbol_北京市轨道交通线路减_1712908151359_386', + 'ms_composite_symbol_北京市轨道交通线路减_1712908151359_387', + 'ms_composite_symbol_北京市轨道交通线路减_1712908151359_388', + 'ms_composite_symbol_北京市轨道交通线路减_1712908151359_389', + 'ms_composite_symbol_北京市轨道交通线路减_1712908151359_390' + ], + id: '北京市轨道交通线路减', + title: '北京市轨道交通线路减', + type: 'composite' + }, + { + visible: true, + id: 'ms_站点3_1712735857741_21', + title: '站点3', + type: 'basic' + }, + { + visible: true, + id: '站点3', + title: '站点3', + type: 'basic' + }, + { + visible: true, + id: 'ms_站点3_1712735793051_16', + title: '站点3', + type: 'basic' + }, + { + visible: true, + parts: ['ms_北京市_1712822459356_412'], + id: '北京市', + title: '北京市', + type: 'composite' + } + ] + }, + sources: { + ms_435608982_1712735745629_12: { + tiles: [ + 'http://localhost:8190/iportal/services/../web/datas/435608982/structureddata/tiles/{z}/{x}/{y}.mvt?epsgCode=3857&returnedFieldNames=%5B%22smpid%22%2C%22parent%22%2C%22adcode%22%2C%22level%22%2C%22centroid%22%2C%22childrenNum%22%2C%22center%22%2C%22subFeatureIndex%22%2C%22name%22%2C%22acroutes%22%2C%22geometry%22%5D&geometryFieldName=geometry' + ], + bounds: [115.423411, 39.442758, 117.514583, 41.0608], + type: 'vector' + }, + CHINA_DARK: { + tiles: ['base/resources/img/baiduTileTest.png'], + tileSize: 256, + attribution: '', + bounds: [-180, -90, 180, 90], + type: 'raster' + }, + ms_1755873792_1712735857741_22: { + tiles: [ + 'http://localhost:8190/iportal/services/../web/datas/1755873792/structureddata/tiles/{z}/{x}/{y}.mvt?epsgCode=3857&returnedFieldNames=%5B%22smpid%22%2C%221111%E6%A0%87%E5%87%86%E5%90%8D%E7%A7%B0%22%2C%22SmID%22%2C%22SmGeometrySize%22%2C%221111SmUserID%22%2C%22SmY%22%2C%22SmGeoPosition%22%2C%22SmX%22%2C%22SmLibTileID%22%2C%22geometry%22%5D&geometryFieldName=geometry' + ], + bounds: [116.36331703990744, 39.89942692791154, 116.38141290077355, 39.9767738835847], + type: 'vector' + }, + ms_aggregation_1755873792_1712735796586_18: { + tiles: [ + 'http://localhost:8190/iportal/web/datas/1755873792/structureddata/aggregation.mvt?zxyFilter={z},{x},{y},3857&pixelGroupBy=%7B%22aggCellSize%22%3A1%2C%22aggCellUnit%22%3A%22PX%22%7D&aggType=AVG&aggField=smpid' + ], + bounds: [116.36331703990744, 39.89942692791154, 116.38141290077355, 39.9767738835847], + type: 'vector' + }, + ms_aggregation_1755873792_1713695380060_432: { + tiles: [ + 'http://localhost:8190/iportal/web/datas/1755873792/structureddata/aggregation.mvt?zxyFilter={z},{x},{y},3857&pixelGroupBy=%7B%22aggCellSize%22%3A100%2C%22aggCellUnit%22%3A%22PX%22%7D&aggType=COUNT' + ], + bounds: [116.36331703990744, 39.89942692791154, 116.38141290077355, 39.9767738835847], + type: 'vector' + }, + ms_1755873792_1712735782349_15: { + tiles: [ + 'http://localhost:8190/iportal/services/../web/datas/1755873792/structureddata/tiles/{z}/{x}/{y}.mvt?epsgCode=3857&returnedFieldNames=%5B%22smpid%22%2C%221111%E6%A0%87%E5%87%86%E5%90%8D%E7%A7%B0%22%2C%22SmID%22%2C%22SmGeometrySize%22%2C%221111SmUserID%22%2C%22SmY%22%2C%22SmGeoPosition%22%2C%22SmX%22%2C%22SmLibTileID%22%2C%22geometry%22%5D&geometryFieldName=geometry' + ], + bounds: [116.36331703990744, 39.89942692791154, 116.38141290077355, 39.9767738835847], + type: 'vector' + }, + ms_2111415064_1712736129943_152: { + tiles: [ + 'http://localhost:8190/iportal/services/../web/datas/2111415064/structureddata/tiles/{z}/{x}/{y}.mvt?epsgCode=3857&returnedFieldNames=%5B%22smpid%22%2C%22%E7%BB%88%E7%82%B9y%22%2C%22SmID%22%2C%22%E6%A0%87%E5%87%86%E5%90%8D%E7%A7%B0%22%2C%22%E8%B5%B7%E7%82%B9x%22%2C%22%E8%B5%B7%E7%82%B9y%22%2C%22testID%22%2C%22%E7%BB%88%E7%82%B9x%22%2C%22geometry%22%5D&geometryFieldName=geometry' + ], + bounds: [116.10214436813241, 39.72316247533395, 116.4357788812853, 40.088344539540586], + type: 'vector' + } + }, + crs: 'EPSG:3857', + center: [116.34412667383185, 39.93811133359088], + zoom: 12, + glyphs: {}, + version: '3.1.5', + rootUrl: 'http://localhost:8190/iportal/', + maxzoom: 12, + name: 'ms-点', + viewExtent: [116.23572251428592, 39.99659112475634, 116.4525308333773, 39.879581525048216], + layers: [ + { + metadata: {}, + maxzoom: 12, + id: 'CHINA_DARK', + source: 'CHINA_DARK', + type: 'raster', + minzoom: 0 + }, + { + filter: ['any', ['all', ['>=', 'smpid', 1], ['<', 'smpid', 3.5], ["==", "$type", "Point"]]], + metadata: {}, + paint: { + 'fill-outline-color': ['interpolate', ['linear'], ['get', 'smpid'], 1, '#D53E4F', 16, '#3288BD'], + 'fill-pattern': [ + 'case', + ['all', ['>=', ['to-number', ['get', 'smpid']], 1], ['<', ['to-number', ['get', 'smpid']], 3.5]], + 'polygon-83040554', + 'polygon-83040554' + ], + 'fill-opacity': 0.9 + }, + id: '北京市', + source: 'ms_435608982_1712735745629_12', + 'source-layer': '435608982$geometry', + type: 'fill' + }, + { + filter: ['all', ['none', ['all', ['>=', 'smpid', 1], ['<', 'smpid', 3.5]]]], + metadata: {}, + paint: { + 'fill-outline-color': ['interpolate', ['linear'], ['get', 'smpid'], 1, '#D53E4F', 16, '#3288BD'], + 'fill-color': [ + 'case', + ['all', ['>=', ['to-number', ['get', 'smpid']], 3.5], ['<', ['to-number', ['get', 'smpid']], 6]], + '#826DBA', + ['all', ['>=', ['to-number', ['get', 'smpid']], 6], ['<', ['to-number', ['get', 'smpid']], 8.5]], + '#826DBA', + ['all', ['>=', ['to-number', ['get', 'smpid']], 8.5], ['<', ['to-number', ['get', 'smpid']], 11]], + '#826DBA', + ['all', ['>=', ['to-number', ['get', 'smpid']], 11], ['<', ['to-number', ['get', 'smpid']], 13.5]], + '#826DBA', + ['all', ['>=', ['to-number', ['get', 'smpid']], 13.5], ['<', ['to-number', ['get', 'smpid']], 16.1]], + '#826DBA', + '#826DBA' + ], + 'fill-opacity': 0.9 + }, + id: 'ms_北京市_1712822459356_412', + source: 'ms_435608982_1712735745629_12', + 'source-layer': '435608982$geometry', + type: 'fill' + }, + { + layout: { + visibility: 'visible' + }, + metadata: {}, + paint: { + 'heatmap-color': [ + 'interpolate', + ['linear'], + ['heatmap-density'], + 0, + 'rgba(0,0,0,0)', + 0.2, + '#0000ff', + 0.4, + '#00ffff', + 0.6, + '#00ff00', + 0.8, + '#ffff00', + 1, + '#ff0000' + ], + 'heatmap-opacity': 1, + 'heatmap-weight': ['get', 'weight'], + 'heatmap-radius': 20 + }, + id: 'ms_站点3_1712735793051_16', + source: 'ms_aggregation_1755873792_1712735796586_18', + 'source-layer': '1755873792$geometry', + type: 'heatmap' + }, + { + metadata: {}, + paint: { + 'circle-color': '#EE4D5A', + 'circle-opacity': 0.9, + 'circle-translate-anchor': 'map', + 'circle-radius': 4, + 'circle-translate': [0, 0] + }, + id: '站点3', + source: 'ms_1755873792_1712735782349_15', + 'source-layer': '1755873792$geometry', + type: 'circle' + }, + { + layout: { + 'icon-allow-overlap': true, + 'text-line-height': 1.2, + visibility: 'visible', + 'text-anchor': 'center', + 'text-size': 16, + 'text-allow-overlap': true, + 'icon-size': 0.2, + 'symbol-placement': 'point', + 'icon-image': [ + 'match', + ['get', 'smpid'], + 1, + 'rectangle', + 2, + 'circle', + 3, + 'triangle', + 4, + 'rectangle', + 'rectangle' + ], + 'icon-ignore-placement': false, + 'text-font': ['Microsoft YaHei'], + 'text-rotate': 0, + 'text-transform': 'none', + 'text-justify': 'center', + 'text-letter-spacing': 0, + 'text-max-width': 10, + 'icon-anchor': 'center', + 'text-ignore-placement': false, + 'icon-rotate': 0, + 'text-z-offset': 0 + }, + metadata: {}, + paint: { + 'icon-translate': [50, 0], + 'text-halo-color': '#242424', + 'text-translate-anchor': 'map', + 'icon-color': 'rgba(0,255,228,1)', + 'text-halo-blur': 2, + 'icon-translate-anchor': 'map', + 'text-color': '#FFFFFF', + 'text-halo-width': 1, + 'icon-opacity': 0.9, + 'text-opacity': 1, + 'text-translate': [0, 0] + }, + id: 'ms_站点3_1712735857741_21', + source: 'ms_1755873792_1712735857741_22', + 'source-layer': '1755873792$geometry', + type: 'symbol' + }, + { + filter: ['==', 'smpid', 1], + layout: { + 'line-cap': 'round', + 'line-join': 'round' + }, + metadata: {}, + paint: { + 'line-width': ['interpolate', ['linear'], ['get', 'smpid'], 1, 0.15, 3, 1.54], + 'line-offset': ['interpolate', ['linear'], ['get', 'smpid'], 1, -0.92, 3, -9.23], + 'line-dasharray': [69.63, 29.84, 318.26, 0], + 'line-color': ['interpolate', ['linear'], ['get', 'smpid'], 1, '#D53E4F', 3, '#3288BD'] + }, + id: '北京市轨道交通线路减', + source: 'ms_2111415064_1712736129943_152', + 'source-layer': '2111415064$geometry', + type: 'line' + }, + { + filter: ['==', 'smpid', 1], + layout: { + 'line-cap': 'round', + 'line-join': 'round' + }, + metadata: {}, + paint: { + 'line-width': ['interpolate', ['linear'], ['get', 'smpid'], 1, 0.15, 3, 1.54], + 'line-offset': ['interpolate', ['linear'], ['get', 'smpid'], 1, 0.92, 3, 9.23], + 'line-dasharray': [69.63, 29.84, 318.26, 0], + 'line-color': ['interpolate', ['linear'], ['get', 'smpid'], 1, '#D53E4F', 3, '#3288BD'] + }, + id: 'ms_composite_symbol_北京市轨道交通线路减_1712908151359_384', + source: 'ms_2111415064_1712736129943_152', + 'source-layer': '2111415064$geometry', + type: 'line' + }, + { + filter: ['==', 'smpid', 2], + layout: { + 'line-cap': 'round', + 'line-join': 'round' + }, + metadata: {}, + paint: { + 'line-width': ['interpolate', ['linear'], ['get', 'smpid'], 1, 0.15, 3, 1.54], + 'line-offset': ['interpolate', ['linear'], ['get', 'smpid'], 1, -0.92, 3, -9.23], + 'line-dasharray': [69.63, 29.84, 318.26, 0], + 'line-color': ['interpolate', ['linear'], ['get', 'smpid'], 1, '#D53E4F', 3, '#3288BD'] + }, + id: 'ms_composite_symbol_北京市轨道交通线路减_1712908151359_385', + source: 'ms_2111415064_1712736129943_152', + 'source-layer': '2111415064$geometry', + type: 'line' + }, + { + filter: ['==', 'smpid', 2], + layout: { + 'line-cap': 'round', + 'line-join': 'round' + }, + metadata: {}, + paint: { + 'line-width': ['interpolate', ['linear'], ['get', 'smpid'], 1, 0.15, 3, 1.54], + 'line-offset': ['interpolate', ['linear'], ['get', 'smpid'], 1, 0.92, 3, 9.23], + 'line-dasharray': [69.63, 29.84, 318.26, 0], + 'line-color': ['interpolate', ['linear'], ['get', 'smpid'], 1, '#D53E4F', 3, '#3288BD'] + }, + id: 'ms_composite_symbol_北京市轨道交通线路减_1712908151359_386', + source: 'ms_2111415064_1712736129943_152', + 'source-layer': '2111415064$geometry', + type: 'line' + }, + { + filter: ['==', 'smpid', 3], + layout: { + 'line-cap': 'round', + 'line-join': 'round' + }, + metadata: {}, + paint: { + 'line-width': ['interpolate', ['linear'], ['get', 'smpid'], 1, 0.15, 3, 1.54], + 'line-offset': ['interpolate', ['linear'], ['get', 'smpid'], 1, -0.92, 3, -9.23], + 'line-dasharray': [69.63, 29.84, 318.26, 0], + 'line-color': ['interpolate', ['linear'], ['get', 'smpid'], 1, '#D53E4F', 3, '#3288BD'] + }, + id: 'ms_composite_symbol_北京市轨道交通线路减_1712908151359_387', + source: 'ms_2111415064_1712736129943_152', + 'source-layer': '2111415064$geometry', + type: 'line' + }, + { + filter: ['==', 'smpid', 3], + layout: { + 'line-cap': 'round', + 'line-join': 'round' + }, + metadata: {}, + paint: { + 'line-width': ['interpolate', ['linear'], ['get', 'smpid'], 1, 0.15, 3, 1.54], + 'line-offset': ['interpolate', ['linear'], ['get', 'smpid'], 1, 0.92, 3, 9.23], + 'line-dasharray': [69.63, 29.84, 318.26, 0], + 'line-color': ['interpolate', ['linear'], ['get', 'smpid'], 1, '#D53E4F', 3, '#3288BD'] + }, + id: 'ms_composite_symbol_北京市轨道交通线路减_1712908151359_388', + source: 'ms_2111415064_1712736129943_152', + 'source-layer': '2111415064$geometry', + type: 'line' + }, + { + filter: ['none', ['==', 'smpid', 1], ['==', 'smpid', 2], ['==', 'smpid', 3]], + layout: { + 'line-cap': 'round', + 'line-join': 'round' + }, + metadata: {}, + paint: { + 'line-width': ['interpolate', ['linear'], ['get', 'smpid'], 1, 0.15, 3, 1.54], + 'line-offset': ['interpolate', ['linear'], ['get', 'smpid'], 1, -0.92, 3, -9.23], + 'line-dasharray': [69.63, 29.84, 318.26, 0], + 'line-color': ['interpolate', ['linear'], ['get', 'smpid'], 1, '#D53E4F', 3, '#3288BD'] + }, + id: 'ms_composite_symbol_北京市轨道交通线路减_1712908151359_389', + source: 'ms_2111415064_1712736129943_152', + 'source-layer': '2111415064$geometry', + type: 'line' + }, + { + filter: ['none', ['==', 'smpid', 1], ['==', 'smpid', 2], ['==', 'smpid', 3]], + layout: { + 'line-cap': 'round', + 'line-join': 'round' + }, + metadata: {}, + paint: { + 'line-width': ['interpolate', ['linear'], ['get', 'smpid'], 1, 0.15, 3, 1.54], + 'line-offset': ['interpolate', ['linear'], ['get', 'smpid'], 1, 0.92, 3, 9.23], + 'line-dasharray': [69.63, 29.84, 318.26, 0], + 'line-color': ['interpolate', ['linear'], ['get', 'smpid'], 1, '#D53E4F', 3, '#3288BD'] + }, + id: 'ms_composite_symbol_北京市轨道交通线路减_1712908151359_390', + source: 'ms_2111415064_1712736129943_152', + 'source-layer': '2111415064$geometry', + type: 'line' + }, + { + layout: { + 'icon-allow-overlap': true, + 'text-line-height': 1.2, + visibility: 'visible', + 'text-size': 12, + 'text-anchor': 'center', + 'text-allow-overlap': true, + 'icon-size': [ + 'interpolate', + ['linear'], + ['to-number', ['get', 'weight']], + 1, + 0.15384615384615385, + 4, + 1.9230769230769231 + ], + 'symbol-placement': 'point', + 'icon-ignore-placement': false, + 'icon-image': 'circle', + 'text-font': ['Microsoft YaHei'], + 'text-rotate': 0, + 'text-transform': 'none', + 'text-max-width': 10, + 'text-justify': 'center', + 'text-letter-spacing': 0, + 'icon-anchor': 'center', + 'text-ignore-placement': false, + 'icon-rotate': 0 + }, + metadata: {}, + paint: { + 'icon-translate': [0, 0], + 'text-halo-color': '#242424', + 'text-translate-anchor': 'map', + 'icon-color': '#EE4D5A', + 'text-halo-blur': 2, + 'text-color': '#FFFFFF', + 'icon-opacity': 0.9, + 'text-halo-width': 1, + 'text-opacity': 1, + 'text-translate': [0, 0] + }, + id: 'ms_站点3_1713695373911_194', + source: 'ms_aggregation_1755873792_1713695380060_432', + 'source-layer': '1755873792$geometry', + type: 'symbol' + } + ], + sprite: 'http://localhost:9876/base/resources/data/sprite', + pitch: 0, + minzoom: 0 +}); +var msProjectINfo_filters = JSON.stringify({ + extent: { + top: 39.060244465996576, + left: 115.3932226740005, + bottom: 40.7783804924719, + leftBottom: { + x: 115.3932226740005, + y: 40.7783804924719 + }, + right: 117.94649844460855, + rightTop: { + x: 117.94649844460855, + y: 39.060244465996576 + } + }, + controls: null, + extentString: + '{"top":39.060244465996576,"left":115.3932226740005,"bottom":40.7783804924719,"leftBottom":{"x":115.3932226740005,"y":40.7783804924719},"right":117.94649844460855,"rightTop":{"x":117.94649844460855,"y":39.060244465996576}}', + description: '', + verifyReason: null, + units: null, + title: 'ms-点', + resolution: 0, + checkStatus: 'SUCCESSFUL', + projectInfo: '{"images":"http://localhost:9876/base/resources/data/sprite","catalogs":[{"visualization":{"renderer":{"rotate":{"type":"simple","value":0},"textLetterSpacing":{"type":"simple","value":0},"textTranslate":{"type":"simple","value":[0,0]},"color":{"type":"simple","value":"#EE4D5A"},"symbolPlacement":{"type":"simple","value":"point"},"textAnchor":{"type":"simple","value":"center"},"type":"point-cluster","translate":{"type":"simple","value":[0,0]},"textRotate":{"type":"simple","value":0},"textField":{"type":"simple","value":"weight"},"textHaloBlur":{"type":"simple","value":2},"transform":{"type":"simple","value":"none"},"symbolsContent":{"type":"simple","value":{"symbolId":"circle","style":{"layout":{"icon-image":"circle"}}}},"textTranslateAnchor":{"type":"simple","value":"map"},"justify":{"type":"simple","value":"center"},"ignorePlacement":{"type":"simple","value":false},"textAllowOverlap":{"type":"simple","value":true},"maxWidth":{"type":"simple","value":10},"textSize":{"type":"simple","value":12},"textHaloColor":{"type":"simple","value":"#242424"},"textColor":{"type":"simple","value":"#FFFFFF"},"size":{"field":"weight","type":"linear","value":[{"value":8,"key":1},{"value":100,"key":4}]},"allowOverlap":{"type":"simple","value":true},"translateAnchor":{"type":"simple","value":"map"},"anchor":{"type":"simple","value":"center"},"textOpacity":{"type":"simple","value":1},"textHaloWidth":{"type":"simple","value":1},"lineHeight":{"type":"simple","value":1.2},"textFont":{"type":"simple","value":["Microsoft YaHei"]},"textIgnorePlacement":{"type":"simple","value":false},"opacity":{"type":"simple","value":0.9}}},"visible":true,"catalogType":"layer","msDatasetId":"ms_datasetId_1713695373901_183","bounds":[116.36331703990744,39.89942692791154,116.38141290077355,39.9767738835847],"showLegend":true,"id":"ms_站点3_1713695373911_194","source":{"option":{"clusterOption":{"aggType":"COUNT","groupBy":{"aggCellSize":100,"aggCellUnit":"PX"}},"cluster":true}},"popupInfo":{"elements":[{"fieldName":"smpid","type":"FIELD"},{"fieldName":"1111标准名称","type":"FIELD"},{"fieldName":"SmID","type":"FIELD"},{"fieldName":"SmGeometrySize","type":"FIELD"},{"fieldName":"1111SmUserID","type":"FIELD"},{"fieldName":"SmY","type":"FIELD"},{"fieldName":"SmGeoPosition","type":"FIELD"},{"fieldName":"SmX","type":"FIELD"},{"fieldName":"SmLibTileID","type":"FIELD"},{"fieldName":"geometry","type":"FIELD"}],"title":"站点3"},"filter":["all",["==","Ctype",""],["!=","smpid",""]],"title":"站点3","layerSourceType":"Data"},{"visualization":{"renderer":[{"lineDasharray":{"type":"simple","value":[1,0]},"color":{"field":["smpid"],"defaultValue":"#ffffff","values":[{"value":"#D53E4F","key":1},{"value":"#3288BD","key":3}],"ribbon":["#D53E4F","#FC8D59","#FEE08B","#FFFFBF","#E6F598","#99D594","#3288BD"],"interpolateInfo":{"type":"linear"},"type":"unique"},"lineTranslateAnchor":{"type":"simple","value":"map"},"lineMiterLimit":{"type":"simple","value":2},"lineOffset":{"type":"simple","value":0},"lineJoin":{"type":"simple","value":"miter"},"lineRoundLimit":{"type":"simple","value":1.05},"lineTranslate":{"type":"simple","value":[0,0]},"styleRenderMode":"mapboxgl","symbolsContent":{"field":["smpid"],"defaultValue":{"symbolId":"line-83030269","style":[{"layout":{"line-cap":"round","line-join":"round"},"paint":{"line-width":0.38,"line-offset":-2.27,"line-dasharray":[69.63,29.84,318.26,0],"line-color":"rgba(255, 0, 0, 1.00)"}},{"layout":{"line-cap":"round","line-join":"round"},"paint":{"line-width":0.38,"line-offset":2.27,"line-dasharray":[69.63,29.84,318.26,0],"line-color":"rgba(255, 0, 0, 1.00)"}}]},"values":[{"value":{"symbolId":"line-83030269","style":[{"layout":{"line-cap":"round","line-join":"round"},"paint":{"line-width":0.38,"line-offset":-2.27,"line-dasharray":[69.63,29.84,318.26,0],"line-color":"rgba(255, 0, 0, 1.00)"}},{"layout":{"line-cap":"round","line-join":"round"},"paint":{"line-width":0.38,"line-offset":2.27,"line-dasharray":[69.63,29.84,318.26,0],"line-color":"rgba(255, 0, 0, 1.00)"}}]},"key":1},{"value":{"symbolId":"line-83030269","style":[{"layout":{"line-cap":"round","line-join":"round"},"paint":{"line-width":0.38,"line-offset":-2.27,"line-dasharray":[69.63,29.84,318.26,0],"line-color":"rgba(255, 0, 0, 1.00)"}},{"layout":{"line-cap":"round","line-join":"round"},"paint":{"line-width":0.38,"line-offset":2.27,"line-dasharray":[69.63,29.84,318.26,0],"line-color":"rgba(255, 0, 0, 1.00)"}}]},"key":2},{"value":{"symbolId":"line-83030269","style":[{"layout":{"line-cap":"round","line-join":"round"},"paint":{"line-width":0.38,"line-offset":-2.27,"line-dasharray":[69.63,29.84,318.26,0],"line-color":"rgba(255, 0, 0, 1.00)"}},{"layout":{"line-cap":"round","line-join":"round"},"paint":{"line-width":0.38,"line-offset":2.27,"line-dasharray":[69.63,29.84,318.26,0],"line-color":"rgba(255, 0, 0, 1.00)"}}]},"key":3}],"interpolateInfo":{"type":"custom"},"type":"unique"},"lineGapWidth":{"type":"simple","value":0},"lineCap":{"type":"simple","value":"butt"},"width":{"field":["smpid"],"defaultValue":4.92,"values":[{"value":2,"key":1},{"value":20,"key":3}],"interpolateInfo":{"type":"linear"},"type":"unique"},"opacity":{"type":"simple"}}]},"visible":true,"filter":["all",["==","Ctype",""],["==","smpid",""]],"catalogType":"layer","msDatasetId":"ms_datasetId_1712736126050_150","bounds":[116.10214436813241,39.72316247533395,116.4357788812853,40.088344539540586],"showLegend":true,"id":"北京市轨道交通线路减","popupInfo":{"elements":[{"fieldName":"smpid","type":"FIELD"},{"fieldName":"终点y","type":"FIELD"},{"fieldName":"SmID","type":"FIELD"},{"fieldName":"标准名称","type":"FIELD"},{"fieldName":"起点x","type":"FIELD"},{"fieldName":"起点y","type":"FIELD"},{"fieldName":"testID","type":"FIELD"},{"fieldName":"终点x","type":"FIELD"},{"fieldName":"geometry","type":"FIELD"}],"title":"北京市轨道交通线路减"},"title":"北京市轨道交通线路减","layerSourceType":"Data","layersContent":["ms_composite_symbol_北京市轨道交通线路减_1712908151359_384","ms_composite_symbol_北京市轨道交通线路减_1712908151359_385","ms_composite_symbol_北京市轨道交通线路减_1712908151359_386","ms_composite_symbol_北京市轨道交通线路减_1712908151359_387","ms_composite_symbol_北京市轨道交通线路减_1712908151359_388","ms_composite_symbol_北京市轨道交通线路减_1712908151359_389","ms_composite_symbol_北京市轨道交通线路减_1712908151359_390"]},{"visualization":{"renderer":[{"rotate":{"type":"simple","value":0},"textLetterSpacing":{"type":"simple","value":0},"textTranslate":{"type":"simple","value":[0,0]},"color":{"type":"simple","value":"rgba(0,255,228,1)"},"textZOffset":{"type":"simple","value":0},"symbolPlacement":{"type":"simple","value":"point"},"textAnchor":{"type":"simple","value":"center"},"translate":{"type":"simple","value":[50,0]},"textRotate":{"type":"simple","value":0},"textField":{"type":"simple","value":""},"styleRenderMode":"mapboxgl","textHaloBlur":{"type":"simple","value":2},"transform":{"type":"simple","value":"none"},"symbolsContent":{"field":["smpid"],"defaultValue":{"symbolId":"rectangle","style":{"layout":{"icon-image":"rectangle"}}},"values":[{"value":{"symbolId":"rectangle","style":{"layout":{"icon-image":"rectangle"}}},"key":1},{"value":{"symbolId":"circle","style":{"layout":{"icon-image":"circle"}}},"key":2},{"value":{"symbolId":"triangle","style":{"layout":{"icon-image":"triangle"}}},"key":3},{"value":{"symbolId":"rectangle","style":{"layout":{"icon-image":"rectangle"}}},"key":4}],"interpolateInfo":{"type":"custom"},"type":"unique"},"textTranslateAnchor":{"type":"simple","value":"map"},"justify":{"type":"simple","value":"center"},"ignorePlacement":{"type":"simple","value":false},"textAllowOverlap":{"type":"simple","value":true},"maxWidth":{"type":"simple","value":10},"textSize":{"type":"simple","value":16},"textHaloColor":{"type":"simple","value":"#242424"},"textColor":{"type":"simple","value":"#FFFFFF"},"size":{"type":"simple","value":20},"allowOverlap":{"type":"simple","value":true},"translateAnchor":{"type":"simple","value":"map"},"anchor":{"type":"simple","value":"center"},"textOpacity":{"type":"simple","value":1},"textHaloWidth":{"type":"simple","value":1},"lineHeight":{"type":"simple","value":1.2},"textFont":{"type":"simple","value":["Microsoft YaHei"]},"textIgnorePlacement":{"type":"simple","value":false},"opacity":{"type":"simple","value":0.9}}]},"visible":true,"catalogType":"layer","filter":["all",["==","$type","Point"],["==","smpid",""]],"msDatasetId":"ms_datasetId_1712735782333_13","bounds":[116.36331703990744,39.89942692791154,116.38141290077355,39.9767738835847],"id":"ms_站点3_1712735857741_21","popupInfo":{"elements":[{"fieldName":"smpid","type":"FIELD"},{"fieldName":"1111标准名称","type":"FIELD"},{"fieldName":"SmID","type":"FIELD"},{"fieldName":"SmGeometrySize","type":"FIELD"},{"fieldName":"1111SmUserID","type":"FIELD"},{"fieldName":"SmY","type":"FIELD"},{"fieldName":"SmGeoPosition","type":"FIELD"},{"fieldName":"SmX","type":"FIELD"},{"fieldName":"SmLibTileID","type":"FIELD"},{"fieldName":"geometry","type":"FIELD"}],"title":"站点3"},"title":"站点3","layerSourceType":"Data"},{"visualization":{"renderer":[{"symbolsContent":{"type":"simple","value":{"symbolId":"circle","style":{"layout":{"icon-image":"circle"}}}},"size":{"type":"simple","value":8},"color":{"type":"simple","value":"#EE4D5A"},"translateAnchor":{"type":"simple","value":"map"},"opacity":{"type":"simple","value":0.9},"translate":{"type":"simple","value":[0,0]},"styleRenderMode":"mapboxgl"}]},"visible":true,"catalogType":"layer","filter":["all",["==","$type","Point"],["==","smpidxxx",""]],"msDatasetId":"ms_datasetId_1712735782333_13","bounds":[116.36331703990744,39.89942692791154,116.38141290077355,39.9767738835847],"id":"站点3","popupInfo":{"elements":[{"fieldName":"smpid","type":"FIELD"},{"fieldName":"1111标准名称","type":"FIELD"},{"fieldName":"SmID","type":"FIELD"},{"fieldName":"SmGeometrySize","type":"FIELD"},{"fieldName":"1111SmUserID","type":"FIELD"},{"fieldName":"SmY","type":"FIELD"},{"fieldName":"SmGeoPosition","type":"FIELD"},{"fieldName":"SmX","type":"FIELD"},{"fieldName":"SmLibTileID","type":"FIELD"},{"fieldName":"geometry","type":"FIELD"}],"title":"站点3"},"title":"站点3","layerSourceType":"Data"},{"visualization":{"renderer":[{"field":"smpid","color":[{"color":"#0000ff"},{"color":"#00ffff"},{"color":"#00ff00"},{"color":"#ffff00"},{"color":"#ff0000"}],"radius":20,"opacity":1,"type":"heat"}]},"visible":true,"catalogType":"layer","msDatasetId":"ms_datasetId_1712735782333_13","bounds":[116.36331703990744,39.89942692791154,116.38141290077355,39.9767738835847],"id":"ms_站点3_1712735793051_16","popupInfo":{"elements":[{"fieldName":"smpid","type":"FIELD"},{"fieldName":"1111标准名称","type":"FIELD"},{"fieldName":"SmID","type":"FIELD"},{"fieldName":"SmGeometrySize","type":"FIELD"},{"fieldName":"1111SmUserID","type":"FIELD"},{"fieldName":"SmY","type":"FIELD"},{"fieldName":"SmGeoPosition","type":"FIELD"},{"fieldName":"SmX","type":"FIELD"},{"fieldName":"SmLibTileID","type":"FIELD"},{"fieldName":"geometry","type":"FIELD"}],"title":"站点3"},"filter":["all",["==","$type","Point"],["==","smpidxxx",""]],"title":"站点3","layerSourceType":"Data"},{"visualization":{"renderer":[{"fillExtrusionTranslateAnchor":{"type":"simple","value":"map"},"fillExtrusionVerticalGradient":{"type":"simple","value":true},"color":{"type":"simple"},"fillExtrusionBase":{"type":"simple","value":0},"fillExtrusionBaseMultiple":{"type":"simple"},"styleRenderMode":"mapboxgl","fillExtrusionHeightMultiple":{"type":"simple"},"symbolsContent":{"field":["smpid"],"defaultValue":{"symbolId":"polygon-0","style":{"paint":{"fill-color":"#826DBA"}}},"values":[{"start":1,"end":3.5,"value":{"symbolId":"polygon-83040554","style":{"paint":{"fill-pattern":"polygon-83040554"}}}},{"start":3.5,"end":6,"value":{"symbolId":"polygon-0","style":{"paint":{"fill-color":"#826DBA"}}}},{"start":6,"end":8.5,"value":{"symbolId":"polygon-0","style":{"paint":{"fill-color":"#826DBA"}}}},{"start":8.5,"end":11,"value":{"symbolId":"polygon-0","style":{"paint":{"fill-color":"#826DBA"}}}},{"start":11,"end":13.5,"value":{"symbolId":"polygon-0","style":{"paint":{"fill-color":"#826DBA"}}}},{"start":13.5,"end":16.1,"value":{"symbolId":"polygon-0","style":{"paint":{"fill-color":"#826DBA"}}}}],"type":"range","segmentMethod":"EQUALINTERVAL","segmentCount":6},"fillExtrusionTranslate":{"type":"simple","value":[0,0]},"antialias":{"type":"simple","value":true},"outlineColor":{"field":["smpid"],"defaultValue":"#ffffff","values":[{"value":"#D53E4F","key":1},{"value":"#3288BD","key":16}],"ribbon":["#D53E4F","#FC8D59","#FEE08B","#FFFFBF","#E6F598","#99D594","#3288BD"],"interpolateInfo":{"type":"linear"},"type":"unique"},"opacity":{"type":"simple","value":0.9},"fillExtrusionHeight":{"type":"simple","value":0}}]},"visible":true,"catalogType":"layer","msDatasetId":"ms_datasetId_1712735745613_10","bounds":[115.423411,39.442758,117.514583,41.0608],"showLegend":true,"id":"北京市","popupInfo":{"elements":[{"fieldName":"smpid","type":"FIELD"},{"fieldName":"parent","type":"FIELD"},{"fieldName":"adcode","type":"FIELD"},{"fieldName":"level","type":"FIELD"},{"fieldName":"centroid","type":"FIELD"},{"fieldName":"childrenNum","type":"FIELD"},{"fieldName":"center","type":"FIELD"},{"fieldName":"subFeatureIndex","type":"FIELD"},{"fieldName":"name","type":"FIELD"},{"fieldName":"acroutes","type":"FIELD"},{"fieldName":"geometry","type":"FIELD"}],"title":"北京市"},"title":"北京市","layerSourceType":"Data","layersContent":["ms_北京市_1712822459356_412"]}],"datas":[{"sourceType":"STRUCTURE_DATA","datasets":[{"datasetTitle":"上海疫情点标注(1)","msDatasetId":"ms_datasetId_1712731623855_7","datasetId":"443715040","geometryField":"geometry"}],"title":"上海疫情点标注(1)"},{"sourceType":"STRUCTURE_DATA","datasets":[{"datasetTitle":"北京市","msDatasetId":"ms_datasetId_1712735745613_10","datasetId":"435608982","geometryField":"geometry"}],"title":"北京市"},{"sourceType":"STRUCTURE_DATA","datasets":[{"datasetTitle":"站点3","msDatasetId":"ms_datasetId_1712735782333_13","datasetId":"1755873792","geometryField":"geometry"}],"title":"站点3"},{"sourceType":"STRUCTURE_DATA","datasets":[{"datasetTitle":"未命名数据(1)","msDatasetId":"ms_datasetId_1712736088320_147","datasetId":"680165081","geometryField":"geometry"}],"title":"未命名数据(1)"},{"sourceType":"STRUCTURE_DATA","datasets":[{"datasetTitle":"北京市轨道交通线路减","msDatasetId":"ms_datasetId_1712736126050_150","datasetId":"2111415064","geometryField":"geometry"}],"title":"北京市轨道交通线路减"},{"sourceType":"STRUCTURE_DATA","datasets":[{"datasetTitle":"站点3","msDatasetId":"ms_datasetId_1713695373901_183","datasetId":"1755873792","geometryField":"geometry"}],"title":"站点3"}],"baseLayer":{"internetMapName":"CHINA_DARK","type":"INTERNET_MAP"},"version":"3.0.3"}', + visitCount: 7, + centerString: '{"x":1.2987629468383811E7,"y":4855006.171145054}', + epsgCode: 3857, + nickname: 'admin_123', + layers: null, + id: 617580084, + searchSetting: null, + thumbnail: 'http://localhost:8190/iportal/resources/thumbnail/map/map249495311.png', + level: 8, + center: { + x: 1.2987629468383811e7, + y: 4855006.171145054 + }, + authorizeSetting: [ + { + permissionType: 'DELETE', + aliasName: 'admin_123', + entityRoles: ['ADMIN', 'SYSTEM'], + entityType: 'USER', + entityName: 'admin_123', + entityId: null + }, + { + permissionType: 'READWRITE', + aliasName: 'GUEST', + entityRoles: [], + entityType: 'USER', + entityName: 'GUEST', + entityId: null + } + ], + updateTime: 1713695404712, + userName: 'admin_123', + tags: [], + checkUser: null, + checkUserNick: null, + checkTime: null, + sourceType: 'MAPSTUDIO', + createTime: 1712731634188, + controlsString: '', + isDefaultBottomMap: false, + status: null, + favoriteCount: 0 }); \ No newline at end of file From 445a84011af67ebb76e6527f905d652aea82371b Mon Sep 17 00:00:00 2001 From: luoxiao Date: Tue, 24 Mar 2026 15:36:39 +0800 Subject: [PATCH 18/46] =?UTF-8?q?[FIX]ut=20=E5=92=8Cmapid=20json?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/mapping/WebMapV3.js | 2 + test/mapboxgl/mapping/WebMapV3Spec.js | 57 +- test/resources/WebMapV3.js | 2389 +++++++++++++++++++------ 3 files changed, 1913 insertions(+), 535 deletions(-) diff --git a/src/common/mapping/WebMapV3.js b/src/common/mapping/WebMapV3.js index 46b2699739..defca6f41e 100644 --- a/src/common/mapping/WebMapV3.js +++ b/src/common/mapping/WebMapV3.js @@ -375,6 +375,8 @@ export function createWebMapV3Extending(SuperClass, { MapManager, mapRepo, crsMa }; if (this._relatedInfo.projectInfo) { this._mapResourceInfo = JSON.parse(this._relatedInfo.projectInfo); + const catalogFilters = this._getFiltersByCatalog(); + this._changeMapInfoFilter(catalogFilters); } this._createMapRelatedInfo(); this._addLayersToMap(); diff --git a/test/mapboxgl/mapping/WebMapV3Spec.js b/test/mapboxgl/mapping/WebMapV3Spec.js index d320ab4d8e..76e0c22d7b 100644 --- a/test/mapboxgl/mapping/WebMapV3Spec.js +++ b/test/mapboxgl/mapping/WebMapV3Spec.js @@ -169,34 +169,67 @@ describe('mapboxgl-webmap3.0', () => { if (url.indexOf('map.json') > -1) { return Promise.resolve(new Response(mapstudioWebMap_filters)); } - if (url.indexOf('617580084.json') > -1) { + if (url.indexOf('932266699.json') > -1) { return Promise.resolve(new Response(msProjectINfo_filters)); } - if (url.indexOf('/sprite') > -1) { - return Promise.resolve(new Response(msSpriteInfo)); + if (url.indexOf('/sprites') > -1) { + return Promise.resolve(new Response(spriteJson)); } return Promise.resolve(); }); - mapstudioWebmap = new WebMap(id, { + mapstudioWebmap = new WebMap('932266699', { server: server }); mapstudioWebmap.on('mapcreatesucceeded', ({ map }) => { expect(map).not.toBeUndefined(); expect(mapstudioWebmap.map).toEqual(map); - const style = map.getStyle(); const webMapV3 = mapstudioWebmap._getWebMapInstance(); - const mapInfo = JSON.parse(mapstudioWebMap_symbol); - expect(style.layers.length).toBe(mapInfo.layers.length); - expect(webMapV3._mapInfo.layers[0].filter).toBe([]); - expect(webMapV3._mapInfo.layers[1].filter).toBe([]); - expect(webMapV3._mapInfo.layers[2].filter).toBe([]); - expect(webMapV3._mapInfo.layers[3].filter).toBe([]); - expect(webMapV3._mapInfo.layers[4].filter).toBe([]); + expect(webMapV3._mapInfo.layers[1].filter).toEqual([ + 'all', + ['all', ['==', ['get', 'Ctype'], ''], ['!=', ['get', 'smpid'], '']], + ['all', ['all', ['all', ['all', ['!=', ['get', 'smpid'], 121]]]]] + ]); + expect(webMapV3._mapInfo.layers[2].filter).toEqual([ + 'all', + ['all', ['==', ['get', 'Ctype'], ''], ['!=', ['get', 'smpid'], '']], + ['all', ['all', ['all', ['any', ['==', ['get', 'smpid'], 121]]]]] + ]); done(); }); }); + it('filters mapId is JSON', (done) => { + spyOn(FetchRequest, 'get').and.callFake((url) => { + if (url.indexOf('/sprites') > -1) { + return Promise.resolve(new Response(msSpriteInfo)); + } + return Promise.resolve(); + }); + const mapInfo = JSON.parse(mapstudioWebMap_filters); + mapstudioWebmap = new WebMapV3(mapInfo, { + server: server, + target: 'map', + iportalServiceProxyUrlPrefix: 'mapId is JSON', + relatedInfo: JSON.parse(msProjectINfo_filters) + }); + mapstudioWebmap.initializeMap(mapInfo); + mapstudioWebmap.on('mapcreatesucceeded', ({ map }) => { + expect(map).not.toBeUndefined(); + expect(mapstudioWebmap.map).toEqual(map); + expect(mapstudioWebmap._mapInfo.layers[1].filter).toEqual([ + 'all', + ['all', ['==', ['get', 'Ctype'], ''], ['!=', ['get', 'smpid'], '']], + ['all', ['all', ['all', ['all', ['!=', ['get', 'smpid'], 121]]]]] + ]); + expect(mapstudioWebmap._mapInfo.layers[2].filter).toEqual([ + 'all', + ['all', ['==', ['get', 'Ctype'], ''], ['!=', ['get', 'smpid'], '']], + ['all', ['all', ['all', ['any', ['==', ['get', 'smpid'], 121]]]]] + ]); + done(); + }); + }); it('mapId is JSON', (done) => { spyOn(FetchRequest, 'get').and.callFake((url) => { if (url.indexOf('/sprite') > -1) { diff --git a/test/resources/WebMapV3.js b/test/resources/WebMapV3.js index 6438001f88..c6b5623566 100644 --- a/test/resources/WebMapV3.js +++ b/test/resources/WebMapV3.js @@ -3854,532 +3854,1875 @@ var msProjectINfo_separate_layerCatalogId = JSON.stringify({ favoriteCount: 0 }); var mapstudioWebMap_filters = JSON.stringify({ - metadata: { - layerCatalog: [ - { - visible: true, - id: 'ms_站点3_1713695373911_194', - title: '站点3', - type: 'basic' - }, - { - visible: true, - parts: [ - 'ms_composite_symbol_北京市轨道交通线路减_1712908151359_384', - 'ms_composite_symbol_北京市轨道交通线路减_1712908151359_385', - 'ms_composite_symbol_北京市轨道交通线路减_1712908151359_386', - 'ms_composite_symbol_北京市轨道交通线路减_1712908151359_387', - 'ms_composite_symbol_北京市轨道交通线路减_1712908151359_388', - 'ms_composite_symbol_北京市轨道交通线路减_1712908151359_389', - 'ms_composite_symbol_北京市轨道交通线路减_1712908151359_390' - ], - id: '北京市轨道交通线路减', - title: '北京市轨道交通线路减', - type: 'composite' - }, - { - visible: true, - id: 'ms_站点3_1712735857741_21', - title: '站点3', - type: 'basic' - }, - { - visible: true, - id: '站点3', - title: '站点3', - type: 'basic' - }, - { - visible: true, - id: 'ms_站点3_1712735793051_16', - title: '站点3', - type: 'basic' - }, - { - visible: true, - parts: ['ms_北京市_1712822459356_412'], - id: '北京市', - title: '北京市', - type: 'composite' - } - ] - }, - sources: { - ms_435608982_1712735745629_12: { - tiles: [ - 'http://localhost:8190/iportal/services/../web/datas/435608982/structureddata/tiles/{z}/{x}/{y}.mvt?epsgCode=3857&returnedFieldNames=%5B%22smpid%22%2C%22parent%22%2C%22adcode%22%2C%22level%22%2C%22centroid%22%2C%22childrenNum%22%2C%22center%22%2C%22subFeatureIndex%22%2C%22name%22%2C%22acroutes%22%2C%22geometry%22%5D&geometryFieldName=geometry' - ], - bounds: [115.423411, 39.442758, 117.514583, 41.0608], - type: 'vector' - }, - CHINA_DARK: { - tiles: ['base/resources/img/baiduTileTest.png'], - tileSize: 256, - attribution: '', - bounds: [-180, -90, 180, 90], - type: 'raster' - }, - ms_1755873792_1712735857741_22: { - tiles: [ - 'http://localhost:8190/iportal/services/../web/datas/1755873792/structureddata/tiles/{z}/{x}/{y}.mvt?epsgCode=3857&returnedFieldNames=%5B%22smpid%22%2C%221111%E6%A0%87%E5%87%86%E5%90%8D%E7%A7%B0%22%2C%22SmID%22%2C%22SmGeometrySize%22%2C%221111SmUserID%22%2C%22SmY%22%2C%22SmGeoPosition%22%2C%22SmX%22%2C%22SmLibTileID%22%2C%22geometry%22%5D&geometryFieldName=geometry' - ], - bounds: [116.36331703990744, 39.89942692791154, 116.38141290077355, 39.9767738835847], - type: 'vector' - }, - ms_aggregation_1755873792_1712735796586_18: { - tiles: [ - 'http://localhost:8190/iportal/web/datas/1755873792/structureddata/aggregation.mvt?zxyFilter={z},{x},{y},3857&pixelGroupBy=%7B%22aggCellSize%22%3A1%2C%22aggCellUnit%22%3A%22PX%22%7D&aggType=AVG&aggField=smpid' - ], - bounds: [116.36331703990744, 39.89942692791154, 116.38141290077355, 39.9767738835847], - type: 'vector' - }, - ms_aggregation_1755873792_1713695380060_432: { - tiles: [ - 'http://localhost:8190/iportal/web/datas/1755873792/structureddata/aggregation.mvt?zxyFilter={z},{x},{y},3857&pixelGroupBy=%7B%22aggCellSize%22%3A100%2C%22aggCellUnit%22%3A%22PX%22%7D&aggType=COUNT' - ], - bounds: [116.36331703990744, 39.89942692791154, 116.38141290077355, 39.9767738835847], - type: 'vector' - }, - ms_1755873792_1712735782349_15: { - tiles: [ - 'http://localhost:8190/iportal/services/../web/datas/1755873792/structureddata/tiles/{z}/{x}/{y}.mvt?epsgCode=3857&returnedFieldNames=%5B%22smpid%22%2C%221111%E6%A0%87%E5%87%86%E5%90%8D%E7%A7%B0%22%2C%22SmID%22%2C%22SmGeometrySize%22%2C%221111SmUserID%22%2C%22SmY%22%2C%22SmGeoPosition%22%2C%22SmX%22%2C%22SmLibTileID%22%2C%22geometry%22%5D&geometryFieldName=geometry' - ], - bounds: [116.36331703990744, 39.89942692791154, 116.38141290077355, 39.9767738835847], - type: 'vector' - }, - ms_2111415064_1712736129943_152: { - tiles: [ - 'http://localhost:8190/iportal/services/../web/datas/2111415064/structureddata/tiles/{z}/{x}/{y}.mvt?epsgCode=3857&returnedFieldNames=%5B%22smpid%22%2C%22%E7%BB%88%E7%82%B9y%22%2C%22SmID%22%2C%22%E6%A0%87%E5%87%86%E5%90%8D%E7%A7%B0%22%2C%22%E8%B5%B7%E7%82%B9x%22%2C%22%E8%B5%B7%E7%82%B9y%22%2C%22testID%22%2C%22%E7%BB%88%E7%82%B9x%22%2C%22geometry%22%5D&geometryFieldName=geometry' - ], - bounds: [116.10214436813241, 39.72316247533395, 116.4357788812853, 40.088344539540586], - type: 'vector' - } - }, - crs: 'EPSG:3857', - center: [116.34412667383185, 39.93811133359088], - zoom: 12, - glyphs: {}, - version: '3.1.5', - rootUrl: 'http://localhost:8190/iportal/', - maxzoom: 12, - name: 'ms-点', - viewExtent: [116.23572251428592, 39.99659112475634, 116.4525308333773, 39.879581525048216], - layers: [ - { - metadata: {}, - maxzoom: 12, - id: 'CHINA_DARK', - source: 'CHINA_DARK', - type: 'raster', - minzoom: 0 - }, - { - filter: ['any', ['all', ['>=', 'smpid', 1], ['<', 'smpid', 3.5], ["==", "$type", "Point"]]], - metadata: {}, - paint: { - 'fill-outline-color': ['interpolate', ['linear'], ['get', 'smpid'], 1, '#D53E4F', 16, '#3288BD'], - 'fill-pattern': [ - 'case', - ['all', ['>=', ['to-number', ['get', 'smpid']], 1], ['<', ['to-number', ['get', 'smpid']], 3.5]], - 'polygon-83040554', - 'polygon-83040554' - ], - 'fill-opacity': 0.9 - }, - id: '北京市', - source: 'ms_435608982_1712735745629_12', - 'source-layer': '435608982$geometry', - type: 'fill' - }, - { - filter: ['all', ['none', ['all', ['>=', 'smpid', 1], ['<', 'smpid', 3.5]]]], - metadata: {}, - paint: { - 'fill-outline-color': ['interpolate', ['linear'], ['get', 'smpid'], 1, '#D53E4F', 16, '#3288BD'], - 'fill-color': [ - 'case', - ['all', ['>=', ['to-number', ['get', 'smpid']], 3.5], ['<', ['to-number', ['get', 'smpid']], 6]], - '#826DBA', - ['all', ['>=', ['to-number', ['get', 'smpid']], 6], ['<', ['to-number', ['get', 'smpid']], 8.5]], - '#826DBA', - ['all', ['>=', ['to-number', ['get', 'smpid']], 8.5], ['<', ['to-number', ['get', 'smpid']], 11]], - '#826DBA', - ['all', ['>=', ['to-number', ['get', 'smpid']], 11], ['<', ['to-number', ['get', 'smpid']], 13.5]], - '#826DBA', - ['all', ['>=', ['to-number', ['get', 'smpid']], 13.5], ['<', ['to-number', ['get', 'smpid']], 16.1]], - '#826DBA', - '#826DBA' - ], - 'fill-opacity': 0.9 - }, - id: 'ms_北京市_1712822459356_412', - source: 'ms_435608982_1712735745629_12', - 'source-layer': '435608982$geometry', - type: 'fill' - }, - { - layout: { - visibility: 'visible' - }, - metadata: {}, - paint: { - 'heatmap-color': [ - 'interpolate', - ['linear'], - ['heatmap-density'], - 0, - 'rgba(0,0,0,0)', - 0.2, - '#0000ff', - 0.4, - '#00ffff', - 0.6, - '#00ff00', - 0.8, - '#ffff00', - 1, - '#ff0000' - ], - 'heatmap-opacity': 1, - 'heatmap-weight': ['get', 'weight'], - 'heatmap-radius': 20 - }, - id: 'ms_站点3_1712735793051_16', - source: 'ms_aggregation_1755873792_1712735796586_18', - 'source-layer': '1755873792$geometry', - type: 'heatmap' - }, - { - metadata: {}, - paint: { - 'circle-color': '#EE4D5A', - 'circle-opacity': 0.9, - 'circle-translate-anchor': 'map', - 'circle-radius': 4, - 'circle-translate': [0, 0] - }, - id: '站点3', - source: 'ms_1755873792_1712735782349_15', - 'source-layer': '1755873792$geometry', - type: 'circle' - }, - { - layout: { - 'icon-allow-overlap': true, - 'text-line-height': 1.2, - visibility: 'visible', - 'text-anchor': 'center', - 'text-size': 16, - 'text-allow-overlap': true, - 'icon-size': 0.2, - 'symbol-placement': 'point', - 'icon-image': [ - 'match', - ['get', 'smpid'], - 1, - 'rectangle', - 2, - 'circle', - 3, - 'triangle', - 4, - 'rectangle', - 'rectangle' - ], - 'icon-ignore-placement': false, - 'text-font': ['Microsoft YaHei'], - 'text-rotate': 0, - 'text-transform': 'none', - 'text-justify': 'center', - 'text-letter-spacing': 0, - 'text-max-width': 10, - 'icon-anchor': 'center', - 'text-ignore-placement': false, - 'icon-rotate': 0, - 'text-z-offset': 0 - }, - metadata: {}, - paint: { - 'icon-translate': [50, 0], - 'text-halo-color': '#242424', - 'text-translate-anchor': 'map', - 'icon-color': 'rgba(0,255,228,1)', - 'text-halo-blur': 2, - 'icon-translate-anchor': 'map', - 'text-color': '#FFFFFF', - 'text-halo-width': 1, - 'icon-opacity': 0.9, - 'text-opacity': 1, - 'text-translate': [0, 0] - }, - id: 'ms_站点3_1712735857741_21', - source: 'ms_1755873792_1712735857741_22', - 'source-layer': '1755873792$geometry', - type: 'symbol' - }, - { - filter: ['==', 'smpid', 1], - layout: { - 'line-cap': 'round', - 'line-join': 'round' - }, - metadata: {}, - paint: { - 'line-width': ['interpolate', ['linear'], ['get', 'smpid'], 1, 0.15, 3, 1.54], - 'line-offset': ['interpolate', ['linear'], ['get', 'smpid'], 1, -0.92, 3, -9.23], - 'line-dasharray': [69.63, 29.84, 318.26, 0], - 'line-color': ['interpolate', ['linear'], ['get', 'smpid'], 1, '#D53E4F', 3, '#3288BD'] - }, - id: '北京市轨道交通线路减', - source: 'ms_2111415064_1712736129943_152', - 'source-layer': '2111415064$geometry', - type: 'line' - }, - { - filter: ['==', 'smpid', 1], - layout: { - 'line-cap': 'round', - 'line-join': 'round' - }, - metadata: {}, - paint: { - 'line-width': ['interpolate', ['linear'], ['get', 'smpid'], 1, 0.15, 3, 1.54], - 'line-offset': ['interpolate', ['linear'], ['get', 'smpid'], 1, 0.92, 3, 9.23], - 'line-dasharray': [69.63, 29.84, 318.26, 0], - 'line-color': ['interpolate', ['linear'], ['get', 'smpid'], 1, '#D53E4F', 3, '#3288BD'] - }, - id: 'ms_composite_symbol_北京市轨道交通线路减_1712908151359_384', - source: 'ms_2111415064_1712736129943_152', - 'source-layer': '2111415064$geometry', - type: 'line' - }, - { - filter: ['==', 'smpid', 2], - layout: { - 'line-cap': 'round', - 'line-join': 'round' - }, - metadata: {}, - paint: { - 'line-width': ['interpolate', ['linear'], ['get', 'smpid'], 1, 0.15, 3, 1.54], - 'line-offset': ['interpolate', ['linear'], ['get', 'smpid'], 1, -0.92, 3, -9.23], - 'line-dasharray': [69.63, 29.84, 318.26, 0], - 'line-color': ['interpolate', ['linear'], ['get', 'smpid'], 1, '#D53E4F', 3, '#3288BD'] - }, - id: 'ms_composite_symbol_北京市轨道交通线路减_1712908151359_385', - source: 'ms_2111415064_1712736129943_152', - 'source-layer': '2111415064$geometry', - type: 'line' - }, - { - filter: ['==', 'smpid', 2], - layout: { - 'line-cap': 'round', - 'line-join': 'round' - }, - metadata: {}, - paint: { - 'line-width': ['interpolate', ['linear'], ['get', 'smpid'], 1, 0.15, 3, 1.54], - 'line-offset': ['interpolate', ['linear'], ['get', 'smpid'], 1, 0.92, 3, 9.23], - 'line-dasharray': [69.63, 29.84, 318.26, 0], - 'line-color': ['interpolate', ['linear'], ['get', 'smpid'], 1, '#D53E4F', 3, '#3288BD'] - }, - id: 'ms_composite_symbol_北京市轨道交通线路减_1712908151359_386', - source: 'ms_2111415064_1712736129943_152', - 'source-layer': '2111415064$geometry', - type: 'line' - }, - { - filter: ['==', 'smpid', 3], - layout: { - 'line-cap': 'round', - 'line-join': 'round' - }, - metadata: {}, - paint: { - 'line-width': ['interpolate', ['linear'], ['get', 'smpid'], 1, 0.15, 3, 1.54], - 'line-offset': ['interpolate', ['linear'], ['get', 'smpid'], 1, -0.92, 3, -9.23], - 'line-dasharray': [69.63, 29.84, 318.26, 0], - 'line-color': ['interpolate', ['linear'], ['get', 'smpid'], 1, '#D53E4F', 3, '#3288BD'] - }, - id: 'ms_composite_symbol_北京市轨道交通线路减_1712908151359_387', - source: 'ms_2111415064_1712736129943_152', - 'source-layer': '2111415064$geometry', - type: 'line' - }, - { - filter: ['==', 'smpid', 3], - layout: { - 'line-cap': 'round', - 'line-join': 'round' - }, - metadata: {}, - paint: { - 'line-width': ['interpolate', ['linear'], ['get', 'smpid'], 1, 0.15, 3, 1.54], - 'line-offset': ['interpolate', ['linear'], ['get', 'smpid'], 1, 0.92, 3, 9.23], - 'line-dasharray': [69.63, 29.84, 318.26, 0], - 'line-color': ['interpolate', ['linear'], ['get', 'smpid'], 1, '#D53E4F', 3, '#3288BD'] - }, - id: 'ms_composite_symbol_北京市轨道交通线路减_1712908151359_388', - source: 'ms_2111415064_1712736129943_152', - 'source-layer': '2111415064$geometry', - type: 'line' - }, - { - filter: ['none', ['==', 'smpid', 1], ['==', 'smpid', 2], ['==', 'smpid', 3]], - layout: { - 'line-cap': 'round', - 'line-join': 'round' - }, - metadata: {}, - paint: { - 'line-width': ['interpolate', ['linear'], ['get', 'smpid'], 1, 0.15, 3, 1.54], - 'line-offset': ['interpolate', ['linear'], ['get', 'smpid'], 1, -0.92, 3, -9.23], - 'line-dasharray': [69.63, 29.84, 318.26, 0], - 'line-color': ['interpolate', ['linear'], ['get', 'smpid'], 1, '#D53E4F', 3, '#3288BD'] - }, - id: 'ms_composite_symbol_北京市轨道交通线路减_1712908151359_389', - source: 'ms_2111415064_1712736129943_152', - 'source-layer': '2111415064$geometry', - type: 'line' + "metadata": { + "layerCatalog": [ + { + "visible": true, + "parts": [ + "ms_郑州POI_GBK_1774245016129_27", + "ms_郑州POI_GBK_1774245104313_105" + ], + "id": "layer_郑州POI_GBK_1774245011909_26", + "title": "郑州POI_GBK", + "type": "composite" + }, + { + "visible": true, + "id": "OSM", + "title": "OpenStreetMap", + "type": "basic" + } + ] }, - { - filter: ['none', ['==', 'smpid', 1], ['==', 'smpid', 2], ['==', 'smpid', 3]], - layout: { - 'line-cap': 'round', - 'line-join': 'round' - }, - metadata: {}, - paint: { - 'line-width': ['interpolate', ['linear'], ['get', 'smpid'], 1, 0.15, 3, 1.54], - 'line-offset': ['interpolate', ['linear'], ['get', 'smpid'], 1, 0.92, 3, 9.23], - 'line-dasharray': [69.63, 29.84, 318.26, 0], - 'line-color': ['interpolate', ['linear'], ['get', 'smpid'], 1, '#D53E4F', 3, '#3288BD'] - }, - id: 'ms_composite_symbol_北京市轨道交通线路减_1712908151359_390', - source: 'ms_2111415064_1712736129943_152', - 'source-layer': '2111415064$geometry', - type: 'line' + "sources": { + "ms_6977061_1774245011908_25": { + "tiles": [ + "http://fake:8190/iportal/web/datas/6977061/structureddata/tiles/{z}/{x}/{y}.mvt?epsgCode=3857&returnedFieldNames=%5B%22smpid%22%2C%22EntityHandle%22%2C%22EntityType%22%2C%22Layer%22%2C%22LayerFroze%22%2C%22LayerLocked%22%2C%22LayerOn%22%2C%22Elevation%22%2C%22Thickness%22%2C%22ColorIndex%22%2C%22LineStyle%22%2C%22BlockName%22%2C%22BlockRotation%22%2C%22LineWidth%22%2C%22UserID%22%2C%22Name%22%2C%22Name_PY%22%2C%22Ctype%22%2C%22Ntype%22%2C%22Code%22%2C%22Address%22%2C%22Telephone%22%2C%22Picture%22%2C%22URL%22%2C%22Link%22%2C%22%E6%B6%88%E9%98%B2%E5%B1%80%E5%90%8D%E7%A7%B0%22%2C%22XZQ%22%2C%22X%22%2C%22Y%22%5D&geometryFieldName=msgeometry" + ], + "bounds": [ + 113.482306, + 34.635322, + 113.827295, + 34.91074 + ], + "type": "vector" + }, + "OSM": { + "tiles": [ + "https://fake:8190/tiles/{z}/{x}/{y}.png" + ], + "tileSize": 256, + "attribution": "", + "bounds": [ + -180, + -90, + 180, + 90 + ], + "type": "raster" + } }, - { - layout: { - 'icon-allow-overlap': true, - 'text-line-height': 1.2, - visibility: 'visible', - 'text-size': 12, - 'text-anchor': 'center', - 'text-allow-overlap': true, - 'icon-size': [ - 'interpolate', - ['linear'], - ['to-number', ['get', 'weight']], - 1, - 0.15384615384615385, - 4, - 1.9230769230769231 - ], - 'symbol-placement': 'point', - 'icon-ignore-placement': false, - 'icon-image': 'circle', - 'text-font': ['Microsoft YaHei'], - 'text-rotate': 0, - 'text-transform': 'none', - 'text-max-width': 10, - 'text-justify': 'center', - 'text-letter-spacing': 0, - 'icon-anchor': 'center', - 'text-ignore-placement': false, - 'icon-rotate': 0 - }, - metadata: {}, - paint: { - 'icon-translate': [0, 0], - 'text-halo-color': '#242424', - 'text-translate-anchor': 'map', - 'icon-color': '#EE4D5A', - 'text-halo-blur': 2, - 'text-color': '#FFFFFF', - 'icon-opacity': 0.9, - 'text-halo-width': 1, - 'text-opacity': 1, - 'text-translate': [0, 0] - }, - id: 'ms_站点3_1713695373911_194', - source: 'ms_aggregation_1755873792_1713695380060_432', - 'source-layer': '1755873792$geometry', - type: 'symbol' - } - ], - sprite: 'http://localhost:9876/base/resources/data/sprite', - pitch: 0, - minzoom: 0 + "crs": "EPSG:3857", + "center": [ + 113.5945719887909, + 34.77314590347322 + ], + "zoom": 10.902814693892449, + "glyphs": {}, + "version": "3.3.7", + "rootUrl": "http://fake:8190/iportal/", + "maxzoom": 19, + "name": "郑州POI", + "viewExtent": [ + 113.33896806325768, + 34.62066566609361, + 113.85017591431918, + 34.925344909204746 + ], + "layers": [ + { + "maxzoom": 19, + "id": "OSM", + "source": "OSM", + "type": "raster", + "minzoom": 0 + }, + { + "filter": [ + "all", + [ + "all", + [ + "==", + "Ctype", + "" + ], + [ + "!=", + "smpid", + "" + ] + ], + [ + "all", + [ + "all", + [ + "all", + [ + "all", + [ + "!=", + "smpid", + 121 + ] + ] + ] + ] + ] + ], + "layout": { + "icon-allow-overlap": true, + "text-line-height": 1.2, + "visibility": "visible", + // "text-field": "{name}", + "text-anchor": "center", + "text-size": 16, + "text-allow-overlap": true, + "icon-size": 0.08, + "symbol-placement": "point", + "icon-image": [ + "match", + [ + "get", + "smpid" + ], + 1, + "shape2", + 10, + "circle", + 100, + "shape6", + 101, + "circle", + 102, + "shape9", + 103, + "circle", + 104, + "circle", + 105, + "circle", + 106, + "circle", + 107, + "circle", + 108, + "circle", + 109, + "circle", + 11, + "circle", + 110, + "circle", + 111, + "circle", + 112, + "circle", + 113, + "circle", + 114, + "circle", + 115, + "circle", + 116, + "circle", + 117, + "circle", + 118, + "circle", + 119, + "circle", + 12, + "circle", + 120, + "circle", + 122, + "circle", + 123, + "circle", + 124, + "circle", + 125, + "circle", + 126, + "circle", + 127, + "circle", + 128, + "circle", + 129, + "circle", + 13, + "circle", + 130, + "circle", + 131, + "circle", + 132, + "circle", + 133, + "circle", + 134, + "circle", + 135, + "circle", + 136, + "circle", + 137, + "circle", + 138, + "circle", + 139, + "circle", + 14, + "circle", + 140, + "circle", + 141, + "circle", + 142, + "circle", + 143, + "circle", + 144, + "circle", + 145, + "circle", + 146, + "circle", + 147, + "circle", + 148, + "circle", + 149, + "circle", + 15, + "circle", + 150, + "circle", + 151, + "circle", + 152, + "circle", + 153, + "circle", + 154, + "circle", + 155, + "circle", + 156, + "circle", + 157, + "circle", + 158, + "circle", + 159, + "circle", + 16, + "circle", + 160, + "circle", + 161, + "circle", + 162, + "circle", + 163, + "circle", + 164, + "circle", + 165, + "circle", + 166, + "circle", + 167, + "circle", + 168, + "circle", + 169, + "circle", + 17, + "circle", + 170, + "circle", + 171, + "circle", + 172, + "circle", + 173, + "circle", + 174, + "circle", + 175, + "circle", + 176, + "circle", + 177, + "circle", + 178, + "circle", + 179, + "circle", + 18, + "circle", + 180, + "circle", + 181, + "circle", + 182, + "circle", + 183, + "circle", + 184, + "circle", + 185, + "circle", + 186, + "circle", + 187, + "circle", + 188, + "circle", + 189, + "circle", + 19, + "circle", + 190, + "circle", + 191, + "circle", + 192, + "circle", + 193, + "circle", + 194, + "circle", + 195, + "circle", + 196, + "circle", + 197, + "circle", + 198, + "circle", + 199, + "circle", + 2, + "circle", + 20, + "circle", + 200, + "circle", + 201, + "circle", + 202, + "circle", + 203, + "circle", + 204, + "circle", + 205, + "circle", + 206, + "circle", + 207, + "circle", + 208, + "circle", + 209, + "circle", + 21, + "circle", + 210, + "circle", + 211, + "circle", + 212, + "circle", + 213, + "circle", + 214, + "circle", + 215, + "circle", + 216, + "circle", + 217, + "circle", + 218, + "circle", + 219, + "circle", + 22, + "circle", + 220, + "circle", + 221, + "circle", + 222, + "circle", + 223, + "circle", + 224, + "circle", + 225, + "circle", + 226, + "circle", + 227, + "circle", + 228, + "circle", + 229, + "circle", + 23, + "circle", + 230, + "circle", + 231, + "circle", + 232, + "circle", + 233, + "circle", + 234, + "circle", + 235, + "circle", + 236, + "circle", + 237, + "circle", + 238, + "circle", + 239, + "circle", + 24, + "circle", + 240, + "circle", + 241, + "circle", + 242, + "circle", + 243, + "circle", + 244, + "circle", + 245, + "circle", + 246, + "circle", + 247, + "circle", + 248, + "circle", + 249, + "circle", + 25, + "circle", + 250, + "circle", + 251, + "circle", + 252, + "circle", + 253, + "circle", + 254, + "circle", + 255, + "circle", + 256, + "circle", + 257, + "circle", + 258, + "circle", + 259, + "circle", + 26, + "circle", + 260, + "circle", + 261, + "circle", + 262, + "circle", + 263, + "circle", + 264, + "circle", + 265, + "circle", + 266, + "circle", + 267, + "circle", + 268, + "circle", + 269, + "circle", + 27, + "circle", + 270, + "circle", + 271, + "circle", + 272, + "circle", + 273, + "circle", + 274, + "circle", + 275, + "circle", + 276, + "circle", + 277, + "circle", + 278, + "circle", + 279, + "circle", + 28, + "circle", + 280, + "circle", + 281, + "circle", + 282, + "circle", + 283, + "circle", + 284, + "circle", + 285, + "circle", + 286, + "circle", + 287, + "circle", + 288, + "circle", + 289, + "circle", + 29, + "circle", + 290, + "circle", + 291, + "circle", + 292, + "circle", + 293, + "circle", + 294, + "circle", + 295, + "circle", + 296, + "circle", + 297, + "circle", + 298, + "circle", + 299, + "circle", + 3, + "circle", + 30, + "circle", + 300, + "circle", + 301, + "circle", + 302, + "circle", + 303, + "circle", + 304, + "circle", + 305, + "circle", + 306, + "circle", + 307, + "circle", + 308, + "circle", + 309, + "circle", + 31, + "circle", + 310, + "circle", + 311, + "circle", + 312, + "circle", + 313, + "circle", + 314, + "circle", + 315, + "circle", + 316, + "circle", + 317, + "circle", + 318, + "circle", + 319, + "circle", + 32, + "circle", + 320, + "circle", + 321, + "circle", + 322, + "circle", + 323, + "circle", + 324, + "circle", + 325, + "circle", + 326, + "circle", + 327, + "circle", + 328, + "circle", + 329, + "circle", + 33, + "circle", + 330, + "circle", + 331, + "circle", + 332, + "circle", + 333, + "circle", + 334, + "circle", + 335, + "circle", + 336, + "circle", + 337, + "circle", + 338, + "circle", + 339, + "circle", + 34, + "circle", + 340, + "circle", + 341, + "circle", + 342, + "circle", + 343, + "circle", + 344, + "circle", + 345, + "circle", + 346, + "circle", + 347, + "circle", + 348, + "circle", + 349, + "circle", + 35, + "circle", + 350, + "circle", + 351, + "circle", + 352, + "circle", + 353, + "circle", + 354, + "circle", + 355, + "circle", + 356, + "circle", + 357, + "circle", + 358, + "circle", + 359, + "circle", + 36, + "circle", + 360, + "circle", + 361, + "circle", + 362, + "circle", + 363, + "circle", + 364, + "circle", + 365, + "circle", + 366, + "circle", + 367, + "circle", + 368, + "circle", + 369, + "circle", + 37, + "circle", + 370, + "circle", + 371, + "circle", + 372, + "circle", + 373, + "circle", + 374, + "circle", + 375, + "circle", + 376, + "circle", + 377, + "circle", + 378, + "circle", + 379, + "circle", + 38, + "circle", + 380, + "circle", + 381, + "circle", + 382, + "circle", + 383, + "circle", + 384, + "circle", + 385, + "circle", + 386, + "circle", + 387, + "circle", + 388, + "circle", + 389, + "circle", + 39, + "circle", + 390, + "circle", + 391, + "circle", + 392, + "circle", + 393, + "circle", + 394, + "circle", + 395, + "circle", + 396, + "circle", + 397, + "circle", + 398, + "circle", + 399, + "circle", + 4, + "circle", + 40, + "circle", + 400, + "circle", + 401, + "circle", + 402, + "circle", + 403, + "circle", + 404, + "circle", + 405, + "circle", + 406, + "circle", + 407, + "circle", + 408, + "circle", + 409, + "circle", + 41, + "circle", + 410, + "circle", + 411, + "circle", + 412, + "circle", + 413, + "circle", + 414, + "circle", + 415, + "circle", + 416, + "circle", + 417, + "circle", + 418, + "circle", + 419, + "circle", + 42, + "circle", + 420, + "circle", + 421, + "circle", + 422, + "circle", + 423, + "circle", + 424, + "circle", + 425, + "circle", + 426, + "circle", + 427, + "circle", + 428, + "circle", + 429, + "circle", + 43, + "circle", + 430, + "circle", + 431, + "circle", + 432, + "circle", + 433, + "circle", + 434, + "circle", + 435, + "circle", + 436, + "circle", + 437, + "circle", + 438, + "circle", + 439, + "circle", + 44, + "circle", + 440, + "circle", + 441, + "circle", + 442, + "circle", + 443, + "circle", + 444, + "circle", + 445, + "circle", + 446, + "circle", + 447, + "circle", + 448, + "circle", + 449, + "circle", + 45, + "circle", + 450, + "circle", + 451, + "circle", + 452, + "circle", + 453, + "circle", + 454, + "circle", + 455, + "circle", + 456, + "circle", + 457, + "circle", + 458, + "circle", + 459, + "circle", + 46, + "circle", + 460, + "circle", + 461, + "circle", + 462, + "circle", + 463, + "circle", + 464, + "circle", + 465, + "circle", + 466, + "circle", + 467, + "circle", + 468, + "circle", + 469, + "circle", + 47, + "circle", + 470, + "circle", + 471, + "circle", + 472, + "circle", + 473, + "circle", + 474, + "circle", + 475, + "circle", + 476, + "circle", + 477, + "circle", + 478, + "circle", + 479, + "circle", + 48, + "circle", + 480, + "circle", + 481, + "circle", + 482, + "circle", + 483, + "circle", + 484, + "circle", + 485, + "circle", + 486, + "circle", + 487, + "circle", + 488, + "circle", + 489, + "circle", + 49, + "circle", + 490, + "circle", + 491, + "circle", + 492, + "circle", + 493, + "circle", + 494, + "circle", + 495, + "circle", + 496, + "circle", + 497, + "circle", + 498, + "circle", + 499, + "circle", + 5, + "circle", + 50, + "circle", + 500, + "circle", + 501, + "circle", + 502, + "circle", + 503, + "circle", + 504, + "circle", + 505, + "circle", + 506, + "circle", + 507, + "circle", + 508, + "circle", + 509, + "circle", + 51, + "circle", + 510, + "circle", + 511, + "circle", + 512, + "circle", + 513, + "circle", + 514, + "circle", + 515, + "circle", + 516, + "circle", + 517, + "circle", + 518, + "circle", + 519, + "circle", + 52, + "circle", + 520, + "circle", + 521, + "circle", + 522, + "circle", + 523, + "circle", + 524, + "circle", + 525, + "circle", + 526, + "circle", + 527, + "circle", + 528, + "circle", + 529, + "circle", + 53, + "circle", + 530, + "circle", + 531, + "circle", + 532, + "circle", + 533, + "circle", + 534, + "circle", + 535, + "circle", + 536, + "circle", + 537, + "circle", + 538, + "circle", + 539, + "circle", + 54, + "circle", + 540, + "circle", + 541, + "circle", + 542, + "circle", + 543, + "circle", + 544, + "circle", + 545, + "circle", + 546, + "circle", + 547, + "circle", + 548, + "circle", + 549, + "circle", + 55, + "circle", + 550, + "circle", + 551, + "circle", + 552, + "circle", + 553, + "circle", + 554, + "circle", + 555, + "circle", + 556, + "circle", + 557, + "circle", + 558, + "circle", + 559, + "circle", + 56, + "circle", + 560, + "circle", + 561, + "circle", + 562, + "circle", + 563, + "circle", + 564, + "circle", + 565, + "circle", + 566, + "circle", + 567, + "circle", + 568, + "circle", + 569, + "circle", + 57, + "circle", + 570, + "circle", + 571, + "circle", + 572, + "circle", + 573, + "circle", + 574, + "circle", + 575, + "circle", + 576, + "circle", + 577, + "circle", + 578, + "circle", + 579, + "circle", + 58, + "circle", + 580, + "circle", + 581, + "circle", + 582, + "circle", + 583, + "circle", + 584, + "circle", + 585, + "circle", + 586, + "circle", + 587, + "circle", + 588, + "circle", + 589, + "circle", + 59, + "circle", + 590, + "circle", + 591, + "circle", + 592, + "circle", + 593, + "circle", + 594, + "circle", + 595, + "circle", + 596, + "circle", + 597, + "circle", + 598, + "circle", + 599, + "circle", + 6, + "circle", + 60, + "circle", + 600, + "circle", + 601, + "circle", + 602, + "circle", + 603, + "circle", + 604, + "circle", + 605, + "circle", + 606, + "circle", + 607, + "circle", + 608, + "circle", + 609, + "circle", + 61, + "circle", + 610, + "circle", + 611, + "circle", + 612, + "circle", + 613, + "circle", + 614, + "circle", + 615, + "circle", + 616, + "circle", + 617, + "circle", + 618, + "circle", + 619, + "circle", + 62, + "circle", + 620, + "circle", + 621, + "circle", + 622, + "circle", + 623, + "circle", + 624, + "circle", + 625, + "circle", + 626, + "circle", + 627, + "circle", + 628, + "circle", + 629, + "circle", + 63, + "circle", + 630, + "circle", + 631, + "circle", + 632, + "circle", + 633, + "circle", + 634, + "circle", + 635, + "circle", + 636, + "circle", + 637, + "circle", + 638, + "circle", + 639, + "circle", + 64, + "circle", + 640, + "circle", + 641, + "circle", + 642, + "circle", + 643, + "circle", + 644, + "circle", + 645, + "circle", + 646, + "circle", + 647, + "circle", + 648, + "circle", + 649, + "circle", + 65, + "circle", + 650, + "circle", + 651, + "circle", + 652, + "circle", + 653, + "circle", + 654, + "circle", + 655, + "circle", + 656, + "circle", + 657, + "circle", + 658, + "circle", + 659, + "circle", + 66, + "circle", + 660, + "circle", + 661, + "circle", + 662, + "circle", + 663, + "circle", + 664, + "circle", + 665, + "circle", + 666, + "circle", + 667, + "circle", + 668, + "circle", + 669, + "circle", + 67, + "circle", + 670, + "circle", + 671, + "circle", + 672, + "circle", + 673, + "circle", + 674, + "circle", + 675, + "circle", + 676, + "circle", + 677, + "circle", + 678, + "circle", + 679, + "circle", + 68, + "circle", + 680, + "circle", + 681, + "circle", + 682, + "circle", + 683, + "circle", + 684, + "circle", + 685, + "circle", + 686, + "circle", + 687, + "circle", + 688, + "circle", + 689, + "circle", + 69, + "circle", + 690, + "circle", + 691, + "circle", + 692, + "circle", + 693, + "circle", + 694, + "circle", + 695, + "circle", + 696, + "circle", + 697, + "circle", + 698, + "circle", + 699, + "circle", + 7, + "circle", + 70, + "circle", + 700, + "circle", + 701, + "circle", + 702, + "circle", + 703, + "circle", + 704, + "circle", + 705, + "circle", + 706, + "circle", + 707, + "circle", + 708, + "circle", + 709, + "circle", + 71, + "circle", + 710, + "circle", + 711, + "circle", + 712, + "circle", + 713, + "circle", + 714, + "circle", + 715, + "circle", + 716, + "circle", + 717, + "circle", + 718, + "circle", + 719, + "circle", + 72, + "circle", + 720, + "circle", + 721, + "circle", + 722, + "circle", + 723, + "circle", + 724, + "circle", + 725, + "circle", + 726, + "circle", + 727, + "circle", + 728, + "circle", + 729, + "circle", + 73, + "circle", + 730, + "circle", + 731, + "circle", + 732, + "circle", + 733, + "circle", + 734, + "circle", + 735, + "circle", + 736, + "circle", + 737, + "circle", + 738, + "circle", + 739, + "circle", + 74, + "circle", + 740, + "circle", + 741, + "circle", + 742, + "circle", + 743, + "circle", + 744, + "circle", + 745, + "circle", + 746, + "circle", + 75, + "circle", + 76, + "circle", + 77, + "circle", + 78, + "circle", + 79, + "circle", + 8, + "circle", + 80, + "circle", + 81, + "circle", + 82, + "circle", + 83, + "circle", + 84, + "circle", + 85, + "circle", + 86, + "circle", + 87, + "circle", + 88, + "circle", + 89, + "circle", + 9, + "circle", + 90, + "circle", + 91, + "circle", + 92, + "circle", + 93, + "circle", + 94, + "circle", + 95, + "circle", + 96, + "circle", + 97, + "circle", + 98, + "circle", + 99, + "circle", + "circle" + ], + "icon-ignore-placement": false, + "text-font": [ + "Open Sans Regular", + "Arial Unicode MS Regular" + ], + "text-rotate": 0, + "text-transform": "none", + "text-justify": "center", + "text-letter-spacing": 0, + "text-max-width": 10, + "icon-anchor": "center", + "text-ignore-placement": false, + "icon-rotate": 0 + }, + "metadata": {}, + "maxzoom": 24, + "paint": { + "icon-translate": [ + 0, + 0 + ], + "text-halo-color": "#242424", + "text-translate-anchor": "map", + "icon-color": "#EE4D5A", + "text-halo-blur": 2, + "icon-translate-anchor": "map", + "text-color": "#FFFFFF", + "text-halo-width": 1, + "icon-opacity": 0.9, + "text-opacity": 1, + "text-translate": [ + 0, + 0 + ] + }, + "id": "ms_郑州POI_GBK_1774245016129_27", + "source": "ms_6977061_1774245011908_25", + "source-layer": "6977061$msgeometry", + "type": "symbol", + "minzoom": 0 + }, + { + "filter": [ + "all", + [ + "all", + [ + "==", + "Ctype", + "" + ], + [ + "!=", + "smpid", + "" + ] + ], + [ + "all", + [ + "all", + [ + "all", + [ + "any", + [ + "==", + "smpid", + 121 + ] + ] + ] + ] + ] + ], + "layout": { + "icon-allow-overlap": true, + "text-line-height": 1.2, + "visibility": "visible", + // "text-field": "{name}", + "text-anchor": "center", + "text-size": 16, + "text-allow-overlap": true, + "icon-size": 0.08, + "symbol-placement": "point", + "icon-image": [ + "match", + [ + "get", + "smpid" + ], + 121, + "point-83030560", + "point-83030560" + ], + "icon-ignore-placement": false, + "text-font": [ + "Open Sans Regular", + "Arial Unicode MS Regular" + ], + "text-rotate": 0, + "text-transform": "none", + "text-justify": "center", + "text-letter-spacing": 0, + "text-max-width": 10, + "icon-anchor": "center", + "text-ignore-placement": false, + "icon-rotate": 0 + }, + "metadata": {}, + "maxzoom": 24, + "paint": { + "icon-translate": [ + 0, + 0 + ], + "text-halo-color": "#242424", + "text-translate-anchor": "map", + "icon-color": "#EE4D5A", + "text-halo-blur": 2, + "icon-translate-anchor": "map", + "text-color": "#FFFFFF", + "text-halo-width": 1, + "icon-opacity": 0.9, + "text-opacity": 1, + "text-translate": [ + 0, + 0 + ] + }, + "id": "ms_郑州POI_GBK_1774245104313_105", + "source": "ms_6977061_1774245011908_25", + "source-layer": "6977061$msgeometry", + "type": "symbol", + "minzoom": 0 + } + ], + "sprite": "http://fake:8190/iportal/web/maps/932266699/sprites/sprite", + "pitch": 0, + "minzoom": 0 }); var msProjectINfo_filters = JSON.stringify({ - extent: { - top: 39.060244465996576, - left: 115.3932226740005, - bottom: 40.7783804924719, - leftBottom: { - x: 115.3932226740005, - y: 40.7783804924719 - }, - right: 117.94649844460855, - rightTop: { - x: 117.94649844460855, - y: 39.060244465996576 - } - }, - controls: null, - extentString: - '{"top":39.060244465996576,"left":115.3932226740005,"bottom":40.7783804924719,"leftBottom":{"x":115.3932226740005,"y":40.7783804924719},"right":117.94649844460855,"rightTop":{"x":117.94649844460855,"y":39.060244465996576}}', - description: '', - verifyReason: null, - units: null, - title: 'ms-点', - resolution: 0, - checkStatus: 'SUCCESSFUL', - projectInfo: '{"images":"http://localhost:9876/base/resources/data/sprite","catalogs":[{"visualization":{"renderer":{"rotate":{"type":"simple","value":0},"textLetterSpacing":{"type":"simple","value":0},"textTranslate":{"type":"simple","value":[0,0]},"color":{"type":"simple","value":"#EE4D5A"},"symbolPlacement":{"type":"simple","value":"point"},"textAnchor":{"type":"simple","value":"center"},"type":"point-cluster","translate":{"type":"simple","value":[0,0]},"textRotate":{"type":"simple","value":0},"textField":{"type":"simple","value":"weight"},"textHaloBlur":{"type":"simple","value":2},"transform":{"type":"simple","value":"none"},"symbolsContent":{"type":"simple","value":{"symbolId":"circle","style":{"layout":{"icon-image":"circle"}}}},"textTranslateAnchor":{"type":"simple","value":"map"},"justify":{"type":"simple","value":"center"},"ignorePlacement":{"type":"simple","value":false},"textAllowOverlap":{"type":"simple","value":true},"maxWidth":{"type":"simple","value":10},"textSize":{"type":"simple","value":12},"textHaloColor":{"type":"simple","value":"#242424"},"textColor":{"type":"simple","value":"#FFFFFF"},"size":{"field":"weight","type":"linear","value":[{"value":8,"key":1},{"value":100,"key":4}]},"allowOverlap":{"type":"simple","value":true},"translateAnchor":{"type":"simple","value":"map"},"anchor":{"type":"simple","value":"center"},"textOpacity":{"type":"simple","value":1},"textHaloWidth":{"type":"simple","value":1},"lineHeight":{"type":"simple","value":1.2},"textFont":{"type":"simple","value":["Microsoft YaHei"]},"textIgnorePlacement":{"type":"simple","value":false},"opacity":{"type":"simple","value":0.9}}},"visible":true,"catalogType":"layer","msDatasetId":"ms_datasetId_1713695373901_183","bounds":[116.36331703990744,39.89942692791154,116.38141290077355,39.9767738835847],"showLegend":true,"id":"ms_站点3_1713695373911_194","source":{"option":{"clusterOption":{"aggType":"COUNT","groupBy":{"aggCellSize":100,"aggCellUnit":"PX"}},"cluster":true}},"popupInfo":{"elements":[{"fieldName":"smpid","type":"FIELD"},{"fieldName":"1111标准名称","type":"FIELD"},{"fieldName":"SmID","type":"FIELD"},{"fieldName":"SmGeometrySize","type":"FIELD"},{"fieldName":"1111SmUserID","type":"FIELD"},{"fieldName":"SmY","type":"FIELD"},{"fieldName":"SmGeoPosition","type":"FIELD"},{"fieldName":"SmX","type":"FIELD"},{"fieldName":"SmLibTileID","type":"FIELD"},{"fieldName":"geometry","type":"FIELD"}],"title":"站点3"},"filter":["all",["==","Ctype",""],["!=","smpid",""]],"title":"站点3","layerSourceType":"Data"},{"visualization":{"renderer":[{"lineDasharray":{"type":"simple","value":[1,0]},"color":{"field":["smpid"],"defaultValue":"#ffffff","values":[{"value":"#D53E4F","key":1},{"value":"#3288BD","key":3}],"ribbon":["#D53E4F","#FC8D59","#FEE08B","#FFFFBF","#E6F598","#99D594","#3288BD"],"interpolateInfo":{"type":"linear"},"type":"unique"},"lineTranslateAnchor":{"type":"simple","value":"map"},"lineMiterLimit":{"type":"simple","value":2},"lineOffset":{"type":"simple","value":0},"lineJoin":{"type":"simple","value":"miter"},"lineRoundLimit":{"type":"simple","value":1.05},"lineTranslate":{"type":"simple","value":[0,0]},"styleRenderMode":"mapboxgl","symbolsContent":{"field":["smpid"],"defaultValue":{"symbolId":"line-83030269","style":[{"layout":{"line-cap":"round","line-join":"round"},"paint":{"line-width":0.38,"line-offset":-2.27,"line-dasharray":[69.63,29.84,318.26,0],"line-color":"rgba(255, 0, 0, 1.00)"}},{"layout":{"line-cap":"round","line-join":"round"},"paint":{"line-width":0.38,"line-offset":2.27,"line-dasharray":[69.63,29.84,318.26,0],"line-color":"rgba(255, 0, 0, 1.00)"}}]},"values":[{"value":{"symbolId":"line-83030269","style":[{"layout":{"line-cap":"round","line-join":"round"},"paint":{"line-width":0.38,"line-offset":-2.27,"line-dasharray":[69.63,29.84,318.26,0],"line-color":"rgba(255, 0, 0, 1.00)"}},{"layout":{"line-cap":"round","line-join":"round"},"paint":{"line-width":0.38,"line-offset":2.27,"line-dasharray":[69.63,29.84,318.26,0],"line-color":"rgba(255, 0, 0, 1.00)"}}]},"key":1},{"value":{"symbolId":"line-83030269","style":[{"layout":{"line-cap":"round","line-join":"round"},"paint":{"line-width":0.38,"line-offset":-2.27,"line-dasharray":[69.63,29.84,318.26,0],"line-color":"rgba(255, 0, 0, 1.00)"}},{"layout":{"line-cap":"round","line-join":"round"},"paint":{"line-width":0.38,"line-offset":2.27,"line-dasharray":[69.63,29.84,318.26,0],"line-color":"rgba(255, 0, 0, 1.00)"}}]},"key":2},{"value":{"symbolId":"line-83030269","style":[{"layout":{"line-cap":"round","line-join":"round"},"paint":{"line-width":0.38,"line-offset":-2.27,"line-dasharray":[69.63,29.84,318.26,0],"line-color":"rgba(255, 0, 0, 1.00)"}},{"layout":{"line-cap":"round","line-join":"round"},"paint":{"line-width":0.38,"line-offset":2.27,"line-dasharray":[69.63,29.84,318.26,0],"line-color":"rgba(255, 0, 0, 1.00)"}}]},"key":3}],"interpolateInfo":{"type":"custom"},"type":"unique"},"lineGapWidth":{"type":"simple","value":0},"lineCap":{"type":"simple","value":"butt"},"width":{"field":["smpid"],"defaultValue":4.92,"values":[{"value":2,"key":1},{"value":20,"key":3}],"interpolateInfo":{"type":"linear"},"type":"unique"},"opacity":{"type":"simple"}}]},"visible":true,"filter":["all",["==","Ctype",""],["==","smpid",""]],"catalogType":"layer","msDatasetId":"ms_datasetId_1712736126050_150","bounds":[116.10214436813241,39.72316247533395,116.4357788812853,40.088344539540586],"showLegend":true,"id":"北京市轨道交通线路减","popupInfo":{"elements":[{"fieldName":"smpid","type":"FIELD"},{"fieldName":"终点y","type":"FIELD"},{"fieldName":"SmID","type":"FIELD"},{"fieldName":"标准名称","type":"FIELD"},{"fieldName":"起点x","type":"FIELD"},{"fieldName":"起点y","type":"FIELD"},{"fieldName":"testID","type":"FIELD"},{"fieldName":"终点x","type":"FIELD"},{"fieldName":"geometry","type":"FIELD"}],"title":"北京市轨道交通线路减"},"title":"北京市轨道交通线路减","layerSourceType":"Data","layersContent":["ms_composite_symbol_北京市轨道交通线路减_1712908151359_384","ms_composite_symbol_北京市轨道交通线路减_1712908151359_385","ms_composite_symbol_北京市轨道交通线路减_1712908151359_386","ms_composite_symbol_北京市轨道交通线路减_1712908151359_387","ms_composite_symbol_北京市轨道交通线路减_1712908151359_388","ms_composite_symbol_北京市轨道交通线路减_1712908151359_389","ms_composite_symbol_北京市轨道交通线路减_1712908151359_390"]},{"visualization":{"renderer":[{"rotate":{"type":"simple","value":0},"textLetterSpacing":{"type":"simple","value":0},"textTranslate":{"type":"simple","value":[0,0]},"color":{"type":"simple","value":"rgba(0,255,228,1)"},"textZOffset":{"type":"simple","value":0},"symbolPlacement":{"type":"simple","value":"point"},"textAnchor":{"type":"simple","value":"center"},"translate":{"type":"simple","value":[50,0]},"textRotate":{"type":"simple","value":0},"textField":{"type":"simple","value":""},"styleRenderMode":"mapboxgl","textHaloBlur":{"type":"simple","value":2},"transform":{"type":"simple","value":"none"},"symbolsContent":{"field":["smpid"],"defaultValue":{"symbolId":"rectangle","style":{"layout":{"icon-image":"rectangle"}}},"values":[{"value":{"symbolId":"rectangle","style":{"layout":{"icon-image":"rectangle"}}},"key":1},{"value":{"symbolId":"circle","style":{"layout":{"icon-image":"circle"}}},"key":2},{"value":{"symbolId":"triangle","style":{"layout":{"icon-image":"triangle"}}},"key":3},{"value":{"symbolId":"rectangle","style":{"layout":{"icon-image":"rectangle"}}},"key":4}],"interpolateInfo":{"type":"custom"},"type":"unique"},"textTranslateAnchor":{"type":"simple","value":"map"},"justify":{"type":"simple","value":"center"},"ignorePlacement":{"type":"simple","value":false},"textAllowOverlap":{"type":"simple","value":true},"maxWidth":{"type":"simple","value":10},"textSize":{"type":"simple","value":16},"textHaloColor":{"type":"simple","value":"#242424"},"textColor":{"type":"simple","value":"#FFFFFF"},"size":{"type":"simple","value":20},"allowOverlap":{"type":"simple","value":true},"translateAnchor":{"type":"simple","value":"map"},"anchor":{"type":"simple","value":"center"},"textOpacity":{"type":"simple","value":1},"textHaloWidth":{"type":"simple","value":1},"lineHeight":{"type":"simple","value":1.2},"textFont":{"type":"simple","value":["Microsoft YaHei"]},"textIgnorePlacement":{"type":"simple","value":false},"opacity":{"type":"simple","value":0.9}}]},"visible":true,"catalogType":"layer","filter":["all",["==","$type","Point"],["==","smpid",""]],"msDatasetId":"ms_datasetId_1712735782333_13","bounds":[116.36331703990744,39.89942692791154,116.38141290077355,39.9767738835847],"id":"ms_站点3_1712735857741_21","popupInfo":{"elements":[{"fieldName":"smpid","type":"FIELD"},{"fieldName":"1111标准名称","type":"FIELD"},{"fieldName":"SmID","type":"FIELD"},{"fieldName":"SmGeometrySize","type":"FIELD"},{"fieldName":"1111SmUserID","type":"FIELD"},{"fieldName":"SmY","type":"FIELD"},{"fieldName":"SmGeoPosition","type":"FIELD"},{"fieldName":"SmX","type":"FIELD"},{"fieldName":"SmLibTileID","type":"FIELD"},{"fieldName":"geometry","type":"FIELD"}],"title":"站点3"},"title":"站点3","layerSourceType":"Data"},{"visualization":{"renderer":[{"symbolsContent":{"type":"simple","value":{"symbolId":"circle","style":{"layout":{"icon-image":"circle"}}}},"size":{"type":"simple","value":8},"color":{"type":"simple","value":"#EE4D5A"},"translateAnchor":{"type":"simple","value":"map"},"opacity":{"type":"simple","value":0.9},"translate":{"type":"simple","value":[0,0]},"styleRenderMode":"mapboxgl"}]},"visible":true,"catalogType":"layer","filter":["all",["==","$type","Point"],["==","smpidxxx",""]],"msDatasetId":"ms_datasetId_1712735782333_13","bounds":[116.36331703990744,39.89942692791154,116.38141290077355,39.9767738835847],"id":"站点3","popupInfo":{"elements":[{"fieldName":"smpid","type":"FIELD"},{"fieldName":"1111标准名称","type":"FIELD"},{"fieldName":"SmID","type":"FIELD"},{"fieldName":"SmGeometrySize","type":"FIELD"},{"fieldName":"1111SmUserID","type":"FIELD"},{"fieldName":"SmY","type":"FIELD"},{"fieldName":"SmGeoPosition","type":"FIELD"},{"fieldName":"SmX","type":"FIELD"},{"fieldName":"SmLibTileID","type":"FIELD"},{"fieldName":"geometry","type":"FIELD"}],"title":"站点3"},"title":"站点3","layerSourceType":"Data"},{"visualization":{"renderer":[{"field":"smpid","color":[{"color":"#0000ff"},{"color":"#00ffff"},{"color":"#00ff00"},{"color":"#ffff00"},{"color":"#ff0000"}],"radius":20,"opacity":1,"type":"heat"}]},"visible":true,"catalogType":"layer","msDatasetId":"ms_datasetId_1712735782333_13","bounds":[116.36331703990744,39.89942692791154,116.38141290077355,39.9767738835847],"id":"ms_站点3_1712735793051_16","popupInfo":{"elements":[{"fieldName":"smpid","type":"FIELD"},{"fieldName":"1111标准名称","type":"FIELD"},{"fieldName":"SmID","type":"FIELD"},{"fieldName":"SmGeometrySize","type":"FIELD"},{"fieldName":"1111SmUserID","type":"FIELD"},{"fieldName":"SmY","type":"FIELD"},{"fieldName":"SmGeoPosition","type":"FIELD"},{"fieldName":"SmX","type":"FIELD"},{"fieldName":"SmLibTileID","type":"FIELD"},{"fieldName":"geometry","type":"FIELD"}],"title":"站点3"},"filter":["all",["==","$type","Point"],["==","smpidxxx",""]],"title":"站点3","layerSourceType":"Data"},{"visualization":{"renderer":[{"fillExtrusionTranslateAnchor":{"type":"simple","value":"map"},"fillExtrusionVerticalGradient":{"type":"simple","value":true},"color":{"type":"simple"},"fillExtrusionBase":{"type":"simple","value":0},"fillExtrusionBaseMultiple":{"type":"simple"},"styleRenderMode":"mapboxgl","fillExtrusionHeightMultiple":{"type":"simple"},"symbolsContent":{"field":["smpid"],"defaultValue":{"symbolId":"polygon-0","style":{"paint":{"fill-color":"#826DBA"}}},"values":[{"start":1,"end":3.5,"value":{"symbolId":"polygon-83040554","style":{"paint":{"fill-pattern":"polygon-83040554"}}}},{"start":3.5,"end":6,"value":{"symbolId":"polygon-0","style":{"paint":{"fill-color":"#826DBA"}}}},{"start":6,"end":8.5,"value":{"symbolId":"polygon-0","style":{"paint":{"fill-color":"#826DBA"}}}},{"start":8.5,"end":11,"value":{"symbolId":"polygon-0","style":{"paint":{"fill-color":"#826DBA"}}}},{"start":11,"end":13.5,"value":{"symbolId":"polygon-0","style":{"paint":{"fill-color":"#826DBA"}}}},{"start":13.5,"end":16.1,"value":{"symbolId":"polygon-0","style":{"paint":{"fill-color":"#826DBA"}}}}],"type":"range","segmentMethod":"EQUALINTERVAL","segmentCount":6},"fillExtrusionTranslate":{"type":"simple","value":[0,0]},"antialias":{"type":"simple","value":true},"outlineColor":{"field":["smpid"],"defaultValue":"#ffffff","values":[{"value":"#D53E4F","key":1},{"value":"#3288BD","key":16}],"ribbon":["#D53E4F","#FC8D59","#FEE08B","#FFFFBF","#E6F598","#99D594","#3288BD"],"interpolateInfo":{"type":"linear"},"type":"unique"},"opacity":{"type":"simple","value":0.9},"fillExtrusionHeight":{"type":"simple","value":0}}]},"visible":true,"catalogType":"layer","msDatasetId":"ms_datasetId_1712735745613_10","bounds":[115.423411,39.442758,117.514583,41.0608],"showLegend":true,"id":"北京市","popupInfo":{"elements":[{"fieldName":"smpid","type":"FIELD"},{"fieldName":"parent","type":"FIELD"},{"fieldName":"adcode","type":"FIELD"},{"fieldName":"level","type":"FIELD"},{"fieldName":"centroid","type":"FIELD"},{"fieldName":"childrenNum","type":"FIELD"},{"fieldName":"center","type":"FIELD"},{"fieldName":"subFeatureIndex","type":"FIELD"},{"fieldName":"name","type":"FIELD"},{"fieldName":"acroutes","type":"FIELD"},{"fieldName":"geometry","type":"FIELD"}],"title":"北京市"},"title":"北京市","layerSourceType":"Data","layersContent":["ms_北京市_1712822459356_412"]}],"datas":[{"sourceType":"STRUCTURE_DATA","datasets":[{"datasetTitle":"上海疫情点标注(1)","msDatasetId":"ms_datasetId_1712731623855_7","datasetId":"443715040","geometryField":"geometry"}],"title":"上海疫情点标注(1)"},{"sourceType":"STRUCTURE_DATA","datasets":[{"datasetTitle":"北京市","msDatasetId":"ms_datasetId_1712735745613_10","datasetId":"435608982","geometryField":"geometry"}],"title":"北京市"},{"sourceType":"STRUCTURE_DATA","datasets":[{"datasetTitle":"站点3","msDatasetId":"ms_datasetId_1712735782333_13","datasetId":"1755873792","geometryField":"geometry"}],"title":"站点3"},{"sourceType":"STRUCTURE_DATA","datasets":[{"datasetTitle":"未命名数据(1)","msDatasetId":"ms_datasetId_1712736088320_147","datasetId":"680165081","geometryField":"geometry"}],"title":"未命名数据(1)"},{"sourceType":"STRUCTURE_DATA","datasets":[{"datasetTitle":"北京市轨道交通线路减","msDatasetId":"ms_datasetId_1712736126050_150","datasetId":"2111415064","geometryField":"geometry"}],"title":"北京市轨道交通线路减"},{"sourceType":"STRUCTURE_DATA","datasets":[{"datasetTitle":"站点3","msDatasetId":"ms_datasetId_1713695373901_183","datasetId":"1755873792","geometryField":"geometry"}],"title":"站点3"}],"baseLayer":{"internetMapName":"CHINA_DARK","type":"INTERNET_MAP"},"version":"3.0.3"}', - visitCount: 7, - centerString: '{"x":1.2987629468383811E7,"y":4855006.171145054}', - epsgCode: 3857, - nickname: 'admin_123', - layers: null, - id: 617580084, - searchSetting: null, - thumbnail: 'http://localhost:8190/iportal/resources/thumbnail/map/map249495311.png', - level: 8, - center: { - x: 1.2987629468383811e7, - y: 4855006.171145054 - }, - authorizeSetting: [ - { - permissionType: 'DELETE', - aliasName: 'admin_123', - entityRoles: ['ADMIN', 'SYSTEM'], - entityType: 'USER', - entityName: 'admin_123', - entityId: null + "extent": { + "top": 34.925344909204746, + "left": 113.33896806325768, + "bottom": 34.62066566609361, + "leftBottom": { + "x": 113.33896806325768, + "y": 34.62066566609361, + "m": null + }, + "right": 113.85017591431918, + "rightTop": { + "x": 113.85017591431918, + "y": 34.925344909204746, + "m": null + } }, - { - permissionType: 'READWRITE', - aliasName: 'GUEST', - entityRoles: [], - entityType: 'USER', - entityName: 'GUEST', - entityId: null + "controls": null, + "extentString": "{\"top\":34.925344909204746,\"left\":113.33896806325768,\"bottom\":34.62066566609361,\"leftBottom\":{\"x\":113.33896806325768,\"y\":34.62066566609361,\"m\":null},\"right\":113.85017591431918,\"rightTop\":{\"x\":113.85017591431918,\"y\":34.925344909204746,\"m\":null}}", + "description": "", + "verifyReason": null, + "units": null, + "title": "郑州POI", + "resolution": 0, + "checkStatus": "SUCCESSFUL", + "projectInfo": "{\"images\":\"http://fake:8190/iportal/web/maps/932266699/sprites/sprite\",\"catalogs\":[{\"filter\":[\"all\",[\"==\",\"Ctype\",\"\"],[\"!=\",\"smpid\",\"\"]],\"visualization\":{\"renderer\":[{\"rotate\":{\"type\":\"simple\",\"value\":0},\"textLetterSpacing\":{\"type\":\"simple\",\"value\":0},\"textTranslate\":{\"type\":\"simple\",\"value\":[0,0]},\"color\":{\"type\":\"simple\",\"value\":\"#EE4D5A\"},\"symbolPlacement\":{\"type\":\"simple\",\"value\":\"point\"},\"textAnchor\":{\"type\":\"simple\",\"value\":\"center\"},\"translate\":{\"type\":\"simple\",\"value\":[0,0]},\"textRotate\":{\"type\":\"simple\",\"value\":0},\"textField\":{\"type\":\"simple\",\"value\":\"\"},\"textHaloBlur\":{\"type\":\"simple\",\"value\":2},\"transform\":{\"type\":\"simple\",\"value\":\"none\"},\"symbolsContent\":{\"field\":[\"smpid\"],\"defaultValue\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"values\":[{\"value\":{\"symbolId\":\"shape2\",\"style\":{\"layout\":{\"icon-image\":\"shape2\"}}},\"key\":1},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":10},{\"value\":{\"symbolId\":\"shape6\",\"style\":{\"layout\":{\"icon-image\":\"shape6\"}}},\"key\":100},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":101},{\"value\":{\"symbolId\":\"shape9\",\"style\":{\"layout\":{\"icon-image\":\"shape9\"}}},\"key\":102},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":103},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":104},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":105},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":106},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":107},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":108},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":109},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":11},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":110},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":111},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":112},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":113},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":114},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":115},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":116},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":117},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":118},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":119},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":12},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":120},{\"value\":{\"symbolId\":\"point-83030560\",\"style\":{\"layout\":{\"icon-image\":\"point-83030560\"}}},\"key\":121},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":122},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":123},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":124},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":125},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":126},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":127},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":128},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":129},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":13},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":130},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":131},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":132},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":133},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":134},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":135},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":136},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":137},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":138},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":139},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":14},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":140},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":141},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":142},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":143},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":144},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":145},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":146},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":147},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":148},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":149},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":15},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":150},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":151},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":152},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":153},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":154},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":155},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":156},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":157},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":158},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":159},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":16},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":160},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":161},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":162},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":163},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":164},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":165},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":166},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":167},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":168},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":169},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":17},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":170},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":171},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":172},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":173},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":174},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":175},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":176},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":177},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":178},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":179},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":18},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":180},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":181},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":182},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":183},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":184},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":185},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":186},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":187},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":188},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":189},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":19},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":190},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":191},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":192},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":193},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":194},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":195},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":196},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":197},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":198},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":199},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":2},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":20},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":200},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":201},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":202},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":203},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":204},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":205},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":206},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":207},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":208},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":209},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":21},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":210},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":211},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":212},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":213},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":214},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":215},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":216},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":217},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":218},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":219},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":22},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":220},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":221},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":222},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":223},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":224},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":225},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":226},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":227},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":228},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":229},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":23},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":230},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":231},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":232},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":233},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":234},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":235},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":236},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":237},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":238},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":239},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":24},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":240},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":241},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":242},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":243},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":244},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":245},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":246},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":247},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":248},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":249},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":25},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":250},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":251},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":252},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":253},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":254},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":255},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":256},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":257},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":258},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":259},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":26},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":260},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":261},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":262},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":263},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":264},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":265},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":266},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":267},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":268},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":269},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":27},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":270},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":271},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":272},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":273},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":274},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":275},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":276},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":277},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":278},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":279},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":28},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":280},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":281},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":282},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":283},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":284},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":285},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":286},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":287},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":288},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":289},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":29},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":290},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":291},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":292},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":293},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":294},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":295},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":296},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":297},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":298},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":299},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":3},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":30},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":300},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":301},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":302},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":303},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":304},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":305},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":306},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":307},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":308},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":309},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":31},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":310},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":311},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":312},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":313},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":314},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":315},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":316},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":317},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":318},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":319},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":32},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":320},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":321},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":322},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":323},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":324},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":325},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":326},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":327},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":328},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":329},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":33},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":330},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":331},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":332},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":333},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":334},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":335},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":336},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":337},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":338},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":339},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":34},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":340},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":341},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":342},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":343},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":344},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":345},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":346},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":347},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":348},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":349},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":35},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":350},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":351},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":352},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":353},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":354},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":355},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":356},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":357},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":358},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":359},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":36},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":360},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":361},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":362},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":363},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":364},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":365},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":366},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":367},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":368},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":369},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":37},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":370},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":371},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":372},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":373},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":374},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":375},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":376},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":377},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":378},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":379},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":38},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":380},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":381},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":382},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":383},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":384},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":385},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":386},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":387},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":388},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":389},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":39},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":390},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":391},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":392},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":393},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":394},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":395},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":396},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":397},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":398},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":399},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":4},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":40},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":400},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":401},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":402},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":403},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":404},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":405},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":406},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":407},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":408},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":409},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":41},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":410},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":411},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":412},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":413},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":414},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":415},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":416},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":417},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":418},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":419},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":42},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":420},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":421},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":422},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":423},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":424},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":425},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":426},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":427},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":428},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":429},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":43},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":430},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":431},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":432},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":433},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":434},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":435},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":436},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":437},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":438},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":439},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":44},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":440},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":441},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":442},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":443},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":444},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":445},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":446},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":447},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":448},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":449},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":45},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":450},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":451},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":452},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":453},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":454},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":455},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":456},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":457},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":458},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":459},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":46},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":460},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":461},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":462},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":463},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":464},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":465},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":466},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":467},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":468},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":469},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":47},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":470},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":471},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":472},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":473},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":474},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":475},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":476},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":477},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":478},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":479},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":48},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":480},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":481},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":482},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":483},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":484},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":485},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":486},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":487},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":488},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":489},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":49},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":490},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":491},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":492},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":493},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":494},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":495},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":496},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":497},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":498},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":499},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":5},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":50},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":500},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":501},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":502},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":503},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":504},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":505},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":506},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":507},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":508},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":509},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":51},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":510},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":511},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":512},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":513},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":514},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":515},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":516},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":517},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":518},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":519},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":52},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":520},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":521},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":522},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":523},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":524},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":525},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":526},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":527},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":528},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":529},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":53},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":530},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":531},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":532},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":533},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":534},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":535},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":536},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":537},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":538},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":539},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":54},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":540},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":541},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":542},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":543},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":544},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":545},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":546},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":547},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":548},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":549},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":55},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":550},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":551},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":552},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":553},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":554},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":555},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":556},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":557},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":558},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":559},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":56},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":560},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":561},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":562},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":563},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":564},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":565},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":566},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":567},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":568},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":569},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":57},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":570},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":571},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":572},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":573},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":574},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":575},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":576},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":577},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":578},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":579},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":58},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":580},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":581},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":582},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":583},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":584},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":585},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":586},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":587},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":588},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":589},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":59},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":590},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":591},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":592},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":593},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":594},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":595},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":596},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":597},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":598},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":599},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":6},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":60},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":600},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":601},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":602},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":603},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":604},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":605},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":606},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":607},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":608},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":609},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":61},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":610},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":611},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":612},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":613},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":614},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":615},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":616},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":617},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":618},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":619},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":62},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":620},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":621},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":622},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":623},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":624},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":625},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":626},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":627},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":628},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":629},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":63},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":630},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":631},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":632},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":633},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":634},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":635},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":636},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":637},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":638},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":639},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":64},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":640},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":641},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":642},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":643},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":644},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":645},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":646},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":647},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":648},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":649},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":65},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":650},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":651},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":652},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":653},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":654},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":655},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":656},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":657},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":658},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":659},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":66},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":660},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":661},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":662},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":663},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":664},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":665},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":666},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":667},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":668},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":669},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":67},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":670},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":671},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":672},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":673},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":674},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":675},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":676},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":677},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":678},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":679},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":68},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":680},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":681},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":682},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":683},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":684},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":685},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":686},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":687},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":688},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":689},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":69},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":690},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":691},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":692},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":693},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":694},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":695},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":696},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":697},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":698},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":699},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":7},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":70},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":700},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":701},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":702},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":703},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":704},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":705},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":706},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":707},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":708},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":709},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":71},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":710},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":711},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":712},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":713},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":714},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":715},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":716},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":717},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":718},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":719},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":72},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":720},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":721},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":722},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":723},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":724},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":725},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":726},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":727},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":728},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":729},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":73},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":730},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":731},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":732},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":733},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":734},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":735},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":736},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":737},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":738},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":739},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":74},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":740},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":741},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":742},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":743},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":744},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":745},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":746},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":75},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":76},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":77},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":78},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":79},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":8},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":80},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":81},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":82},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":83},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":84},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":85},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":86},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":87},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":88},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":89},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":9},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":90},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":91},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":92},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":93},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":94},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":95},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":96},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":97},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":98},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":99}],\"interpolateInfo\":{\"type\":\"custom\"},\"type\":\"unique\"},\"textTranslateAnchor\":{\"type\":\"simple\",\"value\":\"map\"},\"justify\":{\"type\":\"simple\",\"value\":\"center\"},\"ignorePlacement\":{\"type\":\"simple\",\"value\":false},\"textAllowOverlap\":{\"type\":\"simple\",\"value\":true},\"maxWidth\":{\"type\":\"simple\",\"value\":10},\"textSize\":{\"type\":\"simple\",\"value\":16},\"textHaloColor\":{\"type\":\"simple\",\"value\":\"#242424\"},\"textColor\":{\"type\":\"simple\",\"value\":\"#FFFFFF\"},\"size\":{\"type\":\"simple\",\"value\":8},\"allowOverlap\":{\"type\":\"simple\",\"value\":true},\"translateAnchor\":{\"type\":\"simple\",\"value\":\"map\"},\"anchor\":{\"type\":\"simple\",\"value\":\"center\"},\"textOpacity\":{\"type\":\"simple\",\"value\":1},\"textHaloWidth\":{\"type\":\"simple\",\"value\":1},\"lineHeight\":{\"type\":\"simple\",\"value\":1.2},\"textFont\":{\"type\":\"simple\",\"value\":[\"Open Sans Regular\",\"Arial Unicode MS Regular\"]},\"textIgnorePlacement\":{\"type\":\"simple\",\"value\":false},\"opacity\":{\"type\":\"simple\",\"value\":0.9}}]},\"visible\":true,\"catalogType\":\"layer\",\"msDatasetId\":\"ms_datasetId_1774244993624_23\",\"bounds\":[113.482306,34.635322,113.827295,34.91074],\"id\":\"layer_郑州POI_GBK_1774245011909_26\",\"popupInfo\":{\"elements\":[{\"fieldName\":\"smpid\",\"type\":\"FIELD\"},{\"fieldName\":\"EntityHandle\",\"type\":\"FIELD\"},{\"fieldName\":\"EntityType\",\"type\":\"FIELD\"},{\"fieldName\":\"Layer\",\"type\":\"FIELD\"},{\"fieldName\":\"LayerFroze\",\"type\":\"FIELD\"},{\"fieldName\":\"LayerLocked\",\"type\":\"FIELD\"},{\"fieldName\":\"LayerOn\",\"type\":\"FIELD\"},{\"fieldName\":\"Elevation\",\"type\":\"FIELD\"},{\"fieldName\":\"Thickness\",\"type\":\"FIELD\"},{\"fieldName\":\"ColorIndex\",\"type\":\"FIELD\"},{\"fieldName\":\"LineStyle\",\"type\":\"FIELD\"},{\"fieldName\":\"BlockName\",\"type\":\"FIELD\"},{\"fieldName\":\"BlockRotation\",\"type\":\"FIELD\"},{\"fieldName\":\"LineWidth\",\"type\":\"FIELD\"},{\"fieldName\":\"UserID\",\"type\":\"FIELD\"},{\"fieldName\":\"Name\",\"type\":\"FIELD\"},{\"fieldName\":\"Name_PY\",\"type\":\"FIELD\"},{\"fieldName\":\"Ctype\",\"type\":\"FIELD\"},{\"fieldName\":\"Ntype\",\"type\":\"FIELD\"},{\"fieldName\":\"Code\",\"type\":\"FIELD\"},{\"fieldName\":\"Address\",\"type\":\"FIELD\"},{\"fieldName\":\"Telephone\",\"type\":\"FIELD\"},{\"fieldName\":\"Picture\",\"type\":\"FIELD\"},{\"fieldName\":\"URL\",\"type\":\"FIELD\"},{\"fieldName\":\"Link\",\"type\":\"FIELD\"},{\"fieldName\":\"消防局名称\",\"type\":\"FIELD\"},{\"fieldName\":\"XZQ\",\"type\":\"FIELD\"},{\"fieldName\":\"X\",\"type\":\"FIELD\"},{\"fieldName\":\"Y\",\"type\":\"FIELD\"},{\"fieldName\":\"msgeometry\",\"type\":\"FIELD\"}],\"title\":\"郑州POI_GBK\"},\"title\":\"郑州POI_GBK\",\"layerSourceType\":\"Data\",\"zoomRange\":[0,24],\"layersContent\":[\"ms_郑州POI_GBK_1774245016129_27\",\"ms_郑州POI_GBK_1774245104313_105\"]}],\"datas\":[{\"sourceType\":\"STRUCTURE_DATA\",\"datasets\":[{\"datasetTitle\":\"郑州POI_GBK\",\"msDatasetId\":\"ms_datasetId_1774244993624_23\",\"datasetId\":\"6977061\",\"geometryField\":\"msgeometry\",\"projection\":\"EPSG:4326\"}],\"title\":\"郑州POI_GBK\"}],\"baseLayer\":{\"internetMapName\":\"OSM\",\"type\":\"INTERNET_MAP\"},\"version\":\"3.1.4\"}", + "visitCount": 73, + "centerString": "{\"x\":113.5945719887909,\"y\":34.77314590347322,\"m\":null}", + "epsgCode": 3857, + "nickname": "admin_123", + "layers": null, + "id": 932266699, + "searchSetting": null, + "thumbnail": "http://fake:8190/iportal/web/static/portal/img/map/defaultThumbnail.png", + "level": 10, + "center": { + "x": 113.5945719887909, + "y": 34.77314590347322, + "m": null + }, + "authorizeSetting": [ + { + "permissionType": "DELETE", + "aliasName": "admin_123", + "entityRoles": [ + "ADMIN", + "SYSTEM" + ], + "entityType": "USER", + "entityName": "admin_123", + "entityId": null + }, + { + "permissionType": "READ", + "aliasName": "GUEST", + "entityRoles": [], + "entityType": "USER", + "entityName": "GUEST", + "entityId": null + } + ], + "updateTime": 1774253716513, + "userName": "admin_123", + "tags": [], + "checkUser": null, + "checkUserNick": null, + "checkTime": null, + "sourceType": "MAPSTUDIO", + "createTime": 1774245165577, + "controlsString": "", + "isDefaultBottomMap": false, + "status": null, + "favoriteCount": 0 +}); +var spriteJson = JSON.stringify({ + "shape6": { + "sdf": true, + "pixelRatio": 1, + "width": 104, + "x": 0, + "y": 104, + "height": 104 + }, + "shape2": { + "sdf": true, + "pixelRatio": 1, + "width": 104, + "x": 104, + "y": 0, + "height": 104 + }, + "circle": { + "sdf": true, + "pixelRatio": 1, + "width": 104, + "x": 0, + "y": 0, + "height": 104 + }, + "shape9": { + "sdf": true, + "pixelRatio": 1, + "width": 104, + "x": 104, + "y": 104, + "height": 104 + }, + "point-83030560": { + "sdf": false, + "pixelRatio": 1, + "width": 100, + "x": 0, + "y": 208, + "height": 100 } - ], - updateTime: 1713695404712, - userName: 'admin_123', - tags: [], - checkUser: null, - checkUserNick: null, - checkTime: null, - sourceType: 'MAPSTUDIO', - createTime: 1712731634188, - controlsString: '', - isDefaultBottomMap: false, - status: null, - favoriteCount: 0 -}); \ No newline at end of file +}) From fe9798746636cff232a36b116ee7a075f35d73cd Mon Sep 17 00:00:00 2001 From: luoxiao Date: Sat, 18 Apr 2026 17:50:57 +0800 Subject: [PATCH 19/46] [fix]mapboxgl.convertFilter --- src/common/mapping/WebMapV2.js | 4 +- src/common/mapping/WebMapV3.js | 103 +++----------------------- test/mapboxgl/mapping/WebMapV3Spec.js | 47 ++++++------ 3 files changed, 37 insertions(+), 117 deletions(-) diff --git a/src/common/mapping/WebMapV2.js b/src/common/mapping/WebMapV2.js index cb588c6dd7..b8cdbb6c2a 100644 --- a/src/common/mapping/WebMapV2.js +++ b/src/common/mapping/WebMapV2.js @@ -1387,8 +1387,8 @@ export function createWebMapV2Extending(SuperClass, { MapManager, mapRepo, crsMa const labelStyle = layerInfo.labelStyle; const properties = features[0] && features[0].properties; const textField = labelStyle.labelField.replace(/{(.+)}/g, '$1'); - if (!properties || !properties[textField]) { - return; + if (!properties || !Object.prototype.hasOwnProperty.call(properties, textField)) { + return; } let { backgroundFill = [255, 255, 255, 0] } = labelStyle; const fontFamily = labelStyle.fontFamily; diff --git a/src/common/mapping/WebMapV3.js b/src/common/mapping/WebMapV3.js index defca6f41e..979cdcce10 100644 --- a/src/common/mapping/WebMapV3.js +++ b/src/common/mapping/WebMapV3.js @@ -336,31 +336,6 @@ export function createWebMapV3Extending(SuperClass, { MapManager, mapRepo, crsMa } return epsgCode; } - _getFilterByCatalog(catalog, res = {}) { - const { catalogType, children } = catalog; - if(catalogType === 'group' && children) { - children.forEach(child => { - this._getFiltersByCatalog(child, res); - }) - } - if (catalogType === 'layer') { - const { filter, layersContent = [] } = catalog; - if (filter) { - layersContent.forEach(layerId => { - res[layerId] = filter; - }) - } - } - } - _getFiltersByCatalog(_mapResourceInfo = this._mapResourceInfo) { - const { catalogs = [] } = _mapResourceInfo; - const res = []; - catalogs.forEach((item) => { - this._getFilterByCatalog(item, res); - }) - return res; - } - /** * @private * @function WebMapV3.prototype._initLayers @@ -375,8 +350,7 @@ export function createWebMapV3Extending(SuperClass, { MapManager, mapRepo, crsMa }; if (this._relatedInfo.projectInfo) { this._mapResourceInfo = JSON.parse(this._relatedInfo.projectInfo); - const catalogFilters = this._getFiltersByCatalog(); - this._changeMapInfoFilter(catalogFilters); + this._changeMapInfoFilter(); } this._createMapRelatedInfo(); this._addLayersToMap(); @@ -389,8 +363,7 @@ export function createWebMapV3Extending(SuperClass, { MapManager, mapRepo, crsMa description: relatedInfo.description }; this._mapResourceInfo = JSON.parse(relatedInfo.projectInfo); - const catalogFilters = this._getFiltersByCatalog(); - this._changeMapInfoFilter(catalogFilters); + this._changeMapInfoFilter(); this._createMapRelatedInfo(); this._addLayersToMap(); }) @@ -404,73 +377,19 @@ export function createWebMapV3Extending(SuperClass, { MapManager, mapRepo, crsMa * @function WebMapV3.prototype._changeMapInfoFilter * @description 更新地图图层的过滤器, 将filter的内容 ['==', 'Ctype', '']转换为['==', ['get', 'Ctype'], 'label'] */ - _changeMapInfoFilter(catalogFilters = {}) { - const { layers =[]} = this._mapInfo; - layers.forEach(layer => { - if (layer.filter && catalogFilters[layer.id]) { - const catalogFilter = catalogFilters[layer.id]; - const matchKeys = this._collectMatchKeys(catalogFilter); - const filter = this._transformFilterByMatchKeys(layer.filter, matchKeys); - layer.filter = filter; + _changeMapInfoFilter() { + if (mapRepo && mapRepo.convertFilter) { + const { layers = [] } = this._mapInfo; + layers.forEach((layer) => { + if (layer.filter) { + layer.filter = mapRepo.convertFilter(layer.filter); } - }) - this._mapInfo ={ + }); + this._mapInfo = { ...this._mapInfo, layers - } - } - - _collectMatchKeys(filter) { - const keys = []; - const excludeKeys = ['$type', '$id', '$layer']; - if (!Array.isArray(filter)) {return keys;} - const traverse = (arr) => { - for (const item of arr) { - if (!Array.isArray(item)) {continue;} - if (item.length >= 3 && this._isComparisonOperator(item[0])) { - const prop = this._getPropertyKey(item[1]); - if (prop && !excludeKeys.includes(prop)) { - keys.push(prop); - continue; - } - if (typeof item[1] === 'string' && !excludeKeys.includes(item[1])) { - keys.push(item[1]); - } - } else { - traverse(item); - } - } - }; - traverse(filter); - return [...new Set(keys)]; - } - - _getPropertyKey(item) { - if (Array.isArray(item) && item.length === 2 && item[0] === 'get' && typeof item[1] === 'string') { - return item[1]; - } - return null; - } - - _transformFilterByMatchKeys(filter, matchKeys) { - if (!Array.isArray(filter)) { - return filter; - } - if (filter.length >= 3 && typeof filter[1] === 'string' && this._isComparisonOperator(filter[0])) { - if (matchKeys.includes(filter[1])) { - return [filter[0], ['get', filter[1]], ...filter.slice(2)]; - } - return filter; - } - if (filter.length >= 2 && typeof filter[1] !== 'string' && this._isComparisonOperator(filter[0])) { - const operands = filter.slice(1).map(item => this._transformFilterByMatchKeys(item, matchKeys)); - return [filter[0], ...operands]; + }; } - return filter.map(item => this._transformFilterByMatchKeys(item, matchKeys)); - } - - _isComparisonOperator(op) { - return ['==', '!=', '>', '<', '>=', '<=', 'in', '!in', 'all', 'any', 'none'].includes(op); } /** diff --git a/test/mapboxgl/mapping/WebMapV3Spec.js b/test/mapboxgl/mapping/WebMapV3Spec.js index 76e0c22d7b..dc3e5cc988 100644 --- a/test/mapboxgl/mapping/WebMapV3Spec.js +++ b/test/mapboxgl/mapping/WebMapV3Spec.js @@ -177,24 +177,28 @@ describe('mapboxgl-webmap3.0', () => { } return Promise.resolve(); }); + // const Spy = spyOn(mapboxgl, 'convertFilter').and.callThrough(); + const Spy = jasmine.createSpy('myMock'); + Spy.and.callFake((arg) => arg); + mapboxgl.convertFilter = Spy mapstudioWebmap = new WebMap('932266699', { server: server }); - mapstudioWebmap.on('mapcreatesucceeded', ({ map }) => { expect(map).not.toBeUndefined(); expect(mapstudioWebmap.map).toEqual(map); - const webMapV3 = mapstudioWebmap._getWebMapInstance(); - expect(webMapV3._mapInfo.layers[1].filter).toEqual([ - 'all', - ['all', ['==', ['get', 'Ctype'], ''], ['!=', ['get', 'smpid'], '']], - ['all', ['all', ['all', ['all', ['!=', ['get', 'smpid'], 121]]]]] - ]); - expect(webMapV3._mapInfo.layers[2].filter).toEqual([ - 'all', - ['all', ['==', ['get', 'Ctype'], ''], ['!=', ['get', 'smpid'], '']], - ['all', ['all', ['all', ['any', ['==', ['get', 'smpid'], 121]]]]] - ]); + expect(Spy).toHaveBeenCalledTimes(2); + // const webMapV3 = mapstudioWebmap._getWebMapInstance(); + // expect(webMapV3._mapInfo.layers[1].filter).toEqual([ + // 'all', + // ['all', ['==', ['get', 'Ctype'], ''], ['!=', ['get', 'smpid'], '']], + // ['all', ['all', ['all', ['all', ['!=', ['get', 'smpid'], 121]]]]] + // ]); + // expect(webMapV3._mapInfo.layers[2].filter).toEqual([ + // 'all', + // ['all', ['==', ['get', 'Ctype'], ''], ['!=', ['get', 'smpid'], '']], + // ['all', ['all', ['all', ['any', ['==', ['get', 'smpid'], 121]]]]] + // ]); done(); }); }); @@ -206,6 +210,11 @@ describe('mapboxgl-webmap3.0', () => { return Promise.resolve(); }); const mapInfo = JSON.parse(mapstudioWebMap_filters); + // const Spy = spyOn(mapboxgl, 'convertFilter').and.callThrough(); + const Spy = jasmine.createSpy('myMock'); + Spy.and.callFake((arg) => arg); + mapboxgl.convertFilter = Spy + mapstudioWebmap = new WebMapV3(mapInfo, { server: server, target: 'map', @@ -213,20 +222,12 @@ describe('mapboxgl-webmap3.0', () => { relatedInfo: JSON.parse(msProjectINfo_filters) }); mapstudioWebmap.initializeMap(mapInfo); - mapstudioWebmap.on('mapcreatesucceeded', ({ map }) => { expect(map).not.toBeUndefined(); expect(mapstudioWebmap.map).toEqual(map); - expect(mapstudioWebmap._mapInfo.layers[1].filter).toEqual([ - 'all', - ['all', ['==', ['get', 'Ctype'], ''], ['!=', ['get', 'smpid'], '']], - ['all', ['all', ['all', ['all', ['!=', ['get', 'smpid'], 121]]]]] - ]); - expect(mapstudioWebmap._mapInfo.layers[2].filter).toEqual([ - 'all', - ['all', ['==', ['get', 'Ctype'], ''], ['!=', ['get', 'smpid'], '']], - ['all', ['all', ['all', ['any', ['==', ['get', 'smpid'], 121]]]]] - ]); + expect(Spy).toHaveBeenCalledTimes(2); + const result2 = mapstudioWebmap._getPopupInfos({}); + expect(result2).toEqual([]); done(); }); }); From 32cd27365d1748792a25e149ee5030c322fff318 Mon Sep 17 00:00:00 2001 From: luoxiao Date: Sat, 18 Apr 2026 18:07:44 +0800 Subject: [PATCH 20/46] [fix]UT --- test/mapboxgl/mapping/WebMapV3Spec.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/mapboxgl/mapping/WebMapV3Spec.js b/test/mapboxgl/mapping/WebMapV3Spec.js index dc3e5cc988..6b7680cd09 100644 --- a/test/mapboxgl/mapping/WebMapV3Spec.js +++ b/test/mapboxgl/mapping/WebMapV3Spec.js @@ -226,8 +226,6 @@ describe('mapboxgl-webmap3.0', () => { expect(map).not.toBeUndefined(); expect(mapstudioWebmap.map).toEqual(map); expect(Spy).toHaveBeenCalledTimes(2); - const result2 = mapstudioWebmap._getPopupInfos({}); - expect(result2).toEqual([]); done(); }); }); From 839ef2373642e339a251080700fe2086531362ac Mon Sep 17 00:00:00 2001 From: zhaoq Date: Sat, 9 May 2026 17:55:38 +0800 Subject: [PATCH 21/46] =?UTF-8?q?[feature]=20webmap3=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=99=AE=E9=80=9Amapbox=E5=9B=BE=E5=B1=82source=E6=98=AFsuperm?= =?UTF-8?q?ap-rest-data=E7=9A=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (reviewed by xjj) --- src/common/mapping/WebMapV3.js | 6 ++++++ src/common/mapping/utils/L7LayerUtil.js | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/common/mapping/WebMapV3.js b/src/common/mapping/WebMapV3.js index 979cdcce10..7dd089b887 100644 --- a/src/common/mapping/WebMapV3.js +++ b/src/common/mapping/WebMapV3.js @@ -433,6 +433,12 @@ export function createWebMapV3Extending(SuperClass, { MapManager, mapRepo, crsMa }); Object.assign(this._mapResourceInfo, { catalogs }); const mapboxglLayers = layers.filter((layer) => !l7LayerUtil.isL7Layer(layer)); + for(const sourceId in sources) { + const source = sources[sourceId]; + if(source.type === 'geojson' && source.data?.type === 'supermap-rest-data') { + source.data = await l7LayerUtil.getRestDataGeojsonByWebMap(source.data, {iportalServiceProxyUrlPrefix: this.options.server, withoutFormatSuffix: true}); + } + } mapboxglLayers.forEach((layer) => { if (layer.metadata && layer.metadata.reused) { return; diff --git a/src/common/mapping/utils/L7LayerUtil.js b/src/common/mapping/utils/L7LayerUtil.js index bbf36be370..a1d6087d26 100644 --- a/src/common/mapping/utils/L7LayerUtil.js +++ b/src/common/mapping/utils/L7LayerUtil.js @@ -2075,7 +2075,8 @@ export function L7LayerUtil(config) { getL7MarkerLayers() { return ChartController.markerLayers; }, - removeL7MarkerLayer + removeL7MarkerLayer, + getRestDataGeojsonByWebMap } } From ac9e78cdb10c12779278f462bd38f16a4c49119d Mon Sep 17 00:00:00 2001 From: zhaoq Date: Mon, 11 May 2026 10:37:45 +0800 Subject: [PATCH 22/46] =?UTF-8?q?[update]=201.=20fix=20ut=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=202.=20=E5=8F=AA=E5=A4=84=E7=90=86mapbox=E5=9B=BE?= =?UTF-8?q?=E5=B1=82=E7=9A=84source=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/mapping/WebMapV3.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/common/mapping/WebMapV3.js b/src/common/mapping/WebMapV3.js index 7dd089b887..15716b02d3 100644 --- a/src/common/mapping/WebMapV3.js +++ b/src/common/mapping/WebMapV3.js @@ -433,7 +433,8 @@ export function createWebMapV3Extending(SuperClass, { MapManager, mapRepo, crsMa }); Object.assign(this._mapResourceInfo, { catalogs }); const mapboxglLayers = layers.filter((layer) => !l7LayerUtil.isL7Layer(layer)); - for(const sourceId in sources) { + const mapboxSourceIds = mapboxglLayers.map((layer) => layer.source); + for(const sourceId of mapboxSourceIds) { const source = sources[sourceId]; if(source.type === 'geojson' && source.data?.type === 'supermap-rest-data') { source.data = await l7LayerUtil.getRestDataGeojsonByWebMap(source.data, {iportalServiceProxyUrlPrefix: this.options.server, withoutFormatSuffix: true}); From c7c37f62787eb0954f7a40ee3ab17513605c43cc Mon Sep 17 00:00:00 2001 From: zhaoq Date: Mon, 11 May 2026 15:04:41 +0800 Subject: [PATCH 23/46] [ut] fix ut MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (reviewed by xjj) --- src/common/mapping/WebMapV3.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/mapping/WebMapV3.js b/src/common/mapping/WebMapV3.js index 15716b02d3..d8e76f5fa1 100644 --- a/src/common/mapping/WebMapV3.js +++ b/src/common/mapping/WebMapV3.js @@ -436,7 +436,7 @@ export function createWebMapV3Extending(SuperClass, { MapManager, mapRepo, crsMa const mapboxSourceIds = mapboxglLayers.map((layer) => layer.source); for(const sourceId of mapboxSourceIds) { const source = sources[sourceId]; - if(source.type === 'geojson' && source.data?.type === 'supermap-rest-data') { + if(source && source.type === 'geojson' && source.data && source.data.type === 'supermap-rest-data') { source.data = await l7LayerUtil.getRestDataGeojsonByWebMap(source.data, {iportalServiceProxyUrlPrefix: this.options.server, withoutFormatSuffix: true}); } } From bf51a77a08e2e426956283a4fe1b46d2d7d95181 Mon Sep 17 00:00:00 2001 From: songyumeng Date: Wed, 17 Jun 2026 16:35:00 +0800 Subject: [PATCH 24/46] Update mock_l7.js --- test/tool/mock_l7.js | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/test/tool/mock_l7.js b/test/tool/mock_l7.js index 9141828005..d7e9b515fe 100644 --- a/test/tool/mock_l7.js +++ b/test/tool/mock_l7.js @@ -1,3 +1,36 @@ +if (!Array.prototype.at) { + Object.defineProperty(Array.prototype, 'at', { + value: function at(index) { + // 1. 让 O 成为 ToObject(this) + if (this == null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + var O = Object(this); + + // 2. 让 len 成为 ToLength(O.length) + var len = O.length >>> 0; + + // 3. 让 relativeIndex 成为 ToInteger(index) + var relativeIndex = Math.trunc(index) || 0; + + // 如果参数是 NaN,Math.trunc(NaN) 是 NaN,NaN || 0 会将其变成 0 + // 这符合标准(规范中 ToIntegerOrInfinity(undefined) 结果为 0) + + // 4. 计算实际索引 + var k = relativeIndex >= 0 ? relativeIndex : len + relativeIndex; + + // 5. 边界检查:如果超出范围,返回 undefined + if (k < 0 || k >= len) { + return undefined; + } + + // 6. 返回对应的属性值 + return O[k]; + }, + writable: true, + configurable: true + }); +} class Event { constructor() { this.stacks = {}; From 8242c6db3c4b070997de47ee25ec0234bb35709f Mon Sep 17 00:00:00 2001 From: luoxiao Date: Wed, 10 Jun 2026 16:15:08 +0800 Subject: [PATCH 25/46] =?UTF-8?q?[fix]webmap=E8=8E=B7=E5=8F=96=E5=BC=B9?= =?UTF-8?q?=E7=AA=97=E9=85=8D=E7=BD=AE=E9=A1=B9=20AI-GEN:=200%=20Cursor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/mapping/WebMapBase.js | 10 ++++++ src/common/mapping/WebMapV2.js | 27 +++++++++++++++++ src/common/mapping/WebMapV3.js | 52 ++++++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+) diff --git a/src/common/mapping/WebMapBase.js b/src/common/mapping/WebMapBase.js index 081fe8b69f..e8b33b775f 100644 --- a/src/common/mapping/WebMapBase.js +++ b/src/common/mapping/WebMapBase.js @@ -358,6 +358,16 @@ export function createWebMapBaseExtending(SuperClass, { mapRepo }) { pitch && this.setPitch(pitch); } + /** + * @version 12.0.2 + * @function WebMapBase.prototype.getPopupInfos + * @description 获取地图上所有图层的弹窗信息。 + * @returns {Array} 弹窗信息数组。 + */ + getPopupInfos() { + return (this._handler && this._handler._getPopupInfos()) || []; + } + /** * @version 11.2.1 * @function WebMapBase.prototype.getLayers diff --git a/src/common/mapping/WebMapV2.js b/src/common/mapping/WebMapV2.js index b8cdbb6c2a..e91d8c77f1 100644 --- a/src/common/mapping/WebMapV2.js +++ b/src/common/mapping/WebMapV2.js @@ -182,6 +182,33 @@ export function createWebMapV2Extending(SuperClass, { MapManager, mapRepo, crsMa crsManager.registerCRS(crs); return epsgCode; } + _getPopupInfos() { + const { layers = [] } = this._mapInfo; + return layers.map((layer) => { + const { popupInfo, enableFields, name, layerID: layerId, captions: fieldCaptions } = layer; + if (popupInfo){ + let elements = popupInfo.elements || []; + if (fieldCaptions) { + elements = (popupInfo.elements || []).map(item => { + if (item.type === 'FIELD') { + item.fieldCaption = fieldCaptions[item.fieldName] || item.fieldName; + } + return item; + }); + } + return { ...popupInfo, layerId: [layerId], elements, title: name }; + } + if (enableFields) { + const elements = enableFields.map((fieldName) => ({ + type: 'FIELD', + fieldName, + fieldCaption: fieldCaptions ? (fieldCaptions[fieldName] || fieldName) : fieldName + })); + return { elements, layerId: [layerId], title: name }; + } + return null; + }).filter(item => item !== null); + } _handleLayerInfo(mapInfo, _taskID) { mapInfo = this._setLayerID(mapInfo); diff --git a/src/common/mapping/WebMapV3.js b/src/common/mapping/WebMapV3.js index d8e76f5fa1..51876609f1 100644 --- a/src/common/mapping/WebMapV3.js +++ b/src/common/mapping/WebMapV3.js @@ -4,6 +4,7 @@ import { FetchRequest } from '../util/FetchRequest'; import { getLayerCatalogRenderLayers, getLayerInfosFromCatalogs, getMainLayerFromCatalog, isSameRasterLayer, mergeFeatures, transformUrl } from './utils/util'; import { SourceListModelV3 } from './utils/SourceListModelV3'; +import cloneDeep from 'lodash.clonedeep'; const LEGEND_RENDER_TYPE = { TEXT: 'TEXT', @@ -336,6 +337,57 @@ export function createWebMapV3Extending(SuperClass, { MapManager, mapRepo, crsMa } return epsgCode; } + _getFieldCaption(msDatasetId) { + const { datas = [] } = this._mapResourceInfo; + let fieldCaptions = null; + datas.forEach(data => { + if (data.datasets) { + const index = data.datasets.findIndex(dataset => dataset.msDatasetId === msDatasetId); + if (index !== -1) { + fieldCaptions = data.datasets[index].fieldsCaptions; + } + } + }); + return fieldCaptions; + } + _getPopupInfoContent(data, msDatasetId) { + const popupInfo = cloneDeep(data); + const fieldCaptions = this._getFieldCaption(msDatasetId); + if (fieldCaptions) { + popupInfo.elements = popupInfo.elements ? popupInfo.elements.map(item => { + if (item.type === 'FIELD') { + item.fieldCaption = fieldCaptions[item.fieldName] || item.fieldName; + } + return item; + }) : []; + } + return popupInfo; + } + _getPopupInfoByCatalog(catalog, res = []) { + const { catalogType, children } = catalog; + if(catalogType === 'group' && children) { + children.forEach(child => { + this._getPopupInfoByCatalog(child, res); + }) + } + if (catalogType === 'layer') { + const { popupInfo, msDatasetId, title, layersContent } = catalog; + if (popupInfo) { + const popupInfoVal = this._getPopupInfoContent(popupInfo, msDatasetId); + if (popupInfoVal) { + res.push({...popupInfoVal, layerId: layersContent, title}); + } + } + } + } + _getPopupInfos(_mapResourceInfo = this._mapResourceInfo) { + const { catalogs = [] } = _mapResourceInfo; + const res = []; + catalogs.forEach((item) => { + this._getPopupInfoByCatalog(item, res); + }) + return res; + } /** * @private * @function WebMapV3.prototype._initLayers From 39f43a9098a1952c8677769295c8122e0e615ca9 Mon Sep 17 00:00:00 2001 From: luoxiao Date: Thu, 18 Jun 2026 11:12:50 +0800 Subject: [PATCH 26/46] =?UTF-8?q?[fix]=E8=A1=A5=E5=85=85webmapv3=20poupinf?= =?UTF-8?q?o=20UT=20AI-GEN:=2060%=20Cursor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/mapboxgl/mapping/WebMapV2Spec.js | 295 ++ test/mapboxgl/mapping/WebMapV3Spec.js | 6719 ++++++++++++++++++++++++- test/resources/WebMapV3.js | 267 + test/resources/WebMapV5.js | 479 +- 4 files changed, 7758 insertions(+), 2 deletions(-) diff --git a/test/mapboxgl/mapping/WebMapV2Spec.js b/test/mapboxgl/mapping/WebMapV2Spec.js index 6be3d42bcb..e53add4ce0 100644 --- a/test/mapboxgl/mapping/WebMapV2Spec.js +++ b/test/mapboxgl/mapping/WebMapV2Spec.js @@ -4278,6 +4278,301 @@ describe('mapboxgl_WebMapV2', () => { done(); }); }); + it('webmap2.0 popupinfo', (done) => { + spyOn(FetchRequest, 'get').and.callFake((url) => { + if (url.indexOf('map.json') > -1) { + return Promise.resolve(new Response(JSON.stringify(Webmap2_popupInfo))); + } else if (url.indexOf('1168691327/content.json?') > -1) { + return Promise.resolve(new Response(JSON.stringify(chart_content))); + } else if (url.indexOf('1371715657/content.json?') > -1) { + return Promise.resolve(new Response(JSON.stringify(layerData_geojson['POINT_GEOJSON']))); + } else if (url.indexOf('portal.json') > -1) { + return Promise.resolve(new Response(JSON.stringify(iportal_serviceProxy))); + } + return Promise.resolve(new Response(JSON.stringify({}))); + }); + datavizWebmap = new WebMap('123', { + server: server + }); + const callback = function () { + const popupInfo = datavizWebmap.getPopupInfos(); + const data = [ + { + elements: [ + { + fieldName: 'parent', + type: 'FIELD', + fieldCaption: 'parent3121' + }, + { + fieldName: 'adcode', + type: 'FIELD', + fieldCaption: 'adcode' + }, + { + fieldName: 'level', + type: 'FIELD', + fieldCaption: 'level' + }, + { + fieldName: 'childrenNum', + type: 'FIELD', + fieldCaption: 'childrenNum' + }, + { + fieldName: 'smpid', + type: 'FIELD', + fieldCaption: 'smpid' + }, + { + fieldName: 'centroid', + type: 'FIELD', + fieldCaption: 'centroid' + }, + { + fieldName: 'center', + type: 'FIELD', + fieldCaption: 'center' + }, + { + fieldName: 'subFeatureIndex', + type: 'FIELD', + fieldCaption: 'subFeatureIndex' + }, + { + fieldName: 'name', + type: 'FIELD', + fieldCaption: 'name' + }, + { + fieldName: 'acroutes', + type: 'FIELD', + fieldCaption: 'acroutes' + }, + { + type: 'DIVIDER' + }, + { + type: 'TEXT', + infos: [ + { + insert: ['concat', ['get', 'level'], ['get', 'adcode'], '----'], + attributes: { + size: 'small', + color: '#4e35cc', + underline: true, + strike: true, + bold: true, + italic: true + } + }, + { + insert: ['concat', ['get', 'childrenNum'], ['get', 'parent']], + attributes: { + size: 'small', + color: '#e01b4b' + } + }, + { + insert: '\n', + attributes: { + align: 'center' + } + } + ] + }, + { + type: 'DIVIDER' + }, + { + type: 'IMAGE', + title: ['concat', ['get', 'adcode']], + value: ['concat', ['get', 'parent']] + }, + { + type: 'IMAGE', + title: 'afdfd', + value: ['concat', ['get', 'level']] + }, + { + type: 'DIVIDER' + }, + { + type: 'VIDEO', + title: 'fdsfs', + value: 'http://fake:8190/iportal/apps/mapstudio/edit.html' + }, + { + type: 'DIVIDER' + }, + { + type: 'IMAGE', + title: ['concat', ['get', 'parent'], ['get', 'adcode']], + value: ['concat', ['get', 'adcode'], ['get', 'level']] + } + ], + title: '北京市(3)', + layerId: ['北京市(3)'] + }, + { + elements: [ + { + fieldName: 'SmID', + type: 'FIELD' + }, + { + fieldName: '标准名称', + type: 'FIELD' + } + ], + title: '北京市轨道交通线路-打印(3)', + layerId:[ '北京市轨道交通线路-打印(3)'] + } + ]; + expect(popupInfo).toEqual(data); + done(); + }; + datavizWebmap.on('mapcreatesucceeded', callback); + datavizWebmap.on('map'); + }); + it('webmap2.0 popupinfo no captions', (done) => { + spyOn(FetchRequest, 'get').and.callFake((url) => { + if (url.indexOf('map.json') > -1) { + return Promise.resolve(new Response(JSON.stringify(Webmap2_popupInfo_no_captions))); + } else if (url.indexOf('1168691327/content.json?') > -1) { + return Promise.resolve(new Response(JSON.stringify(chart_content))); + } else if (url.indexOf('1371715657/content.json?') > -1) { + return Promise.resolve(new Response(JSON.stringify(layerData_geojson['POINT_GEOJSON']))); + } else if (url.indexOf('portal.json') > -1) { + return Promise.resolve(new Response(JSON.stringify(iportal_serviceProxy))); + } + return Promise.resolve(new Response(JSON.stringify({}))); + }); + datavizWebmap = new WebMap('123', { + server: server + }); + const callback = function () { + const popupInfo = datavizWebmap.getPopupInfos(); + const data = [ + { + elements: [ + { + fieldCaption: "SmID", + fieldName: 'SmID', + type: 'FIELD' + }, + { + fieldCaption: '标准名称', + fieldName: '标准名称', + type: 'FIELD' + } + ], + title: '北京市轨道交通线路-打印(3)', + layerId: ['北京市轨道交通线路-打印(3)'] + } + ]; + expect(popupInfo).toEqual(data); + done(); + }; + datavizWebmap.on('mapcreatesucceeded', callback); + datavizWebmap.on('map'); + }); + it('webmap2.0 popupinfo 没有配置弹窗', (done) => { + spyOn(FetchRequest, 'get').and.callFake((url) => { + if (url.indexOf('map.json') > -1) { + return Promise.resolve(new Response(JSON.stringify(Webmap2_popupInfo_no))); + } else if (url.indexOf('1168691327/content.json?') > -1) { + return Promise.resolve(new Response(JSON.stringify(chart_content))); + } else if (url.indexOf('1371715657/content.json?') > -1) { + return Promise.resolve(new Response(JSON.stringify(layerData_geojson['POINT_GEOJSON']))); + } else if (url.indexOf('portal.json') > -1) { + return Promise.resolve(new Response(JSON.stringify(iportal_serviceProxy))); + } + return Promise.resolve(new Response(JSON.stringify({}))); + }); + datavizWebmap = new WebMap('123', { + server: server + }); + const callback = function () { + const popupInfo = datavizWebmap.getPopupInfos(); + const data = [ + { + elements: [ + { + type: 'FIELD', + fieldName: 'parent', + fieldCaption: 'parent3121' + }, + { + type: 'FIELD', + fieldName: 'adcode', + fieldCaption: 'adcode' + }, + { + type: 'FIELD', + fieldName: 'level', + fieldCaption: 'level' + }, + { + type: 'FIELD', + fieldName: 'childrenNum', + fieldCaption: 'childrenNum' + }, + { + type: 'FIELD', + fieldName: 'smpid', + fieldCaption: 'smpid' + }, + { + type: 'FIELD', + fieldName: 'centroid', + fieldCaption: 'centroid' + }, + { + type: 'FIELD', + fieldName: 'center', + fieldCaption: 'center' + }, + { + type: 'FIELD', + fieldName: 'subFeatureIndex', + fieldCaption: 'subFeatureIndex' + }, + { + type: 'FIELD', + fieldName: 'name', + fieldCaption: 'name' + }, + { + type: 'FIELD', + fieldName: 'acroutes', + fieldCaption: 'acroutes' + } + ], + layerId:[ '北京市(3)'], + title: '北京市(3)' + }, + { + elements: [ + { + fieldName: 'SmID', + type: 'FIELD' + }, + { + fieldName: '标准名称', + type: 'FIELD' + } + ], + title: '北京市轨道交通线路-打印(3)', + layerId: ['北京市轨道交通线路-打印(3)'] + } + ]; + expect(popupInfo).toEqual(data); + done(); + }; + datavizWebmap.on('mapcreatesucceeded', callback); + datavizWebmap.on('map'); + }); it('baselayer is MAPBOXSTYLE when mapInfo has no extent', (done) => { const mapInfo = { diff --git a/test/mapboxgl/mapping/WebMapV3Spec.js b/test/mapboxgl/mapping/WebMapV3Spec.js index 6b7680cd09..2a3b4b7def 100644 --- a/test/mapboxgl/mapping/WebMapV3Spec.js +++ b/test/mapboxgl/mapping/WebMapV3Spec.js @@ -804,7 +804,7 @@ describe('mapboxgl-webmap3.0', () => { const spyTest = spyOn(MapManagerUtil, 'default').and.callFake(mbglmap); const mapInfo = JSON.parse(mapstudioWebMap_raster); const iportalServiceProxyUrlPrefix = 'http://localhost:8195/portalproxy'; - const tileCustomRequestHeaders = { 'Authorization': 'test token' }; + const tileCustomRequestHeaders = { Authorization: 'test token' }; mapstudioWebmap = new WebMap(mapInfo, { server: server, target: 'map', @@ -1707,4 +1707,6721 @@ describe('mapboxgl-webmap3.0', () => { }); }); }); + + it('webmap3.0 projectinfo popupInfo', (done) => { + spyOn(FetchRequest, 'get').and.callFake((url) => { + if (url.indexOf('web/config/portal.json') > -1) { + return Promise.resolve(new Response(JSON.stringify(iportal_serviceProxy))); + } + if (url.indexOf('map.json') > -1) { + return Promise.resolve(new Response(msPopupInfoMap)); + } + if (url.indexOf('617580084.json') > -1) { + return Promise.resolve(new Response(msPopupInfo)); + } + if (url.indexOf('/sprite') > -1) { + return Promise.resolve(new Response(msSpriteInfo)); + } + return Promise.resolve(); + }); + mapstudioWebmap = new WebMap(id, { + server: server + }); + mapstudioWebmap.on('mapcreatesucceeded', () => { + const popupInfo = mapstudioWebmap.getPopupInfos(); + const Data = [ + { + elements: [ + { + fieldName: 'geometry', + type: 'FIELD' + }, + { + type: 'DIVIDER' + }, + { + type: 'IMAGE', + title: '无标题', + value: + 'https://pic1.arkoo.com/56D0B40F99F841DF8A2425762AE2565D/picture/o_1i4qop009177v1tgf14db15he1iaj1is.jpg' + }, + { + type: 'DIVIDER' + }, + { + type: 'TEXT', + infos: [ + { + insert: '这是一段文本信息\n' + } + ] + } + ], + title: 'A点', + layerId: ['A点'] + }, + { + elements: [ + { + fieldName: 'geometry', + type: 'FIELD', + fieldCaption: 'geometry' + }, + { + type: 'DIVIDER' + }, + { + type: 'TEXT', + infos: [ + { + insert: ['concat', '这是一段文本信息', ['get', 'smpid'], '\n'] + } + ] + }, + { + type: 'DIVIDER' + }, + { + type: 'IMAGE', + title: ['concat', '无标题', ['get', 'adcode'], '-图片'], + value: ['concat', ['get', 'adcode']] + }, + { + type: 'IMAGE', + title: '无标题', + value: ['concat', ['get', 'adcode']] + }, + { + type: 'VIDEO', + title: '无标题-视频', + value: 'https://www.runoob.com/try/demo_source/mov_bbb.mp4' + }, + { + type: 'DIVIDER' + }, + { + type: 'IMAGE', + title: ['concat', '无标题图片', ['get', 'adcode']], + value: ['concat', ['get', 'name'], ['get', 'smpid']] + } + ], + title: 'A面', + layerId: ['A面', 'A面1'] + } + ]; + expect(popupInfo).toEqual(Data); + const popupInfo1 = mapstudioWebmap._handler._getPopupInfos({ + catalogs: [ + { + visible: true, + catalogType: 'group', + children: [ + { + visible: true, + catalogType: 'group', + children: [ + { + filter: ['all', ['==', '$type', 'Point'], ['has', 'NAME'], ['!=', 'NAME', '']], + visualization: { + renderer: [ + { + rotate: { + type: 'simple', + value: 0 + }, + textLetterSpacing: { + type: 'simple', + value: 0 + }, + textTranslate: { + type: 'simple', + value: [3, 0] + }, + color: { + type: 'simple', + value: '#000000' + }, + symbolPlacement: { + type: 'simple', + value: 'point' + }, + textAnchor: { + type: 'simple', + value: 'left' + }, + translate: { + type: 'simple', + value: [0, 0] + }, + textRotate: { + type: 'simple', + value: 360 + }, + textField: { + type: 'simple', + value: 'NAME' + }, + textHaloBlur: { + type: 'simple', + value: 0 + }, + transform: { + type: 'simple', + value: 'none' + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'marker_907936_6_A5A5A5', + style: { + layout: { + 'icon-image': 'marker_907936_6_A5A5A5' + } + } + } + }, + textTranslateAnchor: { + type: 'simple', + value: 'map' + }, + justify: { + type: 'simple', + value: 'left' + }, + ignorePlacement: { + type: 'simple', + value: false + }, + textAllowOverlap: { + type: 'simple', + value: false + }, + maxWidth: { + type: 'simple', + value: 10 + }, + textSize: { + type: 'simple', + value: 11.55 + }, + textHaloColor: { + type: 'simple', + value: 'rgba(0, 0, 0, 0)' + }, + textColor: { + type: 'simple', + value: 'rgba(115,106,79,1.00)' + }, + size: { + type: 'simple', + value: 6 + }, + allowOverlap: { + type: 'simple', + value: false + }, + translateAnchor: { + type: 'simple', + value: 'map' + }, + anchor: { + type: 'simple', + value: 'center' + }, + textOpacity: { + type: 'simple', + value: 1 + }, + textHaloWidth: { + type: 'simple', + value: 0 + }, + lineHeight: { + type: 'simple', + value: 1.2 + }, + textFont: { + type: 'simple', + value: ['Microsoft YaHei'] + }, + textIgnorePlacement: { + type: 'simple', + value: false + }, + opacity: { + type: 'simple', + value: 1 + } + }, + { + rotate: { + type: 'simple', + value: 0 + }, + textLetterSpacing: { + type: 'simple', + value: 0 + }, + textTranslate: { + type: 'simple', + value: [3, 0] + }, + color: { + type: 'simple', + value: '#000000' + }, + symbolPlacement: { + type: 'simple', + value: 'point' + }, + textAnchor: { + type: 'simple', + value: 'left' + }, + translate: { + type: 'simple', + value: [0, 0] + }, + textRotate: { + type: 'simple', + value: 360 + }, + textField: { + type: 'simple', + value: 'NAME' + }, + textHaloBlur: { + type: 'simple', + value: 0 + }, + transform: { + type: 'simple', + value: 'none' + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'marker_907936_6_A5A5A5', + style: { + layout: { + 'icon-image': 'marker_907936_6_A5A5A5' + } + } + } + }, + textTranslateAnchor: { + type: 'simple', + value: 'map' + }, + justify: { + type: 'simple', + value: 'left' + }, + ignorePlacement: { + type: 'simple', + value: false + }, + textAllowOverlap: { + type: 'simple', + value: false + }, + maxWidth: { + type: 'simple', + value: 10 + }, + textSize: { + type: 'simple', + value: 11.55 + }, + textHaloColor: { + type: 'simple', + value: 'rgba(0, 0, 0, 0)' + }, + textColor: { + type: 'simple', + value: 'rgba(115,106,79,1.00)' + }, + size: { + type: 'simple', + value: 6 + }, + allowOverlap: { + type: 'simple', + value: false + }, + translateAnchor: { + type: 'simple', + value: 'map' + }, + anchor: { + type: 'simple', + value: 'center' + }, + textOpacity: { + type: 'simple', + value: 1 + }, + textHaloWidth: { + type: 'simple', + value: 0 + }, + lineHeight: { + type: 'simple', + value: 1.2 + }, + textFont: { + type: 'simple', + value: ['Microsoft YaHei'] + }, + textIgnorePlacement: { + type: 'simple', + value: false + }, + opacity: { + type: 'simple', + value: 1 + }, + type: 'text' + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'Town_P@Jingjin#1#1', + id: 'Town_P@Jingjin#1#1(12_24)', + serviceLayerGroupId: 'Level_5', + title: 'Town_P@Jingjin#1', + layerSourceType: 'VectorTileService', + zoomRange: [12, 24], + layersContent: ['Town_P@Jingjin#1#1(12_24)'] + }, + { + filter: ['all', ['==', '$type', 'LineString'], ['has', 'name_1'], ['!=', 'name_1', '']], + visualization: { + renderer: [ + { + rotate: { + type: 'simple', + value: 0 + }, + textLetterSpacing: { + type: 'simple', + value: 0.24 + }, + textTranslate: { + type: 'simple', + value: [0, 0] + }, + color: { + type: 'simple', + value: '#000000' + }, + symbolPlacement: { + type: 'simple', + value: 'line' + }, + textAnchor: { + type: 'simple', + value: 'center' + }, + translate: { + type: 'simple', + value: [0, 0] + }, + textRotate: { + type: 'simple', + value: 360 + }, + textField: { + type: 'simple', + value: 'name_1' + }, + textHaloBlur: { + type: 'simple', + value: 0 + }, + transform: { + type: 'simple', + value: 'none' + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: '', + style: { + layout: { + 'icon-image': '' + } + } + } + }, + textTranslateAnchor: { + type: 'simple', + value: 'map' + }, + justify: { + type: 'simple', + value: 'left' + }, + ignorePlacement: { + type: 'simple', + value: false + }, + textAllowOverlap: { + type: 'simple', + value: false + }, + maxWidth: { + type: 'simple', + value: 10 + }, + textSize: { + type: 'simple', + value: 10.5 + }, + textHaloColor: { + type: 'simple', + value: 'rgba(0, 0, 0, 0)' + }, + textColor: { + type: 'simple', + value: 'rgba(63,11,10,1.00)' + }, + size: { + type: 'simple', + value: 100 + }, + allowOverlap: { + type: 'simple', + value: false + }, + translateAnchor: { + type: 'simple', + value: 'map' + }, + anchor: { + type: 'simple', + value: 'center' + }, + textOpacity: { + type: 'simple', + value: 1 + }, + textHaloWidth: { + type: 'simple', + value: 0 + }, + lineHeight: { + type: 'simple', + value: 1.2 + }, + textFont: { + type: 'simple', + value: ['Microsoft YaHei'] + }, + textIgnorePlacement: { + type: 'simple', + value: false + }, + opacity: { + type: 'simple', + value: 1 + } + }, + { + rotate: { + type: 'simple', + value: 0 + }, + textLetterSpacing: { + type: 'simple', + value: 0.24 + }, + textTranslate: { + type: 'simple', + value: [0, 0] + }, + color: { + type: 'simple', + value: '#000000' + }, + symbolPlacement: { + type: 'simple', + value: 'line' + }, + textAnchor: { + type: 'simple', + value: 'center' + }, + translate: { + type: 'simple', + value: [0, 0] + }, + textRotate: { + type: 'simple', + value: 360 + }, + textField: { + type: 'simple', + value: 'name_1' + }, + textHaloBlur: { + type: 'simple', + value: 0 + }, + transform: { + type: 'simple', + value: 'none' + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: '', + style: { + layout: { + 'icon-image': '' + } + } + } + }, + textTranslateAnchor: { + type: 'simple', + value: 'map' + }, + justify: { + type: 'simple', + value: 'left' + }, + ignorePlacement: { + type: 'simple', + value: false + }, + textAllowOverlap: { + type: 'simple', + value: false + }, + maxWidth: { + type: 'simple', + value: 10 + }, + textSize: { + type: 'simple', + value: 10.5 + }, + textHaloColor: { + type: 'simple', + value: 'rgba(0, 0, 0, 0)' + }, + textColor: { + type: 'simple', + value: 'rgba(63,11,10,1.00)' + }, + size: { + type: 'simple', + value: 100 + }, + allowOverlap: { + type: 'simple', + value: false + }, + translateAnchor: { + type: 'simple', + value: 'map' + }, + anchor: { + type: 'simple', + value: 'center' + }, + textOpacity: { + type: 'simple', + value: 1 + }, + textHaloWidth: { + type: 'simple', + value: 0 + }, + lineHeight: { + type: 'simple', + value: 1.2 + }, + textFont: { + type: 'simple', + value: ['Microsoft YaHei'] + }, + textIgnorePlacement: { + type: 'simple', + value: false + }, + opacity: { + type: 'simple', + value: 1 + }, + type: 'text' + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'Road_L@Jingjin#8', + id: 'Road_L@Jingjin#8(12_24)', + popupInfo: { + elements: [ + { + fieldName: 'KD', + type: 'FIELD' + }, + { + fieldName: 'KD_1', + type: 'FIELD' + }, + { + fieldName: 'NAME', + type: 'FIELD' + }, + { + fieldName: 'SmID', + type: 'FIELD' + }, + { + fieldName: 'SmLength', + type: 'FIELD' + }, + { + fieldName: 'SmTopoError', + type: 'FIELD' + }, + { + fieldName: 'SmUserID', + type: 'FIELD' + }, + { + fieldName: 'name_1', + type: 'FIELD' + }, + { + fieldName: 'name_2_len', + type: 'FIELD' + }, + { + fieldName: 'name_3_len', + type: 'FIELD' + } + ], + title: 'Road_L_街道' + }, + serviceLayerGroupId: 'Level_5', + title: 'Road_L_街道', + layerSourceType: 'VectorTileService', + zoomRange: [12, 24], + layersContent: ['Road_L@Jingjin#8(12_24)'] + }, + { + visible: true, + catalogType: 'group', + children: [ + { + filter: ['all', ['==', '$type', 'LineString'], ['<', 'KD_1', 3]], + visualization: { + renderer: [ + { + lineDasharray: { + type: 'simple', + value: [1, 0] + }, + color: { + type: 'simple', + value: 'rgba(255,206,16,1.00)' + }, + lineTranslateAnchor: { + type: 'simple', + value: 'map' + }, + lineMiterLimit: { + type: 'simple', + value: 2 + }, + lineOffset: { + type: 'simple', + value: 0 + }, + lineJoin: { + type: 'simple', + value: 'miter' + }, + lineRoundLimit: { + type: 'simple', + value: 1.05 + }, + lineTranslate: { + type: 'simple', + value: [0, 0] + }, + lineGapWidth: { + type: 'simple', + value: 0 + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'line-0', + style: { + layout: { + visibility: 'visible', + 'line-miter-limit': 2, + 'line-round-limit': 1.05, + 'line-join': 'miter', + 'line-cap': 'butt' + }, + paint: { + 'line-translate-anchor': 'map', + 'line-width': 8.31, + 'line-gap-width': 0, + 'line-offset': 0, + 'line-opacity': 1, + 'line-translate': [0, 0], + 'line-color': 'rgba(255,206,16,1.00)' + } + } + } + }, + lineCap: { + type: 'simple', + value: 'butt' + }, + width: { + type: 'simple', + value: 8.31 + }, + opacity: { + type: 'simple', + value: 1 + } + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'Road_L@Jingjin#3', + id: 'Road_L@Jingjin#3_range_1(12_24)', + serviceLayerGroupId: 'Level_5', + title: 'min < X < 3', + layerSourceType: 'VectorTileService', + zoomRange: [12, 24], + layersContent: ['Road_L@Jingjin#3_range_1(12_24)'] + }, + { + filter: ['all', ['==', '$type', 'LineString'], ['>=', 'KD_1', 3], ['<', 'KD_1', 4]], + visualization: { + renderer: [ + { + lineDasharray: { + type: 'simple', + value: [1, 0] + }, + color: { + type: 'simple', + value: 'rgba(250,246,162,1.00)' + }, + lineTranslateAnchor: { + type: 'simple', + value: 'map' + }, + lineMiterLimit: { + type: 'simple', + value: 2 + }, + lineOffset: { + type: 'simple', + value: 0 + }, + lineJoin: { + type: 'simple', + value: 'miter' + }, + lineRoundLimit: { + type: 'simple', + value: 1.05 + }, + lineTranslate: { + type: 'simple', + value: [0, 0] + }, + lineGapWidth: { + type: 'simple', + value: 0 + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'line-0', + style: { + layout: { + visibility: 'visible', + 'line-miter-limit': 2, + 'line-round-limit': 1.05, + 'line-join': 'miter', + 'line-cap': 'butt' + }, + paint: { + 'line-translate-anchor': 'map', + 'line-width': 8.31, + 'line-gap-width': 0, + 'line-offset': 0, + 'line-opacity': 1, + 'line-translate': [0, 0], + 'line-color': 'rgba(250,246,162,1.00)' + } + } + } + }, + lineCap: { + type: 'simple', + value: 'butt' + }, + width: { + type: 'simple', + value: 8.31 + }, + opacity: { + type: 'simple', + value: 1 + } + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'Road_L@Jingjin#3', + id: 'Road_L@Jingjin#3_range_2(12_24)', + serviceLayerGroupId: 'Level_5', + title: '3 <= X < 4', + layerSourceType: 'VectorTileService', + zoomRange: [12, 24], + layersContent: ['Road_L@Jingjin#3_range_2(12_24)'] + }, + { + filter: ['all', ['==', '$type', 'LineString'], ['>=', 'KD_1', 4]], + visualization: { + renderer: [ + { + lineDasharray: { + type: 'simple', + value: [1, 0] + }, + color: { + type: 'simple', + value: 'rgba(255,255,255,1.00)' + }, + lineTranslateAnchor: { + type: 'simple', + value: 'map' + }, + lineMiterLimit: { + type: 'simple', + value: 2 + }, + lineOffset: { + type: 'simple', + value: 0 + }, + lineJoin: { + type: 'simple', + value: 'miter' + }, + lineRoundLimit: { + type: 'simple', + value: 1.05 + }, + lineTranslate: { + type: 'simple', + value: [0, 0] + }, + lineGapWidth: { + type: 'simple', + value: 0 + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'line-0', + style: { + layout: { + visibility: 'visible', + 'line-miter-limit': 2, + 'line-round-limit': 1.05, + 'line-join': 'miter', + 'line-cap': 'butt' + }, + paint: { + 'line-translate-anchor': 'map', + 'line-width': 6.8, + 'line-gap-width': 0, + 'line-offset': 0, + 'line-opacity': 1, + 'line-translate': [0, 0], + 'line-color': 'rgba(255,255,255,1.00)' + } + } + } + }, + lineCap: { + type: 'simple', + value: 'butt' + }, + width: { + type: 'simple', + value: 6.8 + }, + opacity: { + type: 'simple', + value: 1 + } + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'Road_L@Jingjin#3', + id: 'Road_L@Jingjin#3_range_3(12_24)', + serviceLayerGroupId: 'Level_5', + title: '4 <= X < max', + layerSourceType: 'VectorTileService', + zoomRange: [12, 24], + layersContent: ['Road_L@Jingjin#3_range_3(12_24)'] + } + ], + name: 'Road_L@Jingjin#3', + id: 'group_Road_L@Jingjin#3_1764665757037_33' + }, + { + visible: true, + catalogType: 'group', + children: [ + { + filter: ['all', ['==', '$type', 'LineString'], ['<', 'KD_1', 3]], + visualization: { + renderer: [ + { + lineDasharray: { + type: 'simple', + value: [1, 0] + }, + color: { + type: 'simple', + value: 'rgba(172,107,0,1.00)' + }, + lineTranslateAnchor: { + type: 'simple', + value: 'map' + }, + lineMiterLimit: { + type: 'simple', + value: 2 + }, + lineOffset: { + type: 'simple', + value: 0 + }, + lineJoin: { + type: 'simple', + value: 'miter' + }, + lineRoundLimit: { + type: 'simple', + value: 1.05 + }, + lineTranslate: { + type: 'simple', + value: [0, 0] + }, + lineGapWidth: { + type: 'simple', + value: 0 + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'line-0', + style: { + layout: { + visibility: 'visible', + 'line-miter-limit': 2, + 'line-round-limit': 1.05, + 'line-join': 'miter', + 'line-cap': 'butt' + }, + paint: { + 'line-translate-anchor': 'map', + 'line-width': 9.83, + 'line-gap-width': 0, + 'line-offset': 0, + 'line-opacity': 1, + 'line-translate': [0, 0], + 'line-color': 'rgba(172,107,0,1.00)' + } + } + } + }, + lineCap: { + type: 'simple', + value: 'butt' + }, + width: { + type: 'simple', + value: 9.83 + }, + opacity: { + type: 'simple', + value: 1 + } + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'Road_L@Jingjin#2', + id: 'Road_L@Jingjin#2_range_1(12_24)', + serviceLayerGroupId: 'Level_5', + title: 'min < X < 3', + layerSourceType: 'VectorTileService', + zoomRange: [12, 24], + layersContent: ['Road_L@Jingjin#2_range_1(12_24)'] + }, + { + filter: ['all', ['==', '$type', 'LineString'], ['>=', 'KD_1', 3], ['<', 'KD_1', 4]], + visualization: { + renderer: [ + { + lineDasharray: { + type: 'simple', + value: [1, 0] + }, + color: { + type: 'simple', + value: 'rgba(195,183,147,1.00)' + }, + lineTranslateAnchor: { + type: 'simple', + value: 'map' + }, + lineMiterLimit: { + type: 'simple', + value: 2 + }, + lineOffset: { + type: 'simple', + value: 0 + }, + lineJoin: { + type: 'simple', + value: 'miter' + }, + lineRoundLimit: { + type: 'simple', + value: 1.05 + }, + lineTranslate: { + type: 'simple', + value: [0, 0] + }, + lineGapWidth: { + type: 'simple', + value: 0 + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'line-0', + style: { + layout: { + visibility: 'visible', + 'line-miter-limit': 2, + 'line-round-limit': 1.05, + 'line-join': 'miter', + 'line-cap': 'butt' + }, + paint: { + 'line-translate-anchor': 'map', + 'line-width': 9.83, + 'line-gap-width': 0, + 'line-offset': 0, + 'line-opacity': 1, + 'line-translate': [0, 0], + 'line-color': 'rgba(195,183,147,1.00)' + } + } + } + }, + lineCap: { + type: 'simple', + value: 'butt' + }, + width: { + type: 'simple', + value: 9.83 + }, + opacity: { + type: 'simple', + value: 1 + } + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'Road_L@Jingjin#2', + id: 'Road_L@Jingjin#2_range_2(12_24)', + serviceLayerGroupId: 'Level_5', + title: '3 <= X < 4', + layerSourceType: 'VectorTileService', + zoomRange: [12, 24], + layersContent: ['Road_L@Jingjin#2_range_2(12_24)'] + }, + { + filter: ['all', ['==', '$type', 'LineString'], ['>=', 'KD_1', 4]], + visualization: { + renderer: [ + { + lineDasharray: { + type: 'simple', + value: [1, 0] + }, + color: { + type: 'simple', + value: 'rgba(180,180,180,1.00)' + }, + lineTranslateAnchor: { + type: 'simple', + value: 'map' + }, + lineMiterLimit: { + type: 'simple', + value: 2 + }, + lineOffset: { + type: 'simple', + value: 0 + }, + lineJoin: { + type: 'simple', + value: 'miter' + }, + lineRoundLimit: { + type: 'simple', + value: 1.05 + }, + lineTranslate: { + type: 'simple', + value: [0, 0] + }, + lineGapWidth: { + type: 'simple', + value: 0 + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'line-0', + style: { + layout: { + visibility: 'visible', + 'line-miter-limit': 2, + 'line-round-limit': 1.05, + 'line-join': 'miter', + 'line-cap': 'butt' + }, + paint: { + 'line-translate-anchor': 'map', + 'line-width': 9.07, + 'line-gap-width': 0, + 'line-offset': 0, + 'line-opacity': 1, + 'line-translate': [0, 0], + 'line-color': 'rgba(180,180,180,1.00)' + } + } + } + }, + lineCap: { + type: 'simple', + value: 'butt' + }, + width: { + type: 'simple', + value: 9.07 + }, + opacity: { + type: 'simple', + value: 1 + } + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'Road_L@Jingjin#2', + id: 'Road_L@Jingjin#2_range_3(12_24)', + serviceLayerGroupId: 'Level_5', + title: '4 <= X < max', + layerSourceType: 'VectorTileService', + zoomRange: [12, 24], + layersContent: ['Road_L@Jingjin#2_range_3(12_24)'] + } + ], + name: 'Road_L@Jingjin#2', + id: 'group_Road_L@Jingjin#2_1764665757037_37' + }, + { + visible: true, + catalogType: 'group', + children: [ + { + filter: ['all', ['==', '$type', 'Polygon']], + visualization: { + renderer: [ + { + symbolsContent: { + type: 'simple', + value: { + symbolId: 'polygon-0', + style: { + layout: { + visibility: 'visible' + }, + paint: { + 'fill-color': 'rgba(184,221,165,1.00)', + 'fill-opacity': 1, + 'fill-antialias': true + } + } + } + }, + color: { + type: 'simple', + value: 'rgba(184,221,165,1.00)' + }, + antialias: { + type: 'simple', + value: true + }, + outlineColor: { + type: 'simple', + value: '#FFFFFF' + }, + opacity: { + type: 'simple', + value: 1 + } + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'GreenFeild_R@Jingjin#2#1', + id: 'GreenFeild_R@Jingjin#2#1(12_24)', + serviceLayerGroupId: 'Level_5', + title: 'GreenFeild_R@Jingjin', + layerSourceType: 'VectorTileService', + zoomRange: [12, 24], + layersContent: ['GreenFeild_R@Jingjin#2#1(12_24)'] + }, + { + filter: ['all', ['==', '$type', 'Polygon']], + visualization: { + renderer: [ + { + lineDasharray: { + type: 'simple', + value: [1, 0] + }, + color: { + type: 'simple', + value: 'rgba(184,221,165,1.00)' + }, + lineTranslateAnchor: { + type: 'simple', + value: 'map' + }, + lineMiterLimit: { + type: 'simple', + value: 2 + }, + lineOffset: { + type: 'simple', + value: 0 + }, + lineJoin: { + type: 'simple', + value: 'miter' + }, + lineRoundLimit: { + type: 'simple', + value: 1.05 + }, + lineTranslate: { + type: 'simple', + value: [0, 0] + }, + lineGapWidth: { + type: 'simple', + value: 0 + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'line-0', + style: { + layout: { + visibility: 'visible', + 'line-miter-limit': 2, + 'line-round-limit': 1.05, + 'line-join': 'miter', + 'line-cap': 'butt' + }, + paint: { + 'line-translate-anchor': 'map', + 'line-width': 0.38, + 'line-gap-width': 0, + 'line-offset': 0, + 'line-opacity': 1, + 'line-translate': [0, 0], + 'line-color': 'rgba(184,221,165,1.00)' + } + } + } + }, + lineCap: { + type: 'simple', + value: 'butt' + }, + width: { + type: 'simple', + value: 0.38 + }, + opacity: { + type: 'simple', + value: 1 + } + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'GreenFeild_R@Jingjin#2#1', + id: 'GreenFeild_R@Jingjin#2#1_outline(12_24)', + serviceLayerGroupId: 'Level_5', + title: 'GreenFeild_R@Jingjin', + layerSourceType: 'VectorTileService', + zoomRange: [12, 24], + layersContent: ['GreenFeild_R@Jingjin#2#1_outline(12_24)'] + } + ], + name: 'GreenFeild_R@Jingjin', + id: 'group_GreenFeild_R@Jingjin#2#1_1764665757037_41' + } + ], + name: 'Level_5', + id: 'group_Level_5_1764665757036_27' + }, + { + visible: true, + catalogType: 'group', + children: [ + { + filter: ['all', ['==', '$type', 'Point'], ['has', 'ADMINNAME'], ['!=', 'ADMINNAME', '']], + visualization: { + renderer: [ + { + rotate: { + type: 'simple', + value: 0 + }, + textLetterSpacing: { + type: 'simple', + value: 0 + }, + textTranslate: { + type: 'simple', + value: [0, 0] + }, + color: { + type: 'simple', + value: '#000000' + }, + symbolPlacement: { + type: 'simple', + value: 'point' + }, + textAnchor: { + type: 'simple', + value: 'center' + }, + translate: { + type: 'simple', + value: [0, 0] + }, + textRotate: { + type: 'simple', + value: 360 + }, + textField: { + type: 'simple', + value: 'ADMINNAME' + }, + textHaloBlur: { + type: 'simple', + value: 0 + }, + transform: { + type: 'simple', + value: 'none' + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'BGRR_4489C9_9_{ADMINNAME_len}', + style: { + layout: { + 'icon-image': 'BGRR_4489C9_9_{ADMINNAME_len}' + } + } + } + }, + textTranslateAnchor: { + type: 'simple', + value: 'map' + }, + justify: { + type: 'simple', + value: 'left' + }, + ignorePlacement: { + type: 'simple', + value: false + }, + textAllowOverlap: { + type: 'simple', + value: false + }, + maxWidth: { + type: 'simple', + value: 10 + }, + textSize: { + type: 'simple', + value: 10.5 + }, + textHaloColor: { + type: 'simple', + value: 'rgba(0, 0, 0, 0)' + }, + textColor: { + type: 'simple', + value: 'rgba(255,255,255,1.00)' + }, + size: { + type: 'simple', + value: 100 + }, + allowOverlap: { + type: 'simple', + value: false + }, + translateAnchor: { + type: 'simple', + value: 'map' + }, + anchor: { + type: 'simple', + value: 'center' + }, + textOpacity: { + type: 'simple', + value: 1 + }, + textHaloWidth: { + type: 'simple', + value: 0 + }, + lineHeight: { + type: 'simple', + value: 1.2 + }, + textFont: { + type: 'simple', + value: ['Microsoft YaHei'] + }, + textIgnorePlacement: { + type: 'simple', + value: false + }, + opacity: { + type: 'simple', + value: 1 + } + }, + { + rotate: { + type: 'simple', + value: 0 + }, + textLetterSpacing: { + type: 'simple', + value: 0 + }, + textTranslate: { + type: 'simple', + value: [0, 0] + }, + color: { + type: 'simple', + value: '#000000' + }, + symbolPlacement: { + type: 'simple', + value: 'point' + }, + textAnchor: { + type: 'simple', + value: 'center' + }, + translate: { + type: 'simple', + value: [0, 0] + }, + textRotate: { + type: 'simple', + value: 360 + }, + textField: { + type: 'simple', + value: 'ADMINNAME' + }, + textHaloBlur: { + type: 'simple', + value: 0 + }, + transform: { + type: 'simple', + value: 'none' + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'BGRR_4489C9_9_{ADMINNAME_len}', + style: { + layout: { + 'icon-image': 'BGRR_4489C9_9_{ADMINNAME_len}' + } + } + } + }, + textTranslateAnchor: { + type: 'simple', + value: 'map' + }, + justify: { + type: 'simple', + value: 'left' + }, + ignorePlacement: { + type: 'simple', + value: false + }, + textAllowOverlap: { + type: 'simple', + value: false + }, + maxWidth: { + type: 'simple', + value: 10 + }, + textSize: { + type: 'simple', + value: 10.5 + }, + textHaloColor: { + type: 'simple', + value: 'rgba(0, 0, 0, 0)' + }, + textColor: { + type: 'simple', + value: 'rgba(255,255,255,1.00)' + }, + size: { + type: 'simple', + value: 100 + }, + allowOverlap: { + type: 'simple', + value: false + }, + translateAnchor: { + type: 'simple', + value: 'map' + }, + anchor: { + type: 'simple', + value: 'center' + }, + textOpacity: { + type: 'simple', + value: 1 + }, + textHaloWidth: { + type: 'simple', + value: 0 + }, + lineHeight: { + type: 'simple', + value: 1.2 + }, + textFont: { + type: 'simple', + value: ['Microsoft YaHei'] + }, + textIgnorePlacement: { + type: 'simple', + value: false + }, + opacity: { + type: 'simple', + value: 1 + }, + type: 'text' + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'County_P@Jingjin#1', + id: 'County_P@Jingjin#1(9_13)', + popupInfo: { + elements: [ + { + fieldName: 'ADMINNAME', + type: 'FIELD' + }, + { + fieldName: 'ADMINNAME_len', + type: 'FIELD' + }, + { + fieldName: 'SmID', + type: 'FIELD' + }, + { + fieldName: 'SmUserID', + type: 'FIELD' + } + ], + title: 'County_P@Jingjin#1' + }, + serviceLayerGroupId: 'Level_3', + title: 'County_P@Jingjin#1', + layerSourceType: 'VectorTileService', + zoomRange: [9, 13], + layersContent: ['County_P@Jingjin#1(9_13)'] + }, + { + visible: true, + catalogType: 'group', + children: [ + { + filter: ['all', ['==', '$type', 'LineString'], ['<', 'KD_1', 3]], + visualization: { + renderer: [ + { + lineDasharray: { + type: 'simple', + value: [1, 0] + }, + color: { + type: 'simple', + value: 'rgba(255,165,56,1.00)' + }, + lineTranslateAnchor: { + type: 'simple', + value: 'map' + }, + lineMiterLimit: { + type: 'simple', + value: 2 + }, + lineOffset: { + type: 'simple', + value: 0 + }, + lineJoin: { + type: 'simple', + value: 'miter' + }, + lineRoundLimit: { + type: 'simple', + value: 1.05 + }, + lineTranslate: { + type: 'simple', + value: [0, 0] + }, + lineGapWidth: { + type: 'simple', + value: 0 + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'line-0', + style: { + layout: { + visibility: 'visible', + 'line-miter-limit': 2, + 'line-round-limit': 1.05, + 'line-join': 'miter', + 'line-cap': 'butt' + }, + paint: { + 'line-translate-anchor': 'map', + 'line-width': 0.76, + 'line-gap-width': 0, + 'line-offset': 0, + 'line-opacity': 1, + 'line-translate': [0, 0], + 'line-color': 'rgba(255,165,56,1.00)' + } + } + } + }, + lineCap: { + type: 'simple', + value: 'butt' + }, + width: { + type: 'simple', + value: 0.76 + }, + opacity: { + type: 'simple', + value: 1 + } + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'Road_L@Jingjin#10', + id: 'Road_L@Jingjin#10_range_1(9_10)', + serviceLayerGroupId: 'Level_3', + title: 'min <= X < 3', + layerSourceType: 'VectorTileService', + zoomRange: [9, 10], + layersContent: ['Road_L@Jingjin#10_range_1(9_10)'] + }, + { + filter: ['all', ['==', '$type', 'LineString'], ['>=', 'KD_1', 3], ['<', 'KD_1', 4]], + visualization: { + renderer: [ + { + lineDasharray: { + type: 'simple', + value: [1, 0] + }, + color: { + type: 'simple', + value: 'rgba(250,225,143,1.00)' + }, + lineTranslateAnchor: { + type: 'simple', + value: 'map' + }, + lineMiterLimit: { + type: 'simple', + value: 2 + }, + lineOffset: { + type: 'simple', + value: 0 + }, + lineJoin: { + type: 'simple', + value: 'miter' + }, + lineRoundLimit: { + type: 'simple', + value: 1.05 + }, + lineTranslate: { + type: 'simple', + value: [0, 0] + }, + lineGapWidth: { + type: 'simple', + value: 0 + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'line-0', + style: { + layout: { + visibility: 'visible', + 'line-miter-limit': 2, + 'line-round-limit': 1.05, + 'line-join': 'miter', + 'line-cap': 'butt' + }, + paint: { + 'line-translate-anchor': 'map', + 'line-width': 0.76, + 'line-gap-width': 0, + 'line-offset': 0, + 'line-opacity': 1, + 'line-translate': [0, 0], + 'line-color': 'rgba(250,225,143,1.00)' + } + } + } + }, + lineCap: { + type: 'simple', + value: 'butt' + }, + width: { + type: 'simple', + value: 0.76 + }, + opacity: { + type: 'simple', + value: 1 + } + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'Road_L@Jingjin#10', + id: 'Road_L@Jingjin#10_range_2(9_10)', + serviceLayerGroupId: 'Level_3', + title: '3 <= X < 4', + layerSourceType: 'VectorTileService', + zoomRange: [9, 10], + layersContent: ['Road_L@Jingjin#10_range_2(9_10)'] + }, + { + filter: ['all', ['==', '$type', 'LineString'], ['>=', 'KD_1', 4]], + visualization: { + renderer: [ + { + lineDasharray: { + type: 'simple', + value: [1, 0] + }, + color: { + type: 'simple', + value: 'rgba(235,232,152,1.00)' + }, + lineTranslateAnchor: { + type: 'simple', + value: 'map' + }, + lineMiterLimit: { + type: 'simple', + value: 2 + }, + lineOffset: { + type: 'simple', + value: 0 + }, + lineJoin: { + type: 'simple', + value: 'miter' + }, + lineRoundLimit: { + type: 'simple', + value: 1.05 + }, + lineTranslate: { + type: 'simple', + value: [0, 0] + }, + lineGapWidth: { + type: 'simple', + value: 0 + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'line-0', + style: { + layout: { + visibility: 'visible', + 'line-miter-limit': 2, + 'line-round-limit': 1.05, + 'line-join': 'miter', + 'line-cap': 'butt' + }, + paint: { + 'line-translate-anchor': 'map', + 'line-width': 0.76, + 'line-gap-width': 0, + 'line-offset': 0, + 'line-opacity': 1, + 'line-translate': [0, 0], + 'line-color': 'rgba(235,232,152,1.00)' + } + } + } + }, + lineCap: { + type: 'simple', + value: 'butt' + }, + width: { + type: 'simple', + value: 0.76 + }, + opacity: { + type: 'simple', + value: 1 + } + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'Road_L@Jingjin#10', + id: 'Road_L@Jingjin#10_range_3(9_10)', + serviceLayerGroupId: 'Level_3', + title: '4 <= X < max', + layerSourceType: 'VectorTileService', + zoomRange: [9, 10], + layersContent: ['Road_L@Jingjin#10_range_3(9_10)'] + } + ], + name: 'Road_L@Jingjin', + id: 'group_Road_L@Jingjin#10_1764665757037_47' + } + ], + name: 'Level_3', + id: 'group_Level_3_1764665757037_44' + }, + { + visible: true, + catalogType: 'group', + children: [ + { + filter: ['all', ['==', '$type', 'LineString'], ['has', 'name_2'], ['!=', 'name_2', '']], + visualization: { + renderer: [ + { + rotate: { + type: 'simple', + value: 0 + }, + textLetterSpacing: { + type: 'simple', + value: 0 + }, + textTranslate: { + type: 'simple', + value: [0, 0] + }, + color: { + type: 'simple', + value: '#000000' + }, + symbolPlacement: { + type: 'simple', + value: 'point' + }, + textAnchor: { + type: 'simple', + value: 'center' + }, + translate: { + type: 'simple', + value: [0, 0] + }, + textRotate: { + type: 'simple', + value: 360 + }, + textField: { + type: 'simple', + value: 'name_2' + }, + textHaloBlur: { + type: 'simple', + value: 0 + }, + transform: { + type: 'simple', + value: 'none' + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'BGRR_6C9F41_8_{name_2_len}', + style: { + layout: { + 'icon-image': 'BGRR_6C9F41_8_{name_2_len}' + } + } + } + }, + textTranslateAnchor: { + type: 'simple', + value: 'map' + }, + justify: { + type: 'simple', + value: 'left' + }, + ignorePlacement: { + type: 'simple', + value: false + }, + textAllowOverlap: { + type: 'simple', + value: false + }, + maxWidth: { + type: 'simple', + value: 10 + }, + textSize: { + type: 'simple', + value: 8.4 + }, + textHaloColor: { + type: 'simple', + value: 'rgba(0, 0, 0, 0)' + }, + textColor: { + type: 'simple', + value: 'rgba(255,255,255,1.00)' + }, + size: { + type: 'simple', + value: 100 + }, + allowOverlap: { + type: 'simple', + value: false + }, + translateAnchor: { + type: 'simple', + value: 'map' + }, + anchor: { + type: 'simple', + value: 'center' + }, + textOpacity: { + type: 'simple', + value: 1 + }, + textHaloWidth: { + type: 'simple', + value: 0 + }, + lineHeight: { + type: 'simple', + value: 1.2 + }, + textFont: { + type: 'simple', + value: ['MS PGothic Bold', 'MS PGothic'] + }, + textIgnorePlacement: { + type: 'simple', + value: false + }, + opacity: { + type: 'simple', + value: 1 + } + }, + { + rotate: { + type: 'simple', + value: 0 + }, + textLetterSpacing: { + type: 'simple', + value: 0 + }, + textTranslate: { + type: 'simple', + value: [0, 0] + }, + color: { + type: 'simple', + value: '#000000' + }, + symbolPlacement: { + type: 'simple', + value: 'point' + }, + textAnchor: { + type: 'simple', + value: 'center' + }, + translate: { + type: 'simple', + value: [0, 0] + }, + textRotate: { + type: 'simple', + value: 360 + }, + textField: { + type: 'simple', + value: 'name_2' + }, + textHaloBlur: { + type: 'simple', + value: 0 + }, + transform: { + type: 'simple', + value: 'none' + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'BGRR_6C9F41_8_{name_2_len}', + style: { + layout: { + 'icon-image': 'BGRR_6C9F41_8_{name_2_len}' + } + } + } + }, + textTranslateAnchor: { + type: 'simple', + value: 'map' + }, + justify: { + type: 'simple', + value: 'left' + }, + ignorePlacement: { + type: 'simple', + value: false + }, + textAllowOverlap: { + type: 'simple', + value: false + }, + maxWidth: { + type: 'simple', + value: 10 + }, + textSize: { + type: 'simple', + value: 8.4 + }, + textHaloColor: { + type: 'simple', + value: 'rgba(0, 0, 0, 0)' + }, + textColor: { + type: 'simple', + value: 'rgba(255,255,255,1.00)' + }, + size: { + type: 'simple', + value: 100 + }, + allowOverlap: { + type: 'simple', + value: false + }, + translateAnchor: { + type: 'simple', + value: 'map' + }, + anchor: { + type: 'simple', + value: 'center' + }, + textOpacity: { + type: 'simple', + value: 1 + }, + textHaloWidth: { + type: 'simple', + value: 0 + }, + lineHeight: { + type: 'simple', + value: 1.2 + }, + textFont: { + type: 'simple', + value: ['MS PGothic Bold', 'MS PGothic'] + }, + textIgnorePlacement: { + type: 'simple', + value: false + }, + opacity: { + type: 'simple', + value: 1 + }, + type: 'text' + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'Road_L@Jingjin#7', + id: 'Road_L@Jingjin#7(10_12)', + serviceLayerGroupId: 'Level_4', + title: 'Road_L_国道', + layerSourceType: 'VectorTileService', + zoomRange: [10, 12], + layersContent: ['Road_L@Jingjin#7(10_12)'] + }, + { + filter: ['all', ['==', '$type', 'LineString'], ['has', 'name_3'], ['!=', 'name_3', '']], + visualization: { + renderer: [ + { + rotate: { + type: 'simple', + value: 0 + }, + textLetterSpacing: { + type: 'simple', + value: 0 + }, + textTranslate: { + type: 'simple', + value: [0, 0] + }, + color: { + type: 'simple', + value: '#000000' + }, + symbolPlacement: { + type: 'simple', + value: 'point' + }, + textAnchor: { + type: 'simple', + value: 'center' + }, + translate: { + type: 'simple', + value: [0, 0] + }, + textRotate: { + type: 'simple', + value: 360 + }, + textField: { + type: 'simple', + value: 'name_3' + }, + textHaloBlur: { + type: 'simple', + value: 0 + }, + transform: { + type: 'simple', + value: 'none' + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'BGRR_CC603F_8_{name_3_len}', + style: { + layout: { + 'icon-image': 'BGRR_CC603F_8_{name_3_len}' + } + } + } + }, + textTranslateAnchor: { + type: 'simple', + value: 'map' + }, + justify: { + type: 'simple', + value: 'left' + }, + ignorePlacement: { + type: 'simple', + value: false + }, + textAllowOverlap: { + type: 'simple', + value: false + }, + maxWidth: { + type: 'simple', + value: 10 + }, + textSize: { + type: 'simple', + value: 8.4 + }, + textHaloColor: { + type: 'simple', + value: 'rgba(0, 0, 0, 0)' + }, + textColor: { + type: 'simple', + value: 'rgba(255,255,255,1.00)' + }, + size: { + type: 'simple', + value: 100 + }, + allowOverlap: { + type: 'simple', + value: false + }, + translateAnchor: { + type: 'simple', + value: 'map' + }, + anchor: { + type: 'simple', + value: 'center' + }, + textOpacity: { + type: 'simple', + value: 1 + }, + textHaloWidth: { + type: 'simple', + value: 0 + }, + lineHeight: { + type: 'simple', + value: 1.2 + }, + textFont: { + type: 'simple', + value: ['MS PGothic Bold', 'MS PGothic'] + }, + textIgnorePlacement: { + type: 'simple', + value: false + }, + opacity: { + type: 'simple', + value: 1 + } + }, + { + rotate: { + type: 'simple', + value: 0 + }, + textLetterSpacing: { + type: 'simple', + value: 0 + }, + textTranslate: { + type: 'simple', + value: [0, 0] + }, + color: { + type: 'simple', + value: '#000000' + }, + symbolPlacement: { + type: 'simple', + value: 'point' + }, + textAnchor: { + type: 'simple', + value: 'center' + }, + translate: { + type: 'simple', + value: [0, 0] + }, + textRotate: { + type: 'simple', + value: 360 + }, + textField: { + type: 'simple', + value: 'name_3' + }, + textHaloBlur: { + type: 'simple', + value: 0 + }, + transform: { + type: 'simple', + value: 'none' + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'BGRR_CC603F_8_{name_3_len}', + style: { + layout: { + 'icon-image': 'BGRR_CC603F_8_{name_3_len}' + } + } + } + }, + textTranslateAnchor: { + type: 'simple', + value: 'map' + }, + justify: { + type: 'simple', + value: 'left' + }, + ignorePlacement: { + type: 'simple', + value: false + }, + textAllowOverlap: { + type: 'simple', + value: false + }, + maxWidth: { + type: 'simple', + value: 10 + }, + textSize: { + type: 'simple', + value: 8.4 + }, + textHaloColor: { + type: 'simple', + value: 'rgba(0, 0, 0, 0)' + }, + textColor: { + type: 'simple', + value: 'rgba(255,255,255,1.00)' + }, + size: { + type: 'simple', + value: 100 + }, + allowOverlap: { + type: 'simple', + value: false + }, + translateAnchor: { + type: 'simple', + value: 'map' + }, + anchor: { + type: 'simple', + value: 'center' + }, + textOpacity: { + type: 'simple', + value: 1 + }, + textHaloWidth: { + type: 'simple', + value: 0 + }, + lineHeight: { + type: 'simple', + value: 1.2 + }, + textFont: { + type: 'simple', + value: ['MS PGothic Bold', 'MS PGothic'] + }, + textIgnorePlacement: { + type: 'simple', + value: false + }, + opacity: { + type: 'simple', + value: 1 + }, + type: 'text' + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'Road_L@Jingjin#6', + id: 'Road_L@Jingjin#6(10_12)', + serviceLayerGroupId: 'Level_4', + title: 'Road_L_省道', + layerSourceType: 'VectorTileService', + zoomRange: [10, 12], + layersContent: ['Road_L@Jingjin#6(10_12)'] + }, + { + visible: true, + catalogType: 'group', + children: [ + { + filter: ['all', ['==', '$type', 'LineString']], + visualization: { + renderer: [ + { + lineDasharray: { + type: 'simple', + value: [1, 0] + }, + color: { + type: 'simple', + value: 'rgba(181,181,181,1.00)' + }, + lineTranslateAnchor: { + type: 'simple', + value: 'map' + }, + lineMiterLimit: { + type: 'simple', + value: 2 + }, + lineOffset: { + type: 'simple', + value: 0 + }, + lineJoin: { + type: 'simple', + value: 'miter' + }, + lineRoundLimit: { + type: 'simple', + value: 1.05 + }, + lineTranslate: { + type: 'simple', + value: [0, 0] + }, + lineGapWidth: { + type: 'simple', + value: 0 + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'line-0', + style: { + layout: { + visibility: 'visible', + 'line-miter-limit': 2, + 'line-round-limit': 1.05, + 'line-cap': 'square', + 'line-join': 'miter' + }, + paint: { + 'line-translate-anchor': 'map', + 'line-width': 3.4, + 'line-gap-width': 0, + 'line-offset': 0, + 'line-opacity': 1, + 'line-translate': [0, 0], + 'line-color': 'rgba(181,181,181,1.00)' + } + } + } + }, + lineCap: { + type: 'simple', + value: 'square' + }, + width: { + type: 'simple', + value: 3.4 + }, + opacity: { + type: 'simple', + value: 1 + } + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'Railway_L@Jingjin', + id: 'Railway_L@Jingjin_0(10_12)', + serviceLayerGroupId: 'Level_4', + title: 'Railway_L@Jingjin', + layerSourceType: 'VectorTileService', + zoomRange: [10, 12], + layersContent: ['Railway_L@Jingjin_0(10_12)'] + }, + { + filter: ['all', ['==', '$type', 'LineString']], + visualization: { + renderer: [ + { + lineDasharray: { + type: 'simple', + value: [10, 10] + }, + color: { + type: 'simple', + value: 'rgba(255,255,255,1.00)' + }, + lineTranslateAnchor: { + type: 'simple', + value: 'map' + }, + lineMiterLimit: { + type: 'simple', + value: 2 + }, + lineOffset: { + type: 'simple', + value: 0 + }, + lineJoin: { + type: 'simple', + value: 'miter' + }, + lineRoundLimit: { + type: 'simple', + value: 1.05 + }, + lineTranslate: { + type: 'simple', + value: [0, 0] + }, + lineGapWidth: { + type: 'simple', + value: 0 + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'line-0', + style: { + layout: { + visibility: 'visible', + 'line-miter-limit': 2, + 'line-round-limit': 1.05, + 'line-cap': 'square', + 'line-join': 'miter' + }, + paint: { + 'line-translate-anchor': 'map', + 'line-width': 1.51, + 'line-gap-width': 0, + 'line-offset': 0, + 'line-opacity': 1, + 'line-dasharray': [10, 10], + 'line-translate': [0, 0], + 'line-color': 'rgba(255,255,255,1.00)' + } + } + } + }, + lineCap: { + type: 'simple', + value: 'square' + }, + width: { + type: 'simple', + value: 1.51 + }, + opacity: { + type: 'simple', + value: 1 + } + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'Railway_L@Jingjin', + id: 'Railway_L@Jingjin_1(10_12)', + serviceLayerGroupId: 'Level_4', + title: 'Railway_L@Jingjin', + layerSourceType: 'VectorTileService', + zoomRange: [10, 12], + layersContent: ['Railway_L@Jingjin_1(10_12)'] + } + ], + name: 'Railway_L@Jingjin', + id: 'group_Railway_L@Jingjin_1764665757037_58' + }, + { + visible: true, + catalogType: 'group', + children: [ + { + filter: ['all', ['==', '$type', 'LineString'], ['<', 'KD_1', 3]], + visualization: { + renderer: [ + { + lineDasharray: { + type: 'simple', + value: [1, 0] + }, + color: { + type: 'simple', + value: 'rgba(255,206,16,1.00)' + }, + lineTranslateAnchor: { + type: 'simple', + value: 'map' + }, + lineMiterLimit: { + type: 'simple', + value: 2 + }, + lineOffset: { + type: 'simple', + value: 0 + }, + lineJoin: { + type: 'simple', + value: 'miter' + }, + lineRoundLimit: { + type: 'simple', + value: 1.05 + }, + lineTranslate: { + type: 'simple', + value: [0, 0] + }, + lineGapWidth: { + type: 'simple', + value: 0 + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'line-0', + style: { + layout: { + visibility: 'visible', + 'line-miter-limit': 2, + 'line-round-limit': 1.05, + 'line-join': 'miter', + 'line-cap': 'butt' + }, + paint: { + 'line-translate-anchor': 'map', + 'line-width': 1.51, + 'line-gap-width': 0, + 'line-offset': 0, + 'line-opacity': 1, + 'line-translate': [0, 0], + 'line-color': 'rgba(255,206,16,1.00)' + } + } + } + }, + lineCap: { + type: 'simple', + value: 'butt' + }, + width: { + type: 'simple', + value: 1.51 + }, + opacity: { + type: 'simple', + value: 1 + } + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'Road_L@Jingjin#5', + id: 'Road_L@Jingjin#5_range_1(10_12)', + serviceLayerGroupId: 'Level_4', + title: 'min < X < 3', + layerSourceType: 'VectorTileService', + zoomRange: [10, 12], + layersContent: ['Road_L@Jingjin#5_range_1(10_12)'] + }, + { + filter: ['all', ['==', '$type', 'LineString'], ['>=', 'KD_1', 3], ['<', 'KD_1', 4]], + visualization: { + renderer: [ + { + lineDasharray: { + type: 'simple', + value: [1, 0] + }, + color: { + type: 'simple', + value: 'rgba(250,246,162,1.00)' + }, + lineTranslateAnchor: { + type: 'simple', + value: 'map' + }, + lineMiterLimit: { + type: 'simple', + value: 2 + }, + lineOffset: { + type: 'simple', + value: 0 + }, + lineJoin: { + type: 'simple', + value: 'miter' + }, + lineRoundLimit: { + type: 'simple', + value: 1.05 + }, + lineTranslate: { + type: 'simple', + value: [0, 0] + }, + lineGapWidth: { + type: 'simple', + value: 0 + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'line-0', + style: { + layout: { + visibility: 'visible', + 'line-miter-limit': 2, + 'line-round-limit': 1.05, + 'line-join': 'miter', + 'line-cap': 'butt' + }, + paint: { + 'line-translate-anchor': 'map', + 'line-width': 1.51, + 'line-gap-width': 0, + 'line-offset': 0, + 'line-opacity': 1, + 'line-translate': [0, 0], + 'line-color': 'rgba(250,246,162,1.00)' + } + } + } + }, + lineCap: { + type: 'simple', + value: 'butt' + }, + width: { + type: 'simple', + value: 1.51 + }, + opacity: { + type: 'simple', + value: 1 + } + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'Road_L@Jingjin#5', + id: 'Road_L@Jingjin#5_range_2(10_12)', + serviceLayerGroupId: 'Level_4', + title: '3 <= X < 4', + layerSourceType: 'VectorTileService', + zoomRange: [10, 12], + layersContent: ['Road_L@Jingjin#5_range_2(10_12)'] + }, + { + filter: ['all', ['==', '$type', 'LineString'], ['>=', 'KD_1', 4]], + visualization: { + renderer: [ + { + lineDasharray: { + type: 'simple', + value: [1, 0] + }, + color: { + type: 'simple', + value: 'rgba(255,255,255,1.00)' + }, + lineTranslateAnchor: { + type: 'simple', + value: 'map' + }, + lineMiterLimit: { + type: 'simple', + value: 2 + }, + lineOffset: { + type: 'simple', + value: 0 + }, + lineJoin: { + type: 'simple', + value: 'miter' + }, + lineRoundLimit: { + type: 'simple', + value: 1.05 + }, + lineTranslate: { + type: 'simple', + value: [0, 0] + }, + lineGapWidth: { + type: 'simple', + value: 0 + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'line-0', + style: { + layout: { + visibility: 'visible', + 'line-miter-limit': 2, + 'line-round-limit': 1.05, + 'line-join': 'miter', + 'line-cap': 'butt' + }, + paint: { + 'line-translate-anchor': 'map', + 'line-width': 1.51, + 'line-gap-width': 0, + 'line-offset': 0, + 'line-opacity': 1, + 'line-translate': [0, 0], + 'line-color': 'rgba(255,255,255,1.00)' + } + } + } + }, + lineCap: { + type: 'simple', + value: 'butt' + }, + width: { + type: 'simple', + value: 1.51 + }, + opacity: { + type: 'simple', + value: 1 + } + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'Road_L@Jingjin#5', + id: 'Road_L@Jingjin#5_range_3(10_12)', + serviceLayerGroupId: 'Level_4', + title: '4 <= X < max', + layerSourceType: 'VectorTileService', + zoomRange: [10, 12], + layersContent: ['Road_L@Jingjin#5_range_3(10_12)'] + } + ], + name: 'Road_L@Jingjin#5', + id: 'group_Road_L@Jingjin#5_1764665757037_61' + }, + { + visible: true, + catalogType: 'group', + children: [ + { + filter: ['all', ['==', '$type', 'LineString'], ['<', 'KD_1', 3]], + visualization: { + renderer: [ + { + lineDasharray: { + type: 'simple', + value: [1, 0] + }, + color: { + type: 'simple', + value: 'rgba(172,107,0,1.00)' + }, + lineTranslateAnchor: { + type: 'simple', + value: 'map' + }, + lineMiterLimit: { + type: 'simple', + value: 2 + }, + lineOffset: { + type: 'simple', + value: 0 + }, + lineJoin: { + type: 'simple', + value: 'miter' + }, + lineRoundLimit: { + type: 'simple', + value: 1.05 + }, + lineTranslate: { + type: 'simple', + value: [0, 0] + }, + lineGapWidth: { + type: 'simple', + value: 0 + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'line-0', + style: { + layout: { + visibility: 'visible', + 'line-miter-limit': 2, + 'line-round-limit': 1.05, + 'line-join': 'miter', + 'line-cap': 'butt' + }, + paint: { + 'line-translate-anchor': 'map', + 'line-width': 3.02, + 'line-gap-width': 0, + 'line-offset': 0, + 'line-opacity': 1, + 'line-translate': [0, 0], + 'line-color': 'rgba(172,107,0,1.00)' + } + } + } + }, + lineCap: { + type: 'simple', + value: 'butt' + }, + width: { + type: 'simple', + value: 3.02 + }, + opacity: { + type: 'simple', + value: 1 + } + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'Road_L@Jingjin#4', + id: 'Road_L@Jingjin#4_range_1(10_12)', + serviceLayerGroupId: 'Level_4', + title: 'min < X < 3', + layerSourceType: 'VectorTileService', + zoomRange: [10, 12], + layersContent: ['Road_L@Jingjin#4_range_1(10_12)'] + }, + { + filter: ['all', ['==', '$type', 'LineString'], ['>=', 'KD_1', 3], ['<', 'KD_1', 4]], + visualization: { + renderer: [ + { + lineDasharray: { + type: 'simple', + value: [1, 0] + }, + color: { + type: 'simple', + value: 'rgba(195,183,147,1.00)' + }, + lineTranslateAnchor: { + type: 'simple', + value: 'map' + }, + lineMiterLimit: { + type: 'simple', + value: 2 + }, + lineOffset: { + type: 'simple', + value: 0 + }, + lineJoin: { + type: 'simple', + value: 'miter' + }, + lineRoundLimit: { + type: 'simple', + value: 1.05 + }, + lineTranslate: { + type: 'simple', + value: [0, 0] + }, + lineGapWidth: { + type: 'simple', + value: 0 + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'line-0', + style: { + layout: { + visibility: 'visible', + 'line-miter-limit': 2, + 'line-round-limit': 1.05, + 'line-join': 'miter', + 'line-cap': 'butt' + }, + paint: { + 'line-translate-anchor': 'map', + 'line-width': 3.02, + 'line-gap-width': 0, + 'line-offset': 0, + 'line-opacity': 1, + 'line-translate': [0, 0], + 'line-color': 'rgba(195,183,147,1.00)' + } + } + } + }, + lineCap: { + type: 'simple', + value: 'butt' + }, + width: { + type: 'simple', + value: 3.02 + }, + opacity: { + type: 'simple', + value: 1 + } + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'Road_L@Jingjin#4', + id: 'Road_L@Jingjin#4_range_2(10_12)', + serviceLayerGroupId: 'Level_4', + title: '3 <= X < 4', + layerSourceType: 'VectorTileService', + zoomRange: [10, 12], + layersContent: ['Road_L@Jingjin#4_range_2(10_12)'] + }, + { + filter: ['all', ['==', '$type', 'LineString'], ['>=', 'KD_1', 4]], + visualization: { + renderer: [ + { + lineDasharray: { + type: 'simple', + value: [1, 0] + }, + color: { + type: 'simple', + value: 'rgba(180,180,180,1.00)' + }, + lineTranslateAnchor: { + type: 'simple', + value: 'map' + }, + lineMiterLimit: { + type: 'simple', + value: 2 + }, + lineOffset: { + type: 'simple', + value: 0 + }, + lineJoin: { + type: 'simple', + value: 'miter' + }, + lineRoundLimit: { + type: 'simple', + value: 1.05 + }, + lineTranslate: { + type: 'simple', + value: [0, 0] + }, + lineGapWidth: { + type: 'simple', + value: 0 + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'line-0', + style: { + layout: { + visibility: 'visible', + 'line-miter-limit': 2, + 'line-round-limit': 1.05, + 'line-join': 'miter', + 'line-cap': 'butt' + }, + paint: { + 'line-translate-anchor': 'map', + 'line-width': 3.02, + 'line-gap-width': 0, + 'line-offset': 0, + 'line-opacity': 1, + 'line-translate': [0, 0], + 'line-color': 'rgba(180,180,180,1.00)' + } + } + } + }, + lineCap: { + type: 'simple', + value: 'butt' + }, + width: { + type: 'simple', + value: 3.02 + }, + opacity: { + type: 'simple', + value: 1 + } + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'Road_L@Jingjin#4', + id: 'Road_L@Jingjin#4_range_3(10_12)', + serviceLayerGroupId: 'Level_4', + title: '4 <= X < max', + layerSourceType: 'VectorTileService', + zoomRange: [10, 12], + layersContent: ['Road_L@Jingjin#4_range_3(10_12)'] + } + ], + name: 'Road_L@Jingjin#4', + id: 'group_Road_L@Jingjin#4_1764665757038_65' + }, + { + visible: true, + catalogType: 'group', + children: [ + { + filter: ['all', ['==', '$type', 'Polygon']], + visualization: { + renderer: [ + { + symbolsContent: { + type: 'simple', + value: { + symbolId: 'polygon-0', + style: { + layout: { + visibility: 'visible' + }, + paint: { + 'fill-color': 'rgba(184,221,165,1.00)', + 'fill-opacity': 1, + 'fill-antialias': true + } + } + } + }, + color: { + type: 'simple', + value: 'rgba(184,221,165,1.00)' + }, + antialias: { + type: 'simple', + value: true + }, + outlineColor: { + type: 'simple', + value: '#FFFFFF' + }, + opacity: { + type: 'simple', + value: 1 + } + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'GreenFeild_R@Jingjin#2#2', + id: 'GreenFeild_R@Jingjin#2#2(10_12)', + serviceLayerGroupId: 'Level_4', + title: 'GreenFeild_R@Jingjin', + layerSourceType: 'VectorTileService', + zoomRange: [10, 12], + layersContent: ['GreenFeild_R@Jingjin#2#2(10_12)'] + }, + { + filter: ['all', ['==', '$type', 'Polygon']], + visualization: { + renderer: [ + { + lineDasharray: { + type: 'simple', + value: [1, 0] + }, + color: { + type: 'simple', + value: 'rgba(184,221,165,1.00)' + }, + lineTranslateAnchor: { + type: 'simple', + value: 'map' + }, + lineMiterLimit: { + type: 'simple', + value: 2 + }, + lineOffset: { + type: 'simple', + value: 0 + }, + lineJoin: { + type: 'simple', + value: 'miter' + }, + lineRoundLimit: { + type: 'simple', + value: 1.05 + }, + lineTranslate: { + type: 'simple', + value: [0, 0] + }, + lineGapWidth: { + type: 'simple', + value: 0 + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'line-0', + style: { + layout: { + visibility: 'visible', + 'line-miter-limit': 2, + 'line-round-limit': 1.05, + 'line-join': 'miter', + 'line-cap': 'butt' + }, + paint: { + 'line-translate-anchor': 'map', + 'line-width': 0.38, + 'line-gap-width': 0, + 'line-offset': 0, + 'line-opacity': 1, + 'line-translate': [0, 0], + 'line-color': 'rgba(184,221,165,1.00)' + } + } + } + }, + lineCap: { + type: 'simple', + value: 'butt' + }, + width: { + type: 'simple', + value: 0.38 + }, + opacity: { + type: 'simple', + value: 1 + } + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'GreenFeild_R@Jingjin#2#2', + id: 'GreenFeild_R@Jingjin#2#2_outline(10_12)', + serviceLayerGroupId: 'Level_4', + title: 'GreenFeild_R@Jingjin', + layerSourceType: 'VectorTileService', + zoomRange: [10, 12], + layersContent: ['GreenFeild_R@Jingjin#2#2_outline(10_12)'] + } + ], + name: 'GreenFeild_R@Jingjin', + id: 'group_GreenFeild_R@Jingjin#2#2_1764665757038_69' + } + ], + name: 'Level_4', + id: 'group_Level_4_1764665757037_53' + }, + { + visible: true, + catalogType: 'group', + children: [ + { + filter: ['all', ['==', '$type', 'Point'], ['has', 'ADMINNAME'], ['!=', 'ADMINNAME', '']], + visualization: { + renderer: [ + { + rotate: { + type: 'simple', + value: 0 + }, + textLetterSpacing: { + type: 'simple', + value: 0 + }, + textTranslate: { + type: 'simple', + value: [0, 0] + }, + color: { + type: 'simple', + value: '#000000' + }, + symbolPlacement: { + type: 'simple', + value: 'point' + }, + textAnchor: { + type: 'simple', + value: 'center' + }, + translate: { + type: 'simple', + value: [0, 0] + }, + textRotate: { + type: 'simple', + value: 360 + }, + textField: { + type: 'simple', + value: 'ADMINNAME' + }, + textHaloBlur: { + type: 'simple', + value: 0 + }, + transform: { + type: 'simple', + value: 'none' + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: '', + style: { + layout: { + 'icon-image': '' + } + } + } + }, + textTranslateAnchor: { + type: 'simple', + value: 'map' + }, + justify: { + type: 'simple', + value: 'left' + }, + ignorePlacement: { + type: 'simple', + value: false + }, + textAllowOverlap: { + type: 'simple', + value: false + }, + maxWidth: { + type: 'simple', + value: 10 + }, + textSize: { + type: 'simple', + value: 11.55 + }, + textHaloColor: { + type: 'simple', + value: 'rgba(255,255,255,1.00)' + }, + textColor: { + type: 'simple', + value: 'rgba(164,0,91,1.00)' + }, + size: { + type: 'simple', + value: 100 + }, + allowOverlap: { + type: 'simple', + value: false + }, + translateAnchor: { + type: 'simple', + value: 'map' + }, + anchor: { + type: 'simple', + value: 'center' + }, + textOpacity: { + type: 'simple', + value: 1 + }, + textHaloWidth: { + type: 'simple', + value: 1 + }, + lineHeight: { + type: 'simple', + value: 1.2 + }, + textFont: { + type: 'simple', + value: ['Microsoft YaHei'] + }, + textIgnorePlacement: { + type: 'simple', + value: false + }, + opacity: { + type: 'simple', + value: 1 + } + }, + { + rotate: { + type: 'simple', + value: 0 + }, + textLetterSpacing: { + type: 'simple', + value: 0 + }, + textTranslate: { + type: 'simple', + value: [0, 0] + }, + color: { + type: 'simple', + value: '#000000' + }, + symbolPlacement: { + type: 'simple', + value: 'point' + }, + textAnchor: { + type: 'simple', + value: 'center' + }, + translate: { + type: 'simple', + value: [0, 0] + }, + textRotate: { + type: 'simple', + value: 360 + }, + textField: { + type: 'simple', + value: 'ADMINNAME' + }, + textHaloBlur: { + type: 'simple', + value: 0 + }, + transform: { + type: 'simple', + value: 'none' + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: '', + style: { + layout: { + 'icon-image': '' + } + } + } + }, + textTranslateAnchor: { + type: 'simple', + value: 'map' + }, + justify: { + type: 'simple', + value: 'left' + }, + ignorePlacement: { + type: 'simple', + value: false + }, + textAllowOverlap: { + type: 'simple', + value: false + }, + maxWidth: { + type: 'simple', + value: 10 + }, + textSize: { + type: 'simple', + value: 11.55 + }, + textHaloColor: { + type: 'simple', + value: 'rgba(255,255,255,1.00)' + }, + textColor: { + type: 'simple', + value: 'rgba(164,0,91,1.00)' + }, + size: { + type: 'simple', + value: 100 + }, + allowOverlap: { + type: 'simple', + value: false + }, + translateAnchor: { + type: 'simple', + value: 'map' + }, + anchor: { + type: 'simple', + value: 'center' + }, + textOpacity: { + type: 'simple', + value: 1 + }, + textHaloWidth: { + type: 'simple', + value: 1 + }, + lineHeight: { + type: 'simple', + value: 1.2 + }, + textFont: { + type: 'simple', + value: ['Microsoft YaHei'] + }, + textIgnorePlacement: { + type: 'simple', + value: false + }, + opacity: { + type: 'simple', + value: 1 + }, + type: 'text' + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'County_P@Jingjin#2', + id: 'County_P@Jingjin#2(8_9)', + serviceLayerGroupId: 'Level_2', + title: '行政区划名称', + layerSourceType: 'VectorTileService', + zoomRange: [8, 9], + layersContent: ['County_P@Jingjin#2(8_9)'] + }, + { + filter: ['all', ['==', '$type', 'Point'], ['has', 'ADMINNAME'], ['!=', 'ADMINNAME', '']], + visualization: { + renderer: [ + { + rotate: { + type: 'simple', + value: 0 + }, + textLetterSpacing: { + type: 'simple', + value: 0 + }, + textTranslate: { + type: 'simple', + value: [0, 0] + }, + color: { + type: 'simple', + value: '#000000' + }, + symbolPlacement: { + type: 'simple', + value: 'point' + }, + textAnchor: { + type: 'simple', + value: 'bottom' + }, + translate: { + type: 'simple', + value: [0, 0] + }, + textRotate: { + type: 'simple', + value: 360 + }, + textField: { + type: 'simple', + value: 'ADMINNAME' + }, + textHaloBlur: { + type: 'simple', + value: 0 + }, + transform: { + type: 'simple', + value: 'none' + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: '', + style: { + layout: { + 'icon-image': '' + } + } + } + }, + textTranslateAnchor: { + type: 'simple', + value: 'map' + }, + justify: { + type: 'simple', + value: 'left' + }, + ignorePlacement: { + type: 'simple', + value: false + }, + textAllowOverlap: { + type: 'simple', + value: false + }, + maxWidth: { + type: 'simple', + value: 10 + }, + textSize: { + type: 'simple', + value: 12.6 + }, + textHaloColor: { + type: 'simple', + value: 'rgba(255,255,255,1.00)' + }, + textColor: { + type: 'simple', + value: 'rgba(192,0,0,1.00)' + }, + size: { + type: 'simple', + value: 100 + }, + allowOverlap: { + type: 'simple', + value: false + }, + translateAnchor: { + type: 'simple', + value: 'map' + }, + anchor: { + type: 'simple', + value: 'center' + }, + textOpacity: { + type: 'simple', + value: 1 + }, + textHaloWidth: { + type: 'simple', + value: 1 + }, + lineHeight: { + type: 'simple', + value: 1.2 + }, + textFont: { + type: 'simple', + value: ['Microsoft YaHei'] + }, + textIgnorePlacement: { + type: 'simple', + value: false + }, + opacity: { + type: 'simple', + value: 1 + } + }, + { + rotate: { + type: 'simple', + value: 0 + }, + textLetterSpacing: { + type: 'simple', + value: 0 + }, + textTranslate: { + type: 'simple', + value: [0, 0] + }, + color: { + type: 'simple', + value: '#000000' + }, + symbolPlacement: { + type: 'simple', + value: 'point' + }, + textAnchor: { + type: 'simple', + value: 'bottom' + }, + translate: { + type: 'simple', + value: [0, 0] + }, + textRotate: { + type: 'simple', + value: 360 + }, + textField: { + type: 'simple', + value: 'ADMINNAME' + }, + textHaloBlur: { + type: 'simple', + value: 0 + }, + transform: { + type: 'simple', + value: 'none' + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: '', + style: { + layout: { + 'icon-image': '' + } + } + } + }, + textTranslateAnchor: { + type: 'simple', + value: 'map' + }, + justify: { + type: 'simple', + value: 'left' + }, + ignorePlacement: { + type: 'simple', + value: false + }, + textAllowOverlap: { + type: 'simple', + value: false + }, + maxWidth: { + type: 'simple', + value: 10 + }, + textSize: { + type: 'simple', + value: 12.6 + }, + textHaloColor: { + type: 'simple', + value: 'rgba(255,255,255,1.00)' + }, + textColor: { + type: 'simple', + value: 'rgba(192,0,0,1.00)' + }, + size: { + type: 'simple', + value: 100 + }, + allowOverlap: { + type: 'simple', + value: false + }, + translateAnchor: { + type: 'simple', + value: 'map' + }, + anchor: { + type: 'simple', + value: 'center' + }, + textOpacity: { + type: 'simple', + value: 1 + }, + textHaloWidth: { + type: 'simple', + value: 1 + }, + lineHeight: { + type: 'simple', + value: 1.2 + }, + textFont: { + type: 'simple', + value: ['Microsoft YaHei'] + }, + textIgnorePlacement: { + type: 'simple', + value: false + }, + opacity: { + type: 'simple', + value: 1 + }, + type: 'text' + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'Captital_P@Jingjin#2#1', + id: 'Captital_P@Jingjin#2#1(8_8)', + popupInfo: { + elements: [ + { + fieldName: 'ADMINCODE', + type: 'FIELD' + }, + { + fieldName: 'ADMINNAME', + type: 'FIELD' + }, + { + fieldName: 'SmID', + type: 'FIELD' + }, + { + fieldName: 'SmUserID', + type: 'FIELD' + } + ], + title: 'Captital_P@Jingjin#2' + }, + serviceLayerGroupId: 'Level_2', + title: 'Captital_P@Jingjin#2', + layerSourceType: 'VectorTileService', + zoomRange: [8, 8], + layersContent: ['Captital_P@Jingjin#2#1(8_8)'] + }, + { + visible: true, + catalogType: 'group', + children: [ + { + filter: ['all', ['==', '$type', 'LineString'], ['<', 'KD_1', 3]], + visualization: { + renderer: [ + { + lineDasharray: { + type: 'simple', + value: [1, 0] + }, + color: { + type: 'simple', + value: 'rgba(255,165,56,1.00)' + }, + lineTranslateAnchor: { + type: 'simple', + value: 'map' + }, + lineMiterLimit: { + type: 'simple', + value: 2 + }, + lineOffset: { + type: 'simple', + value: 0 + }, + lineJoin: { + type: 'simple', + value: 'miter' + }, + lineRoundLimit: { + type: 'simple', + value: 1.05 + }, + lineTranslate: { + type: 'simple', + value: [0, 0] + }, + lineGapWidth: { + type: 'simple', + value: 0 + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'line-0', + style: { + layout: { + visibility: 'visible', + 'line-miter-limit': 2, + 'line-round-limit': 1.05, + 'line-join': 'miter', + 'line-cap': 'butt' + }, + paint: { + 'line-translate-anchor': 'map', + 'line-width': 0.76, + 'line-gap-width': 0, + 'line-offset': 0, + 'line-opacity': 1, + 'line-translate': [0, 0], + 'line-color': 'rgba(255,165,56,1.00)' + } + } + } + }, + lineCap: { + type: 'simple', + value: 'butt' + }, + width: { + type: 'simple', + value: 0.76 + }, + opacity: { + type: 'simple', + value: 1 + } + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'Road_L@Jingjin#1#1', + id: 'Road_L@Jingjin#1#1_range_1(8_9)', + serviceLayerGroupId: 'Level_2', + title: 'min <= X < 3', + layerSourceType: 'VectorTileService', + zoomRange: [8, 9], + layersContent: ['Road_L@Jingjin#1#1_range_1(8_9)'] + }, + { + filter: ['all', ['==', '$type', 'LineString'], ['>=', 'KD_1', 3], ['<', 'KD_1', 4]], + visualization: { + renderer: [ + { + lineDasharray: { + type: 'simple', + value: [1, 0] + }, + color: { + type: 'simple', + value: 'rgba(250,225,143,1.00)' + }, + lineTranslateAnchor: { + type: 'simple', + value: 'map' + }, + lineMiterLimit: { + type: 'simple', + value: 2 + }, + lineOffset: { + type: 'simple', + value: 0 + }, + lineJoin: { + type: 'simple', + value: 'miter' + }, + lineRoundLimit: { + type: 'simple', + value: 1.05 + }, + lineTranslate: { + type: 'simple', + value: [0, 0] + }, + lineGapWidth: { + type: 'simple', + value: 0 + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'line-0', + style: { + layout: { + visibility: 'visible', + 'line-miter-limit': 2, + 'line-round-limit': 1.05, + 'line-join': 'miter', + 'line-cap': 'butt' + }, + paint: { + 'line-translate-anchor': 'map', + 'line-width': 0.76, + 'line-gap-width': 0, + 'line-offset': 0, + 'line-opacity': 1, + 'line-translate': [0, 0], + 'line-color': 'rgba(250,225,143,1.00)' + } + } + } + }, + lineCap: { + type: 'simple', + value: 'butt' + }, + width: { + type: 'simple', + value: 0.76 + }, + opacity: { + type: 'simple', + value: 1 + } + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'Road_L@Jingjin#1#1', + id: 'Road_L@Jingjin#1#1_range_2(8_9)', + serviceLayerGroupId: 'Level_2', + title: '3 <= X < 4', + layerSourceType: 'VectorTileService', + zoomRange: [8, 9], + layersContent: ['Road_L@Jingjin#1#1_range_2(8_9)'] + }, + { + filter: ['all', ['==', '$type', 'LineString'], ['>=', 'KD_1', 4]], + visualization: { + renderer: [ + { + lineDasharray: { + type: 'simple', + value: [1, 0] + }, + color: { + type: 'simple', + value: 'rgba(235,232,152,1.00)' + }, + lineTranslateAnchor: { + type: 'simple', + value: 'map' + }, + lineMiterLimit: { + type: 'simple', + value: 2 + }, + lineOffset: { + type: 'simple', + value: 0 + }, + lineJoin: { + type: 'simple', + value: 'miter' + }, + lineRoundLimit: { + type: 'simple', + value: 1.05 + }, + lineTranslate: { + type: 'simple', + value: [0, 0] + }, + lineGapWidth: { + type: 'simple', + value: 0 + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'line-0', + style: { + layout: { + visibility: 'visible', + 'line-miter-limit': 2, + 'line-round-limit': 1.05, + 'line-join': 'miter', + 'line-cap': 'butt' + }, + paint: { + 'line-translate-anchor': 'map', + 'line-width': 0.76, + 'line-gap-width': 0, + 'line-offset': 0, + 'line-opacity': 1, + 'line-translate': [0, 0], + 'line-color': 'rgba(235,232,152,1.00)' + } + } + } + }, + lineCap: { + type: 'simple', + value: 'butt' + }, + width: { + type: 'simple', + value: 0.76 + }, + opacity: { + type: 'simple', + value: 1 + } + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'Road_L@Jingjin#1#1', + id: 'Road_L@Jingjin#1#1_range_3(8_9)', + serviceLayerGroupId: 'Level_2', + title: '4 <= X < max', + layerSourceType: 'VectorTileService', + zoomRange: [8, 9], + layersContent: ['Road_L@Jingjin#1#1_range_3(8_9)'] + } + ], + name: 'Road_L@Jingjin#1', + id: 'group_Road_L@Jingjin#1#1_1764665757038_77' + } + ], + name: 'Level_2', + id: 'group_Level_2_1764665757038_72' + }, + { + visible: true, + catalogType: 'group', + children: [ + { + visible: true, + catalogType: 'group', + children: [ + { + filter: [ + 'all', + ['==', '$type', 'Point'], + ['==', 'ADMINNAME', '北京'], + ['has', 'ADMINNAME'], + ['!=', 'ADMINNAME', ''] + ], + visualization: { + renderer: [ + { + rotate: { + type: 'simple', + value: 0 + }, + textLetterSpacing: { + type: 'simple', + value: 0 + }, + textTranslate: { + type: 'simple', + value: [0, -7] + }, + color: { + type: 'simple', + value: '#000000' + }, + symbolPlacement: { + type: 'simple', + value: 'point' + }, + textAnchor: { + type: 'simple', + value: 'bottom' + }, + translate: { + type: 'simple', + value: [0, 1] + }, + textRotate: { + type: 'simple', + value: 360 + }, + textField: { + type: 'simple', + value: 'ADMINNAME' + }, + textHaloBlur: { + type: 'simple', + value: 0 + }, + transform: { + type: 'simple', + value: 'none' + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'marker_75_3_FF0000', + style: { + layout: { + 'icon-image': 'marker_75_3_FF0000' + } + } + } + }, + textTranslateAnchor: { + type: 'simple', + value: 'map' + }, + justify: { + type: 'simple', + value: 'left' + }, + ignorePlacement: { + type: 'simple', + value: false + }, + textAllowOverlap: { + type: 'simple', + value: false + }, + maxWidth: { + type: 'simple', + value: 10 + }, + textSize: { + type: 'simple', + value: 12.6 + }, + textHaloColor: { + type: 'simple', + value: 'rgba(255,255,255,1.00)' + }, + textColor: { + type: 'simple', + value: 'rgba(192,0,0,1.00)' + }, + size: { + type: 'simple', + value: 14 + }, + allowOverlap: { + type: 'simple', + value: false + }, + translateAnchor: { + type: 'simple', + value: 'map' + }, + anchor: { + type: 'simple', + value: 'center' + }, + textOpacity: { + type: 'simple', + value: 1 + }, + textHaloWidth: { + type: 'simple', + value: 1 + }, + lineHeight: { + type: 'simple', + value: 1.2 + }, + textFont: { + type: 'simple', + value: ['Microsoft YaHei'] + }, + textIgnorePlacement: { + type: 'simple', + value: false + }, + opacity: { + type: 'simple', + value: 1 + } + }, + { + rotate: { + type: 'simple', + value: 0 + }, + textLetterSpacing: { + type: 'simple', + value: 0 + }, + textTranslate: { + type: 'simple', + value: [0, -7] + }, + color: { + type: 'simple', + value: '#000000' + }, + symbolPlacement: { + type: 'simple', + value: 'point' + }, + textAnchor: { + type: 'simple', + value: 'bottom' + }, + translate: { + type: 'simple', + value: [0, 1] + }, + textRotate: { + type: 'simple', + value: 360 + }, + textField: { + type: 'simple', + value: 'ADMINNAME' + }, + textHaloBlur: { + type: 'simple', + value: 0 + }, + transform: { + type: 'simple', + value: 'none' + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'marker_75_3_FF0000', + style: { + layout: { + 'icon-image': 'marker_75_3_FF0000' + } + } + } + }, + textTranslateAnchor: { + type: 'simple', + value: 'map' + }, + justify: { + type: 'simple', + value: 'left' + }, + ignorePlacement: { + type: 'simple', + value: false + }, + textAllowOverlap: { + type: 'simple', + value: false + }, + maxWidth: { + type: 'simple', + value: 10 + }, + textSize: { + type: 'simple', + value: 12.6 + }, + textHaloColor: { + type: 'simple', + value: 'rgba(255,255,255,1.00)' + }, + textColor: { + type: 'simple', + value: 'rgba(192,0,0,1.00)' + }, + size: { + type: 'simple', + value: 14 + }, + allowOverlap: { + type: 'simple', + value: false + }, + translateAnchor: { + type: 'simple', + value: 'map' + }, + anchor: { + type: 'simple', + value: 'center' + }, + textOpacity: { + type: 'simple', + value: 1 + }, + textHaloWidth: { + type: 'simple', + value: 1 + }, + lineHeight: { + type: 'simple', + value: 1.2 + }, + textFont: { + type: 'simple', + value: ['Microsoft YaHei'] + }, + textIgnorePlacement: { + type: 'simple', + value: false + }, + opacity: { + type: 'simple', + value: 1 + }, + type: 'text' + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'Captital_P@Jingjin#2#2', + id: 'Captital_P@Jingjin#1_uniqueandlabel_北京(0_8)', + serviceLayerGroupId: 'Level_1', + title: 'Captital_P@Jingjin#2', + layerSourceType: 'VectorTileService', + zoomRange: [0, 8], + layersContent: ['Captital_P@Jingjin#1_uniqueandlabel_北京(0_8)'] + }, + { + filter: [ + 'all', + ['==', '$type', 'Point'], + ['==', 'ADMINNAME', '天津'], + ['has', 'ADMINNAME'], + ['!=', 'ADMINNAME', ''] + ], + visualization: { + renderer: [ + { + rotate: { + type: 'simple', + value: 0 + }, + textLetterSpacing: { + type: 'simple', + value: 0 + }, + textTranslate: { + type: 'simple', + value: [0, -2] + }, + color: { + type: 'simple', + value: '#000000' + }, + symbolPlacement: { + type: 'simple', + value: 'point' + }, + textAnchor: { + type: 'simple', + value: 'bottom' + }, + translate: { + type: 'simple', + value: [0, 0] + }, + textRotate: { + type: 'simple', + value: 360 + }, + textField: { + type: 'simple', + value: 'ADMINNAME' + }, + textHaloBlur: { + type: 'simple', + value: 0 + }, + transform: { + type: 'simple', + value: 'none' + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'marker_0_2_C00000', + style: { + layout: { + 'icon-image': 'marker_0_2_C00000' + } + } + } + }, + textTranslateAnchor: { + type: 'simple', + value: 'map' + }, + justify: { + type: 'simple', + value: 'left' + }, + ignorePlacement: { + type: 'simple', + value: false + }, + textAllowOverlap: { + type: 'simple', + value: false + }, + maxWidth: { + type: 'simple', + value: 10 + }, + textSize: { + type: 'simple', + value: 12.6 + }, + textHaloColor: { + type: 'simple', + value: 'rgba(255,255,255,1.00)' + }, + textColor: { + type: 'simple', + value: 'rgba(192,0,0,1.00)' + }, + size: { + type: 'simple', + value: 5 + }, + allowOverlap: { + type: 'simple', + value: false + }, + translateAnchor: { + type: 'simple', + value: 'map' + }, + anchor: { + type: 'simple', + value: 'center' + }, + textOpacity: { + type: 'simple', + value: 1 + }, + textHaloWidth: { + type: 'simple', + value: 1 + }, + lineHeight: { + type: 'simple', + value: 1.2 + }, + textFont: { + type: 'simple', + value: ['Microsoft YaHei'] + }, + textIgnorePlacement: { + type: 'simple', + value: false + }, + opacity: { + type: 'simple', + value: 1 + } + }, + { + rotate: { + type: 'simple', + value: 0 + }, + textLetterSpacing: { + type: 'simple', + value: 0 + }, + textTranslate: { + type: 'simple', + value: [0, -2] + }, + color: { + type: 'simple', + value: '#000000' + }, + symbolPlacement: { + type: 'simple', + value: 'point' + }, + textAnchor: { + type: 'simple', + value: 'bottom' + }, + translate: { + type: 'simple', + value: [0, 0] + }, + textRotate: { + type: 'simple', + value: 360 + }, + textField: { + type: 'simple', + value: 'ADMINNAME' + }, + textHaloBlur: { + type: 'simple', + value: 0 + }, + transform: { + type: 'simple', + value: 'none' + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'marker_0_2_C00000', + style: { + layout: { + 'icon-image': 'marker_0_2_C00000' + } + } + } + }, + textTranslateAnchor: { + type: 'simple', + value: 'map' + }, + justify: { + type: 'simple', + value: 'left' + }, + ignorePlacement: { + type: 'simple', + value: false + }, + textAllowOverlap: { + type: 'simple', + value: false + }, + maxWidth: { + type: 'simple', + value: 10 + }, + textSize: { + type: 'simple', + value: 12.6 + }, + textHaloColor: { + type: 'simple', + value: 'rgba(255,255,255,1.00)' + }, + textColor: { + type: 'simple', + value: 'rgba(192,0,0,1.00)' + }, + size: { + type: 'simple', + value: 5 + }, + allowOverlap: { + type: 'simple', + value: false + }, + translateAnchor: { + type: 'simple', + value: 'map' + }, + anchor: { + type: 'simple', + value: 'center' + }, + textOpacity: { + type: 'simple', + value: 1 + }, + textHaloWidth: { + type: 'simple', + value: 1 + }, + lineHeight: { + type: 'simple', + value: 1.2 + }, + textFont: { + type: 'simple', + value: ['Microsoft YaHei'] + }, + textIgnorePlacement: { + type: 'simple', + value: false + }, + opacity: { + type: 'simple', + value: 1 + }, + type: 'text' + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'Captital_P@Jingjin#2#2', + id: 'Captital_P@Jingjin#1_uniqueandlabel_天津(0_8)', + serviceLayerGroupId: 'Level_1', + title: 'Captital_P@Jingjin#2', + layerSourceType: 'VectorTileService', + zoomRange: [0, 8], + layersContent: ['Captital_P@Jingjin#1_uniqueandlabel_天津(0_8)'] + } + ], + name: 'Captital_P@Jingjin#2', + id: 'group_Captital_P@Jingjin#2#2_1764665757038_82' + }, + { + filter: ['all', ['==', '$type', 'Point']], + visualization: { + renderer: [ + { + rotate: { + type: 'simple', + value: 0 + }, + textLetterSpacing: { + type: 'simple', + value: 0 + }, + textTranslate: { + type: 'simple', + value: [0, 0] + }, + color: { + type: 'simple', + value: '#000000' + }, + symbolPlacement: { + type: 'simple', + value: 'point' + }, + textAnchor: { + type: 'simple', + value: 'center' + }, + translate: { + type: 'simple', + value: [0, 0] + }, + textRotate: { + type: 'simple', + value: 0 + }, + textField: { + type: 'simple', + value: '' + }, + textHaloBlur: { + type: 'simple', + value: 0 + }, + transform: { + type: 'simple', + value: 'none' + }, + symbolsContent: { + field: ['ADMINNAME'], + defaultValue: { + symbolId: 'marker_0_2_000000', + style: { + layout: { + 'icon-image': 'marker_0_2_000000' + } + } + }, + values: [ + { + value: { + symbolId: 'marker_75_3_FF0000', + style: { + layout: { + 'icon-image': 'marker_75_3_FF0000' + } + } + }, + key: '北京' + }, + { + value: { + symbolId: 'marker_0_2_C00000', + style: { + layout: { + 'icon-image': 'marker_0_2_C00000' + } + } + }, + key: '天津' + } + ], + type: 'unique' + }, + textTranslateAnchor: { + type: 'simple', + value: 'map' + }, + justify: { + type: 'simple', + value: 'center' + }, + ignorePlacement: { + type: 'simple', + value: false + }, + textAllowOverlap: { + type: 'simple', + value: false + }, + maxWidth: { + type: 'simple', + value: 10 + }, + textSize: { + type: 'simple', + value: 16 + }, + textHaloColor: { + type: 'simple', + value: 'rgba(0, 0, 0, 0)' + }, + textColor: { + type: 'simple', + value: '#000000' + }, + size: { + type: 'simple', + value: 100 + }, + allowOverlap: { + type: 'simple', + value: true + }, + translateAnchor: { + type: 'simple', + value: 'map' + }, + anchor: { + type: 'simple', + value: 'center' + }, + textOpacity: { + type: 'simple', + value: 1 + }, + textHaloWidth: { + type: 'simple', + value: 0 + }, + lineHeight: { + type: 'simple', + value: 1.2 + }, + textFont: { + type: 'simple', + value: ['Open Sans Regular', 'Arial Unicode MS Regular'] + }, + textIgnorePlacement: { + type: 'simple', + value: false + }, + opacity: { + type: 'simple', + value: 1 + } + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'Captital_P@Jingjin#1', + id: 'Captital_P@Jingjin#1_unique_(8_8)', + serviceLayerGroupId: 'Level_1', + title: 'Captital_P@Jingjin#1', + layerSourceType: 'VectorTileService', + zoomRange: [8, 8], + layersContent: ['Captital_P@Jingjin#1_unique_(8_8)'] + } + ], + name: 'Level_1', + id: 'group_Level_1_1764665757038_81' + }, + { + visible: true, + catalogType: 'group', + children: [ + { + filter: ['all', ['==', '$type', 'Point'], ['has', 'NAME'], ['!=', 'NAME', '']], + visualization: { + renderer: [ + { + rotate: { + type: 'simple', + value: 0 + }, + textLetterSpacing: { + type: 'simple', + value: 0 + }, + textTranslate: { + type: 'simple', + value: [7.56, 0] + }, + color: { + type: 'simple', + value: '#000000' + }, + symbolPlacement: { + type: 'simple', + value: 'point' + }, + textAnchor: { + type: 'simple', + value: 'center' + }, + translate: { + type: 'simple', + value: [0, 0] + }, + textRotate: { + type: 'simple', + value: 360 + }, + textField: { + type: 'simple', + value: 'NAME' + }, + textHaloBlur: { + type: 'simple', + value: 0 + }, + transform: { + type: 'simple', + value: 'none' + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: '', + style: { + layout: { + 'icon-image': '' + } + } + } + }, + textTranslateAnchor: { + type: 'simple', + value: 'map' + }, + justify: { + type: 'simple', + value: 'left' + }, + ignorePlacement: { + type: 'simple', + value: false + }, + textAllowOverlap: { + type: 'simple', + value: false + }, + maxWidth: { + type: 'simple', + value: 10 + }, + textSize: { + type: 'simple', + value: 11.55 + }, + textHaloColor: { + type: 'simple', + value: 'rgba(0, 0, 0, 0)' + }, + textColor: { + type: 'simple', + value: 'rgba(115,106,79,1.00)' + }, + size: { + type: 'simple', + value: 100 + }, + allowOverlap: { + type: 'simple', + value: false + }, + translateAnchor: { + type: 'simple', + value: 'map' + }, + anchor: { + type: 'simple', + value: 'center' + }, + textOpacity: { + type: 'simple', + value: 1 + }, + textHaloWidth: { + type: 'simple', + value: 0 + }, + lineHeight: { + type: 'simple', + value: 1.2 + }, + textFont: { + type: 'simple', + value: ['Microsoft YaHei'] + }, + textIgnorePlacement: { + type: 'simple', + value: false + }, + opacity: { + type: 'simple', + value: 1 + } + }, + { + rotate: { + type: 'simple', + value: 0 + }, + textLetterSpacing: { + type: 'simple', + value: 0 + }, + textTranslate: { + type: 'simple', + value: [7.56, 0] + }, + color: { + type: 'simple', + value: '#000000' + }, + symbolPlacement: { + type: 'simple', + value: 'point' + }, + textAnchor: { + type: 'simple', + value: 'center' + }, + translate: { + type: 'simple', + value: [0, 0] + }, + textRotate: { + type: 'simple', + value: 360 + }, + textField: { + type: 'simple', + value: 'NAME' + }, + textHaloBlur: { + type: 'simple', + value: 0 + }, + transform: { + type: 'simple', + value: 'none' + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: '', + style: { + layout: { + 'icon-image': '' + } + } + } + }, + textTranslateAnchor: { + type: 'simple', + value: 'map' + }, + justify: { + type: 'simple', + value: 'left' + }, + ignorePlacement: { + type: 'simple', + value: false + }, + textAllowOverlap: { + type: 'simple', + value: false + }, + maxWidth: { + type: 'simple', + value: 10 + }, + textSize: { + type: 'simple', + value: 11.55 + }, + textHaloColor: { + type: 'simple', + value: 'rgba(0, 0, 0, 0)' + }, + textColor: { + type: 'simple', + value: 'rgba(115,106,79,1.00)' + }, + size: { + type: 'simple', + value: 100 + }, + allowOverlap: { + type: 'simple', + value: false + }, + translateAnchor: { + type: 'simple', + value: 'map' + }, + anchor: { + type: 'simple', + value: 'center' + }, + textOpacity: { + type: 'simple', + value: 1 + }, + textHaloWidth: { + type: 'simple', + value: 0 + }, + lineHeight: { + type: 'simple', + value: 1.2 + }, + textFont: { + type: 'simple', + value: ['Microsoft YaHei'] + }, + textIgnorePlacement: { + type: 'simple', + value: false + }, + opacity: { + type: 'simple', + value: 1 + }, + type: 'text' + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'Neighbor_P@Jingjin#1', + id: 'Neighbor_P@Jingjin#1(7_24)', + popupInfo: { + elements: [ + { + fieldName: 'ADCLASS', + type: 'FIELD' + }, + { + fieldName: 'CODE', + type: 'FIELD' + }, + { + fieldName: 'NAME', + type: 'FIELD' + }, + { + fieldName: 'SmID', + type: 'FIELD' + }, + { + fieldName: 'SmUserID', + type: 'FIELD' + } + ], + title: '相邻行政区划名称' + }, + serviceLayerGroupId: 'Level_0', + title: '相邻行政区划名称', + layerSourceType: 'VectorTileService', + zoomRange: [7, 24], + layersContent: ['Neighbor_P@Jingjin#1(7_24)'] + }, + { + filter: ['all', ['==', '$type', 'LineString']], + visualization: { + renderer: [ + { + lineDasharray: { + type: 'simple', + value: [1, 0] + }, + color: { + type: 'simple', + value: 'rgba(107,107,107,1.00)' + }, + lineTranslateAnchor: { + type: 'simple', + value: 'map' + }, + lineMiterLimit: { + type: 'simple', + value: 2 + }, + lineOffset: { + type: 'simple', + value: 0 + }, + lineJoin: { + type: 'simple', + value: 'miter' + }, + lineRoundLimit: { + type: 'simple', + value: 1.05 + }, + lineTranslate: { + type: 'simple', + value: [0, 0] + }, + lineGapWidth: { + type: 'simple', + value: 0 + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'line-0', + style: { + layout: { + visibility: 'visible', + 'line-miter-limit': 2, + 'line-round-limit': 1.05, + 'line-join': 'miter', + 'line-cap': 'butt' + }, + paint: { + 'line-translate-anchor': 'map', + 'line-width': 1.13, + 'line-gap-width': 0, + 'line-offset': 0, + 'line-opacity': 1, + 'line-translate': [0, 0], + 'line-color': 'rgba(107,107,107,1.00)' + } + } + } + }, + lineCap: { + type: 'simple', + value: 'butt' + }, + width: { + type: 'simple', + value: 1.13 + }, + opacity: { + type: 'simple', + value: 1 + } + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'County_L@Jingjin#1', + id: 'County_L@Jingjin#1(0_10)', + popupInfo: { + elements: [ + { + fieldName: 'SmID', + type: 'FIELD' + }, + { + fieldName: 'SmLength', + type: 'FIELD' + }, + { + fieldName: 'SmTopoError', + type: 'FIELD' + }, + { + fieldName: 'SmUserID', + type: 'FIELD' + } + ], + title: 'County_L@Jingjin' + }, + serviceLayerGroupId: 'Level_0', + title: 'County_L@Jingjin', + layerSourceType: 'VectorTileService', + zoomRange: [0, 10], + layersContent: ['County_L@Jingjin#1(0_10)'] + }, + { + filter: ['all', ['==', '$type', 'LineString']], + visualization: { + renderer: [ + { + lineDasharray: { + type: 'simple', + value: [1, 0] + }, + color: { + type: 'simple', + value: 'rgba(0,170,231,1.00)' + }, + lineTranslateAnchor: { + type: 'simple', + value: 'map' + }, + lineMiterLimit: { + type: 'simple', + value: 2 + }, + lineOffset: { + type: 'simple', + value: 0 + }, + lineJoin: { + type: 'simple', + value: 'miter' + }, + lineRoundLimit: { + type: 'simple', + value: 1.05 + }, + lineTranslate: { + type: 'simple', + value: [0, 0] + }, + lineGapWidth: { + type: 'simple', + value: 0 + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'line-0', + style: { + layout: { + visibility: 'visible', + 'line-miter-limit': 2, + 'line-round-limit': 1.05, + 'line-join': 'miter', + 'line-cap': 'butt' + }, + paint: { + 'line-translate-anchor': 'map', + 'line-width': 1.13, + 'line-gap-width': 0, + 'line-offset': 0, + 'line-opacity': 1, + 'line-translate': [0, 0], + 'line-color': 'rgba(0,170,231,1.00)' + } + } + } + }, + lineCap: { + type: 'simple', + value: 'butt' + }, + width: { + type: 'simple', + value: 1.13 + }, + opacity: { + type: 'simple', + value: 1 + } + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'Coastline_L@Jingjin#1', + id: 'Coastline_L@Jingjin#1(0_24)', + popupInfo: { + elements: [ + { + fieldName: 'SmID', + type: 'FIELD' + }, + { + fieldName: 'SmLength', + type: 'FIELD' + }, + { + fieldName: 'SmTopoError', + type: 'FIELD' + }, + { + fieldName: 'SmUserID', + type: 'FIELD' + } + ], + title: 'Coastline_L@Jingjin' + }, + serviceLayerGroupId: 'Level_0', + title: 'Coastline_L@Jingjin', + layerSourceType: 'VectorTileService', + zoomRange: [0, 24], + layersContent: ['Coastline_L@Jingjin#1(0_24)'] + }, + { + filter: ['all', ['==', '$type', 'LineString']], + visualization: { + renderer: [ + { + lineDasharray: { + type: 'simple', + value: [1, 0] + }, + color: { + type: 'simple', + value: 'rgba(170,170,170,1.00)' + }, + lineTranslateAnchor: { + type: 'simple', + value: 'map' + }, + lineMiterLimit: { + type: 'simple', + value: 2 + }, + lineOffset: { + type: 'simple', + value: 0 + }, + lineJoin: { + type: 'simple', + value: 'miter' + }, + lineRoundLimit: { + type: 'simple', + value: 1.05 + }, + lineTranslate: { + type: 'simple', + value: [0, 0] + }, + lineGapWidth: { + type: 'simple', + value: 0 + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'line-0', + style: { + layout: { + visibility: 'visible', + 'line-miter-limit': 2, + 'line-round-limit': 1.05, + 'line-join': 'miter', + 'line-cap': 'butt' + }, + paint: { + 'line-translate-anchor': 'map', + 'line-width': 0.76, + 'line-gap-width': 0, + 'line-offset': 0, + 'line-opacity': 1, + 'line-translate': [0, 0], + 'line-color': 'rgba(170,170,170,1.00)' + } + } + } + }, + lineCap: { + type: 'simple', + value: 'butt' + }, + width: { + type: 'simple', + value: 0.76 + }, + opacity: { + type: 'simple', + value: 1 + } + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'Province_L@Jingjin', + id: 'Province_L@Jingjin(0_24)', + popupInfo: { + elements: [ + { + fieldName: 'SmID', + type: 'FIELD' + }, + { + fieldName: 'SmLength', + type: 'FIELD' + }, + { + fieldName: 'SmTopoError', + type: 'FIELD' + }, + { + fieldName: 'SmUserID', + type: 'FIELD' + } + ], + title: 'Province_L@Jingjin' + }, + serviceLayerGroupId: 'Level_0', + title: 'Province_L@Jingjin', + layerSourceType: 'VectorTileService', + zoomRange: [0, 24], + layersContent: ['Province_L@Jingjin(0_24)'] + }, + { + filter: ['all', ['==', '$type', 'LineString']], + visualization: { + renderer: [ + { + lineDasharray: { + type: 'simple', + value: [20, 10] + }, + color: { + type: 'simple', + value: 'rgba(107,105,107,1.00)' + }, + lineTranslateAnchor: { + type: 'simple', + value: 'map' + }, + lineMiterLimit: { + type: 'simple', + value: 2 + }, + lineOffset: { + type: 'simple', + value: 0 + }, + lineJoin: { + type: 'simple', + value: 'miter' + }, + lineRoundLimit: { + type: 'simple', + value: 1.05 + }, + lineTranslate: { + type: 'simple', + value: [0, 0] + }, + lineGapWidth: { + type: 'simple', + value: 0 + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'line-0', + style: { + layout: { + visibility: 'visible', + 'line-miter-limit': 2, + 'line-round-limit': 1.05, + 'line-cap': 'round', + 'line-join': 'miter' + }, + paint: { + 'line-translate-anchor': 'map', + 'line-width': 0.38, + 'line-gap-width': 0, + 'line-offset': 0, + 'line-opacity': 1, + 'line-dasharray': [20, 10], + 'line-translate': [0, 0], + 'line-color': 'rgba(107,105,107,1.00)' + } + } + } + }, + lineCap: { + type: 'simple', + value: 'round' + }, + width: { + type: 'simple', + value: 0.38 + }, + opacity: { + type: 'simple', + value: 1 + } + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'MapDivision_L@Jingjin#1', + id: 'MapDivision_L@Jingjin#1_0(0_9)', + popupInfo: { + elements: [ + { + fieldName: 'LATITUDE', + type: 'FIELD' + }, + { + fieldName: 'LATITUDESIMPLE', + type: 'FIELD' + }, + { + fieldName: 'SmID', + type: 'FIELD' + }, + { + fieldName: 'SmLength', + type: 'FIELD' + }, + { + fieldName: 'SmTopoError', + type: 'FIELD' + }, + { + fieldName: 'SmUserID', + type: 'FIELD' + } + ], + title: 'MapDivision_L@Jingjin' + }, + serviceLayerGroupId: 'Level_0', + title: 'MapDivision_L@Jingjin', + layerSourceType: 'VectorTileService', + zoomRange: [0, 9], + layersContent: ['MapDivision_L@Jingjin#1_0(0_9)'] + }, + { + filter: ['all', ['==', '$type', 'Point']], + visualization: { + renderer: [ + { + rotate: { + type: 'simple', + value: 0 + }, + textLetterSpacing: { + type: 'simple', + value: 0 + }, + textTranslate: { + type: 'simple', + value: [0, 0] + }, + color: { + type: 'simple', + value: '#000000' + }, + symbolPlacement: { + type: 'simple', + value: 'point' + }, + textAnchor: { + type: 'simple', + value: 'top-left' + }, + translate: { + type: 'simple', + value: [0, 0] + }, + textRotate: { + type: 'simple', + value: 0 + }, + textField: { + type: 'simple', + value: 'TEXT_VALUE' + }, + textHaloBlur: { + type: 'simple', + value: 0 + }, + transform: { + type: 'simple', + value: 'none' + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: '', + style: { + layout: { + 'icon-image': '' + } + } + } + }, + textTranslateAnchor: { + type: 'simple', + value: 'map' + }, + justify: { + type: 'simple', + value: 'left' + }, + ignorePlacement: { + type: 'simple', + value: false + }, + textAllowOverlap: { + type: 'simple', + value: false + }, + maxWidth: { + type: 'simple', + value: 10 + }, + textSize: { + type: 'simple', + value: 1.05 + }, + textHaloColor: { + type: 'simple', + value: 'rgba(0, 0, 0, 0)' + }, + textColor: { + type: 'simple', + value: 'rgba(0,0,0,1.00)' + }, + size: { + type: 'simple', + value: 100 + }, + allowOverlap: { + type: 'simple', + value: false + }, + translateAnchor: { + type: 'simple', + value: 'map' + }, + anchor: { + type: 'simple', + value: 'center' + }, + textOpacity: { + type: 'simple', + value: 1 + }, + textHaloWidth: { + type: 'simple', + value: 0 + }, + lineHeight: { + type: 'simple', + value: 1.2 + }, + textFont: { + type: 'simple', + value: ['Times New Roman'] + }, + textIgnorePlacement: { + type: 'simple', + value: false + }, + opacity: { + type: 'simple', + value: 1 + } + }, + { + rotate: { + type: 'simple', + value: 0 + }, + textLetterSpacing: { + type: 'simple', + value: 0 + }, + textTranslate: { + type: 'simple', + value: [0, 0] + }, + color: { + type: 'simple', + value: '#000000' + }, + symbolPlacement: { + type: 'simple', + value: 'point' + }, + textAnchor: { + type: 'simple', + value: 'top-left' + }, + translate: { + type: 'simple', + value: [0, 0] + }, + textRotate: { + type: 'simple', + value: 0 + }, + textField: { + type: 'simple', + value: 'TEXT_VALUE' + }, + textHaloBlur: { + type: 'simple', + value: 0 + }, + transform: { + type: 'simple', + value: 'none' + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: '', + style: { + layout: { + 'icon-image': '' + } + } + } + }, + textTranslateAnchor: { + type: 'simple', + value: 'map' + }, + justify: { + type: 'simple', + value: 'left' + }, + ignorePlacement: { + type: 'simple', + value: false + }, + textAllowOverlap: { + type: 'simple', + value: false + }, + maxWidth: { + type: 'simple', + value: 10 + }, + textSize: { + type: 'simple', + value: 1.05 + }, + textHaloColor: { + type: 'simple', + value: 'rgba(0, 0, 0, 0)' + }, + textColor: { + type: 'simple', + value: 'rgba(0,0,0,1.00)' + }, + size: { + type: 'simple', + value: 100 + }, + allowOverlap: { + type: 'simple', + value: false + }, + translateAnchor: { + type: 'simple', + value: 'map' + }, + anchor: { + type: 'simple', + value: 'center' + }, + textOpacity: { + type: 'simple', + value: 1 + }, + textHaloWidth: { + type: 'simple', + value: 0 + }, + lineHeight: { + type: 'simple', + value: 1.2 + }, + textFont: { + type: 'simple', + value: ['Times New Roman'] + }, + textIgnorePlacement: { + type: 'simple', + value: false + }, + opacity: { + type: 'simple', + value: 1 + }, + type: 'text' + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'CoordsysLabel@Jingjin', + id: 'CoordsysLabel@Jingjin', + popupInfo: { + elements: [ + { + fieldName: 'SmID', + type: 'FIELD' + }, + { + fieldName: 'SmUserID', + type: 'FIELD' + }, + { + fieldName: 'TEXT_ALIGN', + type: 'FIELD' + }, + { + fieldName: 'TEXT_ANGLE', + type: 'FIELD' + }, + { + fieldName: 'TEXT_COLOR', + type: 'FIELD' + }, + { + fieldName: 'TEXT_FONTNAME', + type: 'FIELD' + }, + { + fieldName: 'TEXT_HEIGHT', + type: 'FIELD' + }, + { + fieldName: 'TEXT_VALUE', + type: 'FIELD' + }, + { + fieldName: 'TEXT_WIDTH', + type: 'FIELD' + } + ], + title: 'CoordsysLabel@Jingjin' + }, + serviceLayerGroupId: 'Level_0', + title: 'CoordsysLabel@Jingjin', + layerSourceType: 'VectorTileService', + zoomRange: [0, 24], + layersContent: ['CoordsysLabel@Jingjin'] + }, + { + filter: ['all', ['==', '$type', 'LineString']], + visualization: { + renderer: [ + { + lineDasharray: { + type: 'simple', + value: [1, 0] + }, + color: { + type: 'simple', + value: 'rgba(126,206,245,1.00)' + }, + lineTranslateAnchor: { + type: 'simple', + value: 'map' + }, + lineMiterLimit: { + type: 'simple', + value: 2 + }, + lineOffset: { + type: 'simple', + value: 0 + }, + lineJoin: { + type: 'simple', + value: 'miter' + }, + lineRoundLimit: { + type: 'simple', + value: 1.05 + }, + lineTranslate: { + type: 'simple', + value: [0, 0] + }, + lineGapWidth: { + type: 'simple', + value: 0 + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'line-0', + style: { + layout: { + visibility: 'visible', + 'line-miter-limit': 2, + 'line-round-limit': 1.05, + 'line-join': 'miter', + 'line-cap': 'butt' + }, + paint: { + 'line-translate-anchor': 'map', + 'line-width': 1.51, + 'line-gap-width': 0, + 'line-offset': 0, + 'line-opacity': 1, + 'line-translate': [0, 0], + 'line-color': 'rgba(126,206,245,1.00)' + } + } + } + }, + lineCap: { + type: 'simple', + value: 'butt' + }, + width: { + type: 'simple', + value: 1.51 + }, + opacity: { + type: 'simple', + value: 1 + } + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'River_L@Jingjin', + id: 'River_L@Jingjin(0_24)', + popupInfo: { + elements: [ + { + fieldName: 'FNODE_', + type: 'FIELD' + }, + { + fieldName: 'GS', + type: 'FIELD' + }, + { + fieldName: 'HL', + type: 'FIELD' + }, + { + fieldName: 'JB', + type: 'FIELD' + }, + { + fieldName: 'LENGTH', + type: 'FIELD' + }, + { + fieldName: 'LPOLY_', + type: 'FIELD' + }, + { + fieldName: 'LY1', + type: 'FIELD' + }, + { + fieldName: 'LY2', + type: 'FIELD' + }, + { + fieldName: 'LY3', + type: 'FIELD' + }, + { + fieldName: 'LY4', + type: 'FIELD' + }, + { + fieldName: 'NAME', + type: 'FIELD' + }, + { + fieldName: 'RIVER_', + type: 'FIELD' + }, + { + fieldName: 'RIVER_ID', + type: 'FIELD' + }, + { + fieldName: 'RPOLY_', + type: 'FIELD' + }, + { + fieldName: 'SmID', + type: 'FIELD' + }, + { + fieldName: 'SmLength', + type: 'FIELD' + }, + { + fieldName: 'SmTopoError', + type: 'FIELD' + }, + { + fieldName: 'SmUserID', + type: 'FIELD' + }, + { + fieldName: 'TNODE_', + type: 'FIELD' + } + ], + title: 'River_L@Jingjin' + }, + serviceLayerGroupId: 'Level_0', + title: 'River_L@Jingjin', + layerSourceType: 'VectorTileService', + zoomRange: [0, 24], + layersContent: ['River_L@Jingjin(0_24)'] + }, + { + filter: ['all', ['==', '$type', 'Polygon']], + visualization: { + renderer: [ + { + symbolsContent: { + type: 'simple', + value: { + symbolId: 'polygon-0', + style: { + layout: { + visibility: 'visible' + }, + paint: { + 'fill-color': 'rgba(126,206,245,1.00)', + 'fill-opacity': 1, + 'fill-antialias': true + } + } + } + }, + color: { + type: 'simple', + value: 'rgba(126,206,245,1.00)' + }, + antialias: { + type: 'simple', + value: true + }, + outlineColor: { + type: 'simple', + value: '#FFFFFF' + }, + opacity: { + type: 'simple', + value: 1 + } + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'Lake_R@Jingjin', + id: 'Lake_R@Jingjin(0_24)', + popupInfo: { + elements: [ + { + fieldName: 'CODE', + type: 'FIELD' + }, + { + fieldName: 'SmArea', + type: 'FIELD' + }, + { + fieldName: 'SmID', + type: 'FIELD' + }, + { + fieldName: 'SmPerimeter', + type: 'FIELD' + }, + { + fieldName: 'SmUserID', + type: 'FIELD' + } + ], + title: 'Lake_R@Jingjin' + }, + serviceLayerGroupId: 'Level_0', + title: 'Lake_R@Jingjin', + layerSourceType: 'VectorTileService', + zoomRange: [0, 24], + layersContent: ['Lake_R@Jingjin(0_24)'] + }, + { + visible: true, + catalogType: 'group', + children: [ + { + filter: ['all', ['==', '$type', 'Polygon']], + visualization: { + renderer: [ + { + symbolsContent: { + type: 'simple', + value: { + symbolId: 'polygon-0', + style: { + layout: { + visibility: 'visible' + }, + paint: { + 'fill-color': 'rgba(250,250,250,1.00)', + 'fill-opacity': 1, + 'fill-antialias': true + } + } + } + }, + color: { + type: 'simple', + value: 'rgba(250,250,250,1.00)' + }, + antialias: { + type: 'simple', + value: true + }, + outlineColor: { + type: 'simple', + value: '#FFFFFF' + }, + opacity: { + type: 'simple', + value: 1 + } + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'Neighbor_R@Jingjin#1', + id: 'Neighbor_R@Jingjin#1(0_24)', + popupInfo: { + elements: [ + { + fieldName: 'ADMI', + type: 'FIELD' + }, + { + fieldName: 'SmArea', + type: 'FIELD' + }, + { + fieldName: 'SmID', + type: 'FIELD' + }, + { + fieldName: 'SmPerimeter', + type: 'FIELD' + }, + { + fieldName: 'SmUserID', + type: 'FIELD' + } + ], + title: 'Neighbor_R@Jingjin' + }, + serviceLayerGroupId: 'Level_0', + title: 'Neighbor_R@Jingjin', + layerSourceType: 'VectorTileService', + zoomRange: [0, 24], + layersContent: ['Neighbor_R@Jingjin#1(0_24)'] + }, + { + filter: ['all', ['==', '$type', 'Polygon']], + visualization: { + renderer: [ + { + lineDasharray: { + type: 'simple', + value: [1, 0] + }, + color: { + type: 'simple', + value: 'rgba(180,180,180,1.00)' + }, + lineTranslateAnchor: { + type: 'simple', + value: 'map' + }, + lineMiterLimit: { + type: 'simple', + value: 2 + }, + lineOffset: { + type: 'simple', + value: 0 + }, + lineJoin: { + type: 'simple', + value: 'miter' + }, + lineRoundLimit: { + type: 'simple', + value: 1.05 + }, + lineTranslate: { + type: 'simple', + value: [0, 0] + }, + lineGapWidth: { + type: 'simple', + value: 0 + }, + symbolsContent: { + type: 'simple', + value: { + symbolId: 'line-0', + style: { + layout: { + visibility: 'visible', + 'line-miter-limit': 2, + 'line-round-limit': 1.05, + 'line-join': 'miter', + 'line-cap': 'butt' + }, + paint: { + 'line-translate-anchor': 'map', + 'line-width': 0.38, + 'line-gap-width': 0, + 'line-offset': 0, + 'line-opacity': 1, + 'line-translate': [0, 0], + 'line-color': 'rgba(180,180,180,1.00)' + } + } + } + }, + lineCap: { + type: 'simple', + value: 'butt' + }, + width: { + type: 'simple', + value: 0.38 + }, + opacity: { + type: 'simple', + value: 1 + } + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'Neighbor_R@Jingjin#1', + id: 'Neighbor_R@Jingjin#1_outline(0_24)', + serviceLayerGroupId: 'Level_0', + title: 'Neighbor_R@Jingjin', + layerSourceType: 'VectorTileService', + zoomRange: [0, 24], + layersContent: ['Neighbor_R@Jingjin#1_outline(0_24)'] + } + ], + name: 'Neighbor_R@Jingjin', + id: 'group_Neighbor_R@Jingjin#1_1764665757038_105' + }, + { + filter: ['all', ['==', '$type', 'Polygon']], + visualization: { + renderer: [ + { + symbolsContent: { + field: ['City'], + defaultValue: { + symbolId: 'fill_0_BDEBFFFF_FFFFFFFF_100', + style: { + paint: { + 'fill-pattern': 'fill_0_BDEBFFFF_FFFFFFFF_100' + } + } + }, + values: [ + { + value: { + symbolId: 'fill_0_F4F3F0FF_FFFFFFFF_100', + style: { + paint: { + 'fill-pattern': 'fill_0_F4F3F0FF_FFFFFFFF_100' + } + } + }, + key: '北京市' + }, + { + value: { + symbolId: 'fill_0_FAF3F3FF_FFFFFFFF_100', + style: { + paint: { + 'fill-pattern': 'fill_0_FAF3F3FF_FFFFFFFF_100' + } + } + }, + key: '天津市' + } + ], + type: 'unique' + }, + color: { + type: 'simple', + value: '#000000' + }, + antialias: { + type: 'simple', + value: true + }, + outlineColor: { + type: 'simple', + value: '#FFFFFF' + }, + opacity: { + type: 'simple', + value: 1 + } + } + ] + }, + catalogType: 'layer', + serviceLayerId: 'BaseMap_R@Jingjin#1', + id: 'BaseMap_R@Jingjin#1_unique_(0_24)', + popupInfo: { + elements: [ + { + fieldName: 'ADMI', + type: 'FIELD' + }, + { + fieldName: 'City', + type: 'FIELD' + }, + { + fieldName: 'NAME', + type: 'FIELD' + }, + { + fieldName: 'NEWA', + type: 'FIELD' + }, + { + fieldName: 'POP_1992', + type: 'FIELD' + }, + { + fieldName: 'POP_1995', + type: 'FIELD' + }, + { + fieldName: 'POP_1999', + type: 'FIELD' + }, + { + fieldName: 'POP_DENSITY99', + type: 'FIELD' + }, + { + fieldName: 'POP_RATE95', + type: 'FIELD' + }, + { + fieldName: 'POP_RATE99', + type: 'FIELD' + }, + { + fieldName: 'RURAL', + type: 'FIELD' + }, + { + fieldName: 'SmArea', + type: 'FIELD' + }, + { + fieldName: 'SmID', + type: 'FIELD' + }, + { + fieldName: 'SmPerimeter', + type: 'FIELD' + }, + { + fieldName: 'SmUserID', + type: 'FIELD' + }, + { + fieldName: 'URBAN', + type: 'FIELD' + }, + { + fieldName: 'URBANRURAL', + type: 'FIELD' + } + ], + title: 'BaseMap_R@Jingjin#1' + }, + serviceLayerGroupId: 'Level_0', + title: 'BaseMap_R@Jingjin#1', + layerSourceType: 'VectorTileService', + zoomRange: [0, 24], + layersContent: ['BaseMap_R@Jingjin#1_unique_(0_24)'] + } + ], + name: 'Level_0', + id: 'group_Level_0_1764665757038_88' + } + ], + name: '京津地区地图', + id: 'group_京津地区地图_1764665757038_112' + }, + { + visible: false, + catalogType: 'layer', + id: '京津地区地图', + title: '京津地区地图', + layerSourceType: 'TileService', + zoomRange: [0, 24], + layersContent: ['京津地区地图'] + } + ] + }); + const Data1 = { + layerId: ['Road_L@Jingjin#8(12_24)'], + elements: [ + { + fieldName: 'KD', + type: 'FIELD' + }, + { + fieldName: 'KD_1', + type: 'FIELD' + }, + { + fieldName: 'NAME', + type: 'FIELD' + }, + { + fieldName: 'SmID', + type: 'FIELD' + }, + { + fieldName: 'SmLength', + type: 'FIELD' + }, + { + fieldName: 'SmTopoError', + type: 'FIELD' + }, + { + fieldName: 'SmUserID', + type: 'FIELD' + }, + { + fieldName: 'name_1', + type: 'FIELD' + }, + { + fieldName: 'name_2_len', + type: 'FIELD' + }, + { + fieldName: 'name_3_len', + type: 'FIELD' + } + ], + title: 'Road_L_街道' + }; + expect(popupInfo1.length).toEqual(13); + expect(popupInfo1[0]).toEqual(Data1); + done(); + }); + mapstudioWebmap.on('mapcreatefailed', (e) => { + done(); + }); + }); }); diff --git a/test/resources/WebMapV3.js b/test/resources/WebMapV3.js index c6b5623566..ed0ac5eea8 100644 --- a/test/resources/WebMapV3.js +++ b/test/resources/WebMapV3.js @@ -5726,3 +5726,270 @@ var spriteJson = JSON.stringify({ "height": 100 } }) +const msPopupInfo = JSON.stringify({ + extent: { + top: 31.632108900689214, + left: 102.62340682672561, + bottom: 29.58439805731813, + leftBottom: { + x: 102.62340682672561, + y: 29.58439805731813, + m: null + }, + right: 105.60836654973976, + rightTop: { + x: 105.60836654973976, + y: 31.632108900689214, + m: null + } + }, + controls: null, + extentString: '', + description: '', + verifyReason: null, + units: null, + title: 'ms-弹窗-复杂', + resolution: 0, + checkStatus: 'SUCCESSFUL', + projectInfo: JSON.stringify({ + images: 'http://fake:8190/iportal/web/maps/1171931401/sprites/sprite', + catalogs: [ + { + visualization: { + renderer: [ + { + symbolsContent: { + type: 'simple', + value: { + symbolId: 'circle', + style: { + layout: { + 'icon-image': 'circle' + } + } + } + }, + size: { + type: 'simple', + value: 20 + }, + color: { + type: 'simple', + value: '#EE4D5A' + }, + translateAnchor: { + type: 'simple', + value: 'map' + }, + opacity: { + type: 'simple', + value: 0.9 + }, + translate: { + type: 'simple', + value: [0, 0] + }, + styleRenderMode: 'mapboxgl' + } + ] + }, + visible: true, + catalogType: 'layer', + msDatasetId: 'ms_datasetId_1763102159620_163', + bounds: [103.46143, 30.194359, 104.550339, 30.99114], + id: 'layer_A点_1763102159640_174', + popupInfo: { + elements: [ + { + fieldName: 'geometry', + type: 'FIELD' + }, + { + type: 'DIVIDER' + }, + { + type: 'IMAGE', + title: '无标题', + value: + 'https://pic1.arkoo.com/56D0B40F99F841DF8A2425762AE2565D/picture/o_1i4qop009177v1tgf14db15he1iaj1is.jpg' + }, + { + type: 'DIVIDER' + }, + { + type: 'TEXT', + infos: [ + { + insert: '这是一段文本信息\n' + } + ] + } + ], + title: 'A点' + }, + title: 'A点', + layerSourceType: 'Data', + zoomRange: [0, 24], + layersContent: ['A点'] + }, + { + visualization: { + renderer: [ + { + symbolsContent: { + type: 'simple', + value: { + symbolId: 'polygon-0', + style: { + layout: { + visibility: 'visible' + }, + paint: { + 'fill-outline-color': '#FFFFFF', + 'fill-color': '#826DBA', + 'fill-opacity': 0.9 + } + } + } + }, + color: { + type: 'simple', + value: '#826DBA' + }, + antialias: { + type: 'simple', + value: true + }, + outlineColor: { + type: 'simple', + value: '#FFFFFF' + }, + opacity: { + type: 'simple', + value: 0.9 + }, + styleRenderMode: 'mapboxgl' + } + ] + }, + visible: true, + catalogType: 'layer', + msDatasetId: 'ms_datasetId_1763102129825_23', + bounds: [102.992886, 30.089615, 104.89738, 31.435321], + id: 'layer_A面_1763102129836_26', + popupInfo: { + elements: [ + { + fieldName: 'geometry', + type: 'FIELD' + }, + { + type: 'DIVIDER' + }, + { + type: 'TEXT', + infos: [ + { + insert: ['concat', '这是一段文本信息', ['get', 'smpid'], '\n'] + } + ] + }, + { + type: 'DIVIDER' + }, + { + type: 'IMAGE', + title: ['concat', '无标题', ['get', 'adcode'], '-图片'], + value: ['concat', ['get', 'adcode']] + }, + { + type: 'IMAGE', + title: '无标题', + value: ['concat', ['get', 'adcode']] + }, + { + type: 'VIDEO', + title: '无标题-视频', + value: 'https://www.runoob.com/try/demo_source/mov_bbb.mp4' + }, + { + type: 'DIVIDER' + }, + { + type: 'IMAGE', + title: ['concat', '无标题图片', ['get', 'adcode']], + value: ['concat', ['get', 'name'], ['get', 'smpid']] + } + ], + title: 'A面' + }, + title: 'A面', + layerSourceType: 'Data', + zoomRange: [0, 24], + layersContent: ['A面', 'A面1'] + } + ], + datas: [ + { + sourceType: 'STRUCTURE_DATA', + datasets: [ + { + datasetTitle: 'A面', + msDatasetId: 'ms_datasetId_1763102129825_23', + datasetId: '1578304463', + geometryField: 'geometry', + fieldsCaptions: { + smpid: 'smpidxxxxx' + } + } + ], + title: 'A面' + }, + { + sourceType: 'STRUCTURE_DATA', + datasets: [ + { + datasetTitle: 'A点', + msDatasetId: 'ms_datasetId_1763102159620_163', + datasetId: '2105298173', + geometryField: 'geometry' + } + ], + title: 'A点' + } + ], + baseLayer: { + internetMapName: 'OSM', + type: 'INTERNET_MAP', + labelVisible: true + }, + version: '3.1.2' + }), + visitCount: 65, + centerString: '{"x":104.11588668823242,"y":30.608253479003906,"m":null}', + epsgCode: 4326, + nickname: 'admin_123', + layers: null, + id: 1171931401, + searchSetting: null, + thumbnail: 'http://172.16.14.44:8190/iportal/resources/thumbnail/map/map1171931401.png', + level: 8, + center: { + x: 104.11588668823242, + y: 30.608253479003906, + m: null + }, + authorizeSetting: [], + updateTime: 1763359863094, + userName: 'admin_123', + tags: [], + checkUser: null, + checkUserNick: null, + checkTime: null, + sourceType: 'MAPSTUDIO', + createTime: 1763102527590, + controlsString: '', + isDefaultBottomMap: false, + status: null, + favoriteCount: 0 +}); diff --git a/test/resources/WebMapV5.js b/test/resources/WebMapV5.js index 9b8db6bb38..b5eff31c9a 100644 --- a/test/resources/WebMapV5.js +++ b/test/resources/WebMapV5.js @@ -4242,4 +4242,481 @@ var baseLayerIsZXY_TILEMapInfo = { title: 'hk-叠加-0-无bounds', version: '2.4.3', rootUrl: 'http://172.16.14.44:8190/iportal/' -}; \ No newline at end of file +}; +const Webmap2_popupInfo = { + extent: { + leftBottom: { + x: -180, + y: -90 + }, + rightTop: { + x: 180, + y: 90 + } + }, + maxScale: '1:563.6180678101772', + level: 7.352259089802374, + center: { + x: 117.04039037705856, + y: 40.54084473813931 + }, + baseLayer: { + layerType: 'TIANDITU_IMG_4326', + visible: true, + labelLayerVisible: true, + tk: '50599c913367188e6c94e872032f4cf1', + name: '天地图影像(经纬度)' + }, + layers: [ + { + layerType: 'VECTOR', + visible: true, + name: '北京市(3)', + featureType: 'POLYGON', + style: { + fillColor: '#826DBA', + strokeWidth: 1, + fillOpacity: 0.9, + lineDash: 'solid', + strokeColor: '#ffffff', + type: 'POLYGON', + strokeOpacity: 1 + }, + projection: 'EPSG:4326', + popupInfo: { + elements: [ + { + fieldName: 'parent', + type: 'FIELD' + }, + { + fieldName: 'adcode', + type: 'FIELD' + }, + { + fieldName: 'level', + type: 'FIELD' + }, + { + fieldName: 'childrenNum', + type: 'FIELD' + }, + { + fieldName: 'smpid', + type: 'FIELD' + }, + { + fieldName: 'centroid', + type: 'FIELD' + }, + { + fieldName: 'center', + type: 'FIELD' + }, + { + fieldName: 'subFeatureIndex', + type: 'FIELD' + }, + { + fieldName: 'name', + type: 'FIELD' + }, + { + fieldName: 'acroutes', + type: 'FIELD' + }, + { + type: 'DIVIDER' + }, + { + type: 'TEXT', + infos: [ + { + insert: ['concat', ['get', 'level'], ['get', 'adcode'], '----'], + attributes: { + size: 'small', + color: '#4e35cc', + underline: true, + strike: true, + bold: true, + italic: true + } + }, + { + insert: ['concat', ['get', 'childrenNum'], ['get', 'parent']], + attributes: { + size: 'small', + color: '#e01b4b' + } + }, + { + insert: '\n', + attributes: { + align: 'center' + } + } + ] + }, + { + type: 'DIVIDER' + }, + { + type: 'IMAGE', + title: ['concat', ['get', 'adcode']], + value: ['concat', ['get', 'parent']] + }, + { + type: 'IMAGE', + title: 'afdfd', + value: ['concat', ['get', 'level']] + }, + { + type: 'DIVIDER' + }, + { + type: 'VIDEO', + title: 'fdsfs', + value: 'http://fake:8190/iportal/apps/mapstudio/edit.html' + }, + { + type: 'DIVIDER' + }, + { + type: 'IMAGE', + title: ['concat', ['get', 'parent'], ['get', 'adcode']], + value: ['concat', ['get', 'adcode'], ['get', 'level']] + } + ], + title: '北京市(3)' + }, + enableFields: [ + 'parent', + 'adcode', + 'level', + 'childrenNum', + 'smpid', + 'centroid', + 'center', + 'subFeatureIndex', + 'name', + 'acroutes' + ], + dataSource: { + accessType: 'DIRECT', + type: 'PORTAL_DATA', + serverId: '1371715657' + }, + captions: { + parent: 'parent3121' + } + }, + { + layerType: 'VECTOR', + visible: true, + name: '北京市轨道交通线路-打印(3)', + featureType: 'LINE', + style: { + strokeWidth: 6, + lineDash: 'solid', + strokeColor: '#4CC8A3', + type: 'LINE', + strokeOpacity: 1 + }, + projection: 'EPSG:4326', + popupInfo: { + elements: [ + { + fieldName: 'SmID', + type: 'FIELD' + }, + { + fieldName: '标准名称', + type: 'FIELD' + } + ], + title: '北京市轨道交通线路-打印(3)' + }, + enableFields: ['SmID', '标准名称'], + dataSource: { + accessType: 'DIRECT', + type: 'PORTAL_DATA', + serverId: '1168691327' + } + } + ], + description: '', + projection: 'EPSG:4326', + minScale: '1:295498189.5360622', + title: '弹窗-dv', + version: '2.4.3', + rootUrl: 'http://fake:8190/iportal/' +}; +const Webmap2_popupInfo_no_captions = { + extent: { + leftBottom: { + x: -180, + y: -90 + }, + rightTop: { + x: 180, + y: 90 + } + }, + maxScale: '1:563.6180678101772', + level: 7.352259089802374, + center: { + x: 117.04039037705856, + y: 40.54084473813931 + }, + baseLayer: { + layerType: 'TIANDITU_IMG_4326', + visible: true, + labelLayerVisible: true, + tk: '50599c913367188e6c94e872032f4cf1', + name: '天地图影像(经纬度)' + }, + layers: [ + { + layerType: 'VECTOR', + visible: true, + name: '北京市轨道交通线路-打印(3)', + featureType: 'LINE', + style: { + strokeWidth: 6, + lineDash: 'solid', + strokeColor: '#4CC8A3', + type: 'LINE', + strokeOpacity: 1 + }, + projection: 'EPSG:4326', + enableFields: ['SmID', '标准名称'], + dataSource: { + accessType: 'DIRECT', + type: 'PORTAL_DATA', + serverId: '1168691327' + } + } + ], + description: '', + projection: 'EPSG:4326', + minScale: '1:295498189.5360622', + title: '弹窗-dv', + version: '2.4.3', + rootUrl: 'http://fake:8190/iportal/' +}; +const Webmap2_popupInfo_no = { + extent: { + leftBottom: { + x: -180, + y: -90 + }, + rightTop: { + x: 180, + y: 90 + } + }, + maxScale: '1:563.6180678101772', + level: 7.352259089802374, + center: { + x: 117.04039037705856, + y: 40.54084473813931 + }, + baseLayer: { + layerType: 'TIANDITU_IMG_4326', + visible: true, + labelLayerVisible: true, + tk: '50599c913367188e6c94e872032f4cf1', + name: '天地图影像(经纬度)' + }, + layers: [ + { + layerType: 'VECTOR', + visible: true, + name: '北京市(3)', + featureType: 'POLYGON', + style: { + fillColor: '#826DBA', + strokeWidth: 1, + fillOpacity: 0.9, + lineDash: 'solid', + strokeColor: '#ffffff', + type: 'POLYGON', + strokeOpacity: 1 + }, + projection: 'EPSG:4326', + enableFields: [ + 'parent', + 'adcode', + 'level', + 'childrenNum', + 'smpid', + 'centroid', + 'center', + 'subFeatureIndex', + 'name', + 'acroutes' + ], + dataSource: { + accessType: 'DIRECT', + type: 'PORTAL_DATA', + serverId: '1371715657' + }, + captions: { + parent: 'parent3121' + } + }, + { + layerType: 'VECTOR', + visible: true, + name: '北京市轨道交通线路-打印(3)', + featureType: 'LINE', + style: { + strokeWidth: 6, + lineDash: 'solid', + strokeColor: '#4CC8A3', + type: 'LINE', + strokeOpacity: 1 + }, + projection: 'EPSG:4326', + popupInfo: { + elements: [ + { + fieldName: 'SmID', + type: 'FIELD' + }, + { + fieldName: '标准名称', + type: 'FIELD' + } + ], + title: '北京市轨道交通线路-打印(3)' + }, + enableFields: ['SmID', '标准名称'], + dataSource: { + accessType: 'DIRECT', + type: 'PORTAL_DATA', + serverId: '1168691327' + } + } + ], + description: '', + projection: 'EPSG:4326', + minScale: '1:295498189.5360622', + title: '弹窗-dv', + version: '2.4.3', + rootUrl: 'http://fake:8190/iportal/' +}; +const msPopupInfoMap = JSON.stringify({ + metadata: { + layerCatalog: [ + { + visible: true, + parts: ['A点'], + id: 'layer_A点_1763102159640_174', + title: 'A点', + type: 'composite' + }, + { + visible: true, + parts: ['A面'], + id: 'layer_A面_1763102129836_26', + title: 'A面', + type: 'composite' + }, + { + visible: true, + parts: ['A面1'], + id: 'layer_A面_1763102129836_27', + title: 'A面1', + type: 'composite' + } + ] + }, + sources: { + ms_1578304463_1763102129836_25: { + tiles: [ + 'http://fake:8190/iportal/web/datas/1578304463/structureddata/tiles/{z}/{x}/{y}.mvt?epsgCode=4326&returnedFieldNames=%5B%22smpid%22%2C%22adcode%22%2C%22name%22%2C%22level%22%2C%22parent%22%5D&geometryFieldName=geometry' + ], + bounds: [102.992886, 30.089615, 104.89738, 31.435321], + type: 'vector' + }, + OSM: { + tiles: ['https://a.tile.openstreetmap.org/{z}/{x}/{y}.png'], + tileSize: 256, + attribution: '', + bounds: [-180, -90, 180, 90], + type: 'raster' + }, + ms_813334134_1763102180987_239: { + tiles: [ + 'http://fake:8190/iportal/web/datas/813334134/structureddata/tiles/{z}/{x}/{y}.mvt?epsgCode=4326&returnedFieldNames=%5B%22smpid%22%2C%22adcode%22%2C%22name%22%2C%22level%22%2C%22parent%22%5D&geometryFieldName=geometry' + ], + bounds: [102.992886, 30.089615, 104.89738, 31.435321], + type: 'vector' + }, + ms_2105298173_1763102159640_173: { + tiles: [ + 'http://fake:8190/iportal/web/datas/2105298173/structureddata/tiles/{z}/{x}/{y}.mvt?epsgCode=4326&returnedFieldNames=%5B%22smpid%22%2C%22name%22%2C%22adcode%22%2C%22parent%22%5D&geometryFieldName=geometry' + ], + bounds: [103.46143, 30.194359, 104.550339, 30.99114], + type: 'vector' + } + }, + crs: 'EPSG:4326', + center: [104.11588668823242, 30.608253479003906], + zoom: 8.211057838318613, + glyphs: {}, + version: '3.3.3', + rootUrl: 'http://fake:8190/iportal/', + maxzoom: 19, + name: 'ms-弹窗-复杂', + viewExtent: [102.62340682672841, 29.544060763763426, 105.6083665497426, 31.672446194243026], + layers: [ + { + metadata: {}, + maxzoom: 24, + paint: { + 'fill-outline-color': '#FFFFFF', + 'fill-color': '#826DBA', + 'fill-opacity': 0.9 + }, + id: 'A面', + source: 'ms_1578304463_1763102129836_25', + 'source-layer': '1578304463$geometry', + type: 'fill', + minzoom: 0 + }, + { + metadata: {}, + maxzoom: 24, + paint: { + 'fill-outline-color': '#FFFFFF', + 'fill-color': '#826DBA', + 'fill-opacity': 0.9 + }, + id: 'A面1', + source: 'ms_1578304463_1763102129836_25', + 'source-layer': '1578304463$geometry', + type: 'fill', + minzoom: 0 + }, + { + metadata: {}, + maxzoom: 24, + paint: { + 'circle-color': '#EE4D5A', + 'circle-opacity': 0.9, + 'circle-translate-anchor': 'map', + 'circle-radius': 10, + 'circle-translate': [0, 0] + }, + id: 'A点', + source: 'ms_2105298173_1763102159640_173', + 'source-layer': '2105298173$geometry', + type: 'circle', + minzoom: 0 + } + ], + pitch: 0, + minzoom: 0 +}); From 086dd035107d28c9e2ef72312138d08f1a2a5c4d Mon Sep 17 00:00:00 2001 From: luoxiao Date: Thu, 25 Jun 2026 16:27:49 +0800 Subject: [PATCH 27/46] =?UTF-8?q?[fix]setLayersVisible=20webmap=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9EisSetVisible=E5=8F=82=E6=95=B0=E6=8E=A7?= =?UTF-8?q?=E5=88=B6visible=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapping/utils/AppreciableLayerBase.js | 6 +- .../mapping/utils/AppreciableLayerBaseSpec.js | 121 ++++++++++++++++++ test/test-main-common.js | 3 +- 3 files changed, 127 insertions(+), 3 deletions(-) create mode 100644 test/common/mapping/utils/AppreciableLayerBaseSpec.js diff --git a/src/common/mapping/utils/AppreciableLayerBase.js b/src/common/mapping/utils/AppreciableLayerBase.js index aa6063ede4..dfc4f2f2dc 100644 --- a/src/common/mapping/utils/AppreciableLayerBase.js +++ b/src/common/mapping/utils/AppreciableLayerBase.js @@ -98,10 +98,12 @@ export class AppreciableLayerBase extends Events { } } - setLayersVisible(layers, visibility) { + setLayersVisible(layers, visibility, isSetVisible = true) { layers.forEach((layer) => { const visbleId = this._getLayerVisibleId(layer); - this.layersVisibleMap.set(visbleId, visibility === 'visible'); + if (isSetVisible) { + this.layersVisibleMap.set(visbleId, visibility === 'visible'); + } if (layer.CLASS_INSTANCE && layer.CLASS_INSTANCE.show && layer.CLASS_INSTANCE.hide) { visibility === 'visible' ? layer.CLASS_INSTANCE.show() : layer.CLASS_INSTANCE.hide(); this.map.style.fire('data', { dataType: 'style' }); diff --git a/test/common/mapping/utils/AppreciableLayerBaseSpec.js b/test/common/mapping/utils/AppreciableLayerBaseSpec.js new file mode 100644 index 0000000000..50a5575b1f --- /dev/null +++ b/test/common/mapping/utils/AppreciableLayerBaseSpec.js @@ -0,0 +1,121 @@ +import { AppreciableLayerBase } from '../../../../src/common/mapping/utils/AppreciableLayerBase'; + +describe('AppreciableLayerBase', () => { + let instance; + let mockMap; + + beforeEach(() => { + mockMap = { + style: { + fire: jasmine.createSpy('fire') + }, + getLayer: jasmine.createSpy('getLayer').and.returnValue({}), + setLayoutProperty: jasmine.createSpy('setLayoutProperty') + }; + + instance = new AppreciableLayerBase({ + map: mockMap, + layers: [] + }); + }); + + describe('setLayersVisible', () => { + it('should set layer visibility to visible', () => { + const layer = { + renderLayers: ['layer1'], + CLASS_NAME: 'TestLayer' + }; + + instance.setLayersVisible([layer], 'visible', true); + + expect(mockMap.setLayoutProperty).toHaveBeenCalledWith('layer1', 'visibility', 'visible'); + }); + + it('should set layer visibility to none', () => { + const layer = { + renderLayers: ['layer1'], + CLASS_NAME: 'TestLayer' + }; + + instance.setLayersVisible([layer], 'none', true); + + expect(mockMap.setLayoutProperty).toHaveBeenCalledWith('layer1', 'visibility', 'none'); + }); + + it('should handle layer with CLASS_INSTANCE', () => { + const mockShow = jasmine.createSpy('show'); + const mockHide = jasmine.createSpy('hide'); + const layer = { + renderLayers: ['layer1'], + CLASS_NAME: 'TestLayer', + CLASS_INSTANCE: { + show: mockShow, + hide: mockHide + } + }; + + instance.setLayersVisible([layer], 'visible', true); + + expect(mockShow).toHaveBeenCalled(); + expect(mockHide).not.toHaveBeenCalled(); + expect(mockMap.style.fire).toHaveBeenCalledWith('data', { dataType: 'style' }); + }); + + it('should handle layer with CLASS_INSTANCE and hide', () => { + const mockShow = jasmine.createSpy('show'); + const mockHide = jasmine.createSpy('hide'); + const layer = { + renderLayers: ['layer1'], + CLASS_NAME: 'TestLayer', + CLASS_INSTANCE: { + show: mockShow, + hide: mockHide + } + }; + + instance.setLayersVisible([layer], 'none', true); + + expect(mockHide).toHaveBeenCalled(); + expect(mockShow).not.toHaveBeenCalled(); + expect(mockMap.style.fire).toHaveBeenCalledWith('data', { dataType: 'style' }); + }); + + it('should skip layersVisibleMap when isSetVisible is false', () => { + const layer = { + renderLayers: ['layer1'], + CLASS_NAME: 'TestLayer' + }; + + instance.setLayersVisible([layer], 'visible', false); + + // isSetVisible=false 只跳过 layersVisibleMap 的设置,但 setLayoutProperty 仍会被调用 + expect(mockMap.setLayoutProperty).toHaveBeenCalledWith('layer1', 'visibility', 'visible'); + }); + + it('should handle multiple renderLayers', () => { + const layer = { + renderLayers: ['layer1', 'layer2', 'layer3'], + CLASS_NAME: 'TestLayer' + }; + + instance.setLayersVisible([layer], 'visible', true); + + expect(mockMap.setLayoutProperty).toHaveBeenCalledTimes(3); + expect(mockMap.setLayoutProperty).toHaveBeenCalledWith('layer1', 'visibility', 'visible'); + expect(mockMap.setLayoutProperty).toHaveBeenCalledWith('layer2', 'visibility', 'visible'); + expect(mockMap.setLayoutProperty).toHaveBeenCalledWith('layer3', 'visibility', 'visible'); + }); + + it('should skip L7Layer when getLayer returns falsy', () => { + mockMap.getLayer.and.returnValue(null); + const layer = { + renderLayers: ['l7layer1'], + CLASS_NAME: 'L7Layer' + }; + + instance.setLayersVisible([layer], 'visible', true); + + expect(mockMap.setLayoutProperty).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/test/test-main-common.js b/test/test-main-common.js index 09a89c3198..ddcc684199 100644 --- a/test/test-main-common.js +++ b/test/test-main-common.js @@ -227,6 +227,7 @@ import './common/util/EncryptRequestSpec'; import './common/util/MapCalculateUtilSpec'; import './common/util/GeometryAnalysisSpec.js'; +import './common/mapping/utils/AppreciableLayerBaseSpec.js' import './common/mapping/utils/L7LayerUtilSpec'; import './common/mapping/utils/ColorUtilSpec.js'; import './common/mapping/utils/SourceListModelV2Spec.js'; @@ -234,4 +235,4 @@ import './common/mapping/utils/SourceListModelV3Spec.js'; import './common/mapping/utils/epsgDefineSpec.js'; import './common/mapping/utils/UtilSpec.js'; import './common/mapping/WebMapServiceSpec'; -import './common/mapping/WebMapV2BaseSpec'; \ No newline at end of file +import './common/mapping/WebMapV2BaseSpec'; From 340698acf2f12e79d878998510fb5987904a842f Mon Sep 17 00:00:00 2001 From: xiongjj Date: Fri, 26 Jun 2026 14:31:18 +0800 Subject: [PATCH 28/46] =?UTF-8?q?feat=20=E5=8F=AF=E6=84=9F=E7=9F=A5?= =?UTF-8?q?=E5=9B=BE=E5=B1=82=E6=96=B0=E5=A2=9EdataSource=20vector?= =?UTF-8?q?=E7=9A=84=E9=9D=9Erestmap=20=E7=B1=BB=E5=9E=8B=20AI-GEN:=2060%?= =?UTF-8?q?=20Cursor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/mapping/utils/SourceListModelV3.js | 33 +- .../mapping/utils/SourceListModelV3Spec.js | 1171 +++++++++++++++++ 2 files changed, 1196 insertions(+), 8 deletions(-) diff --git a/src/common/mapping/utils/SourceListModelV3.js b/src/common/mapping/utils/SourceListModelV3.js index 637f3f7768..f0ed952e50 100644 --- a/src/common/mapping/utils/SourceListModelV3.js +++ b/src/common/mapping/utils/SourceListModelV3.js @@ -175,17 +175,34 @@ export class SourceListModelV3 extends AppreciableLayerBase { const sourceOnMap = this.map.getSource(layer.source); if (!Object.keys(dataSource).length && sourceOnMap && sourceOnMap.type === 'vector') { const matchSource = this._mapInfo.sources[layer.source] || sourceOnMap; - if (matchSource.tiles && matchSource.tiles[0].includes('/rest/maps/')) { + if (matchSource.tiles && matchSource.tiles.length > 0) { const tileUrl = matchSource.tiles[0]; - const [serverUrl, leftParts] = tileUrl.split('/rest/maps/'); - const [mapName] = leftParts.split('/tileFeature'); - dataSource.url = `${serverUrl}/rest/maps`; - dataSource.mapName = mapName; - dataSource.type = 'REST_MAP'; - dataSource.layerName = serviceLayerId; + switch (true) { + case tileUrl.includes('/rest/maps/'): { + const [serverUrl, leftParts] = tileUrl.split('/rest/maps/'); + const [mapName] = leftParts.split('/tileFeature'); + dataSource.url = `${serverUrl}/rest/maps`; + dataSource.mapName = mapName; + dataSource.type = 'REST_MAP'; + dataSource.layerName = serviceLayerId; + break; + } + case tileUrl.includes('/restjsr/v1/'): { + const [serverUrl, leftParts] = tileUrl.split('/restjsr/v1/'); + const [mapName] = leftParts.split('/tiles/'); + dataSource.url = `${serverUrl}/restjsr/v1/vectortile/maps`; + dataSource.mapName = mapName; + dataSource.type = 'RESTJSR'; + break; + } + default: { + dataSource.url = tileUrl; + dataSource.type = 'VECTOR_OTHER'; + } + } } } - layerInfo.dataSource = dataSource; + layerInfo.dataSource = Object.assign(dataSource, { serviceLayerId }); if (this._l7LayerUtil.isL7Layer(layer)) { layerInfo.CLASS_NAME = 'L7Layer'; } diff --git a/test/common/mapping/utils/SourceListModelV3Spec.js b/test/common/mapping/utils/SourceListModelV3Spec.js index 9831a3fc6f..b310403446 100644 --- a/test/common/mapping/utils/SourceListModelV3Spec.js +++ b/test/common/mapping/utils/SourceListModelV3Spec.js @@ -1757,4 +1757,1175 @@ describe('SourceListV3', () => { expect(nextAppreciableLayers.some(item => item.title === baseLayerInfoCopy.layers[0].metadata.title)).toBeTruthy(); done(); }); + + it('getSelfLayerIds', (done) => { + const mapInfo = JSON.parse(apstudioWebMap_layerData); + const sourceListModel = new SourceListModelV3({ + map, + mapInfo, + mapResourceInfo: JSON.parse(msProjectINfo_layerData), + legendList: [], + l7LayerUtil: { + isL7Layer, + getL7MarkerLayers: () => ({}) + } + }); + const selfLayerIds = sourceListModel.getSelfLayerIds(); + expect(Array.isArray(selfLayerIds)).toBeTruthy(); + expect(selfLayerIds.length).toBeGreaterThan(0); + selfLayerIds.forEach(id => { + expect(typeof id).toBe('string'); + }); + done(); + }); + + it('setBaseLayer with single layer', (done) => { + const mapInfo = { + metadata: { + layerCatalog: [ + { + visible: true, + id: 'test-layer', + title: 'test-layer', + type: 'basic' + }, + { + visible: true, + id: 'base-layer', + title: 'base-layer', + type: 'basic' + } + ] + }, + sources: { + 'test-layer': { + type: 'raster', + tiles: ['http://localhost/test.png'] + }, + 'base-layer': { + type: 'raster', + tiles: ['http://localhost/base.png'] + } + }, + layers: [ + { + id: 'test-layer', + type: 'raster', + source: 'test-layer', + minzoom: 0, + maxzoom: 12 + }, + { + id: 'base-layer', + type: 'raster', + source: 'base-layer', + minzoom: 0, + maxzoom: 12 + } + ], + version: '3.0.0' + }; + const sourceListModel = new SourceListModelV3({ + map, + mapInfo, + mapResourceInfo: {}, + legendList: [], + l7LayerUtil: { + isL7Layer, + getL7MarkerLayers: () => ({}) + } + }); + const newBaseLayer = { + id: 'new-base', + title: 'new-base', + layers: [ + { + id: 'new-base-layer', + type: 'raster', + source: 'new-base-source', + minzoom: 0, + maxzoom: 12 + } + ], + sources: { + 'new-base-source': { + type: 'raster', + tiles: ['http://localhost/newbase.png'] + } + } + }; + sourceListModel.setBaseLayer(newBaseLayer); + const updatedLayers = sourceListModel.getLayers(); + expect(updatedLayers.some(layer => layer.id === 'new-base-layer')).toBeTruthy(); + expect(updatedLayers[0].id).toBe('new-base-layer'); + done(); + }); + + it('setBaseLayer with group layer', (done) => { + const mapInfo = { + metadata: { + layerCatalog: [ + { + visible: true, + id: 'test-layer', + title: 'test-layer', + type: 'basic' + }, + { + visible: true, + id: 'base-layer', + title: 'base-layer', + type: 'basic' + } + ] + }, + sources: { + 'test-layer': { + type: 'raster', + tiles: ['http://localhost/test.png'] + }, + 'base-layer': { + type: 'raster', + tiles: ['http://localhost/base.png'] + } + }, + layers: [ + { + id: 'test-layer', + type: 'raster', + source: 'test-layer', + minzoom: 0, + maxzoom: 12 + }, + { + id: 'base-layer', + type: 'raster', + source: 'base-layer', + minzoom: 0, + maxzoom: 12 + } + ], + version: '3.0.0' + }; + const sourceListModel = new SourceListModelV3({ + map, + mapInfo, + mapResourceInfo: {}, + legendList: [], + l7LayerUtil: { + isL7Layer, + getL7MarkerLayers: () => ({}) + } + }); + const newBaseLayer = { + id: 'new-base-group', + title: 'new-base-group', + layers: [ + { + id: 'new-base-layer-1', + type: 'raster', + source: 'new-base-source-1', + minzoom: 0, + maxzoom: 12, + metadata: { title: 'layer-1' } + }, + { + id: 'new-base-layer-2', + type: 'raster', + source: 'new-base-source-2', + minzoom: 0, + maxzoom: 12, + metadata: { title: 'layer-2' } + } + ], + sources: { + 'new-base-source-1': { + type: 'raster', + tiles: ['http://localhost/newbase1.png'] + }, + 'new-base-source-2': { + type: 'raster', + tiles: ['http://localhost/newbase2.png'] + } + } + }; + sourceListModel.setBaseLayer(newBaseLayer); + const layerCatalog = sourceListModel.getLayerCatalog(); + const baseCatalog = layerCatalog[layerCatalog.length - 1]; + expect(baseCatalog.id).toBe('new-base-group'); + expect(baseCatalog.type).toBe('group'); + expect(baseCatalog.children.length).toBe(2); + expect(baseCatalog.children[0].title).toBe('layer-1'); + expect(baseCatalog.children[1].title).toBe('layer-2'); + done(); + }); + + it('_generateLayers with REST_DATA source', (done) => { + const mapInfo = { + metadata: { + layerCatalog: [ + { + visible: true, + id: 'rest-data-layer', + title: 'REST_DATA Layer', + type: 'basic' + } + ] + }, + sources: { + 'rest-data-source': { + type: 'vector', + tiles: ['http://localhost:8090/iserver/services/data-test/rest/data/datasources/test/datasets/test_dataset/tileFeature.mvt'] + } + }, + layers: [ + { + id: 'rest-data-layer', + type: 'circle', + source: 'rest-data-source', + 'source-layer': 'test_dataset' + } + ], + version: '3.0.0' + }; + const mapResourceInfo = { + catalogs: [ + { + id: 'rest-data-layer', + msDatasetId: 'ms_test_dataset_123', + serviceLayerId: '0' + } + ], + datas: [ + { + sourceType: 'REST_DATA', + url: 'http://localhost:8090/iserver/services/data-test/rest/data/datasources/test', + datasets: [ + { + msDatasetId: 'ms_test_dataset_123', + datasetId: 'test_dataset', + datasetName: 'test:test_dataset' + } + ] + } + ] + }; + const sourceListModel = new SourceListModelV3({ + map, + mapInfo, + mapResourceInfo, + legendList: [], + l7LayerUtil: { + isL7Layer, + getL7MarkerLayers: () => ({}) + } + }); + const layers = sourceListModel.getLayers(); + const restDataLayer = layers.find(layer => layer.id === 'rest-data-layer'); + expect(restDataLayer).toBeTruthy(); + expect(restDataLayer.layerInfo.dataSource.type).toBe('REST_DATA'); + expect(restDataLayer.layerInfo.dataSource.url).toBe('http://localhost:8090/iserver/services/data-test/rest/data'); + expect(restDataLayer.layerInfo.dataSource.dataSourceName).toBe('test:test_dataset'); + done(); + }); + + it('_generateLayers with REST_MAP source', (done) => { + const mapInfo = { + metadata: { + layerCatalog: [ + { + visible: true, + id: 'rest-map-layer', + title: 'REST_MAP Layer', + type: 'basic' + } + ] + }, + sources: { + 'rest-map-source': { + type: 'vector', + tiles: ['http://localhost:8090/iserver/services/map-test/rest/maps/test_map/tileFeature.mvt'] + } + }, + layers: [ + { + id: 'rest-map-layer', + type: 'circle', + source: 'rest-map-source', + 'source-layer': 'test_layer' + } + ], + version: '3.0.0' + }; + const sourceListModel = new SourceListModelV3({ + map, + mapInfo, + mapResourceInfo: {}, + legendList: [], + l7LayerUtil: { + isL7Layer, + getL7MarkerLayers: () => ({}) + } + }); + const layers = sourceListModel.getLayers(); + const restMapLayer = layers.find(layer => layer.id === 'rest-map-layer'); + expect(restMapLayer).toBeTruthy(); + expect(restMapLayer.layerInfo.dataSource.type).toBe('REST_MAP'); + expect(restMapLayer.layerInfo.dataSource.url).toBe('http://localhost:8090/iserver/services/map-test/rest/maps'); + expect(restMapLayer.layerInfo.dataSource.mapName).toBe('test_map'); + done(); + }); + + it('_generateLayers with RESTJSR source', (done) => { + const mapInfo = { + metadata: { + layerCatalog: [ + { + visible: true, + id: 'restjsr-layer', + title: 'RESTJSR Layer', + type: 'basic' + } + ] + }, + sources: { + 'restjsr-source': { + type: 'vector', + tiles: ['http://localhost:8090/restjsr/v1/maps/test_map/tiles/{z}/{x}/{y}.mvt'] + } + }, + layers: [ + { + id: 'restjsr-layer', + type: 'circle', + source: 'restjsr-source', + 'source-layer': 'test_layer' + } + ], + version: '3.0.0' + }; + const sourceListModel = new SourceListModelV3({ + map, + mapInfo, + mapResourceInfo: {}, + legendList: [], + l7LayerUtil: { + isL7Layer, + getL7MarkerLayers: () => ({}) + } + }); + const layers = sourceListModel.getLayers(); + const restjsrLayer = layers.find(layer => layer.id === 'restjsr-layer'); + expect(restjsrLayer).toBeTruthy(); + expect(restjsrLayer.layerInfo.dataSource.type).toBe('RESTJSR'); + expect(restjsrLayer.layerInfo.dataSource.url).toBe('http://localhost:8090/restjsr/v1/vectortile/maps'); + expect(restjsrLayer.layerInfo.dataSource.mapName).toBe('test_map'); + done(); + }); + + it('_generateLayers with VECTOR_OTHER source', (done) => { + const mapInfo = { + metadata: { + layerCatalog: [ + { + visible: true, + id: 'other-vector-layer', + title: 'OTHER Vector Layer', + type: 'basic' + } + ] + }, + sources: { + 'other-vector-source': { + type: 'vector', + tiles: ['http://localhost:8080/tiles/{z}/{x}/{y}.mvt'] + } + }, + layers: [ + { + id: 'other-vector-layer', + type: 'circle', + source: 'other-vector-source', + 'source-layer': 'layer_name' + } + ], + version: '3.0.0' + }; + const sourceListModel = new SourceListModelV3({ + map, + mapInfo, + mapResourceInfo: {}, + legendList: [], + l7LayerUtil: { + isL7Layer, + getL7MarkerLayers: () => ({}) + } + }); + const layers = sourceListModel.getLayers(); + const otherLayer = layers.find(layer => layer.id === 'other-vector-layer'); + expect(otherLayer).toBeTruthy(); + expect(otherLayer.layerInfo.dataSource.type).toBe('VECTOR_OTHER'); + expect(otherLayer.layerInfo.dataSource.url).toBe('http://localhost:8080/tiles/{z}/{x}/{y}.mvt'); + done(); + }); + + it('_generateLayers with serviceLayerId in dataSource', (done) => { + const mapInfo = { + metadata: { + layerCatalog: [ + { + visible: true, + id: 'service-layer', + title: 'Service Layer', + type: 'basic' + } + ] + }, + sources: { + 'service-source': { + type: 'vector', + tiles: ['http://localhost:8090/iserver/services/data-test/rest/data/datasources/test/datasets/test_dataset/tileFeature.mvt'] + } + }, + layers: [ + { + id: 'service-layer', + type: 'circle', + source: 'service-source', + 'source-layer': 'test_dataset' + } + ], + version: '3.0.0' + }; + const mapResourceInfo = { + catalogs: [ + { + id: 'service-layer', + msDatasetId: 'ms_test_dataset_123', + serviceLayerId: '1.2' + } + ], + datas: [ + { + sourceType: 'REST_DATA', + url: 'http://localhost:8090/iserver/services/data-test/rest/data/datasources/test', + datasets: [ + { + msDatasetId: 'ms_test_dataset_123', + datasetId: 'test_dataset', + datasetName: 'test:test_dataset' + } + ] + } + ] + }; + const sourceListModel = new SourceListModelV3({ + map, + mapInfo, + mapResourceInfo, + legendList: [], + l7LayerUtil: { + isL7Layer, + getL7MarkerLayers: () => ({}) + } + }); + const layers = sourceListModel.getLayers(); + const serviceLayer = layers.find(layer => layer.id === 'service-layer'); + expect(serviceLayer).toBeTruthy(); + expect(serviceLayer.layerInfo.dataSource.serviceLayerId).toBe('1.2'); + expect(serviceLayer.layerInfo.dataSource.type).toBe('REST_DATA'); + expect(serviceLayer.layerInfo.dataSource.url).toBe('http://localhost:8090/iserver/services/data-test/rest/data'); + expect(serviceLayer.layerInfo.dataSource.dataSourceName).toBe('test:test_dataset'); + done(); + }); + + it('_generateLayers without serviceLayerId in dataSource', (done) => { + const mapInfo = { + metadata: { + layerCatalog: [ + { + visible: true, + id: 'no-service-layer', + title: 'No Service Layer', + type: 'basic' + } + ] + }, + sources: { + 'no-service-source': { + type: 'vector', + tiles: ['http://localhost:8090/iserver/services/data-test/rest/data/datasources/test/datasets/test_dataset/tileFeature.mvt'] + } + }, + layers: [ + { + id: 'no-service-layer', + type: 'circle', + source: 'no-service-source', + 'source-layer': 'test_dataset' + } + ], + version: '3.0.0' + }; + const mapResourceInfo = { + catalogs: [ + { + id: 'no-service-layer', + msDatasetId: 'ms_test_dataset_123' + } + ], + datas: [ + { + sourceType: 'REST_DATA', + url: 'http://localhost:8090/iserver/services/data-test/rest/data/datasources/test', + datasets: [ + { + msDatasetId: 'ms_test_dataset_123', + datasetId: 'test_dataset', + datasetName: 'test:test_dataset' + } + ] + } + ] + }; + const sourceListModel = new SourceListModelV3({ + map, + mapInfo, + mapResourceInfo, + legendList: [], + l7LayerUtil: { + isL7Layer, + getL7MarkerLayers: () => ({}) + } + }); + const layers = sourceListModel.getLayers(); + const noServiceLayer = layers.find(layer => layer.id === 'no-service-layer'); + expect(noServiceLayer).toBeTruthy(); + expect(noServiceLayer.layerInfo.dataSource.serviceLayerId).toBeUndefined(); + expect(noServiceLayer.layerInfo.dataSource.type).toBe('REST_DATA'); + expect(noServiceLayer.layerInfo.dataSource.url).toBe('http://localhost:8090/iserver/services/data-test/rest/data'); + expect(noServiceLayer.layerInfo.dataSource.dataSourceName).toBe('test:test_dataset'); + done(); + }); + + it('_generateLayers with empty serviceLayerId', (done) => { + const mapInfo = { + metadata: { + layerCatalog: [ + { + visible: true, + id: 'empty-service-layer', + title: 'Empty Service Layer', + type: 'basic' + } + ] + }, + sources: { + 'empty-service-source': { + type: 'vector', + tiles: ['http://localhost:8090/iserver/services/data-test/rest/data/datasources/test/datasets/test_dataset/tileFeature.mvt'] + } + }, + layers: [ + { + id: 'empty-service-layer', + type: 'circle', + source: 'empty-service-source', + 'source-layer': 'test_dataset' + } + ], + version: '3.0.0' + }; + const mapResourceInfo = { + catalogs: [ + { + id: 'empty-service-layer', + msDatasetId: 'ms_test_dataset_123', + serviceLayerId: '' + } + ], + datas: [ + { + sourceType: 'REST_DATA', + url: 'http://localhost:8090/iserver/services/data-test/rest/data/datasources/test', + datasets: [ + { + msDatasetId: 'ms_test_dataset_123', + datasetId: 'test_dataset', + datasetName: 'test:test_dataset' + } + ] + } + ] + }; + const sourceListModel = new SourceListModelV3({ + map, + mapInfo, + mapResourceInfo, + legendList: [], + l7LayerUtil: { + isL7Layer, + getL7MarkerLayers: () => ({}) + } + }); + const layers = sourceListModel.getLayers(); + const emptyServiceLayer = layers.find(layer => layer.id === 'empty-service-layer'); + expect(emptyServiceLayer).toBeTruthy(); + expect(emptyServiceLayer.layerInfo.dataSource.serviceLayerId).toBe(''); + expect(emptyServiceLayer.layerInfo.dataSource.type).toBe('REST_DATA'); + done(); + }); + + it('_generateLayers with REST_MAP source and serviceLayerId', (done) => { + const mapInfo = { + metadata: { + layerCatalog: [ + { + visible: true, + id: 'rest-map-service-layer', + title: 'REST_MAP Service Layer', + type: 'basic' + } + ] + }, + sources: { + 'rest-map-service-source': { + type: 'vector', + tiles: ['http://localhost:8090/iserver/services/map-test/rest/maps/test_map/tileFeature.mvt'] + } + }, + layers: [ + { + id: 'rest-map-service-layer', + type: 'circle', + source: 'rest-map-service-source', + 'source-layer': 'test_layer' + } + ], + version: '3.0.0' + }; + const mapResourceInfo = { + catalogs: [ + { + id: 'rest-map-service-layer', + serviceLayerId: '2' + } + ], + datas: [] + }; + const sourceListModel = new SourceListModelV3({ + map, + mapInfo, + mapResourceInfo, + legendList: [], + l7LayerUtil: { + isL7Layer, + getL7MarkerLayers: () => ({}) + } + }); + const layers = sourceListModel.getLayers(); + const restMapLayer = layers.find(layer => layer.id === 'rest-map-service-layer'); + expect(restMapLayer).toBeTruthy(); + expect(restMapLayer.layerInfo.dataSource.type).toBe('REST_MAP'); + expect(restMapLayer.layerInfo.dataSource.url).toBe('http://localhost:8090/iserver/services/map-test/rest/maps'); + expect(restMapLayer.layerInfo.dataSource.mapName).toBe('test_map'); + expect(restMapLayer.layerInfo.dataSource.serviceLayerId).toBe('2'); + done(); + }); + + it('_generateLayers with RESTJSR source and serviceLayerId', (done) => { + const mapInfo = { + metadata: { + layerCatalog: [ + { + visible: true, + id: 'restjsr-service-layer', + title: 'RESTJSR Service Layer', + type: 'basic' + } + ] + }, + sources: { + 'restjsr-service-source': { + type: 'vector', + tiles: ['http://localhost:8090/restjsr/v1/maps/test_map/tiles/{z}/{x}/{y}.mvt'] + } + }, + layers: [ + { + id: 'restjsr-service-layer', + type: 'circle', + source: 'restjsr-service-source', + 'source-layer': 'test_layer' + } + ], + version: '3.0.0' + }; + const mapResourceInfo = { + catalogs: [ + { + id: 'restjsr-service-layer', + serviceLayerId: '3' + } + ], + datas: [] + }; + const sourceListModel = new SourceListModelV3({ + map, + mapInfo, + mapResourceInfo, + legendList: [], + l7LayerUtil: { + isL7Layer, + getL7MarkerLayers: () => ({}) + } + }); + const layers = sourceListModel.getLayers(); + const restjsrLayer = layers.find(layer => layer.id === 'restjsr-service-layer'); + expect(restjsrLayer).toBeTruthy(); + expect(restjsrLayer.layerInfo.dataSource.type).toBe('RESTJSR'); + expect(restjsrLayer.layerInfo.dataSource.url).toBe('http://localhost:8090/restjsr/v1/vectortile/maps'); + expect(restjsrLayer.layerInfo.dataSource.mapName).toBe('test_map'); + expect(restjsrLayer.layerInfo.dataSource.serviceLayerId).toBe('3'); + done(); + }); + + it('_generateLayers with VECTOR_OTHER source and serviceLayerId', (done) => { + const mapInfo = { + metadata: { + layerCatalog: [ + { + visible: true, + id: 'other-service-layer', + title: 'OTHER Service Layer', + type: 'basic' + } + ] + }, + sources: { + 'other-service-source': { + type: 'vector', + tiles: ['http://localhost:8080/tiles/{z}/{x}/{y}.mvt'] + } + }, + layers: [ + { + id: 'other-service-layer', + type: 'circle', + source: 'other-service-source', + 'source-layer': 'layer_name' + } + ], + version: '3.0.0' + }; + const mapResourceInfo = { + catalogs: [ + { + id: 'other-service-layer', + serviceLayerId: '4' + } + ], + datas: [] + }; + const sourceListModel = new SourceListModelV3({ + map, + mapInfo, + mapResourceInfo, + legendList: [], + l7LayerUtil: { + isL7Layer, + getL7MarkerLayers: () => ({}) + } + }); + const layers = sourceListModel.getLayers(); + const otherLayer = layers.find(layer => layer.id === 'other-service-layer'); + expect(otherLayer).toBeTruthy(); + expect(otherLayer.layerInfo.dataSource.type).toBe('VECTOR_OTHER'); + expect(otherLayer.layerInfo.dataSource.url).toBe('http://localhost:8080/tiles/{z}/{x}/{y}.mvt'); + expect(otherLayer.layerInfo.dataSource.serviceLayerId).toBe('4'); + done(); + }); + + it('_generateLayers with chart type layer', (done) => { + const mapInfo = { + metadata: { + layerCatalog: [ + { + visible: true, + id: 'chart-layer', + title: 'Chart Layer', + type: 'basic' + } + ] + }, + sources: { + 'chart-source': { + type: 'geojson', + data: { + type: 'FeatureCollection', + features: [] + } + } + }, + layers: [ + { + id: 'chart-layer', + type: 'chart', + source: 'chart-source' + } + ], + version: '3.0.0' + }; + const sourceListModel = new SourceListModelV3({ + map, + mapInfo, + mapResourceInfo: {}, + legendList: [], + l7LayerUtil: { + isL7Layer, + getL7MarkerLayers: () => ({}) + } + }); + const layers = sourceListModel.getLayers(); + const chartLayer = layers.find(layer => layer.id === 'chart-layer'); + expect(chartLayer).toBeTruthy(); + expect(chartLayer.layerInfo.metadata.SM_Layer_Order).toBe('top'); + done(); + }); + + it('_generateLayers with legendList', (done) => { + const mapInfo = { + metadata: { + layerCatalog: [ + { + visible: true, + id: 'legend-layer', + title: 'Legend Layer', + type: 'basic' + } + ] + }, + sources: { + 'legend-source': { + type: 'vector', + tiles: ['http://localhost/test.mvt'] + } + }, + layers: [ + { + id: 'legend-layer', + type: 'circle', + source: 'legend-source' + } + ], + version: '3.0.0' + }; + const legendList = [ + { layerId: 'legend-layer', themeField: 'field1' }, + { layerId: 'legend-layer', themeField: 'field2' }, + { layerId: 'legend-layer', themeField: 'field1' } + ]; + const sourceListModel = new SourceListModelV3({ + map, + mapInfo, + mapResourceInfo: {}, + legendList, + l7LayerUtil: { + isL7Layer, + getL7MarkerLayers: () => ({}) + } + }); + const layers = sourceListModel.getLayers(); + const legendLayer = layers.find(layer => layer.id === 'legend-layer'); + expect(legendLayer).toBeTruthy(); + expect(legendLayer.themeSetting).toBeTruthy(); + expect(legendLayer.themeSetting.themeField).toEqual(['field1', 'field2']); + done(); + }); + + it('_generateBaseLayerInfo', (done) => { + const mapInfo = { + metadata: { + layerCatalog: [ + { + visible: true, + id: 'overlay-layer', + title: 'Overlay Layer', + type: 'basic' + }, + { + visible: true, + id: 'base-layer', + title: 'Base Layer', + type: 'basic' + } + ] + }, + sources: { + 'overlay-layer': { + type: 'vector', + tiles: ['http://localhost/overlay.mvt'] + }, + 'base-layer': { + type: 'raster', + tiles: ['http://localhost/base.png'] + } + }, + layers: [ + { + id: 'base-layer', + type: 'raster', + source: 'base-layer', + minzoom: 0, + maxzoom: 12 + }, + { + id: 'overlay-layer', + type: 'circle', + source: 'overlay-layer', + minzoom: 0, + maxzoom: 12 + } + ], + version: '3.0.0' + }; + const sourceListModel = new SourceListModelV3({ + map, + mapInfo, + mapResourceInfo: {}, + legendList: [], + l7LayerUtil: { + isL7Layer, + getL7MarkerLayers: () => ({}) + } + }); + const baseLayerInfo = sourceListModel.baseLayerInfoOnMap; + expect(baseLayerInfo).toBeTruthy(); + expect(baseLayerInfo.id).toBe('__default__base-layer'); + expect(baseLayerInfo.title).toBe('Base Layer'); + expect(baseLayerInfo.layers.length).toBe(1); + expect(baseLayerInfo.layers[0].id).toBe('base-layer'); + expect(baseLayerInfo.sources['base-layer']).toBeTruthy(); + done(); + }); + + it('_getBaseLayerRenderLayers with children', (done) => { + const mapInfo = { + metadata: { + layerCatalog: [ + { + visible: true, + id: 'overlay-layer', + title: 'Overlay Layer', + type: 'basic' + }, + { + visible: true, + id: 'base-group', + title: 'Base Group', + type: 'group', + children: [ + { + visible: true, + id: 'base-layer-1', + title: 'Base Layer 1', + type: 'basic' + }, + { + visible: true, + id: 'base-layer-2', + title: 'Base Layer 2', + type: 'basic' + } + ] + } + ] + }, + sources: { + 'overlay-layer': { + type: 'vector', + tiles: ['http://localhost/overlay.mvt'] + }, + 'base-layer-1': { + type: 'raster', + tiles: ['http://localhost/base1.png'] + }, + 'base-layer-2': { + type: 'raster', + tiles: ['http://localhost/base2.png'] + } + }, + layers: [ + { + id: 'base-layer-1', + type: 'raster', + source: 'base-layer-1', + minzoom: 0, + maxzoom: 12 + }, + { + id: 'base-layer-2', + type: 'raster', + source: 'base-layer-2', + minzoom: 0, + maxzoom: 12 + }, + { + id: 'overlay-layer', + type: 'circle', + source: 'overlay-layer', + minzoom: 0, + maxzoom: 12 + } + ], + version: '3.0.0' + }; + const sourceListModel = new SourceListModelV3({ + map, + mapInfo, + mapResourceInfo: {}, + legendList: [], + l7LayerUtil: { + isL7Layer, + getL7MarkerLayers: () => ({}) + } + }); + const baseLayerInfo = sourceListModel.baseLayerInfoOnMap; + expect(baseLayerInfo).toBeTruthy(); + expect(baseLayerInfo.layers.length).toBe(2); + expect(baseLayerInfo.layers.some(layer => layer.id === 'base-layer-1')).toBeTruthy(); + expect(baseLayerInfo.layers.some(layer => layer.id === 'base-layer-2')).toBeTruthy(); + done(); + }); + + it('_removeBaseLayerRenderLayers', (done) => { + const mapInfo = { + metadata: { + layerCatalog: [ + { + visible: true, + id: 'overlay-layer', + title: 'Overlay Layer', + type: 'basic' + }, + { + visible: true, + id: 'base-layer', + title: 'Base Layer', + type: 'basic' + } + ] + }, + sources: { + 'overlay-layer': { + type: 'vector', + tiles: ['http://localhost/overlay.mvt'] + }, + 'base-layer': { + type: 'raster', + tiles: ['http://localhost/base.png'] + } + }, + layers: [ + { + id: 'base-layer', + type: 'raster', + source: 'base-layer', + minzoom: 0, + maxzoom: 12 + }, + { + id: 'overlay-layer', + type: 'circle', + source: 'overlay-layer', + minzoom: 0, + maxzoom: 12 + } + ], + version: '3.0.0' + }; + const sourceListModel = new SourceListModelV3({ + map, + mapInfo, + mapResourceInfo: {}, + legendList: [], + l7LayerUtil: { + isL7Layer, + getL7MarkerLayers: () => ({}) + } + }); + const initialLayers = sourceListModel.getLayers(); + expect(initialLayers.length).toBeGreaterThanOrEqual(2); + sourceListModel.changeBaseLayer({ + id: 'new-base', + title: 'New Base', + layers: [ + { + id: 'new-base-layer', + type: 'raster', + source: 'new-base-source', + minzoom: 0, + maxzoom: 12 + } + ], + sources: { + 'new-base-source': { + type: 'raster', + tiles: ['http://localhost/newbase.png'] + } + } + }); + const updatedLayers = sourceListModel.getLayers(); + expect(updatedLayers.some(layer => layer.id === 'base-layer')).toBeFalsy(); + expect(updatedLayers.some(layer => layer.id === 'new-base-layer')).toBeTruthy(); + expect(updatedLayers.some(layer => layer.id === 'overlay-layer')).toBeTruthy(); + done(); + }); + + it('_generateLayers with L7 layer', (done) => { + const mapInfo = { + metadata: { + layerCatalog: [ + { + visible: true, + id: 'l7-layer', + title: 'L7 Layer', + type: 'basic' + } + ] + }, + sources: {}, + layers: [ + { + id: 'l7-layer', + type: 'custom', + renderingMode: '3d', + overlay: true + } + ], + version: '3.0.0' + }; + const l7MarkerLayers = { + 'l7-layer': { + show: () => {}, + hide: () => {} + } + }; + const sourceListModel = new SourceListModelV3({ + map, + mapInfo, + mapResourceInfo: {}, + legendList: [], + l7LayerUtil: { + isL7Layer: () => true, + getL7MarkerLayers: () => l7MarkerLayers + } + }); + const layers = sourceListModel.getLayers(); + const l7Layer = layers.find(layer => layer.id === 'l7-layer'); + expect(l7Layer).toBeTruthy(); + expect(l7Layer.CLASS_NAME).toBe('L7Layer'); + expect(l7Layer.CLASS_INSTANCE).toBe(l7MarkerLayers['l7-layer']); + done(); + }); }); From 5671625f06b1d05a112d963a73a9dae04d487530 Mon Sep 17 00:00:00 2001 From: luoxiao Date: Tue, 30 Jun 2026 10:00:09 +0800 Subject: [PATCH 29/46] =?UTF-8?q?[fix]webmap=20=E6=8F=90=E4=BE=9BsetLegend?= =?UTF-8?q?s=EF=BC=8CcleanLayers=E5=8F=AF=E9=85=8D=E7=BD=AE=E5=8F=82?= =?UTF-8?q?=E6=95=B0=20AI-GEN:=2060%=20Cursor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/mapping/MapBase.js | 4 ++ src/common/mapping/WebMapBase.js | 15 +++-- test/common/mapping/MapBaseSpec.js | 95 +++++++++++++++++++++++++++ test/common/mapping/WebMapBaseSpec.js | 81 +++++++++++++++++++++++ test/test-main-common.js | 2 + 5 files changed, 193 insertions(+), 4 deletions(-) create mode 100644 test/common/mapping/MapBaseSpec.js create mode 100644 test/common/mapping/WebMapBaseSpec.js diff --git a/src/common/mapping/MapBase.js b/src/common/mapping/MapBase.js index d4a221adc1..e9b561ae69 100644 --- a/src/common/mapping/MapBase.js +++ b/src/common/mapping/MapBase.js @@ -26,6 +26,10 @@ export function createMapClassExtending(SuperClass = class {}) { return this._legendList; } + setLegends(legendList) { + this._legendList = legendList || []; + } + getSelfAppreciableLayers() { return (this._sourceListModel && this._sourceListModel.getSelfLayers(...arguments)) || []; } diff --git a/src/common/mapping/WebMapBase.js b/src/common/mapping/WebMapBase.js index e8b33b775f..b812bc4c7e 100644 --- a/src/common/mapping/WebMapBase.js +++ b/src/common/mapping/WebMapBase.js @@ -485,16 +485,23 @@ export function createWebMapBaseExtending(SuperClass, { mapRepo }) { * @version 11.2.1 * @function WebMapBase.prototype.cleanLayers * @description 删除追加的图层和事件。当设置 `map` 时有效 + * @param {Array} [layersToClean] - 要删除的图层数组,默认为所有可删除的缓存图层(非 reused)。每个图层对象包含 id 属性 + * @param {boolean} [isClean=true] - 是否调用 clean(false) 销毁内部资源。为 false 时只删除指定图层并同步清理 legends */ - cleanLayers() { + cleanLayers(layersToClean = this._cacheCleanLayers.filter(item => !item.reused), isClean = true) { // 清空追加的地图图层以及对应的事件 if (!this.map) { return; } - const layersToClean = this._cacheCleanLayers.filter((item) => !item.reused); + const cacheLayers = this._cacheCleanLayers.filter((item) => !item.reused); this._handler && this._handler.cleanLayers(layersToClean); - this._cacheCleanLayers = []; - this.clean(false); + this._cacheCleanLayers = cacheLayers.filter(item => !layersToClean.some((item1=> item1.id === item.id))); + if (isClean) { + this.clean(false); + } else { + const legends = this.getLegends(); + this._handler.setLegends(legends.filter(item => !layersToClean.some((item1=> item1.id === item.layerId)))); + } } /** diff --git a/test/common/mapping/MapBaseSpec.js b/test/common/mapping/MapBaseSpec.js new file mode 100644 index 0000000000..ac42e1baf5 --- /dev/null +++ b/test/common/mapping/MapBaseSpec.js @@ -0,0 +1,95 @@ +import { createMapClassExtending } from '@supermapgis/iclient-common/mapping/MapBase'; + +describe('MapBase', () => { + let MapBase; + let instance; + + beforeEach(() => { + MapBase = createMapClassExtending(); + instance = new MapBase(); + }); + + describe('setLegends', () => { + it('should set _legendList with provided array', () => { + const legends = [ + { layerId: 'layer1', items: [{ color: '#fff', label: 'test' }] }, + { layerId: 'layer2', items: [{ color: '#000' }] } + ]; + + instance.setLegends(legends); + + expect(instance._legendList).toEqual(legends); + }); + + it('should set _legendList to empty array when null is passed', () => { + instance.setLegends(null); + + expect(instance._legendList).toEqual([]); + }); + + it('should set _legendList to empty array when undefined is passed', () => { + instance.setLegends(undefined); + + expect(instance._legendList).toEqual([]); + }); + + it('should set _legendList to empty array when no argument is passed', () => { + instance.setLegends(); + + expect(instance._legendList).toEqual([]); + }); + + it('should overwrite existing legends', () => { + instance._legendList = [{ layerId: 'old' }]; + + instance.setLegends([{ layerId: 'new' }]); + + expect(instance._legendList).toEqual([{ layerId: 'new' }]); + }); + }); + + describe('getLegends', () => { + it('should return _legendList', () => { + const legends = [{ layerId: 'layer1' }]; + instance._legendList = legends; + + expect(instance.getLegends()).toEqual(legends); + }); + + it('should return empty array when _legendList is not set', () => { + expect(instance.getLegends()).toEqual([]); + }); + }); + + describe('getLayerCatalog', () => { + it('should return _sourceListModel.getLayerCatalog() when _sourceListModel exists', () => { + const catalogs = [{ id: 'cat1' }]; + instance._sourceListModel = jasmine.createSpyObj('sourceListModel', ['getLayerCatalog']); + instance._sourceListModel.getLayerCatalog.and.returnValue(catalogs); + + expect(instance.getLayerCatalog()).toEqual(catalogs); + }); + + it('should return empty array when _sourceListModel is null', () => { + instance._sourceListModel = null; + + expect(instance.getLayerCatalog()).toEqual([]); + }); + }); + + describe('getLayers', () => { + it('should return _sourceListModel.getLayers() when _sourceListModel exists', () => { + const layers = [{ id: 'layer1' }]; + instance._sourceListModel = jasmine.createSpyObj('sourceListModel', ['getLayers']); + instance._sourceListModel.getLayers.and.returnValue(layers); + + expect(instance.getLayers()).toEqual(layers); + }); + + it('should return empty array when _sourceListModel is null', () => { + instance._sourceListModel = null; + + expect(instance.getLayers()).toEqual([]); + }); + }); +}); diff --git a/test/common/mapping/WebMapBaseSpec.js b/test/common/mapping/WebMapBaseSpec.js new file mode 100644 index 0000000000..23c55bf1b9 --- /dev/null +++ b/test/common/mapping/WebMapBaseSpec.js @@ -0,0 +1,81 @@ +import { createMapClassExtending } from '../../../src/common/mapping/MapBase'; + +describe('WebMapBase - MapBase Methods', () => { + let MapBase; + let instance; + + beforeEach(() => { + MapBase = createMapClassExtending(); + instance = new MapBase(); + }); + + describe('setLegends', () => { + it('should set _legendList with provided array', () => { + const legends = [ + { layerId: 'layer1', items: [{ color: '#fff', label: 'test' }] }, + { layerId: 'layer2', items: [{ color: '#000' }] } + ]; + + instance.setLegends(legends); + + expect(instance._legendList).toEqual(legends); + }); + + it('should set _legendList to empty array when null is passed', () => { + instance.setLegends(null); + + expect(instance._legendList).toEqual([]); + }); + + it('should set _legendList to empty array when undefined is passed', () => { + instance.setLegends(undefined); + + expect(instance._legendList).toEqual([]); + }); + }); + + describe('getLegends', () => { + it('should return _legendList', () => { + const legends = [{ layerId: 'layer1' }]; + instance._legendList = legends; + + expect(instance.getLegends()).toEqual(legends); + }); + + it('should return empty array when _legendList is not set', () => { + expect(instance.getLegends()).toEqual([]); + }); + }); + + describe('getLayerCatalog', () => { + it('should return _sourceListModel.getLayerCatalog() when _sourceListModel exists', () => { + const catalogs = [{ id: 'cat1' }]; + instance._sourceListModel = jasmine.createSpyObj('sourceListModel', ['getLayerCatalog']); + instance._sourceListModel.getLayerCatalog.and.returnValue(catalogs); + + expect(instance.getLayerCatalog()).toEqual(catalogs); + }); + + it('should return empty array when _sourceListModel is null', () => { + instance._sourceListModel = null; + + expect(instance.getLayerCatalog()).toEqual([]); + }); + }); + + describe('getLayers', () => { + it('should return _sourceListModel.getLayers() when _sourceListModel exists', () => { + const layers = [{ id: 'layer1' }]; + instance._sourceListModel = jasmine.createSpyObj('sourceListModel', ['getLayers']); + instance._sourceListModel.getLayers.and.returnValue(layers); + + expect(instance.getLayers()).toEqual(layers); + }); + + it('should return empty array when _sourceListModel is null', () => { + instance._sourceListModel = null; + + expect(instance.getLayers()).toEqual([]); + }); + }); +}); diff --git a/test/test-main-common.js b/test/test-main-common.js index ddcc684199..87cdbd6afc 100644 --- a/test/test-main-common.js +++ b/test/test-main-common.js @@ -229,10 +229,12 @@ import './common/util/GeometryAnalysisSpec.js'; import './common/mapping/utils/AppreciableLayerBaseSpec.js' import './common/mapping/utils/L7LayerUtilSpec'; +import './common/mapping/MapBaseSpec.js' import './common/mapping/utils/ColorUtilSpec.js'; import './common/mapping/utils/SourceListModelV2Spec.js'; import './common/mapping/utils/SourceListModelV3Spec.js'; import './common/mapping/utils/epsgDefineSpec.js'; import './common/mapping/utils/UtilSpec.js'; +import './common/mapping/WebMapBaseSpec.js'; import './common/mapping/WebMapServiceSpec'; import './common/mapping/WebMapV2BaseSpec'; From 5cd15829cd9bf55d62bb54474787a9e696d48cf5 Mon Sep 17 00:00:00 2001 From: songyumeng Date: Tue, 30 Jun 2026 18:04:27 +0800 Subject: [PATCH 30/46] =?UTF-8?q?=E3=80=90fix=E3=80=91bound=20=E4=B8=8D?= =?UTF-8?q?=E5=90=88=E6=B3=95=E4=B8=8D=E8=A6=81=E8=AE=BE=E7=BD=AEbounds=20?= =?UTF-8?q?=E5=87=8F=E5=B0=91=E4=B8=8D=E5=87=BA=E5=9B=BE=E7=9A=84=E5=87=A0?= =?UTF-8?q?=E7=8E=87=20AI-GEN:=2060%=20Cursor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/mapping/WebMapV2.js | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/common/mapping/WebMapV2.js b/src/common/mapping/WebMapV2.js index e91d8c77f1..494121ba05 100644 --- a/src/common/mapping/WebMapV2.js +++ b/src/common/mapping/WebMapV2.js @@ -916,6 +916,9 @@ export function createWebMapV2Extending(SuperClass, { MapManager, mapRepo, crsMa } } } + if (bounds && !this._isValidBounds(bounds)) { + bounds = null; + } this._addBaselayer({ url: [requestUrl], layerID: layerId, @@ -2867,6 +2870,28 @@ export function createWebMapV2Extending(SuperClass, { MapManager, mapRepo, crsMa return coor; } + // 校验 bounds 是否为合法的经纬度范围(EPSG:4326) + // 不合法返回 false:值非数字/无穷、左>=右、下>=上、四个坐标都在 ±0.5 度内(认为退化为原点附近)、超出经纬度范围 + _isValidBounds(bounds) { + if (!Array.isArray(bounds) || bounds.length !== 4) { + return false; + } + const [left, bottom, right, top] = bounds; + if (![left, bottom, right, top].every((v) => typeof v === 'number' && Number.isFinite(v))) { + return false; + } + if (left >= right || bottom >= top) { + return false; + } + if (Math.abs(left) > 180 || Math.abs(right) > 180 || Math.abs(bottom) > 90 || Math.abs(top) > 90) { + return false; + } + if (Math.abs(left) < 0.5 && Math.abs(right) < 0.5 && Math.abs(bottom) < 0.5 && Math.abs(top) < 0.5) { + return false; + } + return true; + } + _getMapCenter(mapInfo) { // center let center = mapInfo.center && [mapInfo.center.x, mapInfo.center.y]; From d177026b3e214841bae63afb7b72cc6b53e9024f Mon Sep 17 00:00:00 2001 From: luoxiao Date: Wed, 1 Jul 2026 17:38:13 +0800 Subject: [PATCH 31/46] =?UTF-8?q?[fix]webmap=E6=96=B0=E5=A2=9E=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=8E=9F=E5=9C=B0=E5=9B=BE=E7=9A=84=E5=9B=BE=E4=BE=8B?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=20AI-GEN:=2070%=20MiniMax-M2.7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/mapping/MapBase.js | 4 +- src/common/mapping/WebMapBase.js | 10 + src/common/mapping/WebMapV2.js | 12 ++ src/common/mapping/WebMapV3.js | 26 +++ test/common/mapping/MapBaseSpec.js | 107 +++++++++- test/common/mapping/WebMapBaseSpec.js | 150 +++++++++++++- test/common/mapping/WebMapV3Spec.js | 286 ++++++++++++++++++++++++++ test/test-main-common.js | 1 + 8 files changed, 593 insertions(+), 3 deletions(-) create mode 100644 test/common/mapping/WebMapV3Spec.js diff --git a/src/common/mapping/MapBase.js b/src/common/mapping/MapBase.js index e9b561ae69..9fa338d01c 100644 --- a/src/common/mapping/MapBase.js +++ b/src/common/mapping/MapBase.js @@ -88,7 +88,9 @@ export function createMapClassExtending(SuperClass = class {}) { } } Array.from(new Set(sourceList)).forEach((sourceId) => { - this.map.removeSource(sourceId); + if (this.map.getSource(sourceId)) { + this.map.removeSource(sourceId); + } }); } }; diff --git a/src/common/mapping/WebMapBase.js b/src/common/mapping/WebMapBase.js index b812bc4c7e..d27ceab5fa 100644 --- a/src/common/mapping/WebMapBase.js +++ b/src/common/mapping/WebMapBase.js @@ -368,6 +368,16 @@ export function createWebMapBaseExtending(SuperClass, { mapRepo }) { return (this._handler && this._handler._getPopupInfos()) || []; } + /** + * @version 11.3.0 + * @function WebMapBase.prototype.getLegendInfos + * @description 获取地图本身所有图层的legend状态。 + * @returns {Array} 图例信息数组,包含 showLegend、id、title 三个属性。 + */ + getLegendInfos() { + return (this._handler && this._handler._getLegendInfos()) || []; + } + /** * @version 11.2.1 * @function WebMapBase.prototype.getLayers diff --git a/src/common/mapping/WebMapV2.js b/src/common/mapping/WebMapV2.js index 494121ba05..814a9ea2ca 100644 --- a/src/common/mapping/WebMapV2.js +++ b/src/common/mapping/WebMapV2.js @@ -210,6 +210,18 @@ export function createWebMapV2Extending(SuperClass, { MapManager, mapRepo, crsMa }).filter(item => item !== null); } + _getLegendInfos() { + const { layers = [] } = this._mapInfo; + return layers.map((layer) => { + const { legendSetting, name, layerID: layerId } = layer; + return { + showLegend: legendSetting ? legendSetting?.isShow !== false : false, + id: layerId, + title: name + }; + }); + } + _handleLayerInfo(mapInfo, _taskID) { mapInfo = this._setLayerID(mapInfo); this._mapInfo = mapInfo; diff --git a/src/common/mapping/WebMapV3.js b/src/common/mapping/WebMapV3.js index 51876609f1..339588a40d 100644 --- a/src/common/mapping/WebMapV3.js +++ b/src/common/mapping/WebMapV3.js @@ -388,6 +388,32 @@ export function createWebMapV3Extending(SuperClass, { MapManager, mapRepo, crsMa }) return res; } + + _getLegendInfoByCatalog(catalog, res = []) { + const { catalogType, children, showLegend, title, id } = catalog; + if (catalogType === 'group' && children) { + children.forEach(child => { + this._getLegendInfoByCatalog(child, res); + }); + } + if (catalogType === 'layer') { + res.push({ + showLegend: showLegend !== false, + id: id, + title: title + }); + } + } + + _getLegendInfos(_mapResourceInfo = this._mapResourceInfo) { + const { catalogs = [] } = _mapResourceInfo; + const res = []; + catalogs.forEach((item) => { + this._getLegendInfoByCatalog(item, res); + }); + return res; + } + /** * @private * @function WebMapV3.prototype._initLayers diff --git a/test/common/mapping/MapBaseSpec.js b/test/common/mapping/MapBaseSpec.js index ac42e1baf5..5b75576f1a 100644 --- a/test/common/mapping/MapBaseSpec.js +++ b/test/common/mapping/MapBaseSpec.js @@ -88,8 +88,113 @@ describe('MapBase', () => { it('should return empty array when _sourceListModel is null', () => { instance._sourceListModel = null; - + expect(instance.getLayers()).toEqual([]); }); }); + + describe('cleanLayers', () => { + beforeEach(() => { + instance.map = jasmine.createSpyObj('map', [ + 'getLayer', + 'removeLayer', + 'getSource', + 'removeSource' + ]); + }); + + it('should remove layers from map', () => { + const layers = [ + { + renderLayers: ['layer1', 'layer2'], + renderSource: { id: 'source1' }, + l7Layer: false + } + ]; + instance.map.getLayer.and.callFake((layerId) => { + if (layerId === 'layer1' || layerId === 'layer2') { + return { source: 'source1' }; + } + return undefined; + }); + instance.map.getSource.and.returnValue(true); + + instance.cleanLayers(layers); + + expect(instance.map.removeLayer).toHaveBeenCalledWith('layer1'); + expect(instance.map.removeLayer).toHaveBeenCalledWith('layer2'); + }); + + it('should remove sources from map when layers are removed', () => { + const layers = [ + { + renderLayers: ['layer1'], + renderSource: { id: 'source1' }, + l7Layer: false + } + ]; + instance.map.getLayer.and.returnValue({ source: 'source1' }); + instance.map.getSource.and.returnValue(true); + + instance.cleanLayers(layers); + + expect(instance.map.removeSource).toHaveBeenCalledWith('source1'); + }); + + it('should not remove source when renderSource.id is falsy', () => { + const layers = [ + { + renderLayers: ['layer1'], + renderSource: { id: null }, + l7Layer: false + } + ]; + instance.map.getLayer.and.returnValue({ source: null }); + // getSource(null) returns falsy, so source won't be added to list + instance.map.getSource.and.returnValue(false); + + instance.cleanLayers(layers); + + expect(instance.map.removeSource).not.toHaveBeenCalled(); + }); + + it('should not remove source when layer is l7Layer', () => { + const layers = [ + { + renderLayers: ['layer1'], + renderSource: { id: 'source1' }, + l7Layer: true + } + ]; + instance.map.getLayer.and.returnValue({ source: 'source1' }); + instance.map.getSource.and.returnValue(true); + + instance.cleanLayers(layers); + + expect(instance.map.removeSource).not.toHaveBeenCalled(); + }); + + it('should deduplicate sources before removal', () => { + const layers = [ + { + renderLayers: ['layer1'], + renderSource: { id: 'source1' }, + l7Layer: false + }, + { + renderLayers: ['layer2'], + renderSource: { id: 'source1' }, + l7Layer: false + } + ]; + instance.map.getLayer.and.returnValue({ source: 'source1' }); + instance.map.getSource.and.returnValue(true); + + instance.cleanLayers(layers); + + // Should only call removeSource once due to deduplication + expect(instance.map.removeSource).toHaveBeenCalledTimes(1); + expect(instance.map.removeSource).toHaveBeenCalledWith('source1'); + }); + }); }); diff --git a/test/common/mapping/WebMapBaseSpec.js b/test/common/mapping/WebMapBaseSpec.js index 23c55bf1b9..f40098b9f7 100644 --- a/test/common/mapping/WebMapBaseSpec.js +++ b/test/common/mapping/WebMapBaseSpec.js @@ -74,8 +74,156 @@ describe('WebMapBase - MapBase Methods', () => { it('should return empty array when _sourceListModel is null', () => { instance._sourceListModel = null; - + expect(instance.getLayers()).toEqual([]); }); }); }); + +describe('WebMapBase - Handler Methods', () => { + let instance; + let mockHandler; + + beforeEach(() => { + const MapBase = createMapClassExtending(); + instance = new MapBase(); + instance.getLegendInfos = function() { + return (this._handler && this._handler._getLegendInfos()) || []; + }; + // Mock WebMapV2 handler + mockHandler = { + _getLegendInfos: jasmine.createSpy('_getLegendInfos').and.callFake(() => { + return [ + { showLegend: true, id: 'layer1', title: 'Layer 1' }, + { showLegend: false, id: 'layer2', title: 'Layer 2' } + ]; + }) + }; + instance._handler = mockHandler; + }); + + describe('getLegendInfos', () => { + it('should call handler._getLegendInfos and return result', () => { + const result = instance.getLegendInfos(); + + expect(mockHandler._getLegendInfos).toHaveBeenCalled(); + expect(result).toEqual([ + { showLegend: true, id: 'layer1', title: 'Layer 1' }, + { showLegend: false, id: 'layer2', title: 'Layer 2' } + ]); + }); + + it('should return empty array when handler._getLegendInfos returns null', () => { + mockHandler._getLegendInfos.and.returnValue(null); + + const result = instance.getLegendInfos(); + + expect(result).toEqual([]); + }); + + it('should return empty array when handler._getLegendInfos returns undefined', () => { + mockHandler._getLegendInfos.and.returnValue(undefined); + + const result = instance.getLegendInfos(); + + expect(result).toEqual([]); + }); + + it('should return empty array when handler is null', () => { + instance._handler = null; + + const result = instance.getLegendInfos(); + + expect(result).toEqual([]); + }); + }); + + describe('getLegendInfos with WebMapV2-like handler', () => { + it('should return legend info from _mapInfo.layers (WebMapV2)', () => { + const webMapV2Handler = { + _getLegendInfos: jasmine.createSpy('_getLegendInfos').and.callFake(function() { + const { layers = [] } = this._mapInfo || {}; + return layers.map((layer) => { + const { legendSetting, name, layerID: layerId } = layer; + return { + showLegend: legendSetting?.isShow !== false, + id: layerId, + title: name + }; + }); + }), + _mapInfo: { + layers: [ + { name: 'Layer1', layerID: 'layer1', legendSetting: { isShow: true } }, + { name: 'Layer2', layerID: 'layer2', legendSetting: { isShow: false } } + ] + } + }; + instance._handler = webMapV2Handler; + + const result = instance.getLegendInfos(); + + expect(webMapV2Handler._getLegendInfos).toHaveBeenCalled(); + expect(result).toEqual([ + { showLegend: true, id: 'layer1', title: 'Layer1' }, + { showLegend: false, id: 'layer2', title: 'Layer2' } + ]); + }); + }); + + describe('getLegendInfos with WebMapV3-like handler', () => { + it('should return legend info from catalogs (WebMapV3)', () => { + const webMapV3Handler = { + _getLegendInfos: jasmine.createSpy('_getLegendInfos').and.callFake(function() { + const { catalogs = [] } = this._mapResourceInfo || {}; + const res = []; + const processCatalog = (catalog) => { + const { catalogType, children, showLegend, title, layersContent, id } = catalog; + if (catalogType === 'group' && children) { + children.forEach(child => processCatalog(child)); + } + if (catalogType === 'layer') { + res.push({ + showLegend: showLegend !== false, + id: layersContent || id, + title: title + }); + } + }; + catalogs.forEach(item => processCatalog(item)); + return res; + }), + _mapResourceInfo: { + catalogs: [ + { + catalogType: 'layer', + title: 'Layer1', + showLegend: true, + layersContent: 'layer1' + }, + { + catalogType: 'group', + children: [ + { + catalogType: 'layer', + title: 'Layer2', + showLegend: false, + layersContent: 'layer2' + } + ] + } + ] + } + }; + instance._handler = webMapV3Handler; + + const result = instance.getLegendInfos(); + + expect(webMapV3Handler._getLegendInfos).toHaveBeenCalled(); + expect(result).toEqual([ + { showLegend: true, id: 'layer1', title: 'Layer1' }, + { showLegend: false, id: 'layer2', title: 'Layer2' } + ]); + }); + }); +}); diff --git a/test/common/mapping/WebMapV3Spec.js b/test/common/mapping/WebMapV3Spec.js new file mode 100644 index 0000000000..0b50cee8e9 --- /dev/null +++ b/test/common/mapping/WebMapV3Spec.js @@ -0,0 +1,286 @@ +describe('WebMapV3 - _getLegendInfos', () => { + let instance; + + beforeEach(() => { + // Create a minimal mock instance with the method + instance = { + _mapResourceInfo: {}, + _getLegendInfoByCatalog: function(catalog, res = []) { + const { catalogType, children, showLegend, title, layersContent, id } = catalog; + if (catalogType === 'group' && children) { + children.forEach(child => { + this._getLegendInfoByCatalog(child, res); + }); + } + if (catalogType === 'layer') { + res.push({ + showLegend: showLegend !== false, + id: layersContent || id, + title: title + }); + } + }, + _getLegendInfos: function(_mapResourceInfo) { + const mapResourceInfo = _mapResourceInfo || this._mapResourceInfo; + const { catalogs = [] } = mapResourceInfo; + const res = []; + catalogs.forEach((item) => { + this._getLegendInfoByCatalog(item, res); + }); + return res; + } + }; + }); + + describe('_getLegendInfos', () => { + it('should return legend info from catalogs with catalogType layer', () => { + instance._mapResourceInfo = { + catalogs: [ + { + catalogType: 'layer', + title: 'Layer1', + showLegend: true, + layersContent: 'layer1' + }, + { + catalogType: 'layer', + title: 'Layer2', + showLegend: false, + layersContent: 'layer2' + } + ] + }; + + const result = instance._getLegendInfos(); + + expect(result).toEqual([ + { showLegend: true, id: 'layer1', title: 'Layer1' }, + { showLegend: false, id: 'layer2', title: 'Layer2' } + ]); + }); + + it('should recursively process group catalogs', () => { + instance._mapResourceInfo = { + catalogs: [ + { + catalogType: 'group', + children: [ + { + catalogType: 'layer', + title: 'ChildLayer', + showLegend: true, + layersContent: 'childLayer' + } + ] + } + ] + }; + + const result = instance._getLegendInfos(); + + expect(result).toEqual([ + { showLegend: true, id: 'childLayer', title: 'ChildLayer' } + ]); + }); + + it('should default showLegend to true when undefined', () => { + instance._mapResourceInfo = { + catalogs: [ + { + catalogType: 'layer', + title: 'Layer1', + layersContent: 'layer1' + } + ] + }; + + const result = instance._getLegendInfos(); + + expect(result).toEqual([ + { showLegend: true, id: 'layer1', title: 'Layer1' } + ]); + }); + + it('should use id when layersContent is not available', () => { + instance._mapResourceInfo = { + catalogs: [ + { + catalogType: 'layer', + title: 'Layer1', + id: 'layer1' + } + ] + }; + + const result = instance._getLegendInfos(); + + expect(result).toEqual([ + { showLegend: true, id: 'layer1', title: 'Layer1' } + ]); + }); + + it('should return empty array when no catalogs', () => { + instance._mapResourceInfo = { catalogs: [] }; + + const result = instance._getLegendInfos(); + + expect(result).toEqual([]); + }); + + it('should handle nested group catalogs', () => { + instance._mapResourceInfo = { + catalogs: [ + { + catalogType: 'group', + children: [ + { + catalogType: 'group', + children: [ + { + catalogType: 'layer', + title: 'NestedLayer', + showLegend: true, + layersContent: 'nestedLayer' + } + ] + } + ] + } + ] + }; + + const result = instance._getLegendInfos(); + + expect(result).toEqual([ + { showLegend: true, id: 'nestedLayer', title: 'NestedLayer' } + ]); + }); + + it('should handle multiple nested groups', () => { + instance._mapResourceInfo = { + catalogs: [ + { + catalogType: 'group', + title: 'Group1', + children: [ + { + catalogType: 'group', + title: 'Group2', + children: [ + { + catalogType: 'layer', + title: 'DeepLayer', + showLegend: false, + layersContent: 'deepLayer' + } + ] + } + ] + } + ] + }; + + const result = instance._getLegendInfos(); + + expect(result).toEqual([ + { showLegend: false, id: 'deepLayer', title: 'DeepLayer' } + ]); + }); + }); + + describe('_getLegendInfoByCatalog', () => { + it('should skip non-layer and non-group catalogTypes', () => { + const res = []; + const catalog = { + catalogType: 'other', + title: 'Other', + showLegend: true, + layersContent: 'other' + }; + + instance._getLegendInfoByCatalog(catalog, res); + + expect(res).toEqual([]); + }); + + it('should process layer catalog correctly', () => { + const res = []; + const catalog = { + catalogType: 'layer', + title: 'TestLayer', + showLegend: true, + layersContent: 'testLayer' + }; + + instance._getLegendInfoByCatalog(catalog, res); + + expect(res).toEqual([ + { showLegend: true, id: 'testLayer', title: 'TestLayer' } + ]); + }); + + it('should default showLegend to true when not specified', () => { + const res = []; + const catalog = { + catalogType: 'layer', + title: 'TestLayer', + layersContent: 'testLayer' + }; + + instance._getLegendInfoByCatalog(catalog, res); + + expect(res).toEqual([ + { showLegend: true, id: 'testLayer', title: 'TestLayer' } + ]); + }); + + it('should handle group with no children', () => { + const res = []; + const catalog = { + catalogType: 'group', + title: 'EmptyGroup', + children: [] + }; + + instance._getLegendInfoByCatalog(catalog, res); + + expect(res).toEqual([]); + }); + }); + + describe('getLegendInfos (WebMapV3)', () => { + it('should call _handler._getLegendInfos through WebMapBase', () => { + const webMapBase = { + _handler: null, + getLegendInfos: function() { + return (this._handler && this._handler._getLegendInfos()) || []; + } + }; + + const mockLegendInfos = [ + { showLegend: true, id: 'layer1', title: 'Layer1' } + ]; + webMapBase._handler = { + _getLegendInfos: jasmine.createSpy('_getLegendInfos').and.returnValue(mockLegendInfos) + }; + + const result = webMapBase.getLegendInfos(); + + expect(webMapBase._handler._getLegendInfos).toHaveBeenCalled(); + expect(result).toEqual(mockLegendInfos); + }); + + it('should return empty array when _handler is null', () => { + const webMapBase = { + _handler: null, + getLegendInfos: function() { + return (this._handler && this._handler._getLegendInfos()) || []; + } + }; + + const result = webMapBase.getLegendInfos(); + + expect(result).toEqual([]); + }); + }); +}); diff --git a/test/test-main-common.js b/test/test-main-common.js index 87cdbd6afc..e5c6cdff8f 100644 --- a/test/test-main-common.js +++ b/test/test-main-common.js @@ -238,3 +238,4 @@ import './common/mapping/utils/UtilSpec.js'; import './common/mapping/WebMapBaseSpec.js'; import './common/mapping/WebMapServiceSpec'; import './common/mapping/WebMapV2BaseSpec'; +import './common/mapping/WebMapV3Spec.js'; From 91706c5d5b691e36c89539e433784dfd1ee53336 Mon Sep 17 00:00:00 2001 From: luoxiao Date: Thu, 2 Jul 2026 10:08:56 +0800 Subject: [PATCH 32/46] [fix]UT AI-GEN: 0% MiniMax-M2.7 --- test/mapboxgl/mapping/WebMapV2Spec.js | 2 +- test/maplibregl/mapping/WebMapV2Spec.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/mapboxgl/mapping/WebMapV2Spec.js b/test/mapboxgl/mapping/WebMapV2Spec.js index e53add4ce0..dd1debbff7 100644 --- a/test/mapboxgl/mapping/WebMapV2Spec.js +++ b/test/mapboxgl/mapping/WebMapV2Spec.js @@ -1401,7 +1401,7 @@ describe('mapboxgl_WebMapV2', () => { } ]; datavizWebmap.cleanLayers(); - expect(getSourceSpy).toHaveBeenCalledTimes(2); + expect(getSourceSpy).toHaveBeenCalledTimes(3); expect(removeSourceSpy).toHaveBeenCalledTimes(1); expect(datavizWebmap._cacheCleanLayers.length).toBe(0); done(); diff --git a/test/maplibregl/mapping/WebMapV2Spec.js b/test/maplibregl/mapping/WebMapV2Spec.js index 78e89354a0..36842c808e 100644 --- a/test/maplibregl/mapping/WebMapV2Spec.js +++ b/test/maplibregl/mapping/WebMapV2Spec.js @@ -1356,7 +1356,7 @@ describe('maplibregl_WebMapV2', () => { } ]; datavizWebmap.cleanLayers(); - expect(getSourceSpy).toHaveBeenCalledTimes(2); + expect(getSourceSpy).toHaveBeenCalledTimes(3); expect(removeSourceSpy).toHaveBeenCalledTimes(1); expect(datavizWebmap._cacheCleanLayers.length).toBe(0); done(); From c8cd729f625a2f476128b540bff17fd2320cc7d6 Mon Sep 17 00:00:00 2001 From: xiongjj Date: Thu, 2 Jul 2026 11:10:51 +0800 Subject: [PATCH 33/46] fix: ut AI-GEN: 0 % --- .../mapping/utils/SourceListModelV3Spec.js | 89 ++++++++++--------- 1 file changed, 49 insertions(+), 40 deletions(-) diff --git a/test/common/mapping/utils/SourceListModelV3Spec.js b/test/common/mapping/utils/SourceListModelV3Spec.js index b310403446..870929be4f 100644 --- a/test/common/mapping/utils/SourceListModelV3Spec.js +++ b/test/common/mapping/utils/SourceListModelV3Spec.js @@ -2004,7 +2004,7 @@ describe('SourceListV3', () => { { msDatasetId: 'ms_test_dataset_123', datasetId: 'test_dataset', - datasetName: 'test:test_dataset' + datasetName: 'test_dataset' } ] } @@ -2023,9 +2023,9 @@ describe('SourceListV3', () => { const layers = sourceListModel.getLayers(); const restDataLayer = layers.find(layer => layer.id === 'rest-data-layer'); expect(restDataLayer).toBeTruthy(); - expect(restDataLayer.layerInfo.dataSource.type).toBe('REST_DATA'); - expect(restDataLayer.layerInfo.dataSource.url).toBe('http://localhost:8090/iserver/services/data-test/rest/data'); - expect(restDataLayer.layerInfo.dataSource.dataSourceName).toBe('test:test_dataset'); + expect(restDataLayer.dataSource.type).toBe('REST_DATA'); + expect(restDataLayer.dataSource.url).toBe('http://localhost:8090/iserver/services/data-test/rest/data'); + expect(restDataLayer.dataSource.dataSourceName).toBe('test:test_dataset'); done(); }); @@ -2057,6 +2057,7 @@ describe('SourceListV3', () => { ], version: '3.0.0' }; + map.addSource('rest-map-source', mapInfo.sources['rest-map-source']); const sourceListModel = new SourceListModelV3({ map, mapInfo, @@ -2070,9 +2071,9 @@ describe('SourceListV3', () => { const layers = sourceListModel.getLayers(); const restMapLayer = layers.find(layer => layer.id === 'rest-map-layer'); expect(restMapLayer).toBeTruthy(); - expect(restMapLayer.layerInfo.dataSource.type).toBe('REST_MAP'); - expect(restMapLayer.layerInfo.dataSource.url).toBe('http://localhost:8090/iserver/services/map-test/rest/maps'); - expect(restMapLayer.layerInfo.dataSource.mapName).toBe('test_map'); + expect(restMapLayer.dataSource.type).toBe('REST_MAP'); + expect(restMapLayer.dataSource.url).toBe('http://localhost:8090/iserver/services/map-test/rest/maps'); + expect(restMapLayer.dataSource.mapName).toBe('test_map'); done(); }); @@ -2091,7 +2092,7 @@ describe('SourceListV3', () => { sources: { 'restjsr-source': { type: 'vector', - tiles: ['http://localhost:8090/restjsr/v1/maps/test_map/tiles/{z}/{x}/{y}.mvt'] + tiles: ['http://localhost:8090/restjsr/v1/test_map/tiles/{z}/{x}/{y}.mvt'] } }, layers: [ @@ -2104,6 +2105,7 @@ describe('SourceListV3', () => { ], version: '3.0.0' }; + map.addSource('restjsr-source', mapInfo.sources['restjsr-source']); const sourceListModel = new SourceListModelV3({ map, mapInfo, @@ -2117,9 +2119,9 @@ describe('SourceListV3', () => { const layers = sourceListModel.getLayers(); const restjsrLayer = layers.find(layer => layer.id === 'restjsr-layer'); expect(restjsrLayer).toBeTruthy(); - expect(restjsrLayer.layerInfo.dataSource.type).toBe('RESTJSR'); - expect(restjsrLayer.layerInfo.dataSource.url).toBe('http://localhost:8090/restjsr/v1/vectortile/maps'); - expect(restjsrLayer.layerInfo.dataSource.mapName).toBe('test_map'); + expect(restjsrLayer.dataSource.type).toBe('RESTJSR'); + expect(restjsrLayer.dataSource.url).toBe('http://localhost:8090/restjsr/v1/vectortile/maps'); + expect(restjsrLayer.dataSource.mapName).toBe('test_map'); done(); }); @@ -2151,6 +2153,7 @@ describe('SourceListV3', () => { ], version: '3.0.0' }; + map.addSource('other-vector-source', mapInfo.sources['other-vector-source']); const sourceListModel = new SourceListModelV3({ map, mapInfo, @@ -2164,8 +2167,8 @@ describe('SourceListV3', () => { const layers = sourceListModel.getLayers(); const otherLayer = layers.find(layer => layer.id === 'other-vector-layer'); expect(otherLayer).toBeTruthy(); - expect(otherLayer.layerInfo.dataSource.type).toBe('VECTOR_OTHER'); - expect(otherLayer.layerInfo.dataSource.url).toBe('http://localhost:8080/tiles/{z}/{x}/{y}.mvt'); + expect(otherLayer.dataSource.type).toBe('VECTOR_OTHER'); + expect(otherLayer.dataSource.url).toBe('http://localhost:8080/tiles/{z}/{x}/{y}.mvt'); done(); }); @@ -2213,7 +2216,7 @@ describe('SourceListV3', () => { { msDatasetId: 'ms_test_dataset_123', datasetId: 'test_dataset', - datasetName: 'test:test_dataset' + datasetName: 'test_dataset' } ] } @@ -2232,10 +2235,10 @@ describe('SourceListV3', () => { const layers = sourceListModel.getLayers(); const serviceLayer = layers.find(layer => layer.id === 'service-layer'); expect(serviceLayer).toBeTruthy(); - expect(serviceLayer.layerInfo.dataSource.serviceLayerId).toBe('1.2'); - expect(serviceLayer.layerInfo.dataSource.type).toBe('REST_DATA'); - expect(serviceLayer.layerInfo.dataSource.url).toBe('http://localhost:8090/iserver/services/data-test/rest/data'); - expect(serviceLayer.layerInfo.dataSource.dataSourceName).toBe('test:test_dataset'); + expect(serviceLayer.dataSource.serviceLayerId).toBe('1.2'); + expect(serviceLayer.dataSource.type).toBe('REST_DATA'); + expect(serviceLayer.dataSource.url).toBe('http://localhost:8090/iserver/services/data-test/rest/data'); + expect(serviceLayer.dataSource.dataSourceName).toBe('test:test_dataset'); done(); }); @@ -2282,7 +2285,7 @@ describe('SourceListV3', () => { { msDatasetId: 'ms_test_dataset_123', datasetId: 'test_dataset', - datasetName: 'test:test_dataset' + datasetName: 'test_dataset' } ] } @@ -2301,10 +2304,10 @@ describe('SourceListV3', () => { const layers = sourceListModel.getLayers(); const noServiceLayer = layers.find(layer => layer.id === 'no-service-layer'); expect(noServiceLayer).toBeTruthy(); - expect(noServiceLayer.layerInfo.dataSource.serviceLayerId).toBeUndefined(); - expect(noServiceLayer.layerInfo.dataSource.type).toBe('REST_DATA'); - expect(noServiceLayer.layerInfo.dataSource.url).toBe('http://localhost:8090/iserver/services/data-test/rest/data'); - expect(noServiceLayer.layerInfo.dataSource.dataSourceName).toBe('test:test_dataset'); + expect(noServiceLayer.dataSource.serviceLayerId).toBeUndefined(); + expect(noServiceLayer.dataSource.type).toBe('REST_DATA'); + expect(noServiceLayer.dataSource.url).toBe('http://localhost:8090/iserver/services/data-test/rest/data'); + expect(noServiceLayer.dataSource.dataSourceName).toBe('test:test_dataset'); done(); }); @@ -2352,7 +2355,7 @@ describe('SourceListV3', () => { { msDatasetId: 'ms_test_dataset_123', datasetId: 'test_dataset', - datasetName: 'test:test_dataset' + datasetName: 'test_dataset' } ] } @@ -2371,8 +2374,8 @@ describe('SourceListV3', () => { const layers = sourceListModel.getLayers(); const emptyServiceLayer = layers.find(layer => layer.id === 'empty-service-layer'); expect(emptyServiceLayer).toBeTruthy(); - expect(emptyServiceLayer.layerInfo.dataSource.serviceLayerId).toBe(''); - expect(emptyServiceLayer.layerInfo.dataSource.type).toBe('REST_DATA'); + expect(emptyServiceLayer.dataSource.serviceLayerId).toBe(''); + expect(emptyServiceLayer.dataSource.type).toBe('REST_DATA'); done(); }); @@ -2413,6 +2416,7 @@ describe('SourceListV3', () => { ], datas: [] }; + map.addSource('rest-map-service-source', mapInfo.sources['rest-map-service-source']); const sourceListModel = new SourceListModelV3({ map, mapInfo, @@ -2426,10 +2430,10 @@ describe('SourceListV3', () => { const layers = sourceListModel.getLayers(); const restMapLayer = layers.find(layer => layer.id === 'rest-map-service-layer'); expect(restMapLayer).toBeTruthy(); - expect(restMapLayer.layerInfo.dataSource.type).toBe('REST_MAP'); - expect(restMapLayer.layerInfo.dataSource.url).toBe('http://localhost:8090/iserver/services/map-test/rest/maps'); - expect(restMapLayer.layerInfo.dataSource.mapName).toBe('test_map'); - expect(restMapLayer.layerInfo.dataSource.serviceLayerId).toBe('2'); + expect(restMapLayer.dataSource.type).toBe('REST_MAP'); + expect(restMapLayer.dataSource.url).toBe('http://localhost:8090/iserver/services/map-test/rest/maps'); + expect(restMapLayer.dataSource.mapName).toBe('test_map'); + expect(restMapLayer.dataSource.serviceLayerId).toBe('2'); done(); }); @@ -2448,7 +2452,7 @@ describe('SourceListV3', () => { sources: { 'restjsr-service-source': { type: 'vector', - tiles: ['http://localhost:8090/restjsr/v1/maps/test_map/tiles/{z}/{x}/{y}.mvt'] + tiles: ['http://localhost:8090/restjsr/v1/test_map/tiles/{z}/{x}/{y}.mvt'] } }, layers: [ @@ -2470,6 +2474,7 @@ describe('SourceListV3', () => { ], datas: [] }; + map.addSource('restjsr-service-source', mapInfo.sources['restjsr-service-source']); const sourceListModel = new SourceListModelV3({ map, mapInfo, @@ -2483,10 +2488,10 @@ describe('SourceListV3', () => { const layers = sourceListModel.getLayers(); const restjsrLayer = layers.find(layer => layer.id === 'restjsr-service-layer'); expect(restjsrLayer).toBeTruthy(); - expect(restjsrLayer.layerInfo.dataSource.type).toBe('RESTJSR'); - expect(restjsrLayer.layerInfo.dataSource.url).toBe('http://localhost:8090/restjsr/v1/vectortile/maps'); - expect(restjsrLayer.layerInfo.dataSource.mapName).toBe('test_map'); - expect(restjsrLayer.layerInfo.dataSource.serviceLayerId).toBe('3'); + expect(restjsrLayer.dataSource.type).toBe('RESTJSR'); + expect(restjsrLayer.dataSource.url).toBe('http://localhost:8090/restjsr/v1/vectortile/maps'); + expect(restjsrLayer.dataSource.mapName).toBe('test_map'); + expect(restjsrLayer.dataSource.serviceLayerId).toBe('3'); done(); }); @@ -2527,6 +2532,7 @@ describe('SourceListV3', () => { ], datas: [] }; + map.addSource('other-service-source', mapInfo.sources['other-service-source']); const sourceListModel = new SourceListModelV3({ map, mapInfo, @@ -2540,9 +2546,9 @@ describe('SourceListV3', () => { const layers = sourceListModel.getLayers(); const otherLayer = layers.find(layer => layer.id === 'other-service-layer'); expect(otherLayer).toBeTruthy(); - expect(otherLayer.layerInfo.dataSource.type).toBe('VECTOR_OTHER'); - expect(otherLayer.layerInfo.dataSource.url).toBe('http://localhost:8080/tiles/{z}/{x}/{y}.mvt'); - expect(otherLayer.layerInfo.dataSource.serviceLayerId).toBe('4'); + expect(otherLayer.dataSource.type).toBe('VECTOR_OTHER'); + expect(otherLayer.dataSource.url).toBe('http://localhost:8080/tiles/{z}/{x}/{y}.mvt'); + expect(otherLayer.dataSource.serviceLayerId).toBe('4'); done(); }); @@ -2586,10 +2592,11 @@ describe('SourceListV3', () => { getL7MarkerLayers: () => ({}) } }); - const layers = sourceListModel.getLayers(); + const layers = sourceListModel.getLayers(false); const chartLayer = layers.find(layer => layer.id === 'chart-layer'); expect(chartLayer).toBeTruthy(); - expect(chartLayer.layerInfo.metadata.SM_Layer_Order).toBe('top'); + expect(chartLayer.metadata).toBeTruthy(); + expect(chartLayer.metadata.SM_Layer_Order).toBe('top'); done(); }); @@ -2689,6 +2696,8 @@ describe('SourceListV3', () => { ], version: '3.0.0' }; + map.addSource('overlay-layer', mapInfo.sources['overlay-layer']); + map.addSource('base-layer', mapInfo.sources['base-layer']); const sourceListModel = new SourceListModelV3({ map, mapInfo, From bb3a8cbe80fde2bc5a299147c6b6c6093bb2ffd2 Mon Sep 17 00:00:00 2001 From: xiongjj Date: Fri, 3 Jul 2026 10:19:16 +0800 Subject: [PATCH 34/46] =?UTF-8?q?fix=EF=BC=9A=20ut=20AI-GEN:=20=200%=20#?= =?UTF-8?q?=20Please=20enter=20the=20commit=20message=20for=20your=20chang?= =?UTF-8?q?es.=20Lines=20starting?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/mapboxgl/mapping/WebMapV3Spec.js | 2 +- test/maplibregl/mapping/WebMapV3Spec.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/mapboxgl/mapping/WebMapV3Spec.js b/test/mapboxgl/mapping/WebMapV3Spec.js index 2a3b4b7def..f52b4b6c6f 100644 --- a/test/mapboxgl/mapping/WebMapV3Spec.js +++ b/test/mapboxgl/mapping/WebMapV3Spec.js @@ -787,7 +787,7 @@ describe('mapboxgl-webmap3.0', () => { ) ).toBeTruthy(); expect( - appreciableLayers.some((item) => item.id === 'CHINA_DARK' && !Object.keys(item.dataSource).length) + appreciableLayers.some((item) => item.id === 'CHINA_DARK' && !item.dataSource.type) ).toBeTruthy(); spyTest.calls.reset(); done(); diff --git a/test/maplibregl/mapping/WebMapV3Spec.js b/test/maplibregl/mapping/WebMapV3Spec.js index 9628841fbc..38be7f8b78 100644 --- a/test/maplibregl/mapping/WebMapV3Spec.js +++ b/test/maplibregl/mapping/WebMapV3Spec.js @@ -716,7 +716,7 @@ describe('maplibregl-webmap3.0', () => { ) ).toBeTruthy(); expect( - appreciableLayers.some((item) => item.id === 'CHINA_DARK' && !Object.keys(item.dataSource).length) + appreciableLayers.some((item) => item.id === 'CHINA_DARK' && !item.dataSource.type) ).toBeTruthy(); spyTest.calls.reset(); done(); From 01c335fb90fb92c36080f7693e8433e78b85886c Mon Sep 17 00:00:00 2001 From: songyumeng Date: Fri, 3 Jul 2026 14:44:50 +0800 Subject: [PATCH 35/46] =?UTF-8?q?=E3=80=90fix=E3=80=91=E5=B0=BD=E9=87=8F?= =?UTF-8?q?=E4=BF=9D=E6=8C=81=E5=8E=9F=E6=9C=89=E9=80=BB=E8=BE=91=E4=B8=8D?= =?UTF-8?q?=E5=BD=B1=E5=93=8D=EF=BC=8C=E7=9B=B8=E5=85=B3=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E8=A7=81overlay=20is=20TILE=20which=20carried=20credential=20t?= =?UTF-8?q?oken?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AI-GEN: 80% Claude --- src/common/mapping/WebMapV2.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/common/mapping/WebMapV2.js b/src/common/mapping/WebMapV2.js index 814a9ea2ca..334a363fd7 100644 --- a/src/common/mapping/WebMapV2.js +++ b/src/common/mapping/WebMapV2.js @@ -2895,7 +2895,14 @@ export function createWebMapV2Extending(SuperClass, { MapManager, mapRepo, crsMa if (left >= right || bottom >= top) { return false; } - if (Math.abs(left) > 180 || Math.abs(right) > 180 || Math.abs(bottom) > 90 || Math.abs(top) > 90) { + // 容差,吸收浮点计算误差(如 180.00000000000006) + const tolerance = 1e-6; + if ( + Math.abs(left) > 180 + tolerance || + Math.abs(right) > 180 + tolerance || + Math.abs(bottom) > 90 + tolerance || + Math.abs(top) > 90 + tolerance + ) { return false; } if (Math.abs(left) < 0.5 && Math.abs(right) < 0.5 && Math.abs(bottom) < 0.5 && Math.abs(top) < 0.5) { From 897bb374a965a0f47b662629c77532aad46afecd Mon Sep 17 00:00:00 2001 From: luoxiao Date: Mon, 6 Jul 2026 16:46:25 +0800 Subject: [PATCH 36/46] [feature] mapbox-enhance addLocalIdeographFontFamily AI-GEN: 60% Cursor --- src/common/mapping/WebMapV2.js | 4 + src/common/mapping/WebMapV3.js | 8 +- src/common/util/MapExtend.js | 6 +- test/common/mapping/WebMapV2Spec.js | 145 ++++++++++++++++++++++++++ test/common/mapping/WebMapV3Spec.js | 130 +++++++++++++++++++++++ test/mapboxgl/mapping/WebMapV2Spec.js | 31 ++++++ test/mapboxgl/mapping/WebMapV3Spec.js | 30 ++++++ test/test-main-common.js | 1 + 8 files changed, 351 insertions(+), 4 deletions(-) create mode 100644 test/common/mapping/WebMapV2Spec.js diff --git a/src/common/mapping/WebMapV2.js b/src/common/mapping/WebMapV2.js index 334a363fd7..3ef2c38561 100644 --- a/src/common/mapping/WebMapV2.js +++ b/src/common/mapping/WebMapV2.js @@ -60,6 +60,10 @@ export function createWebMapV2Extending(SuperClass, { MapManager, mapRepo, crsMa } this._appendLayers = true; this.map = map; + if (this.map.addLocalIdeographFontFamily) { + const fontFamilys = this._getLabelFontFamily(mapInfo); + this.map.addLocalIdeographFontFamily(fontFamilys); + } } this._mapInfo = mapInfo; this._loadLayers(mapInfo, this._taskID); diff --git a/src/common/mapping/WebMapV3.js b/src/common/mapping/WebMapV3.js index 339588a40d..8e1c64c21b 100644 --- a/src/common/mapping/WebMapV3.js +++ b/src/common/mapping/WebMapV3.js @@ -193,6 +193,10 @@ export function createWebMapV3Extending(SuperClass, { MapManager, mapRepo, crsMa sprite }); } + if (this.map.addLocalIdeographFontFamily) { + const fontFamilys = this._getLabelFontFamily(mapInfo); + this.map.addLocalIdeographFontFamily(fontFamilys); + } this._initLayers(); return; } @@ -750,9 +754,9 @@ export function createWebMapV3Extending(SuperClass, { MapManager, mapRepo, crsMa * @function WebMapV3.prototype._getLabelFontFamily * @description 获取图层字体类型。 */ - _getLabelFontFamily() { + _getLabelFontFamily(mapInfo = this._mapInfo) { const fonts = ['sans-serif']; - const layers = this._mapInfo.layers; + const layers = mapInfo.layers; if (layers && layers.length > 0) { layers.forEach((layer) => { const textFont = (layer.layout && layer.layout['text-font']) || []; diff --git a/src/common/util/MapExtend.js b/src/common/util/MapExtend.js index 552f8ec7fc..3262470135 100644 --- a/src/common/util/MapExtend.js +++ b/src/common/util/MapExtend.js @@ -101,8 +101,10 @@ export function createMapExtendExtending(product) { } return this; } - this.style.setLayoutProperty(layerID, name, value); - this._update(true); + if (this.getLayer(layerID)) { + this.style.setLayoutProperty(layerID, name, value); + this._update(true); + } return this; } diff --git a/test/common/mapping/WebMapV2Spec.js b/test/common/mapping/WebMapV2Spec.js new file mode 100644 index 0000000000..20b1acf132 --- /dev/null +++ b/test/common/mapping/WebMapV2Spec.js @@ -0,0 +1,145 @@ +import { createWebMapV2Extending } from '../../../src/common/mapping/WebMapV2'; +import { createWebMapV2BaseExtending } from '../../../src/common/mapping/WebMapV2Base'; +import { Events } from '../../../src/common/commontypes'; + +const mockCrsManager = { + isSameProjection: () => true, + registerCRS: () => {}, + getCRS: () => ({}), + getProj4: () => ({ defs: () => null }) +}; + +function createWebMapV2Instance() { + const WebMapV2 = createWebMapV2Extending( + createWebMapV2BaseExtending(Events, 'fire'), + { + MapManager: function (options) { + this.options = options; + }, + mapRepo: { + LngLat: function (lng, lat) { + return { lng, lat }; + }, + CRS: { + get: () => ({ + getExtent: () => [0, 0, 1, 1] + }) + } + }, + crsManager: mockCrsManager, + DataFlowService: function () {}, + GraticuleLayer: {} + } + ); + return new WebMapV2({}, { target: 'map' }); +} + +describe('WebMapV2 - addLocalIdeographFontFamily', () => { + let instance; + + beforeEach(() => { + instance = createWebMapV2Instance(); + }); + + describe('_getLabelFontFamily', () => { + it('should collect fontFamily from labelStyle and append supermapol-icons', () => { + const mapInfo = { + layers: [ + { labelStyle: { fontFamily: 'Arial' } }, + { labelStyle: { fontFamily: 'Microsoft YaHei' } } + ] + }; + + expect(instance._getLabelFontFamily(mapInfo)).toBe('sans-serif,Arial,Microsoft YaHei,supermapol-icons'); + }); + + it('should return default fonts when no layers', () => { + expect(instance._getLabelFontFamily({})).toBe('sans-serif,supermapol-icons'); + }); + + it('should skip layers without labelStyle', () => { + const mapInfo = { + layers: [{ labelStyle: { fontFamily: '黑体' } }, {}] + }; + + expect(instance._getLabelFontFamily(mapInfo)).toBe('sans-serif,黑体,supermapol-icons'); + }); + }); + + describe('initializeMap', () => { + it('should call addLocalIdeographFontFamily when map is provided', async () => { + spyOn(instance, '_registerMapCRS').and.returnValue(Promise.resolve('EPSG:3857')); + spyOn(instance, '_loadLayers'); + const mapInfo = { + layers: [{ labelStyle: { fontFamily: '微软雅黑' } }] + }; + const map = { + getCRS: () => ({ epsgCode: 'EPSG:3857' }), + addLocalIdeographFontFamily: jasmine.createSpy('addLocalIdeographFontFamily') + }; + + await instance.initializeMap(mapInfo, map); + + expect(instance._appendLayers).toBe(true); + expect(instance.map).toBe(map); + expect(map.addLocalIdeographFontFamily).toHaveBeenCalledWith('sans-serif,微软雅黑,supermapol-icons'); + expect(instance._loadLayers).toHaveBeenCalledWith(mapInfo, instance._taskID); + }); + + it('should not call addLocalIdeographFontFamily when map does not support it', async () => { + spyOn(instance, '_registerMapCRS').and.returnValue(Promise.resolve('EPSG:3857')); + spyOn(instance, '_loadLayers'); + const mapInfo = { + layers: [{ labelStyle: { fontFamily: '微软雅黑' } }] + }; + const map = { + getCRS: () => ({ epsgCode: 'EPSG:3857' }) + }; + + await expectAsync(instance.initializeMap(mapInfo, map)).toBeResolved(); + expect(instance._appendLayers).toBe(true); + expect(instance._loadLayers).toHaveBeenCalledWith(mapInfo, instance._taskID); + }); + }); + + describe('_createMap', () => { + it('should pass localIdeographFontFamily to MapManager', async () => { + let capturedOptions; + const WebMapV2WithCapture = createWebMapV2Extending( + createWebMapV2BaseExtending(Events, 'fire'), + { + MapManager: function (options) { + capturedOptions = options; + this.on = jasmine.createSpy('on'); + }, + mapRepo: { + LngLat: function (lng, lat) { + return { lng, lat }; + }, + CRS: { + get: () => ({ + getExtent: () => [0, 0, 1, 1], + unit: 'degree' + }) + } + }, + DataFlowService: function () {}, + GraticuleLayer: {}, + crsManager: mockCrsManager + } + ); + const inst = new WebMapV2WithCapture({}, { target: 'map' }); + const mapInfo = { + projection: 'EPSG:3857', + extent: { leftBottom: { x: 0, y: 0 }, rightTop: { x: 1, y: 1 } }, + baseLayer: { tileSize: 256 }, + layers: [{ labelStyle: { fontFamily: '微软雅黑' } }] + }; + inst.baseProjection = 'EPSG:3857'; + inst.fire = jasmine.createSpy('fire'); + spyOn(inst, '_getMapCenter').and.returnValue({ lng: 0, lat: 0 }); + await inst._createMap(mapInfo); + expect(capturedOptions.localIdeographFontFamily).toBe('sans-serif,微软雅黑,supermapol-icons'); + }); + }); +}); diff --git a/test/common/mapping/WebMapV3Spec.js b/test/common/mapping/WebMapV3Spec.js index 0b50cee8e9..9e55a565a1 100644 --- a/test/common/mapping/WebMapV3Spec.js +++ b/test/common/mapping/WebMapV3Spec.js @@ -1,3 +1,133 @@ +import { createWebMapV3Extending } from '../../../src/common/mapping/WebMapV3'; +import { Events } from '../../../src/common/commontypes'; + +const mockCrsManager = { + isSameProjection: () => true, + registerCRS: () => {}, + getCRS: () => ({}), + getProj4: () => ({ defs: () => null }) +}; + +function createWebMapV3Instance() { + const WebMapV3 = createWebMapV3Extending(Events, { + MapManager: function () {}, + mapRepo: { + LngLat: function (lng, lat) { + return { lng, lat }; + }, + CRS: null + }, + crsManager: mockCrsManager, + mapRepoName: 'mapbox-gl', + l7LayerUtil: { + getL7MarkerLayers: () => ({}) + } + }); + return new WebMapV3({}, { target: 'map' }); +} + +describe('WebMapV3 - addLocalIdeographFontFamily', () => { + let instance; + + beforeEach(() => { + instance = createWebMapV3Instance(); + }); + + describe('_getLabelFontFamily', () => { + it('should collect text-font from layer layout', () => { + const mapInfo = { + layers: [ + { layout: { 'text-font': ['Arial Unicode MS Regular'] } }, + { layout: { 'text-font': ['Microsoft YaHei Regular', 'Arial Unicode MS Regular'] } } + ] + }; + + expect(instance._getLabelFontFamily(mapInfo)).toBe( + 'sans-serif,Arial Unicode MS Regular,Microsoft YaHei Regular,Arial Unicode MS Regular' + ); + }); + + it('should return sans-serif when no layers', () => { + expect(instance._getLabelFontFamily({})).toBe('sans-serif'); + }); + + it('should skip layers without text-font', () => { + const mapInfo = { + layers: [{ layout: { 'text-font': ['PingFang SC Regular'] } }, {}] + }; + + expect(instance._getLabelFontFamily(mapInfo)).toBe('sans-serif,PingFang SC Regular'); + }); + }); + + describe('initializeMap', () => { + it('should call addLocalIdeographFontFamily when map is provided', () => { + spyOn(instance, '_initLayers'); + const mapInfo = { + crs: 'EPSG:3857', + layers: [{ layout: { 'text-font': ['PingFang SC Regular'] } }] + }; + const map = { + addLocalIdeographFontFamily: jasmine.createSpy('addLocalIdeographFontFamily') + }; + + instance.initializeMap(mapInfo, map); + + expect(instance._appendLayers).toBe(true); + expect(instance.map).toBe(map); + expect(map.addLocalIdeographFontFamily).toHaveBeenCalledWith('sans-serif,PingFang SC Regular'); + expect(instance._initLayers).toHaveBeenCalled(); + }); + + it('should not call addLocalIdeographFontFamily when map does not support it', () => { + spyOn(instance, '_initLayers'); + const mapInfo = { + crs: 'EPSG:3857', + layers: [{ layout: { 'text-font': ['PingFang SC Regular'] } }] + }; + const map = {}; + + expect(() => instance.initializeMap(mapInfo, map)).not.toThrow(); + expect(instance._appendLayers).toBe(true); + expect(instance._initLayers).toHaveBeenCalled(); + }); + }); + + describe('_createMap', () => { + it('should pass localIdeographFontFamily to MapManager', () => { + let capturedOptions; + const WebMapV3WithCapture = createWebMapV3Extending(Events, { + MapManager: function (options) { + capturedOptions = options; + this.on = jasmine.createSpy('on'); + }, + mapRepo: { + LngLat: function (lng, lat) { + return { lng, lat }; + }, + CRS: null + }, + mapRepoName: 'mapbox-gl', + l7LayerUtil: { + getL7MarkerLayers: () => ({}) + }, + crsManager: mockCrsManager + }); + const inst = new WebMapV3WithCapture({}, { target: 'map' }); + inst._mapInfo = { + crs: 'EPSG:3857', + center: { lng: 0, lat: 0 }, + layers: [{ layout: { 'text-font': ['PingFang SC Regular'] } }] + }; + inst._baseProjection = 'EPSG:3857'; + inst.fire = jasmine.createSpy('fire'); + inst._createMap(); + expect(capturedOptions).toBeDefined(); + expect(capturedOptions.localIdeographFontFamily).toBe('sans-serif,PingFang SC Regular'); + }); + }); +}); + describe('WebMapV3 - _getLegendInfos', () => { let instance; diff --git a/test/mapboxgl/mapping/WebMapV2Spec.js b/test/mapboxgl/mapping/WebMapV2Spec.js index dd1debbff7..d1a2dbec23 100644 --- a/test/mapboxgl/mapping/WebMapV2Spec.js +++ b/test/mapboxgl/mapping/WebMapV2Spec.js @@ -4616,4 +4616,35 @@ describe('mapboxgl_WebMapV2', () => { done(); }); }); + + it('_getLabelFontFamily should collect labelStyle fontFamily', () => { + datavizWebmap = new WebMap('', { ...commonOption }); + const WebMapV2 = datavizWebmap._createWebMapFactory('WebMap2'); + const webMapV2 = new WebMapV2('', commonOption, { crs: 'EPSG:3857' }); + const mapInfo = { + layers: [ + { labelStyle: { fontFamily: 'Arial' } }, + { labelStyle: { fontFamily: 'Microsoft YaHei' } } + ] + }; + expect(webMapV2._getLabelFontFamily(mapInfo)).toBe('sans-serif,Arial,Microsoft YaHei,supermapol-icons'); + }); + + it('initializeMap should call addLocalIdeographFontFamily when appending to existing map', async () => { + datavizWebmap = new WebMap('', { ...commonOption }); + const WebMapV2 = datavizWebmap._createWebMapFactory('WebMap2'); + const webMapV2 = new WebMapV2('', commonOption, { crs: 'EPSG:3857' }); + spyOn(webMapV2, '_registerMapCRS').and.returnValue(Promise.resolve('EPSG:3857')); + spyOn(webMapV2, '_loadLayers'); + const mapInfo = { + layers: [{ labelStyle: { fontFamily: '微软雅黑' } }] + }; + const map = { + getCRS: () => ({ epsgCode: 'EPSG:3857' }), + addLocalIdeographFontFamily: jasmine.createSpy('addLocalIdeographFontFamily') + }; + await webMapV2.initializeMap(mapInfo, map); + expect(webMapV2._appendLayers).toBe(true); + expect(map.addLocalIdeographFontFamily).toHaveBeenCalledWith('sans-serif,微软雅黑,supermapol-icons'); + }); }); diff --git a/test/mapboxgl/mapping/WebMapV3Spec.js b/test/mapboxgl/mapping/WebMapV3Spec.js index f52b4b6c6f..360a162e2c 100644 --- a/test/mapboxgl/mapping/WebMapV3Spec.js +++ b/test/mapboxgl/mapping/WebMapV3Spec.js @@ -8424,4 +8424,34 @@ describe('mapboxgl-webmap3.0', () => { done(); }); }); + + it('_getLabelFontFamily should collect text-font from layer layout', () => { + mapstudioWebmap = new WebMapV3({}, { server, target: 'map' }); + const mapInfo = { + layers: [ + { layout: { 'text-font': ['Arial Unicode MS Regular'] } }, + { layout: { 'text-font': ['Microsoft YaHei Regular'] } } + ] + }; + expect(mapstudioWebmap._getLabelFontFamily(mapInfo)).toBe( + 'sans-serif,Arial Unicode MS Regular,Microsoft YaHei Regular' + ); + }); + + it('initializeMap should call addLocalIdeographFontFamily when appending to existing map', () => { + mapstudioWebmap = new WebMapV3({}, { server, target: 'map' }); + spyOn(mapstudioWebmap, '_initLayers'); + const mapInfo = { + crs: 'EPSG:3857', + layers: [{ layout: { 'text-font': ['PingFang SC Regular'] } }] + }; + const map = { + getCRS: () => ({ epsgCode: 'EPSG:3857' }), + addLocalIdeographFontFamily: jasmine.createSpy('addLocalIdeographFontFamily'), + remove: jasmine.createSpy('remove') + }; + mapstudioWebmap.initializeMap(mapInfo, map); + expect(mapstudioWebmap._appendLayers).toBe(true); + expect(map.addLocalIdeographFontFamily).toHaveBeenCalledWith('sans-serif,PingFang SC Regular'); + }); }); diff --git a/test/test-main-common.js b/test/test-main-common.js index e5c6cdff8f..093e40ea53 100644 --- a/test/test-main-common.js +++ b/test/test-main-common.js @@ -239,3 +239,4 @@ import './common/mapping/WebMapBaseSpec.js'; import './common/mapping/WebMapServiceSpec'; import './common/mapping/WebMapV2BaseSpec'; import './common/mapping/WebMapV3Spec.js'; +import './common/mapping/WebMapV2Spec.js'; From 364858b02fd63796818df65e725618a7394d30c2 Mon Sep 17 00:00:00 2001 From: luoxiao Date: Thu, 9 Jul 2026 10:31:46 +0800 Subject: [PATCH 37/46] [fix]UT AI-GEN: 100% Cursor --- test/common/mapping/WebMapV2Spec.js | 1 + test/mapboxgl/mapping/WebMapV2Spec.js | 37 +++++++++++++++++++++++---- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/test/common/mapping/WebMapV2Spec.js b/test/common/mapping/WebMapV2Spec.js index 20b1acf132..e77a0769db 100644 --- a/test/common/mapping/WebMapV2Spec.js +++ b/test/common/mapping/WebMapV2Spec.js @@ -140,6 +140,7 @@ describe('WebMapV2 - addLocalIdeographFontFamily', () => { spyOn(inst, '_getMapCenter').and.returnValue({ lng: 0, lat: 0 }); await inst._createMap(mapInfo); expect(capturedOptions.localIdeographFontFamily).toBe('sans-serif,微软雅黑,supermapol-icons'); + await inst.clean(false); }); }); }); diff --git a/test/mapboxgl/mapping/WebMapV2Spec.js b/test/mapboxgl/mapping/WebMapV2Spec.js index d1a2dbec23..9d01602f86 100644 --- a/test/mapboxgl/mapping/WebMapV2Spec.js +++ b/test/mapboxgl/mapping/WebMapV2Spec.js @@ -1,6 +1,11 @@ import mapboxgl from 'mapbox-gl'; import mbglmap, { CRS, proj4 } from '../../tool/mock_mapboxgl_map'; import { WebMap } from '../../../src/mapboxgl/mapping/WebMap'; +import { createWebMapV2Extending } from '../../../src/common/mapping/WebMapV2'; +import { createWebMapV2BaseExtending } from '../../../src/common/mapping/WebMapV2Base'; +import { createMapClassExtending } from '../../../src/common/mapping/MapBase'; +import { CRSManager } from '../../../src/mapboxgl/mapping/webmap/CRSManager'; +import { GraticuleLayer } from '../../../src/mapboxgl/overlay/GraticuleLayer'; import * as MapManagerUtil from '../../../src/mapboxgl/mapping/webmap/MapManager'; import { ArrayStatistic } from '../../../src/common/util/ArrayStatistic'; import { FetchRequest } from '../../../src/common/util/FetchRequest'; @@ -141,6 +146,20 @@ function DataFlowService(serviceUrl) { }; } +function createMapboxWebMapV2Factory() { + const crsManager = new CRSManager(); + return createWebMapV2Extending( + createWebMapV2BaseExtending(createMapClassExtending(mapboxgl.Evented), 'fire'), + { + MapManager: MapManagerUtil.default, + mapRepo: mapboxgl, + crsManager, + DataFlowService: DataFlowServiceUtil.DataFlowService, + GraticuleLayer + } + ); +} + describe('mapboxgl_WebMapV2', () => { var originalTimeout, testDiv; var server = 'http://fack:8190/iportal/'; @@ -336,7 +355,16 @@ describe('mapboxgl_WebMapV2', () => { }); afterEach(() => { if (datavizWebmap) { - datavizWebmap.clean(); + if (datavizWebmap._handler) { + if (datavizWebmap._handler._sendMapToUser) { + spyOn(datavizWebmap._handler, '_sendMapToUser').and.stub(); + } + datavizWebmap._handler.clean(false); + datavizWebmap._handler = null; + } + if (datavizWebmap.map) { + datavizWebmap.clean(); + } datavizWebmap.map = null; datavizWebmap = null; } @@ -4618,8 +4646,7 @@ describe('mapboxgl_WebMapV2', () => { }); it('_getLabelFontFamily should collect labelStyle fontFamily', () => { - datavizWebmap = new WebMap('', { ...commonOption }); - const WebMapV2 = datavizWebmap._createWebMapFactory('WebMap2'); + const WebMapV2 = createMapboxWebMapV2Factory(); const webMapV2 = new WebMapV2('', commonOption, { crs: 'EPSG:3857' }); const mapInfo = { layers: [ @@ -4631,8 +4658,7 @@ describe('mapboxgl_WebMapV2', () => { }); it('initializeMap should call addLocalIdeographFontFamily when appending to existing map', async () => { - datavizWebmap = new WebMap('', { ...commonOption }); - const WebMapV2 = datavizWebmap._createWebMapFactory('WebMap2'); + const WebMapV2 = createMapboxWebMapV2Factory(); const webMapV2 = new WebMapV2('', commonOption, { crs: 'EPSG:3857' }); spyOn(webMapV2, '_registerMapCRS').and.returnValue(Promise.resolve('EPSG:3857')); spyOn(webMapV2, '_loadLayers'); @@ -4646,5 +4672,6 @@ describe('mapboxgl_WebMapV2', () => { await webMapV2.initializeMap(mapInfo, map); expect(webMapV2._appendLayers).toBe(true); expect(map.addLocalIdeographFontFamily).toHaveBeenCalledWith('sans-serif,微软雅黑,supermapol-icons'); + webMapV2.clean(false); }); }); From 223a3e0bae1889dcb9aa7e585de587c0dbc06bca Mon Sep 17 00:00:00 2001 From: luoxiao Date: Thu, 9 Jul 2026 16:53:45 +0800 Subject: [PATCH 38/46] =?UTF-8?q?[fix]=20=3F.=E8=AF=AD=E6=B3=95=E5=AF=BC?= =?UTF-8?q?=E8=87=B4es6=E6=89=93=E5=8C=85=E4=B8=8D=E5=AF=B9=20AI-GEN:=2070?= =?UTF-8?q?%=20Cursor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/mapping/WebMapV2.js | 2 +- test/common/mapping/WebMapBaseSpec.js | 2 +- test/common/mapping/WebMapV2Spec.js | 49 +++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/common/mapping/WebMapV2.js b/src/common/mapping/WebMapV2.js index 3ef2c38561..ec4703757b 100644 --- a/src/common/mapping/WebMapV2.js +++ b/src/common/mapping/WebMapV2.js @@ -219,7 +219,7 @@ export function createWebMapV2Extending(SuperClass, { MapManager, mapRepo, crsMa return layers.map((layer) => { const { legendSetting, name, layerID: layerId } = layer; return { - showLegend: legendSetting ? legendSetting?.isShow !== false : false, + showLegend: legendSetting ? legendSetting.isShow : false, id: layerId, title: name }; diff --git a/test/common/mapping/WebMapBaseSpec.js b/test/common/mapping/WebMapBaseSpec.js index f40098b9f7..26a0aab3ac 100644 --- a/test/common/mapping/WebMapBaseSpec.js +++ b/test/common/mapping/WebMapBaseSpec.js @@ -146,7 +146,7 @@ describe('WebMapBase - Handler Methods', () => { return layers.map((layer) => { const { legendSetting, name, layerID: layerId } = layer; return { - showLegend: legendSetting?.isShow !== false, + showLegend: legendSetting ? legendSetting.isShow : false, id: layerId, title: name }; diff --git a/test/common/mapping/WebMapV2Spec.js b/test/common/mapping/WebMapV2Spec.js index e77a0769db..80b6076ee1 100644 --- a/test/common/mapping/WebMapV2Spec.js +++ b/test/common/mapping/WebMapV2Spec.js @@ -144,3 +144,52 @@ describe('WebMapV2 - addLocalIdeographFontFamily', () => { }); }); }); + +describe('WebMapV2 - _getLegendInfos', () => { + let instance; + + beforeEach(() => { + instance = createWebMapV2Instance(); + }); + + it('should return showLegend true when isShow is true', () => { + instance._mapInfo = { + layers: [{ name: 'Layer1', layerID: 'layer1', legendSetting: { isShow: true } }] + }; + expect(instance._getLegendInfos()).toEqual([ + { showLegend: true, id: 'layer1', title: 'Layer1' } + ]); + }); + + it('should return showLegend false when isShow is false', () => { + instance._mapInfo = { + layers: [{ name: 'Layer2', layerID: 'layer2', legendSetting: { isShow: false } }] + }; + expect(instance._getLegendInfos()).toEqual([ + { showLegend: false, id: 'layer2', title: 'Layer2' } + ]); + }); + + it('should return showLegend false when legendSetting exists without isShow', () => { + instance._mapInfo = { + layers: [{ name: 'Layer3', layerID: 'layer3', legendSetting: {} }] + }; + expect(instance._getLegendInfos()).toEqual([ + { showLegend: false, id: 'layer3', title: 'Layer3' } + ]); + }); + + it('should return showLegend false when legendSetting is absent', () => { + instance._mapInfo = { + layers: [{ name: 'Layer4', layerID: 'layer4' }] + }; + expect(instance._getLegendInfos()).toEqual([ + { showLegend: false, id: 'layer4', title: 'Layer4' } + ]); + }); + + it('should return empty array when no layers', () => { + instance._mapInfo = {}; + expect(instance._getLegendInfos()).toEqual([]); + }); +}); From 26ab3b7bb23abe770e2230b2a917d5f9aff7bd0a Mon Sep 17 00:00:00 2001 From: luoxiao Date: Thu, 9 Jul 2026 17:13:25 +0800 Subject: [PATCH 39/46] [fix]UT AI-GEN: 0% Cursor --- test/common/mapping/WebMapV2Spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/common/mapping/WebMapV2Spec.js b/test/common/mapping/WebMapV2Spec.js index 80b6076ee1..15f21e229a 100644 --- a/test/common/mapping/WebMapV2Spec.js +++ b/test/common/mapping/WebMapV2Spec.js @@ -175,7 +175,7 @@ describe('WebMapV2 - _getLegendInfos', () => { layers: [{ name: 'Layer3', layerID: 'layer3', legendSetting: {} }] }; expect(instance._getLegendInfos()).toEqual([ - { showLegend: false, id: 'layer3', title: 'Layer3' } + { showLegend: undefined, id: 'layer3', title: 'Layer3' } ]); }); From 559d8c40ddec25cbb61468c73c67acefe061b917 Mon Sep 17 00:00:00 2001 From: luoxiao Date: Mon, 13 Jul 2026 15:23:50 +0800 Subject: [PATCH 40/46] =?UTF-8?q?[feature]=E6=8F=90=E4=BE=9Bvue-iclient?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E6=89=93=E5=8C=85=E5=91=BD=E4=BB=A4=20AI-GEN?= =?UTF-8?q?:=2070%=20Cursor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- build/custom/common-webmapv2base.js | 1 + build/custom/common.js | 33 +++++++++++++ build/custom/externals.js | 33 +++++++++++++ .../webpack.config.common-webmapv2base.js | 48 +++++++++++++++++++ build/custom/webpack.config.common.js | 31 ++++++++++++ build/custom/webpack.config.mapboxgl.js | 13 +++++ package.json | 4 ++ 8 files changed, 165 insertions(+), 1 deletion(-) create mode 100644 build/custom/common-webmapv2base.js create mode 100644 build/custom/common.js create mode 100644 build/custom/externals.js create mode 100644 build/custom/webpack.config.common-webmapv2base.js create mode 100644 build/custom/webpack.config.common.js create mode 100644 build/custom/webpack.config.mapboxgl.js diff --git a/.gitignore b/.gitignore index b9e8d4a187..7066053bc3 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,5 @@ /package-lock.json .npmrc /dist/mapboxgl/resources/ -/dist/maplibregl/resources/ \ No newline at end of file +/dist/maplibregl/resources/ +/custom-dist/ \ No newline at end of file diff --git a/build/custom/common-webmapv2base.js b/build/custom/common-webmapv2base.js new file mode 100644 index 0000000000..3c6e13ecde --- /dev/null +++ b/build/custom/common-webmapv2base.js @@ -0,0 +1 @@ +export * from '../../src/common/mapping/WebMapV2Base'; \ No newline at end of file diff --git a/build/custom/common.js b/build/custom/common.js new file mode 100644 index 0000000000..0c733c284f --- /dev/null +++ b/build/custom/common.js @@ -0,0 +1,33 @@ +import { QueryBySQLParameters } from '../../src/common/iServer/QueryBySQLParameters'; +import { QueryByGeometryParameters } from '../../src/common/iServer/QueryByGeometryParameters'; +import { FilterParameter } from '../../src/common/iServer/FilterParameter'; +import { QueryBySQLService } from '../../src/common/iServer/QueryBySQLService'; +import { QueryService } from '../../src/common/iServer/QueryService'; +import { FetchRequest } from '../../src/common/util/FetchRequest'; +import { GetFeaturesBySQLParameters } from '../../src/common/iServer/GetFeaturesBySQLParameters'; +import { GetFeaturesBySQLService } from '../../src/common/iServer/GetFeaturesBySQLService'; +import { GetFeaturesByBoundsParameters } from '../../src/common/iServer/GetFeaturesByBoundsParameters'; +import { FeatureService } from '../../src/common/iServer/FeatureService'; +import { Util } from '../../src/common/commontypes/Util'; +import { ColorsPickerUtil } from '../../src/common/util/ColorsPickerUtil'; +import { GeometryPolygon, GeometryLinearRing, GeometryPoint } from '../../src/common/commontypes'; +import { mapboxFilterToQueryFilter } from '../../src/common/util/FilterCondition'; + +export { + QueryBySQLParameters, + QueryByGeometryParameters, + FilterParameter, + QueryBySQLService, + QueryService, + FetchRequest, + GetFeaturesBySQLParameters, + GetFeaturesBySQLService, + GetFeaturesByBoundsParameters, + FeatureService, + Util, + ColorsPickerUtil, + GeometryPolygon, + GeometryLinearRing, + GeometryPoint, + mapboxFilterToQueryFilter +}; diff --git a/build/custom/externals.js b/build/custom/externals.js new file mode 100644 index 0000000000..fc8ca2a114 --- /dev/null +++ b/build/custom/externals.js @@ -0,0 +1,33 @@ +/** + * Remove specified keys from externals so those dependencies are bundled. + * @param {Object} externals + * @param {string[]} omitList + * @returns {Object} + */ +function omitExternals(externals, omitList = []) { + const result = Object.assign({}, externals); + omitList.forEach((key) => { + delete result[key]; + }); + return result; +} + +/** + * Parse omit list from env: VUE_ICLIENT_OMIT_EXTERNALS="@antv/g6,@antv/g2" + * @param {string[]} defaultOmit + * @returns {string[]} + */ +function parseOmitList(defaultOmit) { + const env = process.env.VUE_ICLIENT_OMIT_EXTERNALS; + if (!env) { + return defaultOmit; + } + return env.split(',').map((item) => item.trim()).filter(Boolean); +} + +module.exports = { + omitExternals, + parseOmitList, + COMMON_OMIT: ['@antv/g6'], + MAPBOXGL_OMIT: ['./L7/l7-render', '@antv/g2'] +}; diff --git a/build/custom/webpack.config.common-webmapv2base.js b/build/custom/webpack.config.common-webmapv2base.js new file mode 100644 index 0000000000..93939078f6 --- /dev/null +++ b/build/custom/webpack.config.common-webmapv2base.js @@ -0,0 +1,48 @@ +// "deploy-common": "webpack --config ./build/webpack.config.common.js --color", + +// const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; + +module.exports = { + target: ['es6'], + mode: 'production', + //页面入口文件配置 + entry: [`${__dirname}/common-webmapv2base.js`], + + output: { + clean: true, + path: `${__dirname}/../../custom-dist/iclient-common/`, + filename: 'iclient-common-webmapv2base.js', + chunkFormat: 'commonjs', + libraryTarget: 'umd' + }, + + //是否启用压缩 + optimization: { + minimize: true, + emitOnErrors: false + }, + //不显示打包文件大小相关警告 + performance: { + hints: false + }, + + //其它解决方案配置 + resolve: { + extensions: ['.js'] + }, + + module: { + rules: [ + { + test: [/\.js$/], + exclude: /node_modules[\/\\]proj4/, + loader: 'babel-loader', + options: { + presets: ['@babel/preset-env'] + } + } + ] + }, + + plugins: [] +}; diff --git a/build/custom/webpack.config.common.js b/build/custom/webpack.config.common.js new file mode 100644 index 0000000000..d1b59bd41d --- /dev/null +++ b/build/custom/webpack.config.common.js @@ -0,0 +1,31 @@ +// "deploy-common": "webpack --config ./build/webpack.config.common.js --color", +module.exports = { + target: ['es5'], + mode: 'production', + //页面入口文件配置 + entry: [`${__dirname}/common.js`], + + output: { + path: `${__dirname}/../../custom-dist/iclient-common/`, + filename: `iclient-common.js`, + chunkFormat:'commonjs', + libraryTarget: 'umd' + }, + + //是否启用压缩 + optimization: { + minimize: true, + emitOnErrors: false + }, + //不显示打包文件大小相关警告 + performance: { + hints: false + }, + + //其它解决方案配置 + resolve: { + extensions: ['.js'] + }, + + plugins: [] +}; diff --git a/build/custom/webpack.config.mapboxgl.js b/build/custom/webpack.config.mapboxgl.js new file mode 100644 index 0000000000..ed4f6ebb40 --- /dev/null +++ b/build/custom/webpack.config.mapboxgl.js @@ -0,0 +1,13 @@ +const mapboxglConfig = require('../webpack.config.mapboxgl'); +const { omitExternals, parseOmitList, MAPBOXGL_OMIT, COMMON_OMIT } = require('./externals'); +const configBase = require('../webpack.config.base'); + +// mapboxglConfig.externals[0] = Object.assign({}, configBase.externals, mapboxglExternals) +const [mapboxglExternals] = mapboxglConfig.externals; + +module.exports = Object.assign({}, mapboxglConfig, { + externals: [omitExternals(mapboxglExternals, parseOmitList(MAPBOXGL_OMIT.concat(COMMON_OMIT)))], + output: Object.assign({}, configBase.output('iclient-mapboxgl', 'iclient-mapboxgl'), { + path: `${__dirname}/../../custom-dist/iclient-mapboxgl/`, + }), +}); diff --git a/package.json b/package.json index 9d20c0de19..b5c79481e6 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,10 @@ "build-docs-maplibregl": "rimraf ./docs/maplibregl && jsdoc -c ./build/jsdocs/maplibregl/docs.json -R ./build/jsdocs/maplibregl/index.md", "build-docs-classic": "rimraf ./docs/classic && jsdoc -c ./build/jsdocs/classic/docs.json -R ./build/jsdocs/classic/index.md", "pre-publish": "node ./build/publish.js --leaflet && node ./build/publish.js --openlayers && node ./build/publish.js --mapboxgl && node ./build/publish.js --maplibregl && node ./build/publish.js --classic", + "deploy-custom-webmapv2base": "webpack --config ./build/custom/webpack.config.common-webmapv2base.js --color && rimraf ./custom-dist/iclient-common/iclient-common-webmapv2base.js.LICENSE.txt", + "deploy-custom-common": "webpack --config ./build/custom/webpack.config.common.js --color && rimraf ./custom-dist/iclient-common/iclient-common.js.LICENSE.txt", + "deploy-custom-mapboxgl-es5": "cross-env moduleVersion=es5 webpack --config ./build/custom/webpack.config.mapboxgl.js --color && uglifyjs ./custom-dist/iclient-mapboxgl/iclient-mapboxgl.js --ecma 5 --comments /iclient-/i -c -m -o ./custom-dist/iclient-mapboxgl/iclient-mapboxgl.min.js && cleancss -o ./custom-dist/iclient-mapboxgl/iclient-mapboxgl.min.css ./custom-dist/iclient-mapboxgl/iclient-mapboxgl.css && rimraf ./custom-dist/iclient-mapboxgl/iclient-mapboxgl.js ./custom-dist/iclient-mapboxgl/iclient-mapboxgl.css", + "deploy-custom-mapboxgl": "npm run deploy-custom-webmapv2base && npm run deploy-custom-common && npm run deploy-custom-mapboxgl-es5", "publish": "npm run pre-publish && cd ./src/common && npm publish && cd ../leaflet && npm publish && cd ../openlayers && npm publish && cd ../mapboxgl && npm publish && cd ../maplibregl && npm publish && cd ../classic && npm publish" }, "keywords": [ From 7d21a3f2ad1533e8163d2cf9972881d7a5bcb1ff Mon Sep 17 00:00:00 2001 From: songyumeng Date: Wed, 12 Aug 2026 16:51:39 +0800 Subject: [PATCH 41/46] =?UTF-8?q?=E3=80=90fix=E3=80=91=E4=BF=AE=E5=A4=8Dwe?= =?UTF-8?q?bmap=20=E9=9B=AA=E7=A2=A7=E5=9B=BE=20l7layer=E4=B8=ADoptions.wi?= =?UTF-8?q?thCredentials=E7=9A=84=E5=80=BC=E7=9A=84=E9=97=AE=E9=A2=98=20AI?= =?UTF-8?q?-GEN:=2010%=20Claude?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/mapping/WebMapService.js | 6 ++++ src/common/mapping/WebMapV3.js | 6 ++-- src/common/mapping/utils/L7LayerUtil.js | 15 ++++----- src/mapboxgl/mapping/WebMap.js | 6 ++-- src/maplibregl/mapping/WebMap.js | 6 ++-- test/common/mapping/utils/L7LayerUtilSpec.js | 15 ++++++--- test/mapboxgl/mapping/WebMapV3Spec.js | 33 +++++++++++++++++--- test/maplibregl/mapping/WebMapV3Spec.js | 26 ++++++++++++++- test/resources/WebMapV3.js | 4 +-- 9 files changed, 91 insertions(+), 26 deletions(-) diff --git a/src/common/mapping/WebMapService.js b/src/common/mapping/WebMapService.js index c963971500..502f59760e 100644 --- a/src/common/mapping/WebMapService.js +++ b/src/common/mapping/WebMapService.js @@ -1005,6 +1005,12 @@ export class WebMapService { return defaultValue; } + handleUrlWithCredentials(serviceUrl) { + if (serviceUrl && this.iportalServiceProxyUrl && serviceUrl.indexOf(this.iportalServiceProxyUrl) >= 0) { + return true; + } + return null; + } isIportalResourceUrl(serviceUrl) { return ( diff --git a/src/common/mapping/WebMapV3.js b/src/common/mapping/WebMapV3.js index 8e1c64c21b..b23dc45f30 100644 --- a/src/common/mapping/WebMapV3.js +++ b/src/common/mapping/WebMapV3.js @@ -160,7 +160,7 @@ export const LEGEND_STYLE_TYPES = { IMAGE: 'image', STYLE: 'style' }; -export function createWebMapV3Extending(SuperClass, { MapManager, mapRepo, crsManager, l7LayerUtil }) { +export function createWebMapV3Extending(SuperClass, { MapManager, mapRepo, crsManager, l7LayerUtil, webMapService }) { return class WebMapV3 extends SuperClass { constructor(mapId, options, mapOptions = {}) { super(); @@ -495,7 +495,7 @@ export function createWebMapV3Extending(SuperClass, { MapManager, mapRepo, crsMa const mapResourceUrl = transformUrl( Object.assign({ url: `${this.options.server}web/maps/${this.mapId}` }, this.options) ); - return FetchRequest.get(mapResourceUrl, null, { withCredentials: this.options.withCredentials }).then((response) => + return FetchRequest.get(mapResourceUrl, null, { withCredentials: webMapService.handleUrlWithCredentials(mapResourceUrl) }).then((response) => response.json() ); } @@ -797,7 +797,7 @@ export function createWebMapV3Extending(SuperClass, { MapManager, mapRepo, crsMa _getSpriteData(sprite) { const url = sprite.replace(/.+(web\/maps\/.+)/, `${this.options.server}$1`); - return FetchRequest.get(url, null, { withCredentials: this.options.withCredentials }) + return FetchRequest.get(url, null, { withCredentials: webMapService.handleUrlWithCredentials(url) }) .then((response) => { return response.json(); }); diff --git a/src/common/mapping/utils/L7LayerUtil.js b/src/common/mapping/utils/L7LayerUtil.js index a1d6087d26..456f4acd43 100644 --- a/src/common/mapping/utils/L7LayerUtil.js +++ b/src/common/mapping/utils/L7LayerUtil.js @@ -220,7 +220,7 @@ export function getL7Filter(filter, featureFilter) { } export function L7LayerUtil(config) { - const { featureFilter, expression, spec, L7Layer, L7, proj4 } = config; + const { featureFilter, expression, spec, L7Layer, L7, proj4, webMapService } = config; /** * @param {string} url @@ -244,7 +244,7 @@ export function L7LayerUtil(config) { */ function getRestDataFields(datasetUrl, credential, options) { const url = addCredentialToUrl(`${datasetUrl}/fields.json?returnAll=true`, credential); - return FetchRequest.get(url, null, options) + return FetchRequest.get(url, null, { ...options, withCredentials: webMapService.handleUrlWithCredentials(url) }) .then((res) => res.json()) .then((result) => { return result.map((item) => { @@ -270,7 +270,7 @@ export function L7LayerUtil(config) { */ function getRestDataDomains(datasetUrl, credential, options) { const url = addCredentialToUrl(`${datasetUrl}/domain.json`, credential); - return FetchRequest.get(url, null, options).then((result) => { + return FetchRequest.get(url, null, { ...options, withCredentials: webMapService.handleUrlWithCredentials(url) }).then((result) => { return result.json(); }); } @@ -453,7 +453,7 @@ export function L7LayerUtil(config) { const nextOptions = handleWithRequestOptions(datasetUrl, options); const { fieldNames, fieldTypes } = await getRestDataFieldInfo(datasetUrl, credential, nextOptions); const nextUrl = addCredentialToUrl(url, credential); - const attrDataInfo = await FetchRequest.post(nextUrl, JSON.stringify(SQLParams), nextOptions); + const attrDataInfo = await FetchRequest.post(nextUrl, JSON.stringify(SQLParams), { ...nextOptions, withCredentials: webMapService.handleUrlWithCredentials(nextUrl) }); const featuresRes = await attrDataInfo.json(); return { @@ -468,7 +468,7 @@ export function L7LayerUtil(config) { * @param option */ function getStructDataItemJson(href, option) { - return FetchRequest.get(href, null, option) + return FetchRequest.get(href, null, { ...option, withCredentials: webMapService.handleUrlWithCredentials(href) }) .then((res) => res.json()) .then((data) => { if (data.succeed === false) { @@ -616,10 +616,11 @@ export function L7LayerUtil(config) { */ async function getStructuredDataGeojsonByWebMap(data, options) { const allFeature = await getStructDataGeojson(data.dataId, options); + const url = `${options.server}web/datas/${data.dataId}/structureddata.json` const resultRes = await FetchRequest.get( - `${options.server}web/datas/${data.dataId}/structureddata.json`, + url, null, - options + { ...options, withCredentials: webMapService.handleUrlWithCredentials(url) } ); const result = await resultRes.json(); const projection = `EPSG:${result.epsgCode}`; diff --git a/src/mapboxgl/mapping/WebMap.js b/src/mapboxgl/mapping/WebMap.js index 9859762232..d260bc44e3 100644 --- a/src/mapboxgl/mapping/WebMap.js +++ b/src/mapboxgl/mapping/WebMap.js @@ -122,7 +122,8 @@ export class WebMap extends createWebMapBaseExtending(mapboxgl.Evented, { mapRep spec, L7Layer, L7, - proj4: this._crsManager.getProj4() + proj4: this._crsManager.getProj4(), + webMapService: this.webMapService }); switch (type) { case 'MapStyle': @@ -130,7 +131,8 @@ export class WebMap extends createWebMapBaseExtending(mapboxgl.Evented, { mapRep case 'WebMap3': return createWebMapV3Extending(createMapClassExtending(mapboxgl.Evented), { ...commonFactoryOptions, - l7LayerUtil + l7LayerUtil, + webMapService: this.webMapService }); default: return createWebMapV2Extending( diff --git a/src/maplibregl/mapping/WebMap.js b/src/maplibregl/mapping/WebMap.js index 651c114e0f..e8492edac2 100644 --- a/src/maplibregl/mapping/WebMap.js +++ b/src/maplibregl/mapping/WebMap.js @@ -121,7 +121,8 @@ export class WebMap extends createWebMapBaseExtending(maplibregl.Evented, { mapR spec, L7Layer, L7, - proj4: this._crsManager.getProj4() + proj4: this._crsManager.getProj4(), + webMapService: this.webMapService }); switch (type) { case 'MapStyle': @@ -129,7 +130,8 @@ export class WebMap extends createWebMapBaseExtending(maplibregl.Evented, { mapR case 'WebMap3': return createWebMapV3Extending(createMapClassExtending(maplibregl.Evented), { ...commonFactoryOptions, - l7LayerUtil + l7LayerUtil, + webMapService: this.webMapService }); default: return createWebMapV2Extending( diff --git a/test/common/mapping/utils/L7LayerUtilSpec.js b/test/common/mapping/utils/L7LayerUtilSpec.js index 8dcd86e342..11cbe5e01b 100644 --- a/test/common/mapping/utils/L7LayerUtilSpec.js +++ b/test/common/mapping/utils/L7LayerUtilSpec.js @@ -35,7 +35,10 @@ describe('L7LayerUtil', () => { reRender() {} }; - const l7LayerUtil = L7LayerUtil({ featureFilter, expression, spec, L7Layer, L7 }); + const mockWebMapService = { + handleUrlWithCredentials: jasmine.createSpy('handleUrlWithCredentials').and.returnValue(true) + }; + const l7LayerUtil = L7LayerUtil({ featureFilter, expression, spec, L7Layer, L7 ,webMapService: mockWebMapService}); const mapstudioWebMap_L7LayersRes = JSON.parse(mapstudioWebMap_L7Layers); const scene = new mockL7.Scene(); @@ -185,7 +188,7 @@ describe('L7LayerUtil', () => { it('animate line layer', (done) => { spyOn(FetchRequest, 'get').and.callFake((url, _, options) => { - expect(options.withCredentials).toBeUndefined(); + expect(options.withCredentials).toBeTruthy(); expect(options.withoutFormatSuffix).toBeTruthy(); if (url.indexOf('/data-Building/rest/data/datasources/newBuilding/datasets/New_LINE/fields.json') > -1) { return Promise.resolve(new Response(RESTDATA_FIELDS_RES)); @@ -196,7 +199,7 @@ describe('L7LayerUtil', () => { return Promise.resolve(); }); spyOn(FetchRequest, 'post').and.callFake((url, _, options) => { - expect(options.withCredentials).toBeUndefined(); + expect(options.withCredentials).toBeTruthy(); expect(options.withoutFormatSuffix).toBeTruthy(); if (url.indexOf('/data-Building/rest/data/featureResults.geojson') > -1) { return Promise.resolve(new Response(RESTDATA_FEATURES_RES)); @@ -286,7 +289,8 @@ describe('L7LayerUtil', () => { it('add layer one error, one success', (done) => { spyOn(FetchRequest, 'get').and.callFake((url, _, options) => { - expect(options.withCredentials).toBeUndefined(); + console.log('get', url, options.withCredentials); + expect(options.withCredentials).toBeTruthy(); expect(options.withoutFormatSuffix).toBeTruthy(); if (url.indexOf('/data-Building/rest/data/datasources/newBuilding/datasets/New_LINE/fields.json') > -1) { return Promise.resolve(new Response(RESTDATA_FIELDS_RES)); @@ -297,7 +301,8 @@ describe('L7LayerUtil', () => { return Promise.resolve(); }); spyOn(FetchRequest, 'post').and.callFake((url, _, options) => { - expect(options.withCredentials).toBeUndefined(); + console.log('post', url, options.withCredentials); + expect(options.withCredentials).toBeTruthy(); expect(options.withoutFormatSuffix).toBeTruthy(); if (url.indexOf('/data-Building/rest/data/featureResults.geojson') > -1) { return Promise.reject('error test'); diff --git a/test/mapboxgl/mapping/WebMapV3Spec.js b/test/mapboxgl/mapping/WebMapV3Spec.js index 360a162e2c..fac34600e8 100644 --- a/test/mapboxgl/mapping/WebMapV3Spec.js +++ b/test/mapboxgl/mapping/WebMapV3Spec.js @@ -20,11 +20,15 @@ describe('mapboxgl-webmap3.0', () => { var id = 617580084; var mapstudioWebmap; const l7LayerUtil = L7LayerUtil({ featureFilter, expression, spec, L7Layer, L7 }); + const mockWebMapService = { + handleUrlWithCredentials: jasmine.createSpy('handleUrlWithCredentials').and.returnValue(true) + }; const extendOptions = { MapManager: MapManagerUtil.default, mapRepo: mapboxgl, crsManager: new CRSManager(), - l7LayerUtil + l7LayerUtil, + webMapService: mockWebMapService }; const WebMapV3 = createWebMapV3Extending(createMapClassExtending(mapboxgl.Evented), extendOptions); beforeEach(() => { @@ -37,7 +41,7 @@ describe('mapboxgl-webmap3.0', () => { testDiv.style.height = '500px'; window.document.body.appendChild(testDiv); originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL; - jasmine.DEFAULT_TIMEOUT_INTERVAL = 50000; + jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000; mapboxgl.Map.prototype.overlayLayersManager = {}; mbglmap.prototype.getL7Scene = mapboxgl.Map.prototype.getL7Scene; mapboxgl.CRS = CRS; @@ -172,7 +176,7 @@ describe('mapboxgl-webmap3.0', () => { if (url.indexOf('932266699.json') > -1) { return Promise.resolve(new Response(msProjectINfo_filters)); } - if (url.indexOf('/sprites') > -1) { + if (url.indexOf('/sprite') > -1) { return Promise.resolve(new Response(spriteJson)); } return Promise.resolve(); @@ -204,7 +208,7 @@ describe('mapboxgl-webmap3.0', () => { }); it('filters mapId is JSON', (done) => { spyOn(FetchRequest, 'get').and.callFake((url) => { - if (url.indexOf('/sprites') > -1) { + if (url.indexOf('/sprite') > -1) { return Promise.resolve(new Response(msSpriteInfo)); } return Promise.resolve(); @@ -8454,4 +8458,25 @@ describe('mapboxgl-webmap3.0', () => { expect(mapstudioWebmap._appendLayers).toBe(true); expect(map.addLocalIdeographFontFamily).toHaveBeenCalledWith('sans-serif,PingFang SC Regular'); }); + + it('_getSpriteData should use webMapService.handleWithCredentials for withCredentials', (done) => { + + const spriteUrl = 'http://example.com/web/maps/123/sprite.json'; + spyOn(FetchRequest, 'get').and.callFake((url, params, options) => { + if (url.indexOf('sprite.json') > -1) { + expect(mockWebMapService.handleUrlWithCredentials).toHaveBeenCalledWith(url); + expect(options.withCredentials).toBe(true); + return Promise.resolve(new Response(JSON.stringify({}))); + } + return Promise.resolve(new Response(JSON.stringify({}))); + }); + + mapstudioWebmap = new WebMapV3(id, { server, target: 'map' }); + mapstudioWebmap._getSpriteData(spriteUrl).then(() => { + expect(mockWebMapService.handleUrlWithCredentials).toHaveBeenCalled(); + done(); + }).catch((e) => { + done.fail(e); + }); + }); }); diff --git a/test/maplibregl/mapping/WebMapV3Spec.js b/test/maplibregl/mapping/WebMapV3Spec.js index 38be7f8b78..27b6f580c0 100644 --- a/test/maplibregl/mapping/WebMapV3Spec.js +++ b/test/maplibregl/mapping/WebMapV3Spec.js @@ -20,11 +20,15 @@ describe('maplibregl-webmap3.0', () => { var id = 617580084; var mapstudioWebmap; const l7LayerUtil = L7LayerUtil({ featureFilter, expression, spec, L7Layer, L7 }); + const mockWebMapService = { + handleUrlWithCredentials: jasmine.createSpy('handleUrlWithCredentials').and.returnValue(true) + }; const extendOptions = { MapManager: MapManagerUtil.default, mapRepo: maplibregl, crsManager: new CRSManager(), - l7LayerUtil + l7LayerUtil, + webMapService: mockWebMapService }; const WebMapV3 = createWebMapV3Extending(createMapClassExtending(maplibregl.Evented), extendOptions); beforeEach(() => { @@ -1619,4 +1623,24 @@ describe('maplibregl-webmap3.0', () => { }); }); }); + it('_getSpriteData should use webMapService.handleWithCredentials for withCredentials', (done) => { + + const spriteUrl = 'http://example.com/web/maps/123/sprite.json'; + spyOn(FetchRequest, 'get').and.callFake((url, params, options) => { + if (url.indexOf('sprite.json') > -1) { + expect(mockWebMapService.handleUrlWithCredentials).toHaveBeenCalledWith(url); + expect(options.withCredentials).toBe(true); + return Promise.resolve(new Response(JSON.stringify({}))); + } + return Promise.resolve(new Response(JSON.stringify({}))); + }); + + mapstudioWebmap = new WebMapV3(id, { server, target: 'map' }); + mapstudioWebmap._getSpriteData(spriteUrl).then(() => { + expect(mockWebMapService.handleUrlWithCredentials).toHaveBeenCalled(); + done(); + }).catch((e) => { + done.fail(e); + }); + }); }); diff --git a/test/resources/WebMapV3.js b/test/resources/WebMapV3.js index ed0ac5eea8..e6a0554804 100644 --- a/test/resources/WebMapV3.js +++ b/test/resources/WebMapV3.js @@ -5606,7 +5606,7 @@ var mapstudioWebMap_filters = JSON.stringify({ "minzoom": 0 } ], - "sprite": "http://fake:8190/iportal/web/maps/932266699/sprites/sprite", + "sprite": "http://localhost:9876/base/resources/data/sprite", "pitch": 0, "minzoom": 0 }); @@ -5635,7 +5635,7 @@ var msProjectINfo_filters = JSON.stringify({ "title": "郑州POI", "resolution": 0, "checkStatus": "SUCCESSFUL", - "projectInfo": "{\"images\":\"http://fake:8190/iportal/web/maps/932266699/sprites/sprite\",\"catalogs\":[{\"filter\":[\"all\",[\"==\",\"Ctype\",\"\"],[\"!=\",\"smpid\",\"\"]],\"visualization\":{\"renderer\":[{\"rotate\":{\"type\":\"simple\",\"value\":0},\"textLetterSpacing\":{\"type\":\"simple\",\"value\":0},\"textTranslate\":{\"type\":\"simple\",\"value\":[0,0]},\"color\":{\"type\":\"simple\",\"value\":\"#EE4D5A\"},\"symbolPlacement\":{\"type\":\"simple\",\"value\":\"point\"},\"textAnchor\":{\"type\":\"simple\",\"value\":\"center\"},\"translate\":{\"type\":\"simple\",\"value\":[0,0]},\"textRotate\":{\"type\":\"simple\",\"value\":0},\"textField\":{\"type\":\"simple\",\"value\":\"\"},\"textHaloBlur\":{\"type\":\"simple\",\"value\":2},\"transform\":{\"type\":\"simple\",\"value\":\"none\"},\"symbolsContent\":{\"field\":[\"smpid\"],\"defaultValue\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"values\":[{\"value\":{\"symbolId\":\"shape2\",\"style\":{\"layout\":{\"icon-image\":\"shape2\"}}},\"key\":1},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":10},{\"value\":{\"symbolId\":\"shape6\",\"style\":{\"layout\":{\"icon-image\":\"shape6\"}}},\"key\":100},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":101},{\"value\":{\"symbolId\":\"shape9\",\"style\":{\"layout\":{\"icon-image\":\"shape9\"}}},\"key\":102},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":103},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":104},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":105},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":106},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":107},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":108},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":109},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":11},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":110},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":111},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":112},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":113},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":114},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":115},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":116},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":117},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":118},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":119},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":12},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":120},{\"value\":{\"symbolId\":\"point-83030560\",\"style\":{\"layout\":{\"icon-image\":\"point-83030560\"}}},\"key\":121},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":122},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":123},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":124},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":125},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":126},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":127},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":128},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":129},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":13},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":130},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":131},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":132},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":133},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":134},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":135},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":136},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":137},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":138},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":139},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":14},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":140},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":141},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":142},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":143},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":144},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":145},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":146},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":147},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":148},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":149},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":15},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":150},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":151},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":152},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":153},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":154},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":155},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":156},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":157},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":158},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":159},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":16},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":160},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":161},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":162},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":163},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":164},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":165},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":166},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":167},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":168},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":169},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":17},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":170},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":171},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":172},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":173},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":174},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":175},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":176},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":177},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":178},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":179},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":18},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":180},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":181},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":182},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":183},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":184},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":185},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":186},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":187},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":188},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":189},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":19},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":190},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":191},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":192},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":193},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":194},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":195},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":196},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":197},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":198},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":199},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":2},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":20},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":200},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":201},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":202},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":203},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":204},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":205},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":206},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":207},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":208},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":209},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":21},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":210},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":211},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":212},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":213},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":214},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":215},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":216},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":217},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":218},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":219},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":22},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":220},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":221},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":222},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":223},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":224},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":225},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":226},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":227},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":228},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":229},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":23},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":230},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":231},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":232},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":233},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":234},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":235},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":236},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":237},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":238},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":239},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":24},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":240},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":241},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":242},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":243},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":244},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":245},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":246},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":247},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":248},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":249},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":25},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":250},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":251},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":252},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":253},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":254},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":255},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":256},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":257},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":258},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":259},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":26},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":260},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":261},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":262},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":263},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":264},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":265},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":266},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":267},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":268},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":269},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":27},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":270},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":271},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":272},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":273},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":274},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":275},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":276},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":277},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":278},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":279},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":28},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":280},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":281},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":282},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":283},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":284},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":285},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":286},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":287},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":288},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":289},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":29},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":290},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":291},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":292},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":293},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":294},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":295},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":296},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":297},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":298},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":299},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":3},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":30},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":300},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":301},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":302},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":303},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":304},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":305},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":306},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":307},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":308},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":309},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":31},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":310},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":311},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":312},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":313},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":314},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":315},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":316},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":317},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":318},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":319},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":32},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":320},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":321},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":322},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":323},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":324},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":325},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":326},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":327},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":328},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":329},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":33},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":330},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":331},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":332},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":333},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":334},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":335},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":336},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":337},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":338},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":339},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":34},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":340},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":341},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":342},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":343},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":344},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":345},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":346},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":347},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":348},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":349},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":35},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":350},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":351},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":352},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":353},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":354},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":355},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":356},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":357},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":358},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":359},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":36},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":360},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":361},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":362},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":363},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":364},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":365},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":366},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":367},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":368},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":369},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":37},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":370},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":371},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":372},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":373},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":374},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":375},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":376},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":377},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":378},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":379},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":38},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":380},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":381},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":382},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":383},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":384},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":385},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":386},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":387},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":388},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":389},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":39},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":390},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":391},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":392},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":393},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":394},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":395},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":396},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":397},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":398},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":399},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":4},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":40},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":400},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":401},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":402},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":403},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":404},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":405},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":406},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":407},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":408},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":409},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":41},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":410},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":411},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":412},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":413},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":414},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":415},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":416},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":417},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":418},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":419},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":42},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":420},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":421},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":422},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":423},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":424},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":425},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":426},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":427},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":428},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":429},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":43},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":430},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":431},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":432},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":433},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":434},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":435},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":436},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":437},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":438},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":439},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":44},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":440},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":441},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":442},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":443},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":444},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":445},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":446},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":447},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":448},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":449},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":45},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":450},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":451},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":452},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":453},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":454},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":455},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":456},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":457},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":458},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":459},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":46},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":460},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":461},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":462},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":463},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":464},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":465},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":466},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":467},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":468},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":469},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":47},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":470},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":471},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":472},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":473},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":474},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":475},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":476},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":477},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":478},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":479},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":48},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":480},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":481},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":482},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":483},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":484},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":485},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":486},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":487},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":488},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":489},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":49},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":490},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":491},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":492},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":493},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":494},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":495},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":496},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":497},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":498},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":499},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":5},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":50},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":500},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":501},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":502},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":503},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":504},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":505},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":506},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":507},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":508},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":509},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":51},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":510},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":511},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":512},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":513},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":514},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":515},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":516},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":517},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":518},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":519},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":52},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":520},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":521},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":522},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":523},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":524},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":525},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":526},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":527},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":528},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":529},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":53},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":530},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":531},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":532},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":533},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":534},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":535},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":536},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":537},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":538},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":539},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":54},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":540},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":541},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":542},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":543},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":544},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":545},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":546},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":547},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":548},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":549},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":55},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":550},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":551},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":552},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":553},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":554},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":555},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":556},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":557},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":558},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":559},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":56},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":560},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":561},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":562},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":563},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":564},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":565},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":566},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":567},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":568},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":569},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":57},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":570},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":571},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":572},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":573},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":574},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":575},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":576},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":577},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":578},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":579},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":58},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":580},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":581},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":582},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":583},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":584},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":585},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":586},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":587},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":588},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":589},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":59},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":590},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":591},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":592},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":593},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":594},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":595},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":596},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":597},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":598},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":599},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":6},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":60},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":600},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":601},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":602},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":603},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":604},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":605},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":606},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":607},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":608},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":609},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":61},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":610},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":611},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":612},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":613},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":614},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":615},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":616},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":617},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":618},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":619},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":62},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":620},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":621},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":622},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":623},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":624},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":625},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":626},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":627},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":628},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":629},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":63},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":630},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":631},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":632},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":633},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":634},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":635},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":636},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":637},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":638},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":639},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":64},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":640},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":641},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":642},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":643},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":644},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":645},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":646},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":647},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":648},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":649},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":65},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":650},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":651},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":652},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":653},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":654},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":655},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":656},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":657},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":658},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":659},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":66},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":660},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":661},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":662},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":663},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":664},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":665},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":666},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":667},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":668},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":669},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":67},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":670},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":671},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":672},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":673},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":674},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":675},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":676},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":677},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":678},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":679},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":68},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":680},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":681},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":682},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":683},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":684},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":685},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":686},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":687},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":688},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":689},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":69},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":690},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":691},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":692},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":693},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":694},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":695},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":696},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":697},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":698},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":699},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":7},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":70},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":700},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":701},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":702},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":703},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":704},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":705},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":706},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":707},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":708},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":709},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":71},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":710},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":711},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":712},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":713},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":714},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":715},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":716},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":717},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":718},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":719},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":72},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":720},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":721},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":722},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":723},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":724},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":725},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":726},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":727},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":728},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":729},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":73},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":730},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":731},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":732},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":733},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":734},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":735},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":736},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":737},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":738},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":739},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":74},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":740},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":741},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":742},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":743},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":744},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":745},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":746},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":75},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":76},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":77},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":78},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":79},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":8},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":80},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":81},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":82},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":83},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":84},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":85},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":86},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":87},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":88},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":89},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":9},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":90},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":91},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":92},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":93},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":94},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":95},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":96},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":97},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":98},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":99}],\"interpolateInfo\":{\"type\":\"custom\"},\"type\":\"unique\"},\"textTranslateAnchor\":{\"type\":\"simple\",\"value\":\"map\"},\"justify\":{\"type\":\"simple\",\"value\":\"center\"},\"ignorePlacement\":{\"type\":\"simple\",\"value\":false},\"textAllowOverlap\":{\"type\":\"simple\",\"value\":true},\"maxWidth\":{\"type\":\"simple\",\"value\":10},\"textSize\":{\"type\":\"simple\",\"value\":16},\"textHaloColor\":{\"type\":\"simple\",\"value\":\"#242424\"},\"textColor\":{\"type\":\"simple\",\"value\":\"#FFFFFF\"},\"size\":{\"type\":\"simple\",\"value\":8},\"allowOverlap\":{\"type\":\"simple\",\"value\":true},\"translateAnchor\":{\"type\":\"simple\",\"value\":\"map\"},\"anchor\":{\"type\":\"simple\",\"value\":\"center\"},\"textOpacity\":{\"type\":\"simple\",\"value\":1},\"textHaloWidth\":{\"type\":\"simple\",\"value\":1},\"lineHeight\":{\"type\":\"simple\",\"value\":1.2},\"textFont\":{\"type\":\"simple\",\"value\":[\"Open Sans Regular\",\"Arial Unicode MS Regular\"]},\"textIgnorePlacement\":{\"type\":\"simple\",\"value\":false},\"opacity\":{\"type\":\"simple\",\"value\":0.9}}]},\"visible\":true,\"catalogType\":\"layer\",\"msDatasetId\":\"ms_datasetId_1774244993624_23\",\"bounds\":[113.482306,34.635322,113.827295,34.91074],\"id\":\"layer_郑州POI_GBK_1774245011909_26\",\"popupInfo\":{\"elements\":[{\"fieldName\":\"smpid\",\"type\":\"FIELD\"},{\"fieldName\":\"EntityHandle\",\"type\":\"FIELD\"},{\"fieldName\":\"EntityType\",\"type\":\"FIELD\"},{\"fieldName\":\"Layer\",\"type\":\"FIELD\"},{\"fieldName\":\"LayerFroze\",\"type\":\"FIELD\"},{\"fieldName\":\"LayerLocked\",\"type\":\"FIELD\"},{\"fieldName\":\"LayerOn\",\"type\":\"FIELD\"},{\"fieldName\":\"Elevation\",\"type\":\"FIELD\"},{\"fieldName\":\"Thickness\",\"type\":\"FIELD\"},{\"fieldName\":\"ColorIndex\",\"type\":\"FIELD\"},{\"fieldName\":\"LineStyle\",\"type\":\"FIELD\"},{\"fieldName\":\"BlockName\",\"type\":\"FIELD\"},{\"fieldName\":\"BlockRotation\",\"type\":\"FIELD\"},{\"fieldName\":\"LineWidth\",\"type\":\"FIELD\"},{\"fieldName\":\"UserID\",\"type\":\"FIELD\"},{\"fieldName\":\"Name\",\"type\":\"FIELD\"},{\"fieldName\":\"Name_PY\",\"type\":\"FIELD\"},{\"fieldName\":\"Ctype\",\"type\":\"FIELD\"},{\"fieldName\":\"Ntype\",\"type\":\"FIELD\"},{\"fieldName\":\"Code\",\"type\":\"FIELD\"},{\"fieldName\":\"Address\",\"type\":\"FIELD\"},{\"fieldName\":\"Telephone\",\"type\":\"FIELD\"},{\"fieldName\":\"Picture\",\"type\":\"FIELD\"},{\"fieldName\":\"URL\",\"type\":\"FIELD\"},{\"fieldName\":\"Link\",\"type\":\"FIELD\"},{\"fieldName\":\"消防局名称\",\"type\":\"FIELD\"},{\"fieldName\":\"XZQ\",\"type\":\"FIELD\"},{\"fieldName\":\"X\",\"type\":\"FIELD\"},{\"fieldName\":\"Y\",\"type\":\"FIELD\"},{\"fieldName\":\"msgeometry\",\"type\":\"FIELD\"}],\"title\":\"郑州POI_GBK\"},\"title\":\"郑州POI_GBK\",\"layerSourceType\":\"Data\",\"zoomRange\":[0,24],\"layersContent\":[\"ms_郑州POI_GBK_1774245016129_27\",\"ms_郑州POI_GBK_1774245104313_105\"]}],\"datas\":[{\"sourceType\":\"STRUCTURE_DATA\",\"datasets\":[{\"datasetTitle\":\"郑州POI_GBK\",\"msDatasetId\":\"ms_datasetId_1774244993624_23\",\"datasetId\":\"6977061\",\"geometryField\":\"msgeometry\",\"projection\":\"EPSG:4326\"}],\"title\":\"郑州POI_GBK\"}],\"baseLayer\":{\"internetMapName\":\"OSM\",\"type\":\"INTERNET_MAP\"},\"version\":\"3.1.4\"}", + "projectInfo": "{\"images\":\"http://localhost:9876/base/resources/data/sprite\",\"catalogs\":[{\"filter\":[\"all\",[\"==\",\"Ctype\",\"\"],[\"!=\",\"smpid\",\"\"]],\"visualization\":{\"renderer\":[{\"rotate\":{\"type\":\"simple\",\"value\":0},\"textLetterSpacing\":{\"type\":\"simple\",\"value\":0},\"textTranslate\":{\"type\":\"simple\",\"value\":[0,0]},\"color\":{\"type\":\"simple\",\"value\":\"#EE4D5A\"},\"symbolPlacement\":{\"type\":\"simple\",\"value\":\"point\"},\"textAnchor\":{\"type\":\"simple\",\"value\":\"center\"},\"translate\":{\"type\":\"simple\",\"value\":[0,0]},\"textRotate\":{\"type\":\"simple\",\"value\":0},\"textField\":{\"type\":\"simple\",\"value\":\"\"},\"textHaloBlur\":{\"type\":\"simple\",\"value\":2},\"transform\":{\"type\":\"simple\",\"value\":\"none\"},\"symbolsContent\":{\"field\":[\"smpid\"],\"defaultValue\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"values\":[{\"value\":{\"symbolId\":\"shape2\",\"style\":{\"layout\":{\"icon-image\":\"shape2\"}}},\"key\":1},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":10},{\"value\":{\"symbolId\":\"shape6\",\"style\":{\"layout\":{\"icon-image\":\"shape6\"}}},\"key\":100},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":101},{\"value\":{\"symbolId\":\"shape9\",\"style\":{\"layout\":{\"icon-image\":\"shape9\"}}},\"key\":102},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":103},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":104},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":105},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":106},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":107},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":108},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":109},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":11},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":110},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":111},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":112},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":113},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":114},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":115},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":116},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":117},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":118},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":119},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":12},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":120},{\"value\":{\"symbolId\":\"point-83030560\",\"style\":{\"layout\":{\"icon-image\":\"point-83030560\"}}},\"key\":121},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":122},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":123},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":124},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":125},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":126},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":127},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":128},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":129},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":13},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":130},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":131},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":132},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":133},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":134},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":135},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":136},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":137},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":138},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":139},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":14},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":140},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":141},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":142},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":143},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":144},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":145},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":146},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":147},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":148},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":149},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":15},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":150},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":151},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":152},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":153},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":154},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":155},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":156},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":157},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":158},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":159},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":16},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":160},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":161},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":162},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":163},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":164},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":165},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":166},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":167},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":168},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":169},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":17},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":170},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":171},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":172},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":173},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":174},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":175},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":176},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":177},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":178},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":179},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":18},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":180},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":181},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":182},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":183},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":184},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":185},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":186},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":187},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":188},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":189},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":19},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":190},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":191},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":192},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":193},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":194},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":195},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":196},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":197},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":198},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":199},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":2},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":20},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":200},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":201},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":202},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":203},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":204},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":205},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":206},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":207},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":208},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":209},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":21},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":210},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":211},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":212},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":213},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":214},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":215},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":216},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":217},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":218},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":219},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":22},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":220},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":221},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":222},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":223},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":224},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":225},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":226},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":227},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":228},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":229},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":23},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":230},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":231},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":232},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":233},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":234},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":235},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":236},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":237},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":238},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":239},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":24},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":240},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":241},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":242},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":243},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":244},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":245},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":246},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":247},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":248},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":249},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":25},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":250},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":251},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":252},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":253},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":254},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":255},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":256},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":257},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":258},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":259},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":26},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":260},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":261},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":262},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":263},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":264},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":265},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":266},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":267},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":268},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":269},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":27},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":270},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":271},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":272},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":273},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":274},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":275},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":276},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":277},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":278},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":279},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":28},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":280},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":281},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":282},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":283},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":284},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":285},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":286},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":287},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":288},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":289},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":29},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":290},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":291},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":292},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":293},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":294},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":295},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":296},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":297},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":298},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":299},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":3},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":30},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":300},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":301},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":302},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":303},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":304},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":305},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":306},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":307},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":308},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":309},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":31},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":310},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":311},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":312},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":313},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":314},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":315},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":316},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":317},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":318},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":319},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":32},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":320},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":321},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":322},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":323},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":324},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":325},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":326},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":327},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":328},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":329},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":33},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":330},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":331},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":332},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":333},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":334},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":335},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":336},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":337},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":338},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":339},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":34},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":340},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":341},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":342},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":343},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":344},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":345},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":346},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":347},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":348},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":349},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":35},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":350},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":351},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":352},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":353},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":354},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":355},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":356},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":357},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":358},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":359},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":36},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":360},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":361},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":362},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":363},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":364},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":365},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":366},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":367},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":368},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":369},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":37},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":370},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":371},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":372},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":373},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":374},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":375},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":376},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":377},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":378},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":379},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":38},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":380},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":381},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":382},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":383},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":384},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":385},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":386},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":387},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":388},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":389},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":39},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":390},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":391},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":392},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":393},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":394},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":395},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":396},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":397},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":398},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":399},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":4},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":40},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":400},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":401},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":402},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":403},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":404},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":405},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":406},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":407},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":408},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":409},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":41},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":410},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":411},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":412},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":413},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":414},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":415},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":416},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":417},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":418},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":419},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":42},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":420},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":421},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":422},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":423},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":424},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":425},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":426},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":427},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":428},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":429},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":43},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":430},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":431},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":432},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":433},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":434},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":435},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":436},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":437},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":438},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":439},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":44},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":440},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":441},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":442},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":443},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":444},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":445},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":446},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":447},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":448},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":449},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":45},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":450},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":451},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":452},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":453},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":454},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":455},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":456},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":457},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":458},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":459},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":46},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":460},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":461},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":462},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":463},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":464},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":465},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":466},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":467},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":468},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":469},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":47},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":470},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":471},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":472},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":473},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":474},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":475},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":476},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":477},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":478},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":479},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":48},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":480},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":481},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":482},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":483},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":484},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":485},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":486},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":487},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":488},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":489},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":49},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":490},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":491},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":492},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":493},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":494},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":495},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":496},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":497},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":498},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":499},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":5},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":50},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":500},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":501},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":502},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":503},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":504},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":505},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":506},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":507},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":508},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":509},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":51},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":510},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":511},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":512},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":513},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":514},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":515},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":516},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":517},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":518},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":519},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":52},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":520},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":521},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":522},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":523},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":524},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":525},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":526},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":527},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":528},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":529},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":53},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":530},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":531},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":532},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":533},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":534},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":535},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":536},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":537},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":538},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":539},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":54},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":540},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":541},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":542},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":543},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":544},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":545},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":546},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":547},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":548},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":549},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":55},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":550},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":551},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":552},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":553},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":554},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":555},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":556},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":557},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":558},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":559},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":56},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":560},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":561},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":562},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":563},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":564},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":565},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":566},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":567},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":568},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":569},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":57},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":570},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":571},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":572},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":573},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":574},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":575},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":576},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":577},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":578},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":579},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":58},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":580},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":581},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":582},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":583},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":584},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":585},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":586},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":587},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":588},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":589},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":59},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":590},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":591},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":592},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":593},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":594},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":595},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":596},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":597},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":598},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":599},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":6},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":60},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":600},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":601},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":602},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":603},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":604},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":605},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":606},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":607},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":608},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":609},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":61},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":610},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":611},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":612},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":613},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":614},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":615},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":616},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":617},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":618},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":619},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":62},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":620},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":621},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":622},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":623},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":624},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":625},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":626},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":627},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":628},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":629},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":63},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":630},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":631},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":632},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":633},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":634},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":635},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":636},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":637},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":638},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":639},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":64},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":640},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":641},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":642},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":643},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":644},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":645},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":646},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":647},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":648},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":649},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":65},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":650},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":651},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":652},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":653},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":654},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":655},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":656},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":657},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":658},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":659},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":66},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":660},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":661},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":662},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":663},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":664},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":665},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":666},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":667},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":668},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":669},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":67},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":670},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":671},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":672},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":673},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":674},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":675},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":676},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":677},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":678},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":679},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":68},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":680},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":681},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":682},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":683},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":684},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":685},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":686},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":687},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":688},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":689},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":69},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":690},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":691},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":692},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":693},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":694},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":695},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":696},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":697},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":698},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":699},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":7},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":70},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":700},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":701},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":702},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":703},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":704},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":705},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":706},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":707},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":708},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":709},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":71},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":710},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":711},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":712},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":713},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":714},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":715},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":716},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":717},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":718},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":719},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":72},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":720},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":721},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":722},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":723},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":724},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":725},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":726},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":727},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":728},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":729},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":73},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":730},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":731},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":732},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":733},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":734},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":735},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":736},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":737},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":738},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":739},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":74},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":740},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":741},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":742},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":743},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":744},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":745},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":746},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":75},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":76},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":77},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":78},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":79},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":8},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":80},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":81},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":82},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":83},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":84},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":85},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":86},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":87},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":88},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":89},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":9},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":90},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":91},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":92},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":93},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":94},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":95},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":96},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":97},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":98},{\"value\":{\"symbolId\":\"circle\",\"style\":{\"layout\":{\"icon-image\":\"circle\"}}},\"key\":99}],\"interpolateInfo\":{\"type\":\"custom\"},\"type\":\"unique\"},\"textTranslateAnchor\":{\"type\":\"simple\",\"value\":\"map\"},\"justify\":{\"type\":\"simple\",\"value\":\"center\"},\"ignorePlacement\":{\"type\":\"simple\",\"value\":false},\"textAllowOverlap\":{\"type\":\"simple\",\"value\":true},\"maxWidth\":{\"type\":\"simple\",\"value\":10},\"textSize\":{\"type\":\"simple\",\"value\":16},\"textHaloColor\":{\"type\":\"simple\",\"value\":\"#242424\"},\"textColor\":{\"type\":\"simple\",\"value\":\"#FFFFFF\"},\"size\":{\"type\":\"simple\",\"value\":8},\"allowOverlap\":{\"type\":\"simple\",\"value\":true},\"translateAnchor\":{\"type\":\"simple\",\"value\":\"map\"},\"anchor\":{\"type\":\"simple\",\"value\":\"center\"},\"textOpacity\":{\"type\":\"simple\",\"value\":1},\"textHaloWidth\":{\"type\":\"simple\",\"value\":1},\"lineHeight\":{\"type\":\"simple\",\"value\":1.2},\"textFont\":{\"type\":\"simple\",\"value\":[\"Open Sans Regular\",\"Arial Unicode MS Regular\"]},\"textIgnorePlacement\":{\"type\":\"simple\",\"value\":false},\"opacity\":{\"type\":\"simple\",\"value\":0.9}}]},\"visible\":true,\"catalogType\":\"layer\",\"msDatasetId\":\"ms_datasetId_1774244993624_23\",\"bounds\":[113.482306,34.635322,113.827295,34.91074],\"id\":\"layer_郑州POI_GBK_1774245011909_26\",\"popupInfo\":{\"elements\":[{\"fieldName\":\"smpid\",\"type\":\"FIELD\"},{\"fieldName\":\"EntityHandle\",\"type\":\"FIELD\"},{\"fieldName\":\"EntityType\",\"type\":\"FIELD\"},{\"fieldName\":\"Layer\",\"type\":\"FIELD\"},{\"fieldName\":\"LayerFroze\",\"type\":\"FIELD\"},{\"fieldName\":\"LayerLocked\",\"type\":\"FIELD\"},{\"fieldName\":\"LayerOn\",\"type\":\"FIELD\"},{\"fieldName\":\"Elevation\",\"type\":\"FIELD\"},{\"fieldName\":\"Thickness\",\"type\":\"FIELD\"},{\"fieldName\":\"ColorIndex\",\"type\":\"FIELD\"},{\"fieldName\":\"LineStyle\",\"type\":\"FIELD\"},{\"fieldName\":\"BlockName\",\"type\":\"FIELD\"},{\"fieldName\":\"BlockRotation\",\"type\":\"FIELD\"},{\"fieldName\":\"LineWidth\",\"type\":\"FIELD\"},{\"fieldName\":\"UserID\",\"type\":\"FIELD\"},{\"fieldName\":\"Name\",\"type\":\"FIELD\"},{\"fieldName\":\"Name_PY\",\"type\":\"FIELD\"},{\"fieldName\":\"Ctype\",\"type\":\"FIELD\"},{\"fieldName\":\"Ntype\",\"type\":\"FIELD\"},{\"fieldName\":\"Code\",\"type\":\"FIELD\"},{\"fieldName\":\"Address\",\"type\":\"FIELD\"},{\"fieldName\":\"Telephone\",\"type\":\"FIELD\"},{\"fieldName\":\"Picture\",\"type\":\"FIELD\"},{\"fieldName\":\"URL\",\"type\":\"FIELD\"},{\"fieldName\":\"Link\",\"type\":\"FIELD\"},{\"fieldName\":\"消防局名称\",\"type\":\"FIELD\"},{\"fieldName\":\"XZQ\",\"type\":\"FIELD\"},{\"fieldName\":\"X\",\"type\":\"FIELD\"},{\"fieldName\":\"Y\",\"type\":\"FIELD\"},{\"fieldName\":\"msgeometry\",\"type\":\"FIELD\"}],\"title\":\"郑州POI_GBK\"},\"title\":\"郑州POI_GBK\",\"layerSourceType\":\"Data\",\"zoomRange\":[0,24],\"layersContent\":[\"ms_郑州POI_GBK_1774245016129_27\",\"ms_郑州POI_GBK_1774245104313_105\"]}],\"datas\":[{\"sourceType\":\"STRUCTURE_DATA\",\"datasets\":[{\"datasetTitle\":\"郑州POI_GBK\",\"msDatasetId\":\"ms_datasetId_1774244993624_23\",\"datasetId\":\"6977061\",\"geometryField\":\"msgeometry\",\"projection\":\"EPSG:4326\"}],\"title\":\"郑州POI_GBK\"}],\"baseLayer\":{\"internetMapName\":\"OSM\",\"type\":\"INTERNET_MAP\"},\"version\":\"3.1.4\"}", "visitCount": 73, "centerString": "{\"x\":113.5945719887909,\"y\":34.77314590347322,\"m\":null}", "epsgCode": 3857, From 152df24f49d14ac6ec73cadfeb5f049e7caba634 Mon Sep 17 00:00:00 2001 From: zhaoq Date: Thu, 13 Aug 2026 14:45:27 +0800 Subject: [PATCH 42/46] AI-GEN: 100% ARK-CODE-LATEST fix: ut (reviewed by sym) --- test/mapboxgl/mapping/WebMapV3Spec.js | 2 +- test/maplibregl/mapping/WebMapV3Spec.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/mapboxgl/mapping/WebMapV3Spec.js b/test/mapboxgl/mapping/WebMapV3Spec.js index fac34600e8..36a0429db0 100644 --- a/test/mapboxgl/mapping/WebMapV3Spec.js +++ b/test/mapboxgl/mapping/WebMapV3Spec.js @@ -19,10 +19,10 @@ describe('mapboxgl-webmap3.0', () => { var server = 'http://localhost:8190/iportal/'; var id = 617580084; var mapstudioWebmap; - const l7LayerUtil = L7LayerUtil({ featureFilter, expression, spec, L7Layer, L7 }); const mockWebMapService = { handleUrlWithCredentials: jasmine.createSpy('handleUrlWithCredentials').and.returnValue(true) }; + const l7LayerUtil = L7LayerUtil({ featureFilter, expression, spec, L7Layer, L7, webMapService: mockWebMapService }); const extendOptions = { MapManager: MapManagerUtil.default, mapRepo: mapboxgl, diff --git a/test/maplibregl/mapping/WebMapV3Spec.js b/test/maplibregl/mapping/WebMapV3Spec.js index 27b6f580c0..73cc37d2d0 100644 --- a/test/maplibregl/mapping/WebMapV3Spec.js +++ b/test/maplibregl/mapping/WebMapV3Spec.js @@ -19,10 +19,10 @@ describe('maplibregl-webmap3.0', () => { var server = 'http://localhost:8190/iportal/'; var id = 617580084; var mapstudioWebmap; - const l7LayerUtil = L7LayerUtil({ featureFilter, expression, spec, L7Layer, L7 }); const mockWebMapService = { handleUrlWithCredentials: jasmine.createSpy('handleUrlWithCredentials').and.returnValue(true) }; + const l7LayerUtil = L7LayerUtil({ featureFilter, expression, spec, L7Layer, L7, webMapService: mockWebMapService }); const extendOptions = { MapManager: MapManagerUtil.default, mapRepo: maplibregl, From e5e11589923c57074116675525c8ae92c33e7559 Mon Sep 17 00:00:00 2001 From: songyumeng Date: Thu, 13 Aug 2026 16:10:47 +0800 Subject: [PATCH 43/46] Update package.json MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 固定@mapbox/mapbox-gl-style-spec版本 避免??的问题 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b5c79481e6..7beb065f46 100644 --- a/package.json +++ b/package.json @@ -143,7 +143,7 @@ "dependencies": { "@antv/g2": "^4.2.11", "@antv/g6": "^4.8.14", - "@mapbox/mapbox-gl-style-spec": "^14.3.0", + "@mapbox/mapbox-gl-style-spec": "14.27.0", "@mapbox/vector-tile": "1.3.1", "@maplibre/maplibre-gl-style-spec": "^23.3.0", "@supermapgis/iclient-common": "file:src/common", From 2bebcdbd5cd91089a0c09b4af8a6c9df2641f7b8 Mon Sep 17 00:00:00 2001 From: songyumeng Date: Thu, 13 Aug 2026 16:11:40 +0800 Subject: [PATCH 44/46] Update package.json --- src/mapboxgl/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mapboxgl/package.json b/src/mapboxgl/package.json index b591d47e4e..4c2d86366d 100644 --- a/src/mapboxgl/package.json +++ b/src/mapboxgl/package.json @@ -15,7 +15,7 @@ "author": "SuperMap", "license": "Apache-2.0", "dependencies": { - "@mapbox/mapbox-gl-style-spec": "^14.3.0", + "@mapbox/mapbox-gl-style-spec": "14.27.0", "@turf/turf": "7.2.0", "@turf/meta": "^7.2.0", "mapv": "2.0.62", From 87c174d75a0f1b12d68b2fe68a0b4651ac8154fa Mon Sep 17 00:00:00 2001 From: songyumeng Date: Thu, 13 Aug 2026 17:30:52 +0800 Subject: [PATCH 45/46] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7beb065f46..5ea3eb682e 100644 --- a/package.json +++ b/package.json @@ -143,7 +143,7 @@ "dependencies": { "@antv/g2": "^4.2.11", "@antv/g6": "^4.8.14", - "@mapbox/mapbox-gl-style-spec": "14.27.0", + "@mapbox/mapbox-gl-style-spec": "14.23.0", "@mapbox/vector-tile": "1.3.1", "@maplibre/maplibre-gl-style-spec": "^23.3.0", "@supermapgis/iclient-common": "file:src/common", From 04a256cb42df74f56a2667b93fd840b589b4ebbe Mon Sep 17 00:00:00 2001 From: songyumeng Date: Fri, 14 Aug 2026 11:14:12 +0800 Subject: [PATCH 46/46] Update package.json --- src/mapboxgl/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mapboxgl/package.json b/src/mapboxgl/package.json index 4c2d86366d..fb1bdf0cc0 100644 --- a/src/mapboxgl/package.json +++ b/src/mapboxgl/package.json @@ -15,7 +15,7 @@ "author": "SuperMap", "license": "Apache-2.0", "dependencies": { - "@mapbox/mapbox-gl-style-spec": "14.27.0", + "@mapbox/mapbox-gl-style-spec": "14.23.0", "@turf/turf": "7.2.0", "@turf/meta": "^7.2.0", "mapv": "2.0.62",