@supermapgis/vue-iclient-leaflet 11.2.1 → 11.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/iclient-leaflet-vue.css +23 -9
- package/dist/iclient-leaflet-vue.js +21689 -44354
- package/dist/iclient-leaflet-vue.min.css +2 -2
- package/dist/iclient-leaflet-vue.min.js +39 -293
- package/lib/_assets/iconfont/icon-sm-components.css +21 -7
- package/lib/_assets/iconfont/icon-sm-components.ttf +0 -0
- package/lib/_assets/iconfont/icon-sm-components.woff +0 -0
- package/lib/_assets/iconfont/icon-sm-components.woff2 +0 -0
- package/lib/_lang/en.js +20 -8
- package/lib/_lang/index.js +18 -18
- package/lib/_lang/zh.js +20 -8
- package/lib/_mixin/AntdRender.js +15 -17
- package/lib/_mixin/Card.js +10 -11
- package/lib/_mixin/GridLayer.js +4 -4
- package/lib/_mixin/Layer.js +4 -4
- package/lib/_mixin/Options.js +2 -2
- package/lib/_mixin/Popper.js +2 -2
- package/lib/_mixin/Theme.js +13 -15
- package/lib/_mixin/ThirdService.js +15 -16
- package/lib/_mixin/TileLayer.js +4 -4
- package/lib/_mixin/Timer.js +8 -9
- package/lib/_mixin/VmUpdater.js +10 -11
- package/lib/_mixin/map-events.js +8 -9
- package/lib/_mixin/map-getter.js +13 -14
- package/lib/_types/AddressMatchParameter.js +2 -2
- package/lib/_types/GeoJSONParamter.js +2 -2
- package/lib/_types/RestDataParameter.js +5 -6
- package/lib/_types/RestMapParameter.js +5 -6
- package/lib/_types/RestParameter.js +2 -2
- package/lib/_types/event/BaseTypes.js +2 -2
- package/lib/_types/event/Event.js +4 -4
- package/lib/_types/event/Events.js +10 -10
- package/lib/_types/event/Pixel.js +2 -2
- package/lib/_types/event/Util.js +2 -2
- package/lib/_types/iPortalDataParameter.js +3 -2
- package/lib/_types/iServerBaseParameter.js +3 -2
- package/lib/_types/iServerDataParameter.js +5 -6
- package/lib/_types/iServerMapParameter.js +5 -6
- package/lib/_types/index.js +18 -18
- package/lib/_types/map-event.js +6 -6
- package/lib/_utils/EchartsDataService.js +24 -24
- package/lib/_utils/RestService.js +1345 -1149
- package/lib/_utils/epsg-define.js +45 -34
- package/lib/_utils/get-features.js +23 -10
- package/lib/_utils/global-event.js +6 -6
- package/lib/_utils/iPortalDataService.js +1368 -1147
- package/lib/_utils/iServerRestService.js +1518 -1269
- package/lib/_utils/props-binder.js +2 -2
- package/lib/_utils/statistics.js +8 -17
- package/lib/_utils/style/color/colorPalette.js +4 -4
- package/lib/_utils/style/color/serialColors.js +8 -8
- package/lib/_utils/style/theme/chart.js +1343 -1146
- package/lib/_utils/style/theme/set-theme.js +10 -10
- package/lib/_utils/style/theme/theme.json +6 -6
- package/lib/_utils/util.js +12 -12
- package/lib/_utils/vue-types/utils.js +2 -2
- package/lib/attribute-panel/style/attribute-panel.css +1 -0
- package/lib/attribute-panel/style/css.js +7 -0
- package/lib/attribute-panel/style/index.js +7 -0
- package/lib/avatar/index.js +25 -25
- package/lib/border/index.js +77 -77
- package/lib/breadcrumb/index.js +47 -41
- package/lib/button/index.js +53 -50
- package/lib/card/index.js +47 -41
- package/lib/chart/index.js +1437 -1238
- package/lib/checkbox/index.js +36 -33
- package/lib/collapse/index.js +39 -36
- package/lib/collapse-card/index.js +71 -76
- package/lib/color-picker/index.js +48 -49
- package/lib/date-picker/index.js +107 -95
- package/lib/dropdown/index.js +27 -27
- package/lib/empty/index.js +27 -27
- package/lib/icon/index.js +25 -25
- package/lib/identify/index.js +58 -59
- package/lib/iframe/index.js +31 -31
- package/lib/image/index.js +226 -42
- package/lib/image/style/image.css +1 -1
- package/lib/index.js +4 -4
- package/lib/indicator/index.js +70 -67
- package/lib/init.js +8 -8
- package/lib/input/index.js +150 -135
- package/lib/input-number/index.js +100 -97
- package/lib/layout/index.js +72 -60
- package/lib/liquid-fill/index.js +73 -73
- package/lib/marker/index.js +43 -44
- package/lib/menu/index.js +47 -41
- package/lib/message/index.js +3 -3
- package/lib/message/style/message.css +1 -1
- package/lib/modal/index.js +67 -67
- package/lib/modal/style/modal.css +1 -1
- package/lib/notification/index.js +6 -6
- package/lib/notification/style/notification.css +1 -1
- package/lib/pagination/index.js +34 -34
- package/lib/popup/index.js +45 -46
- package/lib/progress/index.js +440 -440
- package/lib/radio/index.js +48 -42
- package/lib/select/index.js +47 -41
- package/lib/slider/index.js +27 -27
- package/lib/slideshow/index.js +103 -160
- package/lib/spin/index.js +30 -30
- package/lib/steps/index.js +35 -32
- package/lib/switch/index.js +25 -25
- package/lib/table/index.js +50 -44
- package/lib/table/style/table.css +1 -1
- package/lib/table-popup/index.js +43 -37
- package/lib/table-popup/style/table-popup.css +1 -1
- package/lib/tabs/index.js +35 -32
- package/lib/text/index.js +39 -39
- package/lib/tile-layer/index.js +35 -36
- package/lib/time-line/index.js +41 -43
- package/lib/time-picker/index.js +27 -27
- package/lib/time-range/index.js +53 -55
- package/lib/time-slider/index.js +73 -75
- package/lib/time-text/index.js +31 -31
- package/lib/tooltip/index.js +25 -25
- package/lib/tooltip/style/tooltip.css +1 -0
- package/lib/transfer/index.js +27 -27
- package/lib/tree/index.js +48 -42
- package/lib/tree-select/index.js +37 -34
- package/lib/video-player/index.js +98 -97
- package/lib/video-player/style/video-player.css +1 -1
- package/lib/web-map/index.js +2336 -103
- package/package.json +2 -4
- package/src/common/_assets/iconfont/icon-sm-components.css +21 -7
- package/src/common/_assets/iconfont/icon-sm-components.ttf +0 -0
- package/src/common/_assets/iconfont/icon-sm-components.woff +0 -0
- package/src/common/_assets/iconfont/icon-sm-components.woff2 +0 -0
- package/src/common/_lang/en.js +19 -8
- package/src/common/_lang/zh.js +18 -6
- package/src/common/_mixin/Card.ts +1 -1
- package/src/common/_types/iPortalDataParameter.js +1 -0
- package/src/common/_types/iServerBaseParameter.ts +3 -0
- package/src/common/_utils/epsg-define.js +32 -27
- package/src/common/_utils/get-features.js +13 -2
- package/src/common/_utils/iPortalDataService.js +14 -3
- package/src/common/_utils/iServerRestService.js +144 -78
- package/src/common/_utils/statistics.js +6 -14
- package/src/common/_utils/style/theme/theme.json +6 -6
- package/src/common/attribute-panel/AttributePanel.vue +58 -0
- package/src/common/attribute-panel/__test__/AttributePanel.spec.js +39 -0
- package/src/common/attribute-panel/index.js +9 -0
- package/src/common/attribute-panel/style/attribute-panel.scss +35 -0
- package/src/common/attribute-panel/style/index.js +4 -0
- package/src/common/collapse-card/style/collapse-card.scss +2 -2
- package/src/common/iframe/Iframe.vue +1 -1
- package/src/common/image/Image.vue +68 -6
- package/src/common/image/style/image.scss +32 -0
- package/src/common/message/style/message.scss +1 -0
- package/src/common/modal/style/modal.scss +36 -0
- package/src/common/notification/style/notification.scss +9 -0
- package/src/common/slideshow/Slideshow.vue +42 -95
- package/src/common/slideshow/Swiper.js +1 -1
- package/src/common/table/style/table.scss +36 -0
- package/src/common/table-popup/TablePopup.vue +5 -0
- package/src/common/tooltip/style/tooltip.scss +3 -0
- package/src/common/video-player/style/video-player.scss +1 -1
- package/src/leaflet/entrys.json +0 -2
- package/src/leaflet/package.json +2 -4
- package/src/leaflet/web-map/WebMap.vue +4 -4
- package/src/leaflet/web-map/WebMapViewModel.ts +64 -17
- package/static/libs/iclient-common/iclient-common-webmapv2base.js +2 -0
- package/static/libs/iclient-common/iclient-common.js +1 -1
- package/static/libs/iclient-leaflet/iclient-leaflet.min.js +5 -1738
- package/lib/_assets/iconfont/icon-sm-components.eot +0 -0
- package/lib/_assets/iconfont/icon-sm-components.svg +0 -197
- package/lib/_mixin/WebMapBase.js +0 -3467
- package/lib/_utils/WebMapService.js +0 -1607
- package/src/common/_assets/iconfont/icon-sm-components.eot +0 -0
- package/src/common/_assets/iconfont/icon-sm-components.svg +0 -197
- package/src/common/_utils/WebMapService.ts +0 -1292
- package/src/common/web-map/WebMapBase.ts +0 -1178
- package/src/common/web-map/config/MunicipalCenter.json +0 -1
- package/src/common/web-map/config/ProvinceCenter.json +0 -1
|
@@ -1,1178 +0,0 @@
|
|
|
1
|
-
import { Events } from 'vue-iclient/src/common/_types/event/Events';
|
|
2
|
-
import municipalCenterData from './config/MunicipalCenter.json';
|
|
3
|
-
import provincialCenterData from './config/ProvinceCenter.json';
|
|
4
|
-
import 'vue-iclient/static/libs/geostats/geostats';
|
|
5
|
-
import 'vue-iclient/static/libs/json-sql/jsonsql';
|
|
6
|
-
import isNumber from 'lodash.isnumber';
|
|
7
|
-
import Canvg from 'canvg';
|
|
8
|
-
import WebMapService from '../_utils/WebMapService';
|
|
9
|
-
import { getColorWithOpacity } from '../_utils/util';
|
|
10
|
-
import { getProjection, registerProjection } from '../../common/_utils/epsg-define';
|
|
11
|
-
import { coordEach } from '@turf/meta';
|
|
12
|
-
import difference from 'lodash.difference';
|
|
13
|
-
|
|
14
|
-
// 迁徙图最大支持要素数量
|
|
15
|
-
const MAX_MIGRATION_ANIMATION_COUNT = 1000;
|
|
16
|
-
export default abstract class WebMapBase extends Events {
|
|
17
|
-
map: any;
|
|
18
|
-
|
|
19
|
-
mapId: string | number | Object;
|
|
20
|
-
|
|
21
|
-
webMapInfo: any;
|
|
22
|
-
|
|
23
|
-
mapOptions: any;
|
|
24
|
-
|
|
25
|
-
serverUrl: string;
|
|
26
|
-
|
|
27
|
-
accessToken: string;
|
|
28
|
-
|
|
29
|
-
accessKey: string;
|
|
30
|
-
|
|
31
|
-
tiandituKey: string;
|
|
32
|
-
|
|
33
|
-
bingMapsKey: string;
|
|
34
|
-
|
|
35
|
-
googleMapsAPIKey: string;
|
|
36
|
-
|
|
37
|
-
googleMapsLanguage: string;
|
|
38
|
-
|
|
39
|
-
withCredentials: boolean;
|
|
40
|
-
|
|
41
|
-
proxy: string | boolean;
|
|
42
|
-
|
|
43
|
-
target: string;
|
|
44
|
-
|
|
45
|
-
excludePortalProxyUrl: boolean;
|
|
46
|
-
|
|
47
|
-
isSuperMapOnline: boolean;
|
|
48
|
-
|
|
49
|
-
zoom: number;
|
|
50
|
-
|
|
51
|
-
mapParams: { title?: string; description?: string };
|
|
52
|
-
|
|
53
|
-
baseProjection: string;
|
|
54
|
-
|
|
55
|
-
ignoreBaseProjection: boolean;
|
|
56
|
-
|
|
57
|
-
on: any;
|
|
58
|
-
|
|
59
|
-
echartslayer: any = [];
|
|
60
|
-
|
|
61
|
-
eventTypes: any;
|
|
62
|
-
|
|
63
|
-
triggerEvent: any;
|
|
64
|
-
|
|
65
|
-
protected webMapService: WebMapService;
|
|
66
|
-
|
|
67
|
-
protected _layers: any = [];
|
|
68
|
-
|
|
69
|
-
protected _svgDiv: HTMLElement;
|
|
70
|
-
|
|
71
|
-
protected _taskID: Date;
|
|
72
|
-
|
|
73
|
-
protected layerAdded: number;
|
|
74
|
-
|
|
75
|
-
protected expectLayerLen: number;
|
|
76
|
-
|
|
77
|
-
protected canvgsV: any = [];
|
|
78
|
-
|
|
79
|
-
constructor(id, options?, mapOptions?) {
|
|
80
|
-
super();
|
|
81
|
-
this.serverUrl = options.serverUrl || 'https://www.supermapol.com';
|
|
82
|
-
this.accessToken = options.accessToken;
|
|
83
|
-
this.accessKey = options.accessKey;
|
|
84
|
-
this.tiandituKey = options.tiandituKey || '';
|
|
85
|
-
this.googleMapsAPIKey = options.googleMapsAPIKey || '';
|
|
86
|
-
this.bingMapsKey = options.bingMapsKey || '';
|
|
87
|
-
this.googleMapsLanguage = options.googleMapsLanguage || 'zh-CN';
|
|
88
|
-
this.withCredentials = options.withCredentials || false;
|
|
89
|
-
this.proxy = options.proxy;
|
|
90
|
-
this.target = options.target || 'map';
|
|
91
|
-
this.excludePortalProxyUrl = options.excludePortalProxyUrl;
|
|
92
|
-
this.isSuperMapOnline = options.isSuperMapOnline;
|
|
93
|
-
this.ignoreBaseProjection = options.ignoreBaseProjection;
|
|
94
|
-
this.echartslayer = [];
|
|
95
|
-
this.webMapService = new WebMapService(id, options);
|
|
96
|
-
this.mapOptions = mapOptions;
|
|
97
|
-
this.eventTypes = [
|
|
98
|
-
'getmapinfofailed',
|
|
99
|
-
'crsnotsupport',
|
|
100
|
-
'getlayerdatasourcefailed',
|
|
101
|
-
'addlayerssucceeded',
|
|
102
|
-
'notsupportmvt',
|
|
103
|
-
'notsupportbaidumap',
|
|
104
|
-
'projectionIsNotMatch',
|
|
105
|
-
'beforeremovemap',
|
|
106
|
-
'mapinitialized'
|
|
107
|
-
];
|
|
108
|
-
this.mapId = id;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
abstract _initWebMap(): void;
|
|
112
|
-
abstract _getMapInfo(data, _taskID?);
|
|
113
|
-
abstract _createMap();
|
|
114
|
-
// TODO 重构子类 webmap layer 添加逻辑,只重写具体添加某个layer的方法,基类实现 initxxxx
|
|
115
|
-
abstract _initBaseLayer(mapInfo);
|
|
116
|
-
abstract _initOverlayLayer(layer, features?);
|
|
117
|
-
|
|
118
|
-
abstract _addLayerSucceeded();
|
|
119
|
-
abstract _unproject(point: [number, number]): [number, number];
|
|
120
|
-
abstract clean();
|
|
121
|
-
|
|
122
|
-
public echartsLayerResize(): void {
|
|
123
|
-
this.echartslayer.forEach(echartslayer => {
|
|
124
|
-
echartslayer.chart.resize();
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
public setMapId(mapId: string | number): void {
|
|
129
|
-
if (typeof mapId === 'string' || typeof mapId === 'number') {
|
|
130
|
-
this.mapId = mapId;
|
|
131
|
-
this.webMapInfo = null;
|
|
132
|
-
} else if (mapId !== null && typeof mapId === 'object') {
|
|
133
|
-
this.webMapInfo = mapId;
|
|
134
|
-
}
|
|
135
|
-
this.webMapService.setMapId(mapId);
|
|
136
|
-
if (!mapId) {
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
setTimeout(() => {
|
|
140
|
-
this._initWebMap();
|
|
141
|
-
}, 0);
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
public setServerUrl(serverUrl: string): void {
|
|
145
|
-
this.serverUrl = serverUrl;
|
|
146
|
-
this.webMapService.setServerUrl(serverUrl);
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
public setWithCredentials(withCredentials) {
|
|
150
|
-
this.withCredentials = withCredentials;
|
|
151
|
-
this.webMapService.setWithCredentials(withCredentials);
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
public setProxy(proxy) {
|
|
155
|
-
this.proxy = proxy;
|
|
156
|
-
this.webMapService.setProxy(proxy);
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
public setZoom(zoom) {
|
|
160
|
-
if (this.map) {
|
|
161
|
-
this.mapOptions.zoom = zoom;
|
|
162
|
-
if (zoom !== +this.map.getZoom().toFixed(2)) {
|
|
163
|
-
(zoom || zoom === 0) && this.map.setZoom(zoom, { from: 'setZoom' });
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
public setMaxBounds(maxBounds): void {
|
|
169
|
-
if (this.map) {
|
|
170
|
-
this.mapOptions.maxBounds = maxBounds;
|
|
171
|
-
maxBounds && this.map.setMaxBounds(maxBounds);
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
public setMinZoom(minZoom): void {
|
|
176
|
-
if (this.map) {
|
|
177
|
-
this.mapOptions.minZoom = minZoom;
|
|
178
|
-
(minZoom || minZoom === 0) && this.map.setMinZoom(minZoom);
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
public setMaxZoom(maxZoom): void {
|
|
183
|
-
if (this.map) {
|
|
184
|
-
this.mapOptions.maxZoom = maxZoom;
|
|
185
|
-
(maxZoom || maxZoom === 0) && this.map.setMaxZoom(maxZoom);
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
protected initWebMap() {
|
|
190
|
-
this.clean();
|
|
191
|
-
this.serverUrl = this.serverUrl && this.webMapService.handleServerUrl(this.serverUrl);
|
|
192
|
-
if (this.webMapInfo) {
|
|
193
|
-
// 传入是webmap对象
|
|
194
|
-
const mapInfo = this.webMapInfo;
|
|
195
|
-
mapInfo.mapParams = {
|
|
196
|
-
title: this.webMapInfo.title,
|
|
197
|
-
description: this.webMapInfo.description
|
|
198
|
-
};
|
|
199
|
-
this.mapParams = mapInfo.mapParams;
|
|
200
|
-
this._getMapInfo(mapInfo);
|
|
201
|
-
return;
|
|
202
|
-
} else if (!this.mapId || !this.serverUrl) {
|
|
203
|
-
this._createMap();
|
|
204
|
-
return;
|
|
205
|
-
}
|
|
206
|
-
this._taskID = new Date();
|
|
207
|
-
this.getMapInfo(this._taskID);
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
protected getMapInfo(_taskID) {
|
|
211
|
-
this.serverUrl = this.serverUrl && this.webMapService.handleServerUrl(this.serverUrl);
|
|
212
|
-
this.webMapService
|
|
213
|
-
.getMapInfo()
|
|
214
|
-
.then(
|
|
215
|
-
(mapInfo: any) => {
|
|
216
|
-
if (this._taskID !== _taskID) {
|
|
217
|
-
return;
|
|
218
|
-
}
|
|
219
|
-
// 存储地图的名称以及描述等信息,返回给用户
|
|
220
|
-
this.mapParams = mapInfo.mapParams;
|
|
221
|
-
this._getMapInfo(mapInfo, _taskID);
|
|
222
|
-
},
|
|
223
|
-
error => {
|
|
224
|
-
throw error;
|
|
225
|
-
}
|
|
226
|
-
)
|
|
227
|
-
.catch(error => {
|
|
228
|
-
this.triggerEvent('getmapinfofailed', { error });
|
|
229
|
-
console.log(error);
|
|
230
|
-
});
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
protected getBaseLayerType(layerInfo) {
|
|
234
|
-
let layerType = layerInfo.layerType; // 底图和rest地图兼容
|
|
235
|
-
|
|
236
|
-
if (
|
|
237
|
-
layerType.indexOf('TIANDITU_VEC') > -1 ||
|
|
238
|
-
layerType.indexOf('TIANDITU_IMG') > -1 ||
|
|
239
|
-
layerType.indexOf('TIANDITU_TER') > -1
|
|
240
|
-
) {
|
|
241
|
-
layerType = 'TIANDITU';
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
switch (layerType) {
|
|
245
|
-
case 'TILE':
|
|
246
|
-
case 'SUPERMAP_REST':
|
|
247
|
-
return 'TILE';
|
|
248
|
-
case 'CLOUD':
|
|
249
|
-
case 'CLOUD_BLACK':
|
|
250
|
-
return 'CLOUD';
|
|
251
|
-
case 'OSM':
|
|
252
|
-
case 'JAPAN_ORT':
|
|
253
|
-
case 'JAPAN_RELIEF':
|
|
254
|
-
case 'JAPAN_PALE':
|
|
255
|
-
case 'JAPAN_STD':
|
|
256
|
-
case 'GOOGLE_CN':
|
|
257
|
-
case 'GOOGLE':
|
|
258
|
-
return 'XYZ';
|
|
259
|
-
default:
|
|
260
|
-
return layerType;
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
protected getMapurls(mapurl: { CLOUD?: string; CLOUD_BLACK?: string; OSM?: string } = {}) {
|
|
265
|
-
const mapUrls = {
|
|
266
|
-
CLOUD: mapurl.CLOUD || 'http://t2.dituhui.com/FileService/image?map=quanguo&type=web&x={x}&y={y}&z={z}',
|
|
267
|
-
CLOUD_BLACK: mapurl.CLOUD_BLACK || 'http://t3.dituhui.com/MapService/getGdp?x={x}&y={y}&z={z}',
|
|
268
|
-
OSM: mapurl.OSM || 'https://{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png',
|
|
269
|
-
GOOGLE:
|
|
270
|
-
'https://maps.googleapis.com/maps/vt?pb=!1m5!1m4!1i{z}!2i{x}!3i{y}!4i256!2m3!1e0!2sm!3i540264686!3m12!2s{googleMapsLanguage}!3sUS!5e18!12m4!1e68!2m2!1sset!2sRoadmap!12m3!1e37!2m1!1ssmartmaps!4e0&key={googleMapsAPIKey}',
|
|
271
|
-
GOOGLE_CN: 'https://mt{0-3}.google.com/vt/lyrs=m&hl=zh-CN&gl=cn&x={x}&y={y}&z={z}',
|
|
272
|
-
JAPAN_STD: 'https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png',
|
|
273
|
-
JAPAN_PALE: 'https://cyberjapandata.gsi.go.jp/xyz/pale/{z}/{x}/{y}.png',
|
|
274
|
-
JAPAN_RELIEF: 'https://cyberjapandata.gsi.go.jp/xyz/relief/{z}/{x}/{y}.png',
|
|
275
|
-
JAPAN_ORT: 'https://cyberjapandata.gsi.go.jp/xyz/ort/{z}/{x}/{y}.jpg'
|
|
276
|
-
};
|
|
277
|
-
|
|
278
|
-
return mapUrls;
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
protected getLayerFeatures(layer, _taskID, type) {
|
|
282
|
-
const getLayerFunc = this.webMapService.getLayerFeatures(type, layer, this.baseProjection);
|
|
283
|
-
getLayerFunc &&
|
|
284
|
-
getLayerFunc
|
|
285
|
-
.then(
|
|
286
|
-
async result => {
|
|
287
|
-
if (this.mapId && this._taskID !== _taskID) {
|
|
288
|
-
return;
|
|
289
|
-
}
|
|
290
|
-
if (result && layer.projection) {
|
|
291
|
-
if (!getProjection(layer.projection)) {
|
|
292
|
-
const epsgWKT = await this.webMapService.getEpsgCodeInfo(
|
|
293
|
-
layer.projection.split(':')[1],
|
|
294
|
-
this.serverUrl
|
|
295
|
-
);
|
|
296
|
-
if (epsgWKT) {
|
|
297
|
-
registerProjection(layer.projection, epsgWKT);
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
this._getLayerFeaturesSucceeded(result, layer);
|
|
303
|
-
},
|
|
304
|
-
error => {
|
|
305
|
-
throw new Error(error);
|
|
306
|
-
}
|
|
307
|
-
)
|
|
308
|
-
.catch(error => {
|
|
309
|
-
this._addLayerSucceeded();
|
|
310
|
-
this.triggerEvent('getlayerdatasourcefailed', { error, layer, map: this.map });
|
|
311
|
-
console.log(error);
|
|
312
|
-
});
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
protected setFeatureInfo(feature: any): any {
|
|
316
|
-
let featureInfo;
|
|
317
|
-
const info = feature.dv_v5_markerInfo;
|
|
318
|
-
if (info && info.dataViz_title) {
|
|
319
|
-
// 有featureInfo信息就不需要再添加
|
|
320
|
-
featureInfo = info;
|
|
321
|
-
} else {
|
|
322
|
-
// featureInfo = this.getDefaultAttribute();
|
|
323
|
-
return info;
|
|
324
|
-
}
|
|
325
|
-
const properties = feature.properties;
|
|
326
|
-
for (const key in featureInfo) {
|
|
327
|
-
if (properties[key]) {
|
|
328
|
-
featureInfo[key] = properties[key];
|
|
329
|
-
delete properties[key];
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
return featureInfo;
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
protected getRankStyleGroup(themeField, features, parameters) {
|
|
336
|
-
// 找出所有的单值
|
|
337
|
-
const values = [];
|
|
338
|
-
let segements = [];
|
|
339
|
-
const style = parameters.style;
|
|
340
|
-
const themeSetting = parameters.themeSetting;
|
|
341
|
-
const segmentMethod = themeSetting.segmentMethod;
|
|
342
|
-
const segmentCount = themeSetting.segmentCount;
|
|
343
|
-
const customSettings = themeSetting.customSettings;
|
|
344
|
-
const minR = parameters.themeSetting.minRadius;
|
|
345
|
-
const maxR = parameters.themeSetting.maxRadius;
|
|
346
|
-
const colors = themeSetting.colors;
|
|
347
|
-
const fillColor = style.fillColor;
|
|
348
|
-
features.forEach(feature => {
|
|
349
|
-
const properties = feature.properties;
|
|
350
|
-
const value = properties[themeField];
|
|
351
|
-
// 过滤掉空值和非数值
|
|
352
|
-
if (value == null || value === '' || !isNumber(+value)) {
|
|
353
|
-
return;
|
|
354
|
-
}
|
|
355
|
-
values.push(Number(value));
|
|
356
|
-
});
|
|
357
|
-
try {
|
|
358
|
-
segements = SuperMap.ArrayStatistic.getArraySegments(values, segmentMethod, segmentCount);
|
|
359
|
-
} catch (error) {
|
|
360
|
-
console.log(error);
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
// 处理自定义 分段
|
|
364
|
-
for (let i = 0; i < segmentCount; i++) {
|
|
365
|
-
if (i in customSettings) {
|
|
366
|
-
const startValue = customSettings[i].segment.start;
|
|
367
|
-
const endValue = customSettings[i].segment.end;
|
|
368
|
-
startValue != null && (segements[i] = startValue);
|
|
369
|
-
endValue != null && (segements[i + 1] = endValue);
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
// 生成styleGroup
|
|
374
|
-
const styleGroup = [];
|
|
375
|
-
if (segements && segements.length) {
|
|
376
|
-
const len = segements.length;
|
|
377
|
-
const incrementR = (maxR - minR) / (len - 1); // 半径增量
|
|
378
|
-
let start;
|
|
379
|
-
let end;
|
|
380
|
-
let radius = Number(((maxR + minR) / 2).toFixed(2));
|
|
381
|
-
let color = '';
|
|
382
|
-
const rangeColors = colors ? SuperMap.ColorsPickerUtil.getGradientColors(colors, len, 'RANGE') : [];
|
|
383
|
-
for (let i = 0; i < len - 1; i++) {
|
|
384
|
-
// 处理radius
|
|
385
|
-
start = Number(segements[i].toFixed(2));
|
|
386
|
-
end = Number(segements[i + 1].toFixed(2));
|
|
387
|
-
// 这里特殊处理以下分段值相同的情况(即所有字段值相同)
|
|
388
|
-
radius = start === end ? radius : minR + Math.round(incrementR * i);
|
|
389
|
-
// 最后一个分段时将end+0.01,避免取不到最大值
|
|
390
|
-
end = i === len - 2 ? end + 0.01 : end;
|
|
391
|
-
// 处理自定义 半径
|
|
392
|
-
radius = customSettings[i] && customSettings[i].radius ? customSettings[i].radius : radius;
|
|
393
|
-
style.radius = radius;
|
|
394
|
-
// 处理颜色
|
|
395
|
-
if (colors && colors.length > 0) {
|
|
396
|
-
color = customSettings[i] && customSettings[i].color ? customSettings[i].color : rangeColors[i] || fillColor;
|
|
397
|
-
style.fillColor = color;
|
|
398
|
-
}
|
|
399
|
-
styleGroup.push({ radius, color, start, end, style });
|
|
400
|
-
}
|
|
401
|
-
return styleGroup;
|
|
402
|
-
} else {
|
|
403
|
-
return false;
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
protected createRankStyleSource(parameters, features) {
|
|
408
|
-
const themeSetting = parameters.themeSetting;
|
|
409
|
-
const themeField = themeSetting.themeField;
|
|
410
|
-
const styleGroups = this.getRankStyleGroup(themeField, features, parameters);
|
|
411
|
-
// @ts-ignore
|
|
412
|
-
return styleGroups ? { parameters, styleGroups } : false;
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
protected isMatchAdministrativeName(featureName, fieldName) {
|
|
416
|
-
const isString = typeof fieldName === 'string' && fieldName.constructor === String;
|
|
417
|
-
if (isString) {
|
|
418
|
-
let shortName = featureName.substr(0, 2);
|
|
419
|
-
// 张家口市和张家界市 特殊处理
|
|
420
|
-
if (shortName === '张家') {
|
|
421
|
-
shortName = featureName.substr(0, 3);
|
|
422
|
-
}
|
|
423
|
-
return !!fieldName.match(new RegExp(shortName));
|
|
424
|
-
}
|
|
425
|
-
return false;
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
protected getRestMapLayerInfo(restMapInfo, layer) {
|
|
429
|
-
const { bounds, coordUnit, visibleScales, url } = restMapInfo;
|
|
430
|
-
layer.layerType = 'TILE';
|
|
431
|
-
layer.orginEpsgCode = this.baseProjection;
|
|
432
|
-
layer.units = coordUnit && coordUnit.toLowerCase();
|
|
433
|
-
layer.extent = [bounds.left, bounds.bottom, bounds.right, bounds.top];
|
|
434
|
-
layer.visibleScales = visibleScales;
|
|
435
|
-
layer.url = url;
|
|
436
|
-
layer.sourceType = 'TILE';
|
|
437
|
-
return layer;
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
protected handleLayerFeatures(features, layerInfo) {
|
|
441
|
-
const { layerType, style, themeSetting, filterCondition } = layerInfo;
|
|
442
|
-
if ((style || themeSetting) && filterCondition) {
|
|
443
|
-
// 将 feature 根据过滤条件进行过滤, 分段专题图和单值专题图因为要计算 styleGroup 所以暂时不过滤
|
|
444
|
-
if (layerType !== 'RANGE' && layerType !== 'UNIQUE' && layerType !== 'RANK_SYMBOL') {
|
|
445
|
-
features = this.getFilterFeatures(filterCondition, features);
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
return features;
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
protected mergeFeatures(layerId: string, features: any, mergeByField?: string): any {
|
|
453
|
-
if (!(features instanceof Array)) {
|
|
454
|
-
return features;
|
|
455
|
-
}
|
|
456
|
-
features = features.map((feature: any, index: any) => {
|
|
457
|
-
if (!Object.prototype.hasOwnProperty.call(feature.properties, 'index')) {
|
|
458
|
-
feature.properties.index = index;
|
|
459
|
-
}
|
|
460
|
-
return feature;
|
|
461
|
-
});
|
|
462
|
-
if (!features.length || !mergeByField && features[0].geometry) {
|
|
463
|
-
return features;
|
|
464
|
-
}
|
|
465
|
-
const source = this.map.getSource(layerId);
|
|
466
|
-
if ((!source || !source._data.features) && features[0].geometry) {
|
|
467
|
-
return features;
|
|
468
|
-
}
|
|
469
|
-
const prevFeatures = source && source._data && source._data.features;
|
|
470
|
-
const nextFeatures = [];
|
|
471
|
-
if (!mergeByField && prevFeatures) {
|
|
472
|
-
return prevFeatures;
|
|
473
|
-
}
|
|
474
|
-
features.forEach((feature: any) => {
|
|
475
|
-
const prevFeature = prevFeatures.find((item: any) => {
|
|
476
|
-
if (isNaN(+item.properties[mergeByField]) && isNaN(+feature.properties[mergeByField])) {
|
|
477
|
-
return (
|
|
478
|
-
JSON.stringify(item.properties[mergeByField] || '') ===
|
|
479
|
-
JSON.stringify(feature.properties[mergeByField] || '')
|
|
480
|
-
);
|
|
481
|
-
} else {
|
|
482
|
-
return +item.properties[mergeByField] === +feature.properties[mergeByField];
|
|
483
|
-
}
|
|
484
|
-
});
|
|
485
|
-
if (prevFeature) {
|
|
486
|
-
nextFeatures.push({
|
|
487
|
-
...prevFeature,
|
|
488
|
-
...feature
|
|
489
|
-
});
|
|
490
|
-
} else if (feature.geometry) {
|
|
491
|
-
nextFeatures.push(feature);
|
|
492
|
-
}
|
|
493
|
-
});
|
|
494
|
-
return nextFeatures;
|
|
495
|
-
}
|
|
496
|
-
|
|
497
|
-
protected getFilterFeatures(filterCondition: string, allFeatures): any {
|
|
498
|
-
if (!filterCondition) {
|
|
499
|
-
return allFeatures;
|
|
500
|
-
}
|
|
501
|
-
let condition = this.replaceFilterCharacter(filterCondition);
|
|
502
|
-
const filterFeatures = [];
|
|
503
|
-
for (let i = 0; i < allFeatures.length; i++) {
|
|
504
|
-
const feature = allFeatures[i];
|
|
505
|
-
let filterResult: any;
|
|
506
|
-
const properties = feature.properties;
|
|
507
|
-
try {
|
|
508
|
-
condition = this.parseCondition(condition, Object.keys(properties));
|
|
509
|
-
const filterFeature = this.parseConditionFeature(properties);
|
|
510
|
-
const sql = 'select * from json where (' + condition + ')';
|
|
511
|
-
filterResult = window.jsonsql.query(sql, { attributes: filterFeature });
|
|
512
|
-
} catch (err) {
|
|
513
|
-
// 必须把要过滤得内容封装成一个对象,主要是处理jsonsql(line : 62)中由于with语句遍历对象造成的问题
|
|
514
|
-
continue;
|
|
515
|
-
}
|
|
516
|
-
if (filterResult && filterResult.length > 0) {
|
|
517
|
-
// afterFilterFeatureIdx.push(i);
|
|
518
|
-
filterFeatures.push(feature);
|
|
519
|
-
}
|
|
520
|
-
}
|
|
521
|
-
return filterFeatures;
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
protected replaceFilterCharacter(filterString: string): string {
|
|
525
|
-
filterString = filterString
|
|
526
|
-
.replace(/=/g, '==')
|
|
527
|
-
.replace(/AND|and/g, '&&')
|
|
528
|
-
.replace(/or|OR/g, '||')
|
|
529
|
-
.replace(/<==/g, '<=')
|
|
530
|
-
.replace(/>==/g, '>=');
|
|
531
|
-
return filterString;
|
|
532
|
-
}
|
|
533
|
-
|
|
534
|
-
protected getParseSpecialCharacter() {
|
|
535
|
-
// 特殊字符字典
|
|
536
|
-
const directory = ['(', ')', '(', ')', ',', ','];
|
|
537
|
-
const res = {};
|
|
538
|
-
directory.forEach((item, index) => {
|
|
539
|
-
res[item] = `$${index}`;
|
|
540
|
-
});
|
|
541
|
-
return res;
|
|
542
|
-
}
|
|
543
|
-
|
|
544
|
-
protected parseSpecialCharacter(str) {
|
|
545
|
-
const directory = this.getParseSpecialCharacter();
|
|
546
|
-
for (let key in directory) {
|
|
547
|
-
const replaceValue = directory[key];
|
|
548
|
-
const pattern = new RegExp(`\\${key}`, 'g');
|
|
549
|
-
// eslint-disable-next-line
|
|
550
|
-
while (pattern.test(str)) {
|
|
551
|
-
str = str.replace(pattern, replaceValue);
|
|
552
|
-
}
|
|
553
|
-
}
|
|
554
|
-
return str;
|
|
555
|
-
}
|
|
556
|
-
|
|
557
|
-
protected parseCondition(filterCondition, keys) {
|
|
558
|
-
const str = filterCondition.replace(/&|\||>|<|=|!/g, ' ');
|
|
559
|
-
const arr = str.split(' ').filter((item) => item);
|
|
560
|
-
let result = filterCondition;
|
|
561
|
-
arr.forEach((item) => {
|
|
562
|
-
const key = keys.find((val) => val === item);
|
|
563
|
-
if (this.startsWithNumber(item) && key) {
|
|
564
|
-
result = result.replace(key, '$' + key);
|
|
565
|
-
}
|
|
566
|
-
if (key) {
|
|
567
|
-
const res = this.parseSpecialCharacter(key);
|
|
568
|
-
result = result.replace(key, res);
|
|
569
|
-
}
|
|
570
|
-
});
|
|
571
|
-
return result;
|
|
572
|
-
}
|
|
573
|
-
|
|
574
|
-
// 处理jsonsqlfeature, 加前缀
|
|
575
|
-
protected parseConditionFeature(feature) {
|
|
576
|
-
let copyValue = {};
|
|
577
|
-
for (let key in feature) {
|
|
578
|
-
let copyKey = key;
|
|
579
|
-
if (this.startsWithNumber(key)) {
|
|
580
|
-
copyKey = '$' + key;
|
|
581
|
-
}
|
|
582
|
-
copyKey = this.parseSpecialCharacter(copyKey);
|
|
583
|
-
copyValue[copyKey] = feature[key];
|
|
584
|
-
}
|
|
585
|
-
return copyValue;
|
|
586
|
-
}
|
|
587
|
-
|
|
588
|
-
protected startsWithNumber(str) {
|
|
589
|
-
return /^\d/.test(str);
|
|
590
|
-
}
|
|
591
|
-
|
|
592
|
-
protected getEchartsLayerOptions(layerInfo, features, coordinateSystem) {
|
|
593
|
-
const properties = this.webMapService.getFeatureProperties(features);
|
|
594
|
-
const lineData = this._createLinesData(layerInfo, properties);
|
|
595
|
-
const pointData = this._createPointsData(lineData, layerInfo, properties);
|
|
596
|
-
const options = this._createOptions(layerInfo, lineData, pointData, coordinateSystem);
|
|
597
|
-
return options;
|
|
598
|
-
}
|
|
599
|
-
|
|
600
|
-
protected getDashStyle(str, strokeWidth = 1, type = 'array') {
|
|
601
|
-
if (!str) {
|
|
602
|
-
return type === 'array' ? [] : '';
|
|
603
|
-
}
|
|
604
|
-
|
|
605
|
-
const w = strokeWidth;
|
|
606
|
-
let dashArr;
|
|
607
|
-
switch (str) {
|
|
608
|
-
case 'solid':
|
|
609
|
-
dashArr = [];
|
|
610
|
-
break;
|
|
611
|
-
case 'dot':
|
|
612
|
-
dashArr = [1, 4 * w];
|
|
613
|
-
break;
|
|
614
|
-
case 'dash':
|
|
615
|
-
dashArr = [4 * w, 4 * w];
|
|
616
|
-
break;
|
|
617
|
-
case 'dashrailway':
|
|
618
|
-
dashArr = [8 * w, 12 * w];
|
|
619
|
-
break;
|
|
620
|
-
case 'dashdot':
|
|
621
|
-
dashArr = [4 * w, 4 * w, 1 * w, 4 * w];
|
|
622
|
-
break;
|
|
623
|
-
case 'longdash':
|
|
624
|
-
dashArr = [8 * w, 4 * w];
|
|
625
|
-
break;
|
|
626
|
-
case 'longdashdot':
|
|
627
|
-
dashArr = [8 * w, 4 * w, 1, 4 * w];
|
|
628
|
-
break;
|
|
629
|
-
default:
|
|
630
|
-
if (SuperMap.Util.isArray(str)) {
|
|
631
|
-
dashArr = str;
|
|
632
|
-
}
|
|
633
|
-
str = SuperMap.String.trim(str).replace(/\s+/g, ',');
|
|
634
|
-
dashArr = str.replace(/\[|\]/gi, '').split(',');
|
|
635
|
-
break;
|
|
636
|
-
}
|
|
637
|
-
dashArr = type === 'array' ? dashArr : dashArr.join(',');
|
|
638
|
-
return dashArr;
|
|
639
|
-
}
|
|
640
|
-
|
|
641
|
-
protected getCanvasFromSVG(svgUrl: string, divDom: HTMLElement, callBack: Function): void {
|
|
642
|
-
const canvas = document.createElement('canvas');
|
|
643
|
-
canvas.id = `dataviz-canvas-${new Date().getTime()}`;
|
|
644
|
-
canvas.style.display = 'none';
|
|
645
|
-
divDom.appendChild(canvas);
|
|
646
|
-
if (svgUrl) {
|
|
647
|
-
const canvgs = window.canvg?.default ? window.canvg.default : Canvg;
|
|
648
|
-
const ctx = canvas.getContext('2d');
|
|
649
|
-
canvgs.from(ctx, svgUrl, {
|
|
650
|
-
ignoreMouse: true,
|
|
651
|
-
ignoreAnimation: true,
|
|
652
|
-
forceRedraw: () => false
|
|
653
|
-
}).then(v => {
|
|
654
|
-
v.start();
|
|
655
|
-
this.canvgsV.push(v);
|
|
656
|
-
if (canvas.width > 300 || canvas.height > 300) {
|
|
657
|
-
return;
|
|
658
|
-
}
|
|
659
|
-
callBack(canvas);
|
|
660
|
-
});
|
|
661
|
-
} else {
|
|
662
|
-
callBack(canvas);
|
|
663
|
-
}
|
|
664
|
-
}
|
|
665
|
-
|
|
666
|
-
protected stopCanvg() {
|
|
667
|
-
this.canvgsV.forEach(v => v.stop());
|
|
668
|
-
this.canvgsV = [];
|
|
669
|
-
}
|
|
670
|
-
|
|
671
|
-
protected getRangeStyleGroup(layerInfo: any, features: any): Array<any> | void {
|
|
672
|
-
const { featureType, style, themeSetting } = layerInfo;
|
|
673
|
-
const { customSettings, themeField, segmentCount, segmentMethod, colors } = themeSetting;
|
|
674
|
-
|
|
675
|
-
// 找出分段值
|
|
676
|
-
const values = [];
|
|
677
|
-
let attributes;
|
|
678
|
-
|
|
679
|
-
features.forEach(feature => {
|
|
680
|
-
attributes = feature.properties;
|
|
681
|
-
if (attributes) {
|
|
682
|
-
// 过滤掉非数值的数据
|
|
683
|
-
const val = attributes[themeField];
|
|
684
|
-
(val || val === 0) && isNumber(+val) && values.push(parseFloat(val));
|
|
685
|
-
}
|
|
686
|
-
}, this);
|
|
687
|
-
|
|
688
|
-
let segements =
|
|
689
|
-
values && values.length && SuperMap.ArrayStatistic.getArraySegments(values, segmentMethod, segmentCount);
|
|
690
|
-
if (segements) {
|
|
691
|
-
let itemNum = segmentCount;
|
|
692
|
-
if (attributes && segements[0] === segements[attributes.length - 1]) {
|
|
693
|
-
itemNum = 1;
|
|
694
|
-
segements.length = 2;
|
|
695
|
-
}
|
|
696
|
-
|
|
697
|
-
// 保留两位有效数
|
|
698
|
-
for (let i = 0; i < segements.length; i++) {
|
|
699
|
-
let value = segements[i];
|
|
700
|
-
value = i === 0 ? Math.floor(value * 100) / 100 : Math.ceil(value * 100) / 100 + 0.1; // 加0.1 解决最大值没有样式问题
|
|
701
|
-
segements[i] = Number(value.toFixed(2));
|
|
702
|
-
}
|
|
703
|
-
|
|
704
|
-
// 获取一定量的颜色
|
|
705
|
-
let curentColors = colors;
|
|
706
|
-
curentColors = SuperMap.ColorsPickerUtil.getGradientColors(curentColors, itemNum, 'RANGE');
|
|
707
|
-
for (let index = 0; index < itemNum; index++) {
|
|
708
|
-
if (index in customSettings) {
|
|
709
|
-
if (customSettings[index].segment.start) {
|
|
710
|
-
segements[index] = customSettings[index].segment.start;
|
|
711
|
-
}
|
|
712
|
-
if (customSettings[index].segment.end) {
|
|
713
|
-
segements[index + 1] = customSettings[index].segment.end;
|
|
714
|
-
}
|
|
715
|
-
}
|
|
716
|
-
}
|
|
717
|
-
// 生成styleGroup
|
|
718
|
-
const styleGroups = [];
|
|
719
|
-
for (let i = 0; i < itemNum; i++) {
|
|
720
|
-
let color = curentColors[i];
|
|
721
|
-
if (i in customSettings) {
|
|
722
|
-
if (customSettings[i].color) {
|
|
723
|
-
color = customSettings[i].color;
|
|
724
|
-
}
|
|
725
|
-
}
|
|
726
|
-
if (featureType === 'LINE') {
|
|
727
|
-
style.strokeColor = color;
|
|
728
|
-
} else {
|
|
729
|
-
style.fillColor = color;
|
|
730
|
-
}
|
|
731
|
-
|
|
732
|
-
const start = segements[i];
|
|
733
|
-
const end = segements[i + 1];
|
|
734
|
-
const styleObj = JSON.parse(JSON.stringify(style));
|
|
735
|
-
styleGroups.push({
|
|
736
|
-
style: styleObj,
|
|
737
|
-
color: color,
|
|
738
|
-
start: start,
|
|
739
|
-
end: end
|
|
740
|
-
});
|
|
741
|
-
}
|
|
742
|
-
return styleGroups;
|
|
743
|
-
}
|
|
744
|
-
}
|
|
745
|
-
|
|
746
|
-
protected getCustomSettingColors(customSettings, featureType) {
|
|
747
|
-
const keys = Object.keys(customSettings);
|
|
748
|
-
const colors = [];
|
|
749
|
-
keys.forEach(key => {
|
|
750
|
-
if (featureType === 'LINE') {
|
|
751
|
-
colors.push(customSettings[key].strokeColor);
|
|
752
|
-
} else {
|
|
753
|
-
colors.push(customSettings[key].fillColor);
|
|
754
|
-
}
|
|
755
|
-
});
|
|
756
|
-
return colors;
|
|
757
|
-
}
|
|
758
|
-
|
|
759
|
-
protected getUniqueStyleGroup(parameters: any, features: any) {
|
|
760
|
-
const { featureType, style, themeSetting } = parameters;
|
|
761
|
-
const { colors, customSettings } = themeSetting;
|
|
762
|
-
let themeField = themeSetting.themeField;
|
|
763
|
-
// 找出所有的单值
|
|
764
|
-
const featurePropertie = (features && features[0] && features[0].properties) || {};
|
|
765
|
-
Object.keys(featurePropertie).forEach(key => {
|
|
766
|
-
key.toLocaleUpperCase() === themeField.toLocaleUpperCase() && (themeField = key);
|
|
767
|
-
});
|
|
768
|
-
const names = [];
|
|
769
|
-
for (const i in features) {
|
|
770
|
-
const properties = features[i].properties;
|
|
771
|
-
const name = properties[themeField];
|
|
772
|
-
let isSaved = false;
|
|
773
|
-
for (const j in names) {
|
|
774
|
-
if (names[j] === name) {
|
|
775
|
-
isSaved = true;
|
|
776
|
-
break;
|
|
777
|
-
}
|
|
778
|
-
}
|
|
779
|
-
if (!isSaved) {
|
|
780
|
-
names.push(name);
|
|
781
|
-
}
|
|
782
|
-
}
|
|
783
|
-
|
|
784
|
-
// 获取一定量的颜色
|
|
785
|
-
let curentColors = colors;
|
|
786
|
-
curentColors = SuperMap.ColorsPickerUtil.getGradientColors(curentColors, names.length);
|
|
787
|
-
const usedColors = this.getCustomSettingColors(customSettings, featureType).map(item => item && item.toLowerCase());
|
|
788
|
-
const allColors = SuperMap.ColorsPickerUtil.getGradientColors(colors, names.length + Object.keys(customSettings).length).map(item => item.toLowerCase());
|
|
789
|
-
const newColors = difference(allColors, usedColors);
|
|
790
|
-
const styleGroup = [];
|
|
791
|
-
names.forEach((name, index) => {
|
|
792
|
-
let color = curentColors[index];
|
|
793
|
-
let itemStyle = { ...style };
|
|
794
|
-
const customStyle = customSettings[name];
|
|
795
|
-
if (typeof customStyle === 'object') {
|
|
796
|
-
itemStyle = Object.assign(itemStyle, customStyle);
|
|
797
|
-
color = itemStyle.fillColor || itemStyle.strokeColor;
|
|
798
|
-
} else {
|
|
799
|
-
if (typeof customStyle === 'string') {
|
|
800
|
-
color = customSettings[name];
|
|
801
|
-
}
|
|
802
|
-
if (!customStyle) {
|
|
803
|
-
color = newColors.shift();
|
|
804
|
-
}
|
|
805
|
-
if (featureType === 'LINE') {
|
|
806
|
-
itemStyle.strokeColor = color;
|
|
807
|
-
} else {
|
|
808
|
-
itemStyle.fillColor = color;
|
|
809
|
-
}
|
|
810
|
-
}
|
|
811
|
-
|
|
812
|
-
styleGroup.push({
|
|
813
|
-
color: color,
|
|
814
|
-
style: itemStyle,
|
|
815
|
-
value: name,
|
|
816
|
-
themeField: themeField
|
|
817
|
-
});
|
|
818
|
-
}, this);
|
|
819
|
-
|
|
820
|
-
return styleGroup;
|
|
821
|
-
}
|
|
822
|
-
|
|
823
|
-
protected transformFeatures(features) {
|
|
824
|
-
features &&
|
|
825
|
-
features.forEach((feature, index) => {
|
|
826
|
-
let coordinates = feature.geometry && feature.geometry.coordinates;
|
|
827
|
-
if (!coordinates || coordinates.length === 0) {
|
|
828
|
-
return;
|
|
829
|
-
}
|
|
830
|
-
coordEach(feature, (coordinates) => {
|
|
831
|
-
// @ts-ignore
|
|
832
|
-
let transCoordinates = this._unproject(coordinates);
|
|
833
|
-
coordinates[0] = transCoordinates[0];
|
|
834
|
-
coordinates[1] = transCoordinates[1];
|
|
835
|
-
});
|
|
836
|
-
features[index] = feature;
|
|
837
|
-
});
|
|
838
|
-
|
|
839
|
-
return features;
|
|
840
|
-
}
|
|
841
|
-
|
|
842
|
-
private _drawTextRectAndGetSize({ context, style, textArray, lineHeight, doublePadding, canvas }) {
|
|
843
|
-
let backgroundFill = style.backgroundFill;
|
|
844
|
-
const maxWidth = style.maxWidth - doublePadding;
|
|
845
|
-
let width = 0;
|
|
846
|
-
let height = 0;
|
|
847
|
-
let lineCount = 0;
|
|
848
|
-
let lineWidths = [];
|
|
849
|
-
// 100的宽度,去掉左右两边3padding
|
|
850
|
-
textArray.forEach((arrText: string) => {
|
|
851
|
-
let line = '';
|
|
852
|
-
let isOverMax = false;
|
|
853
|
-
lineCount++;
|
|
854
|
-
for (let n = 0; n < arrText.length; n++) {
|
|
855
|
-
let textLine = line + arrText[n];
|
|
856
|
-
let metrics = context.measureText(textLine);
|
|
857
|
-
let textWidth = metrics.width;
|
|
858
|
-
if ((textWidth > maxWidth && n > 0) || arrText[n] === '\n') {
|
|
859
|
-
line = arrText[n];
|
|
860
|
-
lineCount++;
|
|
861
|
-
// 有换行,记录当前换行的width
|
|
862
|
-
isOverMax = true;
|
|
863
|
-
} else {
|
|
864
|
-
line = textLine;
|
|
865
|
-
width = textWidth;
|
|
866
|
-
}
|
|
867
|
-
}
|
|
868
|
-
if(isOverMax) {
|
|
869
|
-
lineWidths.push(maxWidth);
|
|
870
|
-
} else {
|
|
871
|
-
lineWidths.push(width);
|
|
872
|
-
}
|
|
873
|
-
}, this);
|
|
874
|
-
for (let i = 0; i < lineWidths.length; i++) {
|
|
875
|
-
let lineW = lineWidths[i];
|
|
876
|
-
if(lineW >= maxWidth) {
|
|
877
|
-
// 有任何一行超过最大高度,就用最大高度
|
|
878
|
-
width = maxWidth;
|
|
879
|
-
break;
|
|
880
|
-
} else if(lineW > width) {
|
|
881
|
-
// 自己换行,就要比较每行的最大宽度
|
|
882
|
-
width = lineW;
|
|
883
|
-
}
|
|
884
|
-
}
|
|
885
|
-
width += doublePadding;
|
|
886
|
-
// -6 是为了去掉canvas下方多余空白,让文本垂直居中
|
|
887
|
-
height = lineCount * lineHeight + doublePadding - 6;
|
|
888
|
-
canvas.width = width;
|
|
889
|
-
canvas.height = height;
|
|
890
|
-
context.fillStyle = backgroundFill;
|
|
891
|
-
context.fillRect(0, 0, width, height);
|
|
892
|
-
context.lineWidth = style.borderWidth;
|
|
893
|
-
context.strokeStyle = style.borderColor;
|
|
894
|
-
context.strokeRect(0, 0, width, height);
|
|
895
|
-
return {
|
|
896
|
-
width: width,
|
|
897
|
-
height: height
|
|
898
|
-
};
|
|
899
|
-
}
|
|
900
|
-
|
|
901
|
-
private _drawTextWithCanvas({ context, canvas, style }) {
|
|
902
|
-
const padding = 8;
|
|
903
|
-
const doublePadding = padding * 2;
|
|
904
|
-
const lineHeight = Number(style.font.replace(/[^0-9]/ig, '')) + 3;
|
|
905
|
-
const textArray = style.text.split('\r\n');
|
|
906
|
-
context.font = style.font;
|
|
907
|
-
const size = this._drawTextRectAndGetSize({ context, style, textArray, lineHeight, doublePadding, canvas });
|
|
908
|
-
let positionY = padding;
|
|
909
|
-
textArray.forEach((text: string, i: number) => {
|
|
910
|
-
if(i !== 0) {
|
|
911
|
-
positionY = positionY + lineHeight;
|
|
912
|
-
}
|
|
913
|
-
context.font = style.font;
|
|
914
|
-
let textAlign = style.textAlign;
|
|
915
|
-
let x: number;
|
|
916
|
-
const width = size.width - doublePadding; // 减去padding
|
|
917
|
-
switch (textAlign) {
|
|
918
|
-
case 'center':
|
|
919
|
-
x = width / 2;
|
|
920
|
-
break;
|
|
921
|
-
case 'right':
|
|
922
|
-
x = width;
|
|
923
|
-
break;
|
|
924
|
-
default:
|
|
925
|
-
x = 8;
|
|
926
|
-
break;
|
|
927
|
-
}
|
|
928
|
-
// 字符分隔为数组
|
|
929
|
-
const arrText = text.split('');
|
|
930
|
-
let line = '';
|
|
931
|
-
const fillColor = style.fillColor;
|
|
932
|
-
// 每一行限制的高度
|
|
933
|
-
let maxWidth = style.maxWidth - doublePadding;
|
|
934
|
-
for (let n = 0; n < arrText.length; n++) {
|
|
935
|
-
let testLine = line + arrText[n];
|
|
936
|
-
let metrics = context.measureText(testLine);
|
|
937
|
-
let testWidth = metrics.width;
|
|
938
|
-
if ((testWidth > maxWidth && n > 0) || arrText[n] === '\n') {
|
|
939
|
-
context.fillStyle = fillColor;
|
|
940
|
-
context.textAlign = textAlign;
|
|
941
|
-
context.textBaseline = 'top';
|
|
942
|
-
context.fillText(line, x, positionY);
|
|
943
|
-
line = arrText[n];
|
|
944
|
-
positionY += lineHeight;
|
|
945
|
-
} else {
|
|
946
|
-
line = testLine;
|
|
947
|
-
}
|
|
948
|
-
}
|
|
949
|
-
context.fillStyle = fillColor;
|
|
950
|
-
context.textAlign = textAlign;
|
|
951
|
-
context.textBaseline = 'top';
|
|
952
|
-
context.fillText(line, x, positionY);
|
|
953
|
-
}, this);
|
|
954
|
-
}
|
|
955
|
-
|
|
956
|
-
protected handleSvgColor(style, canvas) {
|
|
957
|
-
const { fillColor, fillOpacity, strokeColor, strokeOpacity, strokeWidth } = style;
|
|
958
|
-
const context = canvas.getContext('2d');
|
|
959
|
-
if (style.text) {
|
|
960
|
-
this._drawTextWithCanvas({ context, canvas, style });
|
|
961
|
-
return;
|
|
962
|
-
}
|
|
963
|
-
if (fillColor) {
|
|
964
|
-
context.fillStyle = getColorWithOpacity(fillColor, fillOpacity);
|
|
965
|
-
context.fill();
|
|
966
|
-
}
|
|
967
|
-
|
|
968
|
-
if (strokeColor || strokeWidth) {
|
|
969
|
-
context.strokeStyle = getColorWithOpacity(strokeColor, strokeOpacity);
|
|
970
|
-
context.lineWidth = strokeWidth;
|
|
971
|
-
context.stroke();
|
|
972
|
-
}
|
|
973
|
-
}
|
|
974
|
-
|
|
975
|
-
private _createLinesData(layerInfo, properties) {
|
|
976
|
-
const data = [];
|
|
977
|
-
if (properties && properties.length) {
|
|
978
|
-
// 重新获取数据
|
|
979
|
-
const from = layerInfo.from;
|
|
980
|
-
const to = layerInfo.to;
|
|
981
|
-
let fromCoord;
|
|
982
|
-
let toCoord;
|
|
983
|
-
if (from.type === 'XY_FIELD' && from.xField && from.yField && to.xField && to.yField) {
|
|
984
|
-
properties.forEach(property => {
|
|
985
|
-
const fromX = property[from.xField];
|
|
986
|
-
const fromY = property[from.yField];
|
|
987
|
-
const toX = property[to.xField];
|
|
988
|
-
const toY = property[to.yField];
|
|
989
|
-
if (!fromX || !fromY || !toX || !toY) {
|
|
990
|
-
return;
|
|
991
|
-
}
|
|
992
|
-
|
|
993
|
-
fromCoord = [property[from.xField], property[from.yField]];
|
|
994
|
-
toCoord = [property[to.xField], property[to.yField]];
|
|
995
|
-
data.push({
|
|
996
|
-
coords: [fromCoord, toCoord]
|
|
997
|
-
});
|
|
998
|
-
});
|
|
999
|
-
} else if (from.type === 'PLACE_FIELD' && from.field && to.field) {
|
|
1000
|
-
const centerDatas = provincialCenterData.concat(municipalCenterData);
|
|
1001
|
-
|
|
1002
|
-
properties.forEach(property => {
|
|
1003
|
-
const fromField = property[from.field];
|
|
1004
|
-
const toField = property[to.field];
|
|
1005
|
-
fromCoord = centerDatas.find(item => {
|
|
1006
|
-
return this.isMatchAdministrativeName(item.name, fromField);
|
|
1007
|
-
});
|
|
1008
|
-
toCoord = centerDatas.find(item => {
|
|
1009
|
-
return this.isMatchAdministrativeName(item.name, toField);
|
|
1010
|
-
});
|
|
1011
|
-
if (!fromCoord || !toCoord) {
|
|
1012
|
-
return;
|
|
1013
|
-
}
|
|
1014
|
-
data.push({
|
|
1015
|
-
coords: [fromCoord.coord, toCoord.coord]
|
|
1016
|
-
});
|
|
1017
|
-
});
|
|
1018
|
-
}
|
|
1019
|
-
}
|
|
1020
|
-
return data;
|
|
1021
|
-
}
|
|
1022
|
-
|
|
1023
|
-
private _createPointsData(lineData, layerInfo, properties) {
|
|
1024
|
-
let data = [];
|
|
1025
|
-
const labelSetting = layerInfo.labelSetting;
|
|
1026
|
-
// 标签隐藏则直接返回
|
|
1027
|
-
if (!labelSetting.show || !lineData.length) {
|
|
1028
|
-
return data;
|
|
1029
|
-
}
|
|
1030
|
-
const fromData = [];
|
|
1031
|
-
const toData = [];
|
|
1032
|
-
lineData.forEach((item, idx) => {
|
|
1033
|
-
const coords = item.coords;
|
|
1034
|
-
const fromCoord = coords[0];
|
|
1035
|
-
const toCoord = coords[1];
|
|
1036
|
-
const fromProperty = properties[idx][labelSetting.from];
|
|
1037
|
-
const toProperty = properties[idx][labelSetting.to];
|
|
1038
|
-
// 起始字段去重
|
|
1039
|
-
const f = fromData.find(d => {
|
|
1040
|
-
return d.value[0] === fromCoord[0] && d.value[1] === fromCoord[1];
|
|
1041
|
-
});
|
|
1042
|
-
!f &&
|
|
1043
|
-
fromData.push({
|
|
1044
|
-
name: fromProperty,
|
|
1045
|
-
value: fromCoord
|
|
1046
|
-
});
|
|
1047
|
-
// 终点字段去重
|
|
1048
|
-
const t = toData.find(d => {
|
|
1049
|
-
return d.value[0] === toCoord[0] && d.value[1] === toCoord[1];
|
|
1050
|
-
});
|
|
1051
|
-
!t &&
|
|
1052
|
-
toData.push({
|
|
1053
|
-
name: toProperty,
|
|
1054
|
-
value: toCoord
|
|
1055
|
-
});
|
|
1056
|
-
});
|
|
1057
|
-
data = fromData.concat(toData);
|
|
1058
|
-
return data;
|
|
1059
|
-
}
|
|
1060
|
-
|
|
1061
|
-
private _createOptions(layerInfo, lineData, pointData, coordinateSystem) {
|
|
1062
|
-
let series;
|
|
1063
|
-
const lineSeries = this._createLineSeries(layerInfo, lineData, coordinateSystem);
|
|
1064
|
-
if (pointData && pointData.length) {
|
|
1065
|
-
const pointSeries: any = this._createPointSeries(layerInfo, pointData, coordinateSystem);
|
|
1066
|
-
series = lineSeries.concat(pointSeries);
|
|
1067
|
-
} else {
|
|
1068
|
-
series = lineSeries.slice();
|
|
1069
|
-
}
|
|
1070
|
-
return { series };
|
|
1071
|
-
}
|
|
1072
|
-
|
|
1073
|
-
private _createPointSeries(layerInfo, pointData, coordinateSystem) {
|
|
1074
|
-
const lineSetting = layerInfo.lineSetting;
|
|
1075
|
-
const animationSetting = layerInfo.animationSetting;
|
|
1076
|
-
const labelSetting = layerInfo.labelSetting;
|
|
1077
|
-
const pointSeries = [
|
|
1078
|
-
{
|
|
1079
|
-
name: 'point-series',
|
|
1080
|
-
coordinateSystem: coordinateSystem,
|
|
1081
|
-
zlevel: 2,
|
|
1082
|
-
label: {
|
|
1083
|
-
normal: {
|
|
1084
|
-
show: labelSetting.show,
|
|
1085
|
-
position: 'right',
|
|
1086
|
-
formatter: '{b}',
|
|
1087
|
-
color: labelSetting.color,
|
|
1088
|
-
fontFamily: labelSetting.fontFamily
|
|
1089
|
-
}
|
|
1090
|
-
},
|
|
1091
|
-
itemStyle: {
|
|
1092
|
-
normal: {
|
|
1093
|
-
color: lineSetting.color || labelSetting.color
|
|
1094
|
-
}
|
|
1095
|
-
},
|
|
1096
|
-
data: pointData
|
|
1097
|
-
}
|
|
1098
|
-
];
|
|
1099
|
-
|
|
1100
|
-
if (animationSetting.show) {
|
|
1101
|
-
// 开启动画
|
|
1102
|
-
// @ts-ignore
|
|
1103
|
-
pointSeries[0].type = 'effectScatter';
|
|
1104
|
-
// @ts-ignore
|
|
1105
|
-
pointSeries[0].rippleEffect = {
|
|
1106
|
-
brushType: 'stroke'
|
|
1107
|
-
};
|
|
1108
|
-
} else {
|
|
1109
|
-
// 关闭动画
|
|
1110
|
-
// @ts-ignore
|
|
1111
|
-
pointSeries[0].type = 'scatter';
|
|
1112
|
-
}
|
|
1113
|
-
|
|
1114
|
-
return pointSeries;
|
|
1115
|
-
}
|
|
1116
|
-
|
|
1117
|
-
private _createLineSeries(layerInfo, lineData, coordinateSystem) {
|
|
1118
|
-
const lineSetting = layerInfo.lineSetting;
|
|
1119
|
-
const animationSetting = layerInfo.animationSetting;
|
|
1120
|
-
const linesSeries = [
|
|
1121
|
-
// 轨迹线样式
|
|
1122
|
-
{
|
|
1123
|
-
name: 'line-series',
|
|
1124
|
-
coordinateSystem: coordinateSystem,
|
|
1125
|
-
type: 'lines',
|
|
1126
|
-
zlevel: 1,
|
|
1127
|
-
effect: {
|
|
1128
|
-
show: animationSetting.show,
|
|
1129
|
-
constantSpeed: animationSetting.constantSpeed,
|
|
1130
|
-
trailLength: 0,
|
|
1131
|
-
symbol: animationSetting.symbol,
|
|
1132
|
-
symbolSize: animationSetting.symbolSize
|
|
1133
|
-
},
|
|
1134
|
-
lineStyle: {
|
|
1135
|
-
normal: {
|
|
1136
|
-
color: lineSetting.color,
|
|
1137
|
-
type: lineSetting.type,
|
|
1138
|
-
width: lineSetting.width,
|
|
1139
|
-
opacity: lineSetting.opacity,
|
|
1140
|
-
curveness: lineSetting.curveness
|
|
1141
|
-
}
|
|
1142
|
-
},
|
|
1143
|
-
data: lineData
|
|
1144
|
-
}
|
|
1145
|
-
];
|
|
1146
|
-
|
|
1147
|
-
if (lineData.length >= MAX_MIGRATION_ANIMATION_COUNT) {
|
|
1148
|
-
// @ts-ignore
|
|
1149
|
-
linesSeries[0].large = true;
|
|
1150
|
-
// @ts-ignore
|
|
1151
|
-
linesSeries[0].largeThreshold = 100;
|
|
1152
|
-
// @ts-ignore
|
|
1153
|
-
linesSeries[0].blendMode = 'lighter';
|
|
1154
|
-
}
|
|
1155
|
-
|
|
1156
|
-
return linesSeries;
|
|
1157
|
-
}
|
|
1158
|
-
|
|
1159
|
-
private _getLayerFeaturesSucceeded(result, layer) {
|
|
1160
|
-
switch (result.type) {
|
|
1161
|
-
case 'feature':
|
|
1162
|
-
this._initOverlayLayer(layer, result.features);
|
|
1163
|
-
break;
|
|
1164
|
-
case 'restMap':
|
|
1165
|
-
layer.layerType = 'restMap';
|
|
1166
|
-
this._initOverlayLayer(layer, result.restMaps);
|
|
1167
|
-
break;
|
|
1168
|
-
case 'mvt':
|
|
1169
|
-
layer.layerType = 'mvt';
|
|
1170
|
-
this._initOverlayLayer(layer, result);
|
|
1171
|
-
break;
|
|
1172
|
-
case 'dataflow':
|
|
1173
|
-
case 'noServerId':
|
|
1174
|
-
this._initOverlayLayer(layer);
|
|
1175
|
-
break;
|
|
1176
|
-
}
|
|
1177
|
-
}
|
|
1178
|
-
}
|