gis-common 4.2.5 → 4.2.7
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/constant/ErrorTypeConstant.d.ts +1 -0
- package/dist/core/Color.d.ts +2 -1
- package/dist/core/HashMap.d.ts +14 -1
- package/dist/core/Storage.d.ts +4 -1
- package/dist/gis-common.es.js +387 -83
- package/dist/gis-common.umd.js +1 -1
- package/dist/utils/AssertUtil.d.ts +3 -0
- package/dist/utils/BrowserUtil.d.ts +65 -16
- package/dist/utils/CommUtil.d.ts +1 -0
- package/dist/utils/StringUtil.d.ts +2 -0
- package/package.json +1 -1
- package/CHANGELOG.md +0 -13
|
@@ -17,6 +17,7 @@ declare enum ErrorType {
|
|
|
17
17
|
PARAMETER_ERROR_STRING = "\u9A8C\u8BC1\u6570\u636E\u7C7B\u578B\u5931\u8D25\uFF0C\u5FC5\u987B\u662F\u5B57\u7B26",
|
|
18
18
|
PARAMETER_ERROR_FUNCTION = "\u9A8C\u8BC1\u6570\u636E\u7C7B\u578B\u5931\u8D25\uFF0C\u5FC5\u987B\u662F\u51FD\u6570",
|
|
19
19
|
PARAMETER_ERROR_OBJECT = "\u9A8C\u8BC1\u6570\u636E\u7C7B\u578B\u5931\u8D25\uFF0C\u5FC5\u987B\u662F\u5BF9\u8C61",
|
|
20
|
+
PARAMETER_ERROR_INTEGER = "\u9A8C\u8BC1\u6570\u636E\u7C7B\u578B\u5931\u8D25\uFF0C\u5FC5\u987B\u662F\u6574\u578B",
|
|
20
21
|
PARAMETER_ERROR_NUMBER = "\u9A8C\u8BC1\u6570\u636E\u7C7B\u578B\u5931\u8D25\uFF0C\u5FC5\u987B\u662F\u6570\u503C",
|
|
21
22
|
PARAMETER_ERROR_LACK = "\u9A8C\u8BC1\u6570\u636E\u7C7B\u578B\u5931\u8D25\uFF0C\u5FC5\u987B\u975E\u7A7A",
|
|
22
23
|
DATA_ERROR = "\u683C\u5F0F\u7C7B\u578B\u9A8C\u8BC1\u5931\u8D25",
|
package/dist/core/Color.d.ts
CHANGED
|
@@ -16,7 +16,8 @@ export default class Color {
|
|
|
16
16
|
private _validateColorChannel;
|
|
17
17
|
get rgba(): ColorRGBA;
|
|
18
18
|
get hex(): string;
|
|
19
|
-
|
|
19
|
+
setAlpha(a: number): Color;
|
|
20
|
+
setRgb(r: number, g: number, b: number): Color;
|
|
20
21
|
/**
|
|
21
22
|
* 从RGBA字符串创建Color对象
|
|
22
23
|
*
|
package/dist/core/HashMap.d.ts
CHANGED
|
@@ -3,5 +3,18 @@ export default class HashMap<K, V> extends Map<K, V> {
|
|
|
3
3
|
_values(): V[];
|
|
4
4
|
_keys(): K[];
|
|
5
5
|
_entries(): [K, V][];
|
|
6
|
-
|
|
6
|
+
/**
|
|
7
|
+
* 从键值对数组创建一个HashMap对象
|
|
8
|
+
*
|
|
9
|
+
* @param array 键值对数组,默认为空数组
|
|
10
|
+
* @returns 返回一个新的HashMap对象
|
|
11
|
+
*/
|
|
12
|
+
static fromEntries<K extends string | number | symbol, V>(array?: Array<[K, V]>): HashMap<K, V>;
|
|
13
|
+
/**
|
|
14
|
+
* 从JSON字符串创建HashMap实例
|
|
15
|
+
*
|
|
16
|
+
* @param str JSON字符串
|
|
17
|
+
* @returns HashMap实例
|
|
18
|
+
*/
|
|
19
|
+
static fromJson<K extends string | number | symbol, V>(str: any): HashMap<K, V>;
|
|
7
20
|
}
|
package/dist/core/Storage.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
export default class Storage {
|
|
2
|
+
static store: Storage;
|
|
2
3
|
static prefix: string;
|
|
4
|
+
static useLocal(): void;
|
|
5
|
+
static useSession(): void;
|
|
3
6
|
private static _getPrefixedKey;
|
|
4
7
|
/**
|
|
5
8
|
* 将键值对存储到localStorage中
|
|
@@ -13,7 +16,7 @@ export default class Storage {
|
|
|
13
16
|
expires?: number;
|
|
14
17
|
}): void;
|
|
15
18
|
/**
|
|
16
|
-
* 从
|
|
19
|
+
* 从Storage中获取指定key的存储值
|
|
17
20
|
*
|
|
18
21
|
* @param key 存储键名
|
|
19
22
|
* @param missing 当获取不到指定key的存储值时返回的默认值
|
package/dist/gis-common.es.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
3
|
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
4
|
+
var _a;
|
|
4
5
|
import { connect } from "mqtt-browser";
|
|
5
6
|
var EventType = /* @__PURE__ */ ((EventType2) => {
|
|
6
7
|
EventType2["MAP_RENDER"] = "mapRender";
|
|
@@ -45,6 +46,7 @@ var ErrorType = /* @__PURE__ */ ((ErrorType2) => {
|
|
|
45
46
|
ErrorType2["PARAMETER_ERROR_STRING"] = "验证数据类型失败,必须是字符";
|
|
46
47
|
ErrorType2["PARAMETER_ERROR_FUNCTION"] = "验证数据类型失败,必须是函数";
|
|
47
48
|
ErrorType2["PARAMETER_ERROR_OBJECT"] = "验证数据类型失败,必须是对象";
|
|
49
|
+
ErrorType2["PARAMETER_ERROR_INTEGER"] = "验证数据类型失败,必须是整型";
|
|
48
50
|
ErrorType2["PARAMETER_ERROR_NUMBER"] = "验证数据类型失败,必须是数值";
|
|
49
51
|
ErrorType2["PARAMETER_ERROR_LACK"] = "验证数据类型失败,必须非空";
|
|
50
52
|
ErrorType2["DATA_ERROR"] = "格式类型验证失败";
|
|
@@ -464,6 +466,9 @@ const CommUtils = {
|
|
|
464
466
|
isNumber(a) {
|
|
465
467
|
return typeof a === "number" && !isNaN(a) || typeof a === "string" && Number.isFinite(+a);
|
|
466
468
|
},
|
|
469
|
+
isInteger(a) {
|
|
470
|
+
return parseInt(a) === a;
|
|
471
|
+
},
|
|
467
472
|
isFunction(obj) {
|
|
468
473
|
if (this.isNil(obj)) {
|
|
469
474
|
return false;
|
|
@@ -1309,6 +1314,52 @@ const StringUtil = {
|
|
|
1309
1314
|
}
|
|
1310
1315
|
}
|
|
1311
1316
|
return str;
|
|
1317
|
+
},
|
|
1318
|
+
string2Bytes(str) {
|
|
1319
|
+
const bytes = [];
|
|
1320
|
+
let c;
|
|
1321
|
+
const len = str.length;
|
|
1322
|
+
for (let i = 0; i < len; i++) {
|
|
1323
|
+
c = str.charCodeAt(i);
|
|
1324
|
+
if (c >= 65536 && c <= 1114111) {
|
|
1325
|
+
bytes.push(c >> 18 & 7 | 240);
|
|
1326
|
+
bytes.push(c >> 12 & 63 | 128);
|
|
1327
|
+
bytes.push(c >> 6 & 63 | 128);
|
|
1328
|
+
bytes.push(c & 63 | 128);
|
|
1329
|
+
} else if (c >= 2048 && c <= 65535) {
|
|
1330
|
+
bytes.push(c >> 12 & 15 | 224);
|
|
1331
|
+
bytes.push(c >> 6 & 63 | 128);
|
|
1332
|
+
bytes.push(c & 63 | 128);
|
|
1333
|
+
} else if (c >= 128 && c <= 2047) {
|
|
1334
|
+
bytes.push(c >> 6 & 31 | 192);
|
|
1335
|
+
bytes.push(c & 63 | 128);
|
|
1336
|
+
} else {
|
|
1337
|
+
bytes.push(c & 255);
|
|
1338
|
+
}
|
|
1339
|
+
}
|
|
1340
|
+
return new Uint8Array(bytes);
|
|
1341
|
+
},
|
|
1342
|
+
bytes2String(uint8arr) {
|
|
1343
|
+
if (typeof uint8arr === "string") {
|
|
1344
|
+
return uint8arr;
|
|
1345
|
+
}
|
|
1346
|
+
let str = "";
|
|
1347
|
+
const _arr = uint8arr;
|
|
1348
|
+
for (let i = 0; i < _arr.length; i++) {
|
|
1349
|
+
const one = _arr[i].toString(2), v = one.match(/^1+?(?=0)/);
|
|
1350
|
+
if (v && one.length == 8) {
|
|
1351
|
+
const bytesLength = v[0].length;
|
|
1352
|
+
let store = _arr[i].toString(2).slice(7 - bytesLength);
|
|
1353
|
+
for (let st = 1; st < bytesLength; st++) {
|
|
1354
|
+
store += _arr[st + i].toString(2).slice(2);
|
|
1355
|
+
}
|
|
1356
|
+
str += String.fromCharCode(parseInt(store, 2));
|
|
1357
|
+
i += bytesLength - 1;
|
|
1358
|
+
} else {
|
|
1359
|
+
str += String.fromCharCode(_arr[i]);
|
|
1360
|
+
}
|
|
1361
|
+
}
|
|
1362
|
+
return str;
|
|
1312
1363
|
}
|
|
1313
1364
|
};
|
|
1314
1365
|
const TYPES = ["Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon"];
|
|
@@ -1560,6 +1611,13 @@ const AssertUtil = {
|
|
|
1560
1611
|
}
|
|
1561
1612
|
});
|
|
1562
1613
|
},
|
|
1614
|
+
assertInteger(...arg) {
|
|
1615
|
+
arg.forEach((a) => {
|
|
1616
|
+
if (!CommUtils.isInteger(a)) {
|
|
1617
|
+
throw Error(ErrorType.PARAMETER_ERROR_INTEGER + " -> " + a);
|
|
1618
|
+
}
|
|
1619
|
+
});
|
|
1620
|
+
},
|
|
1563
1621
|
assertNumber(...arg) {
|
|
1564
1622
|
arg.forEach((a) => {
|
|
1565
1623
|
if (!CommUtils.isNumber(a)) {
|
|
@@ -1619,6 +1677,16 @@ const AssertUtil = {
|
|
|
1619
1677
|
throw Error(ErrorType.STRING_CHECK_LOSS + " -> " + str);
|
|
1620
1678
|
}
|
|
1621
1679
|
},
|
|
1680
|
+
assertStartWith(value, prefix) {
|
|
1681
|
+
if (!value.startsWith(prefix)) {
|
|
1682
|
+
throw Error("字符串" + value + "开头不是 -> " + prefix);
|
|
1683
|
+
}
|
|
1684
|
+
},
|
|
1685
|
+
assertEndWith(value, prefix) {
|
|
1686
|
+
if (!value.endsWith(prefix)) {
|
|
1687
|
+
throw Error("字符串" + value + "结尾不是 -> " + prefix);
|
|
1688
|
+
}
|
|
1689
|
+
},
|
|
1622
1690
|
/**
|
|
1623
1691
|
* 判断字符串是否合法
|
|
1624
1692
|
*
|
|
@@ -1798,50 +1866,106 @@ const ArrayUtil = {
|
|
|
1798
1866
|
return this.union(...args).filter((d) => !this.intersection(...args).includes(d));
|
|
1799
1867
|
}
|
|
1800
1868
|
};
|
|
1801
|
-
|
|
1802
|
-
/**
|
|
1803
|
-
*
|
|
1804
|
-
*
|
|
1805
|
-
* @returns
|
|
1806
|
-
*/
|
|
1807
|
-
|
|
1808
|
-
var
|
|
1809
|
-
|
|
1810
|
-
|
|
1811
|
-
|
|
1812
|
-
|
|
1813
|
-
|
|
1814
|
-
|
|
1815
|
-
|
|
1816
|
-
|
|
1817
|
-
} else if (
|
|
1818
|
-
|
|
1869
|
+
class BrowserUtil {
|
|
1870
|
+
/**
|
|
1871
|
+
* 获取系统类型
|
|
1872
|
+
*
|
|
1873
|
+
* @returns 返回一个包含系统类型和版本的对象
|
|
1874
|
+
*/
|
|
1875
|
+
static getSystem() {
|
|
1876
|
+
var _a2, _b, _c, _d, _e, _f, _g, _h, _i;
|
|
1877
|
+
const userAgent = this.userAgent || ((_a2 = this.navigator) == null ? void 0 : _a2.userAgent);
|
|
1878
|
+
let type = "", version = "";
|
|
1879
|
+
if (userAgent.includes("Android") || userAgent.includes("Adr")) {
|
|
1880
|
+
type = "Android";
|
|
1881
|
+
version = ((_b = userAgent.match(/Android ([\d.]+);/)) == null ? void 0 : _b[1]) || "";
|
|
1882
|
+
} else if (userAgent.includes("CrOS")) {
|
|
1883
|
+
type = "Chromium OS";
|
|
1884
|
+
version = ((_c = userAgent.match(/MSIE ([\d.]+)/)) == null ? void 0 : _c[1]) || ((_d = userAgent.match(/rv:([\d.]+)/)) == null ? void 0 : _d[1]) || "";
|
|
1885
|
+
} else if (userAgent.includes("Linux") || userAgent.includes("X11")) {
|
|
1886
|
+
type = "Linux";
|
|
1887
|
+
version = ((_e = userAgent.match(/Linux ([\d.]+)/)) == null ? void 0 : _e[1]) || "";
|
|
1888
|
+
} else if (userAgent.includes("Ubuntu")) {
|
|
1889
|
+
type = "Ubuntu";
|
|
1890
|
+
version = ((_f = userAgent.match(/Ubuntu ([\d.]+)/)) == null ? void 0 : _f[1]) || "";
|
|
1891
|
+
} else if (userAgent.includes("Windows")) {
|
|
1892
|
+
let v = ((_g = userAgent.match(/^Mozilla\/\d.0 \(Windows NT ([\d.]+)[;)].*$/)) == null ? void 0 : _g[1]) || "";
|
|
1893
|
+
let hash = {
|
|
1894
|
+
"10.0": "10",
|
|
1895
|
+
"6.4": "10 Technical Preview",
|
|
1896
|
+
"6.3": "8.1",
|
|
1897
|
+
"6.2": "8",
|
|
1898
|
+
"6.1": "7",
|
|
1899
|
+
"6.0": "Vista",
|
|
1900
|
+
"5.2": "XP 64-bit",
|
|
1901
|
+
"5.1": "XP",
|
|
1902
|
+
"5.01": "2000 SP1",
|
|
1903
|
+
"5.0": "2000",
|
|
1904
|
+
"4.0": "NT",
|
|
1905
|
+
"4.90": "ME"
|
|
1906
|
+
};
|
|
1907
|
+
type = "Windows";
|
|
1908
|
+
version = v in hash ? hash[v] : v;
|
|
1909
|
+
} else if (userAgent.includes("like Mac OS X")) {
|
|
1910
|
+
type = "IOS";
|
|
1911
|
+
version = ((_h = userAgent.match(/OS ([\d_]+) like/)) == null ? void 0 : _h[1].replace(/_/g, ".")) || "";
|
|
1912
|
+
} else if (userAgent.includes("Macintosh")) {
|
|
1913
|
+
type = "macOS";
|
|
1914
|
+
version = ((_i = userAgent.match(/Mac OS X -?([\d_]+)/)) == null ? void 0 : _i[1].replace(/_/g, ".")) || "";
|
|
1915
|
+
}
|
|
1916
|
+
return { type, version };
|
|
1917
|
+
}
|
|
1918
|
+
/**
|
|
1919
|
+
* 获取浏览器类型信息
|
|
1920
|
+
*
|
|
1921
|
+
* @returns 浏览器类型信息,包含浏览器类型和版本号
|
|
1922
|
+
*/
|
|
1923
|
+
static getExplorer() {
|
|
1924
|
+
var _a2;
|
|
1925
|
+
const userAgent = this.userAgent || ((_a2 = this.navigator) == null ? void 0 : _a2.userAgent);
|
|
1926
|
+
let type = "", version = "";
|
|
1927
|
+
if (/MSIE|Trident/.test(userAgent)) {
|
|
1928
|
+
let matches = /MSIE\s(\d+\.\d+)/.exec(userAgent) || /rv:(\d+\.\d+)/.exec(userAgent);
|
|
1929
|
+
if (matches) {
|
|
1930
|
+
type = "IE";
|
|
1931
|
+
version = matches[1];
|
|
1932
|
+
}
|
|
1933
|
+
} else if (/Edge/.test(userAgent)) {
|
|
1934
|
+
let matches = /Edge\/(\d+\.\d+)/.exec(userAgent);
|
|
1935
|
+
if (matches) {
|
|
1936
|
+
type = "Edge";
|
|
1937
|
+
version = matches[1];
|
|
1938
|
+
}
|
|
1939
|
+
} else if (/Chrome/.test(userAgent) && /Google Inc/.test(this.navigator.vendor)) {
|
|
1940
|
+
let matches = /Chrome\/(\d+\.\d+)/.exec(userAgent);
|
|
1941
|
+
if (matches) {
|
|
1942
|
+
type = "Chrome";
|
|
1943
|
+
version = matches[1];
|
|
1944
|
+
}
|
|
1945
|
+
} else if (/Firefox/.test(userAgent)) {
|
|
1946
|
+
let matches = /Firefox\/(\d+\.\d+)/.exec(userAgent);
|
|
1947
|
+
if (matches) {
|
|
1948
|
+
type = "Firefox";
|
|
1949
|
+
version = matches[1];
|
|
1950
|
+
}
|
|
1951
|
+
} else if (/Safari/.test(userAgent) && /Apple Computer/.test(this.navigator.vendor)) {
|
|
1952
|
+
let matches = /Version\/(\d+\.\d+)([^S]*)(Safari)/.exec(userAgent);
|
|
1953
|
+
if (matches) {
|
|
1954
|
+
type = "Safari";
|
|
1955
|
+
version = matches[1];
|
|
1956
|
+
}
|
|
1819
1957
|
}
|
|
1820
|
-
return
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
* @returns 返回操作系统类型字符串,可能的值有:'MS Windows'、'Apple mac'、'Linux'、'Unix'
|
|
1826
|
-
*/
|
|
1827
|
-
detectOS() {
|
|
1828
|
-
let os_type = "";
|
|
1829
|
-
const windows = navigator.userAgent.indexOf("Windows", 0) != -1 ? 1 : 0;
|
|
1830
|
-
const mac = navigator.userAgent.indexOf("mac", 0) != -1 ? 1 : 0;
|
|
1831
|
-
const linux = navigator.userAgent.indexOf("Linux", 0) != -1 ? 1 : 0;
|
|
1832
|
-
const unix = navigator.userAgent.indexOf("X11", 0) != -1 ? 1 : 0;
|
|
1833
|
-
if (windows) os_type = "MS Windows";
|
|
1834
|
-
else if (mac) os_type = "Apple mac";
|
|
1835
|
-
else if (linux) os_type = "Linux";
|
|
1836
|
-
else if (unix) os_type = "Unix";
|
|
1837
|
-
return os_type;
|
|
1838
|
-
},
|
|
1958
|
+
return {
|
|
1959
|
+
type,
|
|
1960
|
+
version
|
|
1961
|
+
};
|
|
1962
|
+
}
|
|
1839
1963
|
/**
|
|
1840
1964
|
* 切换全屏状态
|
|
1841
1965
|
*
|
|
1842
1966
|
* @param status 是否全屏
|
|
1843
1967
|
*/
|
|
1844
|
-
switchFullScreen(status) {
|
|
1968
|
+
static switchFullScreen(status) {
|
|
1845
1969
|
if (status) {
|
|
1846
1970
|
const element = document.documentElement;
|
|
1847
1971
|
if (element.requestFullscreen) {
|
|
@@ -1864,41 +1988,196 @@ const BrowserUtil = {
|
|
|
1864
1988
|
document.webkitExitFullscreen();
|
|
1865
1989
|
}
|
|
1866
1990
|
}
|
|
1867
|
-
}
|
|
1991
|
+
}
|
|
1868
1992
|
/**
|
|
1869
|
-
*
|
|
1993
|
+
* 判断当前浏览器是否支持WebGL
|
|
1870
1994
|
*
|
|
1871
|
-
* @returns
|
|
1995
|
+
* @returns 如果支持WebGL则返回true,否则返回false
|
|
1872
1996
|
*/
|
|
1873
|
-
|
|
1874
|
-
|
|
1875
|
-
|
|
1876
|
-
const appElement = document.getElementById("app");
|
|
1877
|
-
if (!appElement) return;
|
|
1878
|
-
const appStyle = appElement.style;
|
|
1879
|
-
const realRatio = baseWidth / baseHeight;
|
|
1880
|
-
const designRatio = 16 / 9;
|
|
1881
|
-
let scaleRate = baseWidth / 1920;
|
|
1882
|
-
if (realRatio > designRatio) {
|
|
1883
|
-
scaleRate = baseHeight / 1080;
|
|
1997
|
+
static isSupportWebGL() {
|
|
1998
|
+
if (!(this == null ? void 0 : this.document)) {
|
|
1999
|
+
return false;
|
|
1884
2000
|
}
|
|
1885
|
-
|
|
1886
|
-
|
|
1887
|
-
|
|
1888
|
-
}
|
|
2001
|
+
const $canvas = this.document.createElement("canvas");
|
|
2002
|
+
const gl = $canvas.getContext("webgl") || $canvas.getContext("experimental-webgl");
|
|
2003
|
+
return gl && gl instanceof WebGLRenderingContext;
|
|
2004
|
+
}
|
|
1889
2005
|
/**
|
|
1890
|
-
* 获取
|
|
2006
|
+
* 获取GPU信息
|
|
1891
2007
|
*
|
|
1892
|
-
* @returns
|
|
2008
|
+
* @returns 返回包含GPU类型和型号的对象
|
|
1893
2009
|
*/
|
|
1894
|
-
|
|
1895
|
-
|
|
1896
|
-
|
|
1897
|
-
if (
|
|
1898
|
-
|
|
2010
|
+
static getGPU() {
|
|
2011
|
+
let type = "";
|
|
2012
|
+
let model = "";
|
|
2013
|
+
if (this == null ? void 0 : this.document) {
|
|
2014
|
+
let $canvas = this.document.createElement("canvas");
|
|
2015
|
+
let webgl = $canvas.getContext("webgl") || $canvas.getContext("experimental-webgl");
|
|
2016
|
+
if (webgl instanceof WebGLRenderingContext) {
|
|
2017
|
+
let debugInfo = webgl.getExtension("WEBGL_debug_renderer_info");
|
|
2018
|
+
if (debugInfo) {
|
|
2019
|
+
let gpu_str = webgl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
|
|
2020
|
+
type = (gpu_str.match(/ANGLE \((.+?),/) || [])[1] || "";
|
|
2021
|
+
model = (gpu_str.match(/, (.+?) (\(|vs_)/) || [])[1] || "";
|
|
2022
|
+
}
|
|
2023
|
+
}
|
|
1899
2024
|
}
|
|
2025
|
+
return {
|
|
2026
|
+
type,
|
|
2027
|
+
model
|
|
2028
|
+
};
|
|
1900
2029
|
}
|
|
1901
|
-
|
|
2030
|
+
/**
|
|
2031
|
+
* 获取当前浏览器设置的语言
|
|
2032
|
+
*
|
|
2033
|
+
* @returns 返回浏览器设置的语言,格式为 "语言_地区",例如 "zh_CN"。如果获取失败,则返回 "Unknown"。
|
|
2034
|
+
*/
|
|
2035
|
+
static getLanguage() {
|
|
2036
|
+
var _a2, _b;
|
|
2037
|
+
let g = ((_a2 = this.navigator) == null ? void 0 : _a2.language) || ((_b = this.navigator) == null ? void 0 : _b.userLanguage);
|
|
2038
|
+
if (typeof g !== "string") return "";
|
|
2039
|
+
let arr = g.split("-");
|
|
2040
|
+
if (arr[1]) {
|
|
2041
|
+
arr[1] = arr[1].toUpperCase();
|
|
2042
|
+
}
|
|
2043
|
+
let language = arr.join("_");
|
|
2044
|
+
return language;
|
|
2045
|
+
}
|
|
2046
|
+
/**
|
|
2047
|
+
* 获取当前环境的时区。
|
|
2048
|
+
*
|
|
2049
|
+
* @returns 返回当前环境的时区,若获取失败则返回 undefined。
|
|
2050
|
+
*/
|
|
2051
|
+
static getTimeZone() {
|
|
2052
|
+
var _a2, _b;
|
|
2053
|
+
return (_b = (_a2 = Intl == null ? void 0 : Intl.DateTimeFormat()) == null ? void 0 : _a2.resolvedOptions()) == null ? void 0 : _b.timeZone;
|
|
2054
|
+
}
|
|
2055
|
+
/**
|
|
2056
|
+
* 获取屏幕帧率
|
|
2057
|
+
*
|
|
2058
|
+
* @returns 返回一个Promise,resolve为计算得到的屏幕帧率
|
|
2059
|
+
* eg: const fps = await BrowserUtil.getScreenFPS()
|
|
2060
|
+
*/
|
|
2061
|
+
static async getScreenFPS() {
|
|
2062
|
+
return new Promise(function(resolve) {
|
|
2063
|
+
let lastTime = 0;
|
|
2064
|
+
let count = 1;
|
|
2065
|
+
let list = [];
|
|
2066
|
+
let tick = function(timestamp) {
|
|
2067
|
+
if (lastTime > 0) {
|
|
2068
|
+
if (count < 12) {
|
|
2069
|
+
list.push(timestamp - lastTime);
|
|
2070
|
+
lastTime = timestamp;
|
|
2071
|
+
count++;
|
|
2072
|
+
requestAnimationFrame(tick);
|
|
2073
|
+
} else {
|
|
2074
|
+
list.sort();
|
|
2075
|
+
list = list.slice(1, 11);
|
|
2076
|
+
let sum = list.reduce((a, b) => a + b);
|
|
2077
|
+
const fps = Math.round(1e4 / sum / 10) * 10;
|
|
2078
|
+
resolve(fps);
|
|
2079
|
+
}
|
|
2080
|
+
} else {
|
|
2081
|
+
lastTime = timestamp;
|
|
2082
|
+
requestAnimationFrame(tick);
|
|
2083
|
+
}
|
|
2084
|
+
};
|
|
2085
|
+
requestAnimationFrame(tick);
|
|
2086
|
+
});
|
|
2087
|
+
}
|
|
2088
|
+
/**
|
|
2089
|
+
* 获取IP地址
|
|
2090
|
+
*
|
|
2091
|
+
* @returns 返回一个Promise,当成功获取到IP地址时resolve,返回IP地址字符串;当获取失败时reject,返回undefined
|
|
2092
|
+
*/
|
|
2093
|
+
static async getIPAddress() {
|
|
2094
|
+
const reg = {
|
|
2095
|
+
IPv4: /\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/,
|
|
2096
|
+
IPv6: /\b(?:[A-F0-9]{1,4}:){7}[A-F0-9]{1,4}\b/i
|
|
2097
|
+
};
|
|
2098
|
+
let RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
|
|
2099
|
+
const ipSet = /* @__PURE__ */ new Set();
|
|
2100
|
+
const onicecandidate = (ice) => {
|
|
2101
|
+
var _a2;
|
|
2102
|
+
const candidate = (_a2 = ice == null ? void 0 : ice.candidate) == null ? void 0 : _a2.candidate;
|
|
2103
|
+
if (candidate) {
|
|
2104
|
+
for (const regex of [reg["IPv4"], reg["IPv6"]]) {
|
|
2105
|
+
const match = candidate.match(regex);
|
|
2106
|
+
if (match) {
|
|
2107
|
+
ipSet.add(match[0]);
|
|
2108
|
+
}
|
|
2109
|
+
}
|
|
2110
|
+
}
|
|
2111
|
+
};
|
|
2112
|
+
return new Promise(function(resolve, reject) {
|
|
2113
|
+
const conn = new RTCPeerConnection({
|
|
2114
|
+
iceServers: [
|
|
2115
|
+
{
|
|
2116
|
+
urls: "stun:stun.l.google.com:19302"
|
|
2117
|
+
},
|
|
2118
|
+
{
|
|
2119
|
+
urls: "stun:stun.services.mozilla.com"
|
|
2120
|
+
}
|
|
2121
|
+
]
|
|
2122
|
+
});
|
|
2123
|
+
conn.addEventListener("icecandidate", onicecandidate);
|
|
2124
|
+
conn.createDataChannel("");
|
|
2125
|
+
conn.createOffer().then((offer) => conn.setLocalDescription(offer), reject);
|
|
2126
|
+
let count = 20;
|
|
2127
|
+
let hander;
|
|
2128
|
+
let closeConnect = function() {
|
|
2129
|
+
try {
|
|
2130
|
+
conn.removeEventListener("icecandidate", onicecandidate);
|
|
2131
|
+
conn.close();
|
|
2132
|
+
} catch {
|
|
2133
|
+
}
|
|
2134
|
+
hander && clearInterval(hander);
|
|
2135
|
+
};
|
|
2136
|
+
hander = setInterval(function() {
|
|
2137
|
+
let ips = [...ipSet];
|
|
2138
|
+
if (ips.length) {
|
|
2139
|
+
closeConnect();
|
|
2140
|
+
resolve(ips[0]);
|
|
2141
|
+
} else if (count) {
|
|
2142
|
+
count--;
|
|
2143
|
+
} else {
|
|
2144
|
+
closeConnect();
|
|
2145
|
+
resolve("");
|
|
2146
|
+
}
|
|
2147
|
+
}, 100);
|
|
2148
|
+
});
|
|
2149
|
+
}
|
|
2150
|
+
/**
|
|
2151
|
+
* 获取网络状态信息
|
|
2152
|
+
*
|
|
2153
|
+
* @returns 返回包含网络状态信息的对象,包含以下属性:
|
|
2154
|
+
* - network: 网络类型,可能的值为 'wifi'、'4g' 等
|
|
2155
|
+
* - isOnline: 是否在线,为 true 或 false
|
|
2156
|
+
* - ip: 当前设备的 IP 地址
|
|
2157
|
+
*/
|
|
2158
|
+
static async getNetwork() {
|
|
2159
|
+
var _a2, _b;
|
|
2160
|
+
let network = "unknown";
|
|
2161
|
+
let connection = (_a2 = this.navigator) == null ? void 0 : _a2.connection;
|
|
2162
|
+
if (connection) {
|
|
2163
|
+
network = connection.type || connection.effectiveType;
|
|
2164
|
+
if (network == "2" || network == "unknown") {
|
|
2165
|
+
network = "wifi";
|
|
2166
|
+
}
|
|
2167
|
+
}
|
|
2168
|
+
let isOnline = ((_b = this.navigator) == null ? void 0 : _b.onLine) || false;
|
|
2169
|
+
let ip = await this.getIPAddress();
|
|
2170
|
+
return {
|
|
2171
|
+
network,
|
|
2172
|
+
isOnline,
|
|
2173
|
+
ip
|
|
2174
|
+
};
|
|
2175
|
+
}
|
|
2176
|
+
}
|
|
2177
|
+
__publicField(BrowserUtil, "document", window == null ? void 0 : window.document);
|
|
2178
|
+
__publicField(BrowserUtil, "navigator", window == null ? void 0 : window.navigator);
|
|
2179
|
+
__publicField(BrowserUtil, "userAgent", (_a = window == null ? void 0 : window.navigator) == null ? void 0 : _a.userAgent);
|
|
2180
|
+
__publicField(BrowserUtil, "screen", window == null ? void 0 : window.screen);
|
|
1902
2181
|
const CoordsUtil = {
|
|
1903
2182
|
PI: 3.141592653589793,
|
|
1904
2183
|
XPI: 3.141592653589793 * 3e3 / 180,
|
|
@@ -2237,10 +2516,10 @@ const DomUtil = {
|
|
|
2237
2516
|
* @returns 元素的样式值,如果获取不到则返回 null
|
|
2238
2517
|
*/
|
|
2239
2518
|
getStyle(el, style) {
|
|
2240
|
-
var
|
|
2519
|
+
var _a2;
|
|
2241
2520
|
let value = el.style[style];
|
|
2242
2521
|
if (!value || value === "auto") {
|
|
2243
|
-
const css = (
|
|
2522
|
+
const css = (_a2 = document.defaultView) == null ? void 0 : _a2.getComputedStyle(el, null);
|
|
2244
2523
|
value = css ? css[style] : null;
|
|
2245
2524
|
if (value === "auto") value = null;
|
|
2246
2525
|
}
|
|
@@ -2326,8 +2605,8 @@ const DomUtil = {
|
|
|
2326
2605
|
* @returns 返回一个布尔值,表示元素是否包含指定类名
|
|
2327
2606
|
*/
|
|
2328
2607
|
hasClass(el, name) {
|
|
2329
|
-
var
|
|
2330
|
-
if ((
|
|
2608
|
+
var _a2;
|
|
2609
|
+
if ((_a2 = el.classList) == null ? void 0 : _a2.contains(name)) {
|
|
2331
2610
|
return true;
|
|
2332
2611
|
}
|
|
2333
2612
|
const className = this.getClass(el);
|
|
@@ -2647,22 +2926,24 @@ class Color {
|
|
|
2647
2926
|
throw new Error("Color channel must be between 0 and 255.");
|
|
2648
2927
|
}
|
|
2649
2928
|
}
|
|
2650
|
-
// 获取颜色的RGB值
|
|
2651
2929
|
get rgba() {
|
|
2652
2930
|
return { r: this._r, g: this._g, b: this._b, a: this._alpha };
|
|
2653
2931
|
}
|
|
2654
2932
|
get hex() {
|
|
2655
2933
|
return Color.rgb2hex(this._r, this._g, this._b, this._alpha);
|
|
2656
2934
|
}
|
|
2935
|
+
setAlpha(a) {
|
|
2936
|
+
this._alpha = MathUtils.clamp(a, 0, 1);
|
|
2937
|
+
return this;
|
|
2938
|
+
}
|
|
2657
2939
|
// 设置颜色的RGB值
|
|
2658
|
-
setRgb(r, g, b
|
|
2940
|
+
setRgb(r, g, b) {
|
|
2659
2941
|
this._validateColorChannel(r);
|
|
2660
2942
|
this._validateColorChannel(g);
|
|
2661
2943
|
this._validateColorChannel(b);
|
|
2662
2944
|
this._r = r;
|
|
2663
2945
|
this._g = g;
|
|
2664
2946
|
this._b = b;
|
|
2665
|
-
this._alpha = MathUtils.clamp(a, 0, 1);
|
|
2666
2947
|
return this;
|
|
2667
2948
|
}
|
|
2668
2949
|
/**
|
|
@@ -2774,10 +3055,10 @@ class Color {
|
|
|
2774
3055
|
return /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(a);
|
|
2775
3056
|
}
|
|
2776
3057
|
static isRgb(a) {
|
|
2777
|
-
return /^
|
|
3058
|
+
return /^rgba?\s*\(\s*\d+\s*,\s*\d+\s*,\s*\d+\s*(,\s*[\d.]+)?\s*\)$/.test(a);
|
|
2778
3059
|
}
|
|
2779
3060
|
static isHsl(a) {
|
|
2780
|
-
return /^hsl
|
|
3061
|
+
return /^(hsl|hsla)\(\d+,\s*[\d.]+%,\s*[\d.]+%(,\s*[\d.]+)?\)$/.test(a);
|
|
2781
3062
|
}
|
|
2782
3063
|
static isColor(a) {
|
|
2783
3064
|
return this.isHex(a) || this.isRgb(a) || this.isHsl(a);
|
|
@@ -2954,6 +3235,12 @@ class HashMap extends Map {
|
|
|
2954
3235
|
_entries() {
|
|
2955
3236
|
return Array.from(this.entries());
|
|
2956
3237
|
}
|
|
3238
|
+
/**
|
|
3239
|
+
* 从键值对数组创建一个HashMap对象
|
|
3240
|
+
*
|
|
3241
|
+
* @param array 键值对数组,默认为空数组
|
|
3242
|
+
* @returns 返回一个新的HashMap对象
|
|
3243
|
+
*/
|
|
2957
3244
|
static fromEntries(array = []) {
|
|
2958
3245
|
const hashMap = new HashMap();
|
|
2959
3246
|
array.forEach((element) => {
|
|
@@ -2963,6 +3250,16 @@ class HashMap extends Map {
|
|
|
2963
3250
|
});
|
|
2964
3251
|
return hashMap;
|
|
2965
3252
|
}
|
|
3253
|
+
/**
|
|
3254
|
+
* 从JSON字符串创建HashMap实例
|
|
3255
|
+
*
|
|
3256
|
+
* @param str JSON字符串
|
|
3257
|
+
* @returns HashMap实例
|
|
3258
|
+
*/
|
|
3259
|
+
static fromJson(str) {
|
|
3260
|
+
const json = ObjectUtil.parse(str);
|
|
3261
|
+
return new HashMap(Object.entries(json));
|
|
3262
|
+
}
|
|
2966
3263
|
}
|
|
2967
3264
|
class WebSocketClient extends EventDispatcher {
|
|
2968
3265
|
constructor(url = "ws://127.0.0.1:10088") {
|
|
@@ -3163,6 +3460,12 @@ __publicField(_MqttClient, "defaultContext", {
|
|
|
3163
3460
|
});
|
|
3164
3461
|
let MqttClient = _MqttClient;
|
|
3165
3462
|
const _Storage = class _Storage {
|
|
3463
|
+
static useLocal() {
|
|
3464
|
+
this.store = window.localStorage;
|
|
3465
|
+
}
|
|
3466
|
+
static useSession() {
|
|
3467
|
+
this.store = window.sessionStorage;
|
|
3468
|
+
}
|
|
3166
3469
|
/**
|
|
3167
3470
|
* 将键值对存储到localStorage中
|
|
3168
3471
|
*
|
|
@@ -3179,13 +3482,13 @@ const _Storage = class _Storage {
|
|
|
3179
3482
|
if (expires) {
|
|
3180
3483
|
data.expires = expires;
|
|
3181
3484
|
}
|
|
3182
|
-
|
|
3485
|
+
this.store.setItem(query_key, JSON.stringify(data));
|
|
3183
3486
|
} catch (e) {
|
|
3184
|
-
if (console) console.warn(`Storage didn't successfully save the '{"${key}": "${value}"}' pair, because the
|
|
3487
|
+
if (console) console.warn(`Storage didn't successfully save the '{"${key}": "${value}"}' pair, because the Storage is full.`);
|
|
3185
3488
|
}
|
|
3186
3489
|
}
|
|
3187
3490
|
/**
|
|
3188
|
-
* 从
|
|
3491
|
+
* 从Storage中获取指定key的存储值
|
|
3189
3492
|
*
|
|
3190
3493
|
* @param key 存储键名
|
|
3191
3494
|
* @param missing 当获取不到指定key的存储值时返回的默认值
|
|
@@ -3195,10 +3498,10 @@ const _Storage = class _Storage {
|
|
|
3195
3498
|
static get(key, missing, options) {
|
|
3196
3499
|
var query_key = this._getPrefixedKey(key, options), value;
|
|
3197
3500
|
try {
|
|
3198
|
-
value = JSON.parse(
|
|
3501
|
+
value = JSON.parse(this.store.getItem(query_key) || "");
|
|
3199
3502
|
} catch (e) {
|
|
3200
|
-
if (
|
|
3201
|
-
value = { data:
|
|
3503
|
+
if (this.store[query_key]) {
|
|
3504
|
+
value = { data: this.store.getItem(query_key) };
|
|
3202
3505
|
} else {
|
|
3203
3506
|
value = null;
|
|
3204
3507
|
}
|
|
@@ -3215,7 +3518,7 @@ const _Storage = class _Storage {
|
|
|
3215
3518
|
}
|
|
3216
3519
|
static keys() {
|
|
3217
3520
|
const keys = [];
|
|
3218
|
-
var allKeys = Object.keys(
|
|
3521
|
+
var allKeys = Object.keys(this.store);
|
|
3219
3522
|
if (_Storage.prefix.length === 0) {
|
|
3220
3523
|
return allKeys;
|
|
3221
3524
|
}
|
|
@@ -3243,18 +3546,19 @@ const _Storage = class _Storage {
|
|
|
3243
3546
|
}
|
|
3244
3547
|
static remove(key, options) {
|
|
3245
3548
|
var queryKey = this._getPrefixedKey(key, options);
|
|
3246
|
-
|
|
3549
|
+
this.store.removeItem(queryKey);
|
|
3247
3550
|
}
|
|
3248
3551
|
static clear(options) {
|
|
3249
3552
|
if (_Storage.prefix.length) {
|
|
3250
3553
|
this.keys().forEach((key) => {
|
|
3251
|
-
|
|
3554
|
+
this.store.removeItem(this._getPrefixedKey(key, options));
|
|
3252
3555
|
});
|
|
3253
3556
|
} else {
|
|
3254
|
-
|
|
3557
|
+
this.store.clear();
|
|
3255
3558
|
}
|
|
3256
3559
|
}
|
|
3257
3560
|
};
|
|
3561
|
+
__publicField(_Storage, "store", window.localStorage);
|
|
3258
3562
|
__publicField(_Storage, "prefix", "");
|
|
3259
3563
|
__publicField(_Storage, "_getPrefixedKey", function(key, options) {
|
|
3260
3564
|
options = options || {};
|
package/dist/gis-common.umd.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("mqtt-browser")):"function"==typeof define&&define.amd?define(["exports","mqtt-browser"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self)["gis-common"]={},t.mqttBrowser)}(this,(function(t,e){"use strict";var n=Object.defineProperty,r=(t,e,r)=>((t,e,r)=>e in t?n(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r)(t,"symbol"!=typeof e?e+"":e,r),s=(t=>(t.MAP_RENDER="mapRender",t.MAP_READY="mapReady",t.MOUSE_CLICK="click",t.MOUSE_DOUBLE_CLICK="dblclick",t.MOUSE_MOVE="mousemove",t.MOUSE_IN="mousein",t.MOUSE_OUT="mouseout",t.MOUSE_RIGHT_CLICK="mouseRightClick",t.KEY_DOWN="keyDown",t.KEY_UP="keyUp",t.DRAW_ACTIVE="drawActive",t.DRAW_MOVE="drawMove",t.DRAW_COMPLETE="drawComplete",t.MQTT_CONNECT="mqttConnect",t.MQTT_ERROR="mqttError",t.MQTT_MESSAGE="mqttMessage",t.MQTT_CLOSE="mqttClose",t.WEB_SOCKET_CONNECT="webSocketConnect",t.WEB_SOCKET_ERROR="webSocketError",t.WEB_SOCKET_MESSAGE="webSocketMessage",t.WEB_SOCKET_CLOSE="webSocketClose",t))(s||{}),a=(t=>(t.LOGIN_EXPIRED="登录信息过期,请重新登录",t.CROSS_ERROR="跨域访问",t.UNEXIST_RESOURCE="资源不存在",t.TIMEOUT="请求超时",t.INTERNAL_ERROR="内部错误",t.NETWORK_ERROR="请求失败,请检查网络是否已连接",t.PROCESS_FAIL="处理失败",t.AUTH_VERIFY_ERROR="权限验证失败",t.NO_DATA_FOUND="未找到数据",t.DUPLICATE_INSTANCE="实例为单例模式,不允许重复构建",t.JSON_PARSE_ERROR="JSON解析失败,格式有误",t.JSON_VALUE_ERROR="JSON无此键",t.STRING_CHECK_LOSS="字符缺少关键字",t.PARAMETER_ERROR="验证数据类型失败",t.PARAMETER_ERROR_ARRAY="验证数据类型失败,必须是数组",t.PARAMETER_ERROR_STRING="验证数据类型失败,必须是字符",t.PARAMETER_ERROR_FUNCTION="验证数据类型失败,必须是函数",t.PARAMETER_ERROR_OBJECT="验证数据类型失败,必须是对象",t.PARAMETER_ERROR_NUMBER="验证数据类型失败,必须是数值",t.PARAMETER_ERROR_LACK="验证数据类型失败,必须非空",t.DATA_ERROR="格式类型验证失败",t.DATA_ERROR_COORDINATE="格式类型验证失败,必须是坐标",t.DATA_ERROR_COLOR="格式类型验证失败,必须是颜色代码",t.DATA_ERROR_GEOJSON="格式类型验证失败,必须是GeoJSON",t))(a||{}),i=(t=>(t.SUPER_MAP_IMAGES="SuperMapImages",t.SUPER_MAP_DATA="SuperMapData",t.ARC_GIS_MAP_IMAGES="ArcGisMapImages",t.ARC_GIS_MAP_DATA="ArcGisMapData",t.OSGB_LAYER="OSGBLayer",t.S3M_GROUP="S3MGroup",t.TERRAIN_LAYER="TerrainFileLayer",t))(i||{}),o=(t=>(t.POINT="point",t.POLYLINE="polyline",t.POLYGON="polygon",t.BILLBOARD="billboard",t.CYLINDER="cylinder",t.ELLIPSOID="ellipsoid",t.LABEL="label",t.MODEL="model",t.WALL="wall",t))(o||{}),l=(t=>(t.DASH="10,5",t.DOT="3",t.DASHDOT="10,3,3,3",t.DASHDOTDOT="10,3,3,3,3,3",t))(l||{}),c=(t=>(t.DISTANCE="distance",t.AREA="area",t.HEIGHT="height",t))(c||{}),h=(t=>(t.ADD="add",t.REMOVE="remove",t.INIT="init",t))(h||{});const u={getDataType:t=>Object.prototype.toString.call(t).slice(8,-1),asArray(t){return this.isEmpty(t)?[]:Array.isArray(t)?t:[t]},asNumber:t=>Number.isNaN(Number(t))?0:Number(t),asString(t){if(this.isEmpty(t))return"";switch(this.getDataType(t)){case"Object":case"Array":return JSON.stringify(t);default:return t}},isEmpty(t){if(null==t)return!0;switch(this.getDataType(t)){case"String":return""===t.trim();case"Array":return!t.length;case"Object":return!Object.keys(t).length;case"Boolean":return!t;default:return!1}},json2form(t){const e=new FormData;return Object.keys(t).forEach((n=>{e.append(n,t[n]instanceof Object?JSON.stringify(t[n]):t[n])})),e},guid(){const t=function(){return(65536*(1+Math.random())|0).toString(16).substring(1)};return t()+t()+t()+t()+t()+t()+t()+t()},decodeDict(...t){let e="";if(t.length>1){const n=t.slice(1,t.length%2==0?t.length-1:t.length);for(let r=0;r<n.length;r+=2){const s=n[r];t[0]===s&&(e=n[r+1])}e||t.length%2!=0||(e=t[t.length-1])}else e=t[0];return e},extend(t,...e){let n,r,s,a;for(r=0,s=e.length;r<s;r++)for(n in a=e[r],a)t[n]=a[n];return t},convertToTree2(t,e="id",n="parentId",r="children"){const s=[];function a(i){const o=t.filter((t=>t[n]===i[e])).map((t=>(s.some((n=>n[e]===t[e]))||a(t),t)));o.length>0&&(i[r]=o)}return t.forEach((r=>{t.some((t=>t[n]===r[e]))||(a(r),s.push(r))})),s},asyncLoadScript:t=>new Promise(((e,n)=>{try{const r=document.createElement("script");r.type="text/javascript",r.src=t,"readyState"in r?r.onreadystatechange=function(){"complete"!==r.readyState&&"loaded"!==r.readyState||e(r)}:(r.onload=function(){e(r)},r.onerror=function(){n(new Error("Script failed to load for URL: "+t))}),document.body.appendChild(r)}catch(r){n(r)}})),loadStyle(t){t.forEach((t=>{const e=document.createElement("link");e.href=t,e.rel="stylesheet",e.type="text/css",e.onerror=function(){console.error(`Style loading failed for URL: ${t}`)},document.head.appendChild(e)}))},template:(t,e)=>t.replace(/\{ *([\w_-]+) *\}/g,((t,n)=>{const r=e[n];if(void 0===r)throw new Error(`${a.JSON_VALUE_ERROR}: ${t}`);return"function"==typeof r?r(e):r})),deleteEmptyProperty(t){return Object.fromEntries(Object.keys(t).filter((e=>!this.isEmpty(t[e]))).map((e=>[e,t[e]])))},deepAssign(t,...e){"object"==typeof t&&null!==t||(t={});for(const n of e)if("object"==typeof n&&null!==n)for(const e in n)Object.prototype.hasOwnProperty.call(n,e)&&("object"==typeof n[e]&&null!==n[e]?(t[e]||(t[e]=Array.isArray(n[e])?[]:{}),this.deepAssign(t[e],n[e])):t[e]=n[e]);return t},handleCopyValue(t){if(navigator.clipboard&&window.isSecureContext)return navigator.clipboard.writeText(t);{const e=document.createElement("textarea");return e.style.position="fixed",e.style.top=e.style.left="-100vh",e.style.opacity="0",e.value=t,document.body.appendChild(e),e.focus(),e.select(),new Promise(((t,n)=>{try{document.execCommand("copy"),t()}catch(r){n(new Error("copy failed"))}finally{e.remove()}}))}},isArray:t=>Array.isArray(t),isObject:t=>Object.prototype.toString.call(t).indexOf("Object")>-1,isNil:t=>void 0===t||"undefined"===t||null===t||"null"===t,isNumber:t=>"number"==typeof t&&!isNaN(t)||"string"==typeof t&&Number.isFinite(+t),isFunction(t){return!this.isNil(t)&&("function"==typeof t||null!==t.constructor&&t.constructor===Function)},isElement:t=>"object"==typeof t&&1===t.nodeType,checheVersion:(t,e)=>t.replace(/[^0-9]/gi,"")<e.replace(/[^0-9]/gi,"")},d={deepClone:t=>structuredClone(t),isEqual:(t,e)=>JSON.stringify(t)===JSON.stringify(e),parse:t=>t&&"string"==typeof t?JSON.parse(t):t},p={emptyImageUrl:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",getURL(t){let e,n;if(/^data:/i.test(t.src))return t.src;if("undefined"==typeof HTMLCanvasElement)return t.src;if(t instanceof HTMLCanvasElement)n=t;else{void 0===e&&(e=document.createElementNS("http://www.w3.org/1999/xhtml","canvas")),e.width=t.width,e.height=t.height;const r=e.getContext("2d");r&&(t instanceof ImageData?r.putImageData(t,0,0):r.drawImage(t,0,0,t.width,t.height)),n=e}return n.width>2048||n.height>2048?(console.warn("ImageUtil.getDataURL: Image converted to jpg for performance reasons",t),n.toDataURL("image/jpeg",.6)):n.toDataURL("image/png")},getBase64(t){return new Promise(((e,n)=>{let r=new Image;r.setAttribute("crossOrigin","Anonymous"),r.src=t,r.onload=()=>{let t=this.getURL(r);e(t)},r.onerror=n}))},parseBase64(t){let e=new RegExp("data:(?<type>.*?);base64,(?<data>.*)").exec(t);return e&&e.groups?{type:e.groups.type,ext:e.groups.type.split("/").slice(-1)[0],data:e.groups.data}:null},async copyImage(t){try{const e=await this.getBase64(t),n=this.parseBase64(e.dataURL);if(!n)throw new Error("Failed to parse base64 data.");let r=n.type,s=atob(n.data),a=new ArrayBuffer(s.length),i=new Uint8Array(a);for(let t=0;t<s.length;t++)i[t]=s.charCodeAt(t);let o=new Blob([a],{type:r});await navigator.clipboard.write([new ClipboardItem({[r]:o})])}catch(e){console.error("Failed to copy image to clipboard:",e)}}},g={jsonp(t,e){const n="_jsonp_"+u.guid(),r=document.getElementsByTagName("head")[0];t.includes("?")?t+="&callback="+n:t+="?callback="+n;let s=document.createElement("script");s.type="text/javascript",s.src=t,window[n]=function(t){e(null,t),r.removeChild(s),s=null,delete window[n]},r.appendChild(s)},get(t,e,n){if(u.isFunction(e)){const t=n;n=e,e=t}const r=this._getClient(n);if(r.open("GET",t,!0),e){for(const t in e.headers)r.setRequestHeader(t,e.headers[t]);r.withCredentials="include"===e.credentials,e.responseType&&(r.responseType=e.responseType)}return r.send(null),r},post(t,e={},n){let r;if("string"!=typeof t?(n=e.cb,r=e.postData,delete(e={...e}).cb,delete e.postData,t=e.url):("function"==typeof e&&(n=e,e={}),r=e.postData),!n)throw new Error("Callback function is required");const s=this._getClient(n);return s.open("POST",t,!0),e.headers=e.headers||{},e.headers["Content-Type"]||(e.headers["Content-Type"]="application/x-www-form-urlencoded"),Object.keys(e.headers).forEach((t=>{s.setRequestHeader(t,e.headers[t])})),"string"!=typeof r&&(r=JSON.stringify(r)),s.send(r),s},_wrapCallback:(t,e)=>function(){if(4===t.readyState)if(200===t.status)if("arraybuffer"===t.responseType){0===t.response.byteLength?e(new Error("http status 200 returned without content.")):e(null,{data:t.response,cacheControl:t.getResponseHeader("Cache-Control"),expires:t.getResponseHeader("Expires"),contentType:t.getResponseHeader("Content-Type")})}else e(null,t.responseText);else e(new Error(t.statusText+","+t.status))},_getClient(t){let e=null;try{e=new XMLHttpRequest}catch(n){throw new Error("XMLHttpRequest not supported.")}return e&&(e.onreadystatechange=this._wrapCallback(e,t)),e},getArrayBuffer(t,e,n){if(u.isFunction(e)){const t=n;n=e,e=t}return e||(e={}),e.responseType="arraybuffer",this.get(t,e,n)},getImage(t,e,n){return this.getArrayBuffer(e,n,((e,n)=>{if(e)t.onerror&&t.onerror(e);else if(n){const e=window.URL||window.webkitURL,r=t.onload;t.onload=()=>{r&&r(),e.revokeObjectURL(t.src)};const s=new Blob([new Uint8Array(n.data)],{type:n.contentType});t.cacheControl=n.cacheControl,t.expires=n.expires,t.src=n.data.byteLength?e.createObjectURL(s):p.emptyImageUrl}}))},getJSON(t,e,n){if(u.isFunction(e)){const t=n;n=e,e=t}const r=function(t,e){const r=e?d.parse(e):null;n&&n(t,r)};return e&&e.jsonp?this.jsonp(t,r):this.get(t,e,r)}},f={DEG2RAD:Math.PI/180,RAD2DEG:180/Math.PI,randInt:(t,e)=>t+Math.floor(Math.random()*(e-t+1)),randFloat:(t,e)=>t+Math.random()*(e-t),deg2Rad(t){return t*this.DEG2RAD},rad2Deg(t){return t*this.RAD2DEG},round:(t,e=2)=>Math.round(t*Math.pow(10,e))/Math.pow(10,e),clamp:(t,e,n)=>Math.max(e,Math.min(n,t))},m={toRadian:Math.PI/180,R:6371393,isLnglat:(t,e)=>!isNaN(t)&&!isNaN(e)&&!!(+e>-90&&+e<90&&+t>-180&&+t<180),distance:(t,e)=>Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2)),distanceByPoints(t,e){const{lng:n,lat:r}=t,{lng:s,lat:a}=e;let i=Math.cos(r*Math.PI/180)*Math.cos(a*Math.PI/180)*Math.cos((n-s)*Math.PI/180)+Math.sin(r*Math.PI/180)*Math.sin(a*Math.PI/180);i>1&&(i=1),i<-1&&(i=-1);return 6371e3*Math.acos(i)},formatLnglat(t,e){let n="";function r(t){const e=Math.floor(t),n=Math.floor(60*(t-e));return`${e}°${n}′${(3600*(t-e)-60*n).toFixed(2)}″`}return this.isLnglat(t,e)?n=r(t)+","+r(e):isNaN(t)?isNaN(e)||(n=r(e)):n=r(t),n},transformLnglat(t,e){function n(t){let e=/[sw]/i.test(t)?-1:1;const n=t.match(/[\d.]+/g)||[];let r=0;for(let s=0;s<n.length;s++)r+=parseFloat(n[s])/e,e*=60;return r}if(t&&e)return{lng:n(t),lat:n(e)}},rayCasting(t,e){for(var n=t.x,r=t.y,s=!1,a=0,i=e.length,o=i-1;a<i;o=a,a++){var l=e[a].x,c=e[a].y,h=e[o].x,u=e[o].y;if(l===n&&c===r||h===n&&u===r)return"on";if(c<r&&u>=r||c>=r&&u<r){var d=l+(r-c)*(h-l)/(u-c);if(d===n)return"on";d>n&&(s=!s)}}return s?"in":"out"},rotatePoint:(t,e,n)=>({x:(t.x-e.x)*Math.cos(Math.PI/180*-n)-(t.y-e.y)*Math.sin(Math.PI/180*-n)+e.x,y:(t.x-e.x)*Math.sin(Math.PI/180*-n)+(t.y-e.y)*Math.cos(Math.PI/180*-n)+e.y}),calcBearAndDis(t,e){const{x:n,y:r}=t,{x:s,y:a}=e,i=s-n,o=a-r,l=Math.sqrt(i*i+o*o);return{angle:(Math.atan2(o,i)*(180/Math.PI)+360+90)%360,distance:l}},calcBearAndDisByPoints(t,e){var n=1*t.lat,r=1*t.lng,s=1*e.lat,a=1*e.lng,i=Math.sin((a-r)*this.toRadian)*Math.cos(s*this.toRadian),o=Math.cos(n*this.toRadian)*Math.sin(s*this.toRadian)-Math.sin(n*this.toRadian)*Math.cos(s*this.toRadian)*Math.cos((a-r)*this.toRadian),l=Math.atan2(i,o)*(180/Math.PI),c=(s-n)*this.toRadian,h=(a-r)*this.toRadian,u=Math.sin(c/2)*Math.sin(c/2)+Math.cos(n*this.toRadian)*Math.cos(s*this.toRadian)*Math.sin(h/2)*Math.sin(h/2),d=2*Math.atan2(Math.sqrt(u),Math.sqrt(1-u));return{angle:l,distance:this.R*d}},distanceToSegment(t,e,n){const r=t.x,s=t.y,a=e.x,i=e.y,o=n.x,l=n.y,c=(o-a)*(r-a)+(l-i)*(s-i);if(c<=0)return Math.sqrt((r-a)*(r-a)+(s-i)*(s-i));const h=(o-a)*(o-a)+(l-i)*(l-i);if(c>=h)return Math.sqrt((r-o)*(r-o)+(s-l)*(s-l));const u=c/h,d=a+(o-a)*u,p=i+(l-i)*u;return Math.sqrt((r-d)*(r-d)+(s-p)*(s-p))},calcPointByBearAndDis(t,e,n){const r=f.deg2Rad(1*t.lat),s=f.deg2Rad(1*t.lng),a=n/this.R;e=f.deg2Rad(e);const i=Math.asin(Math.sin(r)*Math.cos(a)+Math.cos(r)*Math.sin(a)*Math.cos(e)),o=s+Math.atan2(Math.sin(e)*Math.sin(a)*Math.cos(r),Math.cos(a)-Math.sin(r)*Math.sin(i));return{lat:f.rad2Deg(i),lng:f.rad2Deg(o)}},mercatorTolonlat(t,e){var n=e/20037508.34*180;return{lng:t/20037508.34*180,lat:180/Math.PI*(2*Math.atan(Math.exp(n*Math.PI/180))-Math.PI/2)}},lonlatToMercator(t,e){var n=6378137;const r=t*Math.PI/180*n;var s=e*Math.PI/180;return{x:r,y:3189068.5*Math.log((1+Math.sin(s))/(1-Math.sin(s)))}},interpolate:({x:t,y:e,z:n=0},{x:r,y:s,z:a=0},i)=>({x:t+(r-t)*i,y:e+(s-e)*i,z:n+(a-n)*i})},y={checkStr(t,e){switch(e){case"phone":return/^1[3|4|5|6|7|8|9][0-9]{9}$/.test(t);case"tel":return/^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/.test(t);case"card":return/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(t);case"pwd":return/^[a-zA-Z]\w{5,17}$/.test(t);case"postal":return/[1-9]\d{5}(?!\d)/.test(t);case"QQ":return/^[1-9][0-9]{4,9}$/.test(t);case"email":return/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(t);case"money":return/^\d*(?:\.\d{0,2})?$/.test(t);case"URL":return/(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/.test(t);case"IP":return/((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))/.test(t);case"date":return/^(\d{4})\-(\d{2})\-(\d{2}) (\d{2})(?:\:\d{2}|:(\d{2}):(\d{2}))$/.test(t)||/^(\d{4})\-(\d{2})\-(\d{2})$/.test(t);case"number":return/^[0-9]$/.test(t);case"english":return/^[a-zA-Z]+$/.test(t);case"chinese":return/^[\u4E00-\u9FA5]+$/.test(t);case"lower":return/^[a-z]+$/.test(t);case"upper":return/^[A-Z]+$/.test(t);case"HTML":return/<("[^"]*"|'[^']*'|[^'">])*>/.test(t);default:return!0}},changeCase(t,e){switch(e=e||4){case 1:return t.replace(/\b\w+\b/g,(function(t){return t.substring(0,1).toUpperCase()+t.substring(1).toLowerCase()}));case 2:return t.replace(/\b\w+\b/g,(function(t){return t.substring(0,1).toLowerCase()+t.substring(1).toUpperCase()}));case 3:return t.split("").map((function(t){return/[a-z]/.test(t)?t.toUpperCase():t.toLowerCase()})).join("");case 4:return t.toUpperCase();case 5:return t.toLowerCase();default:return t}},tag:(t,...e)=>(e=e.map((t=>{switch(u.getDataType(t)){case"Object":return t||"{}";case"Array":return t||"[]";default:return t||""}})),t.reduce(((t,n,r)=>`${t}${e[r-1]}${n}`))),getByteLength:t=>t.replace(/[\u0391-\uFFE5]/g,"aa").length,subStringByte(t,e,n){var r=/[^\x00-\xff]/g;if(t.replace(r,"mm").length<=n)return t;for(var s=Math.floor(n/2);s<t.length;s++){let a=t.substring(e,s);if(a.replace(r,"mm").length>=n)return a}return t}},E=["Point","MultiPoint","LineString","MultiLineString","Polygon","MultiPolygon"],M={getGeoJsonType:t=>t.geometry?t.geometry.type:null,isGeoJson(t){const e=this.getGeoJsonType(t);if(e)for(let n=0,r=E.length;n<r;n++)if(E[n]===e)return!0;return!1},isGeoJsonPolygon(t){const e=this.getGeoJsonType(t);return!(!e||e!==E[4]&&e!==E[5])},isGeoJsonLine(t){const e=this.getGeoJsonType(t);return!(!e||e!==E[2]&&e!==E[3])},isGeoJsonPoint(t){const e=this.getGeoJsonType(t);return!(!e||e!==E[0]&&e!==E[1])},isGeoJsonMulti(t){const e=this.getGeoJsonType(t);return!!(e&&e.indexOf("Multi")>-1)},getGeoJsonCoordinates:t=>t.geometry?t.geometry.coordinates:[],getGeoJsonCenter(t,e){const n=this.getGeoJsonType(t);if(!n||!t.geometry)return null;const r=t.geometry.coordinates;if(!r)return null;let s=0,a=0,i=0;switch(n){case"Point":s=r[0],a=r[1],i++;break;case"MultiPoint":case"LineString":for(let t=0,e=r.length;t<e;t++)s+=r[t][0],a+=r[t][1],i++;break;case"MultiLineString":case"Polygon":for(let t=0,e=r.length;t<e;t++)for(let n=0,o=r[t].length;n<o;n++)s+=r[t][n][0],a+=r[t][n][1],i++;break;case"MultiPolygon":for(let t=0,e=r.length;t<e;t++)for(let n=0,o=r[t].length;n<o;n++)for(let e=0,l=r[t][n].length;e<l;e++)s+=r[t][n][e][0],a+=r[t][n][e][1],i++}const o=s/i,l=a/i;return e?(e.x=o,e.y=l,e):{x:o,y:l}},spliteGeoJsonMulti(t){const e=this.getGeoJsonType(t);if(!e||!t.geometry)return null;const n=t.geometry,r=t.properties||{},s=n.coordinates;if(!s)return null;const a=[];let i;switch(e){case"MultiPoint":i="Point";break;case"MultiLineString":i="LineString";break;case"MultiPolygon":i="Polygon"}if(i)for(let o=0,l=s.length;o<l;o++)a.push({type:"Feature",geometry:{type:i,coordinates:s[o]},properties:r});else a.push(t);return a},getGeoJsonByCoordinates(t){if(!Array.isArray(t))throw Error("coordinates 参数格式错误");let e;if(2===t.length&&"number"==typeof t[0]&&"number"==typeof t[1])e="Point";else if(Array.isArray(t[0])&&2===t[0].length)e="LineString";else{if(!Array.isArray(t[0])||!Array.isArray(t[0][0]))throw Error("coordinates 参数格式错误");{const n=t[0];if(n[0].join(",")===n[n.length-1].join(","))e="Polygon";else{if(!(t.length>1))throw Error("coordinates 参数格式错误");e="MultiPolygon"}}}return{type:"Feature",geometry:{type:e,coordinates:t}}}},R={assertEmpty(...t){t.forEach((t=>{if(u.isEmpty(t))throw Error(a.PARAMETER_ERROR_LACK+" -> "+t)}))},assertNumber(...t){t.forEach((t=>{if(!u.isNumber(t))throw Error(a.PARAMETER_ERROR_NUMBER+" -> "+t)}))},assertArray(...t){t.forEach((t=>{if(!u.isArray(t))throw Error(a.PARAMETER_ERROR_ARRAY+" -> "+t)}))},assertFunction(...t){t.forEach((t=>{if(!u.isFunction(t))throw Error(a.PARAMETER_ERROR_FUNCTION+" -> "+t)}))},assertObject(...t){t.forEach((t=>{if(!u.isObject(t))throw Error(a.PARAMETER_ERROR_OBJECT+" -> "+t)}))},assertColor(...t){t.forEach((t=>{if(!v.isColor(t))throw Error(a.DATA_ERROR_COLOR+" -> "+t)}))},assertLnglat(...t){t.forEach((t=>{if(!m.isLnglat(t.lng,t.lat))throw Error(a.DATA_ERROR_COORDINATE+" -> "+t)}))},assertGeoJson(...t){t.forEach((t=>{if(!M.isGeoJson(t))throw Error(a.DATA_ERROR_GEOJSON+" -> "+t)}))},assertContain(t,...e){let n=!1;for(let r=0,s=e.length||0;r<s;r++)n=t.indexOf(e[r])>=0;if(n)throw Error(a.STRING_CHECK_LOSS+" -> "+t)},assertLegal(t,e){const n=y.checkStr(t,e);let r="";switch(e){case"phone":r="电话";break;case"tel":r="座机";break;case"card":r="身份证";break;case"pwd":r="密码";break;case"postal":r="邮政编码";break;case"QQ":r="QQ";break;case"email":r="邮箱";break;case"money":r="金额";break;case"URL":r="网址";break;case"IP":r="IP";break;case"date":r="日期时间";break;case"number":r="数字";break;case"english":r="英文";break;case"chinese":r="中文";break;case"lower":r="小写";break;case"upper":r="大写";break;case"HTML":r="HTML标记"}if(!n)throw Error(a.DATA_ERROR+" -> 不是"+r)}},w=Object.create(Array);w.groupBy=function(t){var e={};return this.forEach((function(n){var r=JSON.stringify(t(n));e[r]=e[r]||[],e[r].push(n)})),Object.keys(e).map((t=>e[t]))},w.distinct=function(t=t=>t){const e=[],n={};return this.forEach((r=>{const s=t(r),a=String(s);n[a]||(n[a]=!0,e.push(r))})),e},w.prototype.max=function(){return Math.max.apply({},this)},w.prototype.min=function(){return Math.min.apply({},this)},w.sum=function(){return this.length>0?this.reduce(((t=0,e=0)=>t+e)):0},w.avg=function(){return this.length?this.sum()/this.length:0},w.desc=function(t=t=>t){return this.sort(((e,n)=>t(n)-t(e)))},w.asc=function(t=t=>t){return this.sort(((e,n)=>t(e)-t(n)))},w.random=function(){return this[Math.floor(Math.random()*this.length)]},w.remove=function(t){const e=this.indexOf(t);return e>-1&&this.splice(e,1),this};const A={create:t=>[...new Array(t).keys()],union(...t){let e=[];return t.forEach((t=>{Array.isArray(t)&&(e=e.concat(t.filter((t=>!e.includes(t)))))})),e},intersection(...t){let e=t[0]||[];return t.forEach((t=>{Array.isArray(t)&&(e=e.filter((e=>t.includes(e))))})),e},unionAll:(...t)=>[...t].flat().filter((t=>!!t)),difference(...t){return 0===t.length?[]:this.union(...t).filter((e=>!this.intersection(...t).includes(e)))}},b={getExplorer(){var t=window.navigator.userAgent;return t.indexOf("MSIE")>=0||/Trident\//.test(t)?"IE":t.indexOf("Firefox")>=0?"Firefox":t.indexOf("Chrome")>=0?"Chrome":t.indexOf("Opera")>=0?"Opera":t.indexOf("Safari")>=0&&-1===t.indexOf("Chrome")?"Safari":"Unknown"},detectOS(){let t="";const e=-1!=navigator.userAgent.indexOf("Windows",0)?1:0,n=-1!=navigator.userAgent.indexOf("mac",0)?1:0,r=-1!=navigator.userAgent.indexOf("Linux",0)?1:0,s=-1!=navigator.userAgent.indexOf("X11",0)?1:0;return e?t="MS Windows":n?t="Apple mac":r?t="Linux":s&&(t="Unix"),t},switchFullScreen(t){if(t){const t=document.documentElement;t.requestFullscreen?t.requestFullscreen():"msRequestFullscreen"in t?t.msRequestFullscreen():"mozRequestFullScreen"in t?t.mozRequestFullScreen():"webkitRequestFullscreen"in t&&t.webkitRequestFullscreen()}else document.exitFullscreen?document.exitFullscreen():"msExitFullscreen"in document?document.msExitFullscreen():"mozCancelFullScreen"in document?document.mozCancelFullScreen():"webkitExitFullscreen"in document&&document.webkitExitFullscreen()},refreshScale(){const t=document.documentElement.clientWidth||0,e=document.documentElement.clientHeight||0,n=document.getElementById("app");if(!n)return;const r=n.style;let s=t/1920;t/e>16/9&&(s=e/1080),r.transformOrigin="left top",r.transform=`scale(${s}) translateX(-49.99%)`,r.width=t/s+"px"},getHtmlFontSize(){const t=document.documentElement.clientWidth||document.body.clientWidth,e=document.querySelector("html");e&&(e.style.fontSize=t/192+"px")}},_={PI:3.141592653589793,XPI:52.35987755982988,delta(t,e){const n=6378245,r=.006693421622965943;let s=this.transformLat(e-105,t-35),a=this.transformLon(e-105,t-35);const i=t/180*this.PI;let o=Math.sin(i);o=1-r*o*o;const l=Math.sqrt(o);return s=180*s/(n*(1-r)/(o*l)*this.PI),a=180*a/(n/l*Math.cos(i)*this.PI),{lat:s,lng:a}},outOfChina:(t,e)=>t<72.004||t>137.8347||(e<.8293||e>55.8271),gcjEncrypt(t,e){if(this.outOfChina(t,e))return{lat:t,lng:e};const n=this.delta(t,e);return{lat:t+n.lat,lng:e+n.lng}},gcjDecrypt(t,e){if(this.outOfChina(t,e))return{lat:t,lng:e};const n=this.delta(t,e);return{lat:t-n.lat,lng:e-n.lng}},gcjDecryptExact(t,e){let n=.01,r=.01,s=t-n,a=e-r,i=t+n,o=e+r,l=0,c=0,h=0;for(;;){l=(s+i)/2,c=(a+o)/2;const u=this.gcjEncrypt(l,c);if(n=u.lat-t,r=u.lng-e,Math.abs(n)<1e-9&&Math.abs(r)<1e-9)break;if(n>0?i=l:s=l,r>0?o=c:a=c,++h>1e4)break}return{lat:l,lng:c}},bdEncrypt(t,e){const n=e,r=t,s=Math.sqrt(n*n+r*r)+2e-5*Math.sin(r*this.XPI),a=Math.atan2(r,n)+3e-6*Math.cos(n*this.XPI),i=s*Math.cos(a)+.0065;return{lat:s*Math.sin(a)+.006,lng:i}},bdDecrypt(t,e){const n=e-.0065,r=t-.006,s=Math.sqrt(n*n+r*r)-2e-5*Math.sin(r*this.XPI),a=Math.atan2(r,n)-3e-6*Math.cos(n*this.XPI),i=s*Math.cos(a);return{lat:s*Math.sin(a),lng:i}},mercatorEncrypt(t,e){const n=20037508.34*e/180;let r=Math.log(Math.tan((90+t)*this.PI/360))/(this.PI/180);return r=20037508.34*r/180,{lat:r,lng:n}},mercatorDecrypt(t,e){const n=e/20037508.34*180;let r=t/20037508.34*180;return r=180/this.PI*(2*Math.atan(Math.exp(r*this.PI/180))-this.PI/2),{lat:r,lng:n}},transformLat(t,e){let n=2*t-100+3*e+.2*e*e+.1*t*e+.2*Math.sqrt(Math.abs(t));return n+=2*(20*Math.sin(6*t*this.PI)+20*Math.sin(2*t*this.PI))/3,n+=2*(20*Math.sin(e*this.PI)+40*Math.sin(e/3*this.PI))/3,n+=2*(160*Math.sin(e/12*this.PI)+320*Math.sin(e*this.PI/30))/3,n},transformLon(t,e){let n=300+t+2*e+.1*t*t+.1*t*e+.1*Math.sqrt(Math.abs(t));return n+=2*(20*Math.sin(6*t*this.PI)+20*Math.sin(2*t*this.PI))/3,n+=2*(20*Math.sin(t*this.PI)+40*Math.sin(t/3*this.PI))/3,n+=2*(150*Math.sin(t/12*this.PI)+300*Math.sin(t/30*this.PI))/3,n},random:({x:t,y:e},{x:n,y:r})=>({x:Math.random()*(n-t)+t,y:Math.random()*(r-e)+e}),deCompose(t,e,n){if(!Array.isArray(t))return n?e.call(n,t):e(t);const r=[];let s,a;for(let i=0,o=t.length;i<o;i++)s=t[i],u.isNil(s)?r.push(null):Array.isArray(s)?r.push(this.deCompose(s,e,n)):(a=n?e.call(n,s):e(s),r.push(a));return r}},x=Object.create(Date);x.prototype.format=function(t="yyyy-MM-dd hh:mm:ss"){const e={"M+":this.getMonth()+1,"d+":this.getDate(),"h+":this.getHours()%12,"H+":this.getHours(),"m+":this.getMinutes(),"s+":this.getSeconds(),"q+":Math.floor((this.getMonth()+3)/3),S:this.getMilliseconds()};/(y+)/.test(t)&&(t=t.replace(RegExp.$1,(this.getFullYear()+"").substr(4-RegExp.$1.length)));for(const n in e)if(new RegExp("("+n+")").test(t)){const r=1===n.length?1:Number(n.slice(1));t=t.replace(RegExp.$1,("00"+e[n]).substr((""+e[n]).length+r-(e[n]+"").length))}return t},x.prototype.addDate=function(t,e){const n=new Date(this);switch(t){case"y":n.setFullYear(this.getFullYear()+e);break;case"q":n.setMonth(this.getMonth()+3*e);break;case"M":n.setMonth(this.getMonth()+e);break;case"w":n.setDate(this.getDate()+7*e);break;case"d":default:n.setDate(this.getDate()+e);break;case"h":n.setHours(this.getHours()+e);break;case"m":n.setMinutes(this.getMinutes()+e);break;case"s":n.setSeconds(this.getSeconds()+e)}return n};const O={lastMonthDate:new Date((new Date).getFullYear(),(new Date).getMonth()-1,1),thisMonthDate:new Date((new Date).getFullYear(),(new Date).getMonth(),1),nextMonthDate:new Date((new Date).getFullYear(),(new Date).getMonth()+1,1),lastWeekDate:new Date((new Date).getFullYear(),(new Date).getMonth(),(new Date).getDate()+1-7-(new Date).getDay()),thisWeekDate:new Date((new Date).getFullYear(),(new Date).getMonth(),(new Date).getDate()+1-(new Date).getDay()),nextWeekDate:new Date((new Date).getFullYear(),(new Date).getMonth(),(new Date).getDate()+1+7-(new Date).getDay()),lastDayDate:new Date((new Date).getFullYear(),(new Date).getMonth(),(new Date).getDate()-1),thisDayDate:new Date((new Date).setHours(0,0,0,0)),nextDayDate:new Date((new Date).getFullYear(),(new Date).getMonth(),(new Date).getDate()+1),parseDate(t){if("string"==typeof t){var e=t.match(/^ *(\d{4})-(\d{1,2})-(\d{1,2}) *$/);if(e&&e.length>3)return new Date(parseInt(e[1]),parseInt(e[2])-1,parseInt(e[3]));if((e=t.match(/^ *(\d{4})-(\d{1,2})-(\d{1,2}) +(\d{1,2}):(\d{1,2}):(\d{1,2}) *$/))&&e.length>6)return new Date(parseInt(e[1]),parseInt(e[2])-1,parseInt(e[3]),parseInt(e[4]),parseInt(e[5]),parseInt(e[6]));if((e=t.match(/^ *(\d{4})-(\d{1,2})-(\d{1,2}) +(\d{1,2}):(\d{1,2}):(\d{1,2})\.(\d{1,9}) *$/))&&e.length>7)return new Date(parseInt(e[1]),parseInt(e[2])-1,parseInt(e[3]),parseInt(e[4]),parseInt(e[5]),parseInt(e[6]),parseInt(e[7]))}return null},formatDateInterval(t,e){const n=new Date(t),r=new Date(e).getTime()-n.getTime(),s=Math.floor(r/864e5),a=r%864e5,i=Math.floor(a/36e5),o=a%36e5,l=Math.floor(o/6e4),c=o%6e4,h=Math.round(c/1e3);let u="";return s>0&&(u+=s+"天"),i>0&&(u+=i+"时"),l>0&&(u+=l+"分"),h>0&&(u+=h+"秒"),0===s&&0===i&&0===l&&0===h&&(u="少于1秒"),u},formatterCounter(t){const e=function(t){return(t>10?"":"0")+(t||0)},n=t%3600,r=n%60;return`${e(Math.floor(t/3600))}:${e(Math.floor(n/60))}:${e(Math.round(r))}`},sleep(t){}};function C(t){return function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}(t).split(/\s+/)}const S={getStyle(t,e){var n;let r=t.style[e];if(!r||"auto"===r){const s=null==(n=document.defaultView)?void 0:n.getComputedStyle(t,null);r=s?s[e]:null,"auto"===r&&(r=null)}return r},create(t,e,n){const r=document.createElement(t);return r.className=e||"",n&&n.appendChild(r),r},remove(t){const e=t.parentNode;e&&e.removeChild(t)},empty(t){for(;t.firstChild;)t.removeChild(t.firstChild)},toFront(t){const e=t.parentNode;e&&e.lastChild!==t&&e.appendChild(t)},toBack(t){const e=t.parentNode;e&&e.firstChild!==t&&e.insertBefore(t,e.firstChild)},getClass:t=>((null==t?void 0:t.host)||t).className.toString(),hasClass(t,e){var n;if(null==(n=t.classList)?void 0:n.contains(e))return!0;const r=this.getClass(t);return r.length>0&&new RegExp(`(^|\\s)${e}(\\s|$)`).test(r)},addClass(t,e){if(void 0!==t.classList){const n=C(e);for(let e=0,r=n.length;e<r;e++)t.classList.add(n[e])}else if(!this.hasClass(t,e)){const n=this.getClass(t);this.setClass(t,(n?n+" ":"")+e)}},removeClass(t,e){if(void 0!==t.classList){C(e).forEach((e=>t.classList.remove(e)))}else this.setClass(t,(" "+this.getClass(t)+" ").replace(" "+e+" "," ").trim())},setClass(t,e){"classList"in t&&(t.classList.value="",e.split(" ").forEach((e=>t.classList.add(e))))},parseFromString:t=>(new DOMParser).parseFromString(t,"text/xml").children[0]},T={convertBase64ToBlob(t){const e=t.split(",")[0].split(":")[1].split(";")[0],n=atob(t.split(",")[1]),r=new Array(n.length);for(let a=0;a<n.length;a++)r[a]=n.charCodeAt(a);const s=new Uint8Array(r);return new Blob([s],{type:e})},convertBase64ToFile(t,e){const n=t.split(","),r=n[0].match(/:(.*?);/),s=r?r[1]:"image/png",a=atob(n[1]),i=new Uint8Array(a.length);for(let o=0;o<a.length;o++)i[o]=a.charCodeAt(o);return new File([i],e,{type:s})},downloadFromFile(t,e){if("object"==typeof t)if(t instanceof Blob)t=URL.createObjectURL(t);else{const e=JSON.stringify(t),n=new Blob([e],{type:"text/json"});t=window.URL.createObjectURL(n)}else if("string"==typeof t&&-1===t.indexOf("http")){const e=new Blob([t],{type:"text/json"});t=window.URL.createObjectURL(e)}var n=document.createElement("a");n.href=t,n.download=e||"",n.click(),window.URL.revokeObjectURL(n.href)}},D={debounce(t,e,n=!0){let r,s,a=null;const i=()=>{const o=Date.now()-r;o<e&&o>0?a=setTimeout(i,e-o):(a=null,n||(s=t.apply(this,undefined)))};return(...o)=>{r=Date.now();const l=n&&!a;return a||(a=setTimeout(i,e)),l&&(s=t.apply(this,o),a||(o=null)),s}},throttle(t,e,n=1){let r=0,s=null;return(...a)=>{if(1===n){const n=Date.now();n-r>=e&&(t.apply(this,a),r=n)}else 2===n&&(s||(s=setTimeout((()=>{s=null,t.apply(this,a)}),e)))}},memoize(t){const e=new Map;return(...n)=>{const r=JSON.stringify(n);if(e.has(r))return e.get(r);{const s=t.apply(this,n);return e.set(r,s),s}}},recurve(t,e=500,n=5e3){let r=0;setTimeout((()=>{r++,r<Math.floor(n/e)&&(t.call(this),setTimeout(this.recurve.bind(this,t,e,n),e))}),e)},once(t){let e=!1;return function(...n){if(!e)return e=!0,t(...n)}}},I={json2Query(t){var e=[];for(var n in t)if(t.hasOwnProperty(n)){var r=n,s=t[n];e.push(encodeURIComponent(r)+"="+encodeURIComponent(s))}return e.join("&")},query2Json(t=window.location.href,e=!0){const n=/([^&=]+)=([\w\W]*?)(&|$|#)/g,{search:r,hash:s}=new URL(t),a=[r,s];let i={};for(let o=0;o<a.length;o++){const t=a[o];if(t){const r=t.replace(/#|\//g,"").split("?");if(r.length>1)for(let t=1;t<r.length;t++){let s;for(;s=n.exec(r[t]);)i[s[1]]=e?decodeURIComponent(s[2]):s[2]}}}return i}};class v{constructor(t,e,n,s){r(this,"_r"),r(this,"_g"),r(this,"_b"),r(this,"_alpha"),this._validateColorChannel(t),this._validateColorChannel(e),this._validateColorChannel(n),this._r=t,this._g=e,this._b=n,this._alpha=f.clamp(s||1,0,1)}_validateColorChannel(t){if(t<0||t>255)throw new Error("Color channel must be between 0 and 255.")}get rgba(){return{r:this._r,g:this._g,b:this._b,a:this._alpha}}get hex(){return v.rgb2hex(this._r,this._g,this._b,this._alpha)}setRgb(t,e,n,r){return this._validateColorChannel(t),this._validateColorChannel(e),this._validateColorChannel(n),this._r=t,this._g=e,this._b=n,this._alpha=f.clamp(r,0,1),this}static fromRgba(t){const e=t.match(/^rgba?\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([\d.]+))?\s*\)$/);if(!e)throw new Error("Invalid RGBA color value");const n=parseInt(e[1],10),r=parseInt(e[2],10),s=parseInt(e[3],10),a=e[5]?parseFloat(e[5]):1;return new v(n,r,s,a)}static fromHex(t,e=1){const n=t.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i,((t,e,n,r)=>e+e+n+n+r+r)),r=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(n);if(!r)throw new Error("Invalid HEX color value");const s=parseInt(r[1],16),a=parseInt(r[2],16),i=parseInt(r[3],16);return new v(s,a,i,e)}static fromHsl(t){const e=/hsl\((\d+),\s*([\d.]+)%,\s*([\d.]+)%\)/g.exec(t)||/hsla\((\d+),\s*([\d.]+)%,\s*([\d.]+)%,\s*([\d.]+)\)/g.exec(t);if(!e)throw new Error("Invalid HSL color value");const n=parseInt(e[1],10)/360,r=parseInt(e[2],10)/100,s=parseInt(e[3],10)/100,a=e[4]?parseFloat(e[4]):1;function i(t,e,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?t+6*(e-t)*n:n<.5?e:n<2/3?t+(e-t)*(2/3-n)*6:t}let o,l,c;if(0===r)o=l=c=s;else{const t=s<.5?s*(1+r):s+r-s*r,e=2*s-t;o=i(e,t,n+1/3),l=i(e,t,n),c=i(e,t,n-1/3)}return new v(Math.round(255*o),Math.round(255*l),Math.round(255*c),a)}static from(t){if(this.isRgb(t))return this.fromRgba(t);if(this.isHex(t))return this.fromHex(t);if(this.isHsl(t))return this.fromHsl(t);throw new Error("Invalid color value")}static rgb2hex(t,e,n,r){var s="#"+((1<<24)+(t<<16)+(e<<8)+n).toString(16).slice(1);if(void 0!==r){return s+Math.round(255*r).toString(16).padStart(2,"0")}return s}static isHex(t){return/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(t)}static isRgb(t){return/^rgb/.test(t)}static isHsl(t){return/^hsl/.test(t)}static isColor(t){return this.isHex(t)||this.isRgb(t)||this.isHsl(t)}static random(){let t=Math.floor(256*Math.random()),e=Math.floor(256*Math.random()),n=Math.floor(256*Math.random()),r=Math.random();return new v(t,e,n,r)}}class P{constructor(){r(this,"_listeners"),r(this,"_mutex",{}),r(this,"_context")}addEventListener(t,e,n,r){void 0===this._listeners&&(this._listeners={}),this._context=n;const s=this._mutex,a=this._listeners;return void 0===a[t]&&(a[t]=[]),-1===a[t].indexOf(e)&&(r&&(s[t]=e),a[t].push(e)),this}hasEventListener(t,e){if(null===this._listeners||void 0===this._listeners)return!1;const n=this._listeners;return void 0!==n[t]&&-1!==n[t].indexOf(e)}removeEventListener(t,e){if(void 0===this._listeners)return;const n=this._listeners[t];if(this._mutex[t]===e&&(this._mutex[t]=null),void 0!==n){const t=n.map((t=>t.toString())).indexOf(e.toString());-1!==t&&n.splice(t,1)}}dispatchEvent(t){if(void 0===this._listeners)return;const e=this._listeners[t.type];if(void 0!==e){t.target=this;const n=e.slice(0);if(void 0!==this._mutex[t.type]){const e=n.find((e=>e===this._mutex[t.type]));if(e)return void e.call(this._context||this,t)}for(let e=0,r=n.length;e<r;e++){const r=n[e];"function"==typeof r&&r.call(this._context||this,t)}}}removeAllListener(){this._mutex={};for(const t in this._listeners)this._listeners[t]=[]}}class L extends Map{isEmpty(){return 0===this.size}_values(){return Array.from(this.values())}_keys(){return Array.from(this.keys())}_entries(){return Array.from(this.entries())}static fromEntries(t=[]){const e=new L;return t.forEach((t=>{Array.isArray(t)&&2===t.length&&e.set(t[0],t[1])})),e}}const k=class t extends P{constructor(n=`ws://${window.document.domain}:20007/mqtt`,s={}){super(),r(this,"state"),r(this,"url"),r(this,"context"),r(this,"options"),r(this,"client"),r(this,"topics"),this.context=u.extend(t.defaultContext,s),this.options={connectTimeout:this.context.MQTT_TIMEOUTM,clientId:u.guid(),username:this.context.MQTT_USERNAME,password:this.context.MQTT_PASSWORD,clean:!0},this.url=n,this.client=e.connect(this.url,this.options),this._onConnect(),this._onMessage(),this.state=0,this.topics=[]}_onConnect(){this.client.on("connect",(()=>{this.state=1,console.log("链接mqtt成功==>"+this.url),this.dispatchEvent({type:s.MQTT_CONNECT,message:this})})),this.client.on("error",(t=>{console.log("链接mqtt报错",t),this.state=-1,this.dispatchEvent({type:s.MQTT_ERROR,message:this}),this.client.end(),this.client.reconnect()}))}_onMessage(){this.client.on("message",((t,e)=>{let n=e,r="";e instanceof Uint8Array&&(n=e.toString());try{r=d.parse(n)}catch(i){throw new Error(a.JSON_PARSE_ERROR)}this.dispatchEvent({type:s.MQTT_MESSAGE,message:{topic:t,data:r}})}))}sendMsg(t,e){this.client.connected?this.client.publish(t,e,{qos:1,retain:!0}):console.error("客户端未连接")}subscribe(t){return 1===this.state?this.client.subscribe(t,{qos:1},((e,n)=>{e instanceof Error?console.error("订阅失败==>"+t,e):(this.topics=A.union(this.topics,t),console.log("订阅成功==>"+t))})):this.addEventListener(s.MQTT_CONNECT,(e=>{this.client.subscribe(t,{qos:1},((e,n)=>{e instanceof Error?console.error("订阅失败==>"+t,e):(this.topics=A.union(this.topics,t),console.log("订阅成功==>"+t))}))})),this}unsubscribe(t){return this.client.unsubscribe(t,{qos:1},((e,n)=>{e instanceof Error?console.error(`取消订阅失败==>${t}`,e):(this.topics=A.difference(this.topics,t),console.log(`取消订阅成功==>${t}`))})),this}unsubscribeAll(){this.unsubscribe(this.topics)}unconnect(){this.client.end(),this.client=null,this.dispatchEvent({type:s.MQTT_CLOSE,message:null}),console.log("断开mqtt成功==>"+this.url)}};r(k,"defaultContext",{MQTT_USERNAME:"iRVMS-WEB",MQTT_PASSWORD:"novasky888",MQTT_TIMEOUTM:2e4});let N=k;const U=class t{static set(t,e=null,n={}){var r=this._getPrefixedKey(t,n);try{const{expires:t}=n,s={data:e};t&&(s.expires=t),localStorage.setItem(r,JSON.stringify(s))}catch(s){console&&console.warn(`Storage didn't successfully save the '{"${t}": "${e}"}' pair, because the localStorage is full.`)}}static get(t,e,n){var r,s=this._getPrefixedKey(t,n);try{r=JSON.parse(localStorage.getItem(s)||"")}catch(a){r=localStorage[s]?{data:localStorage.getItem(s)}:null}if(!r)return e;if("object"==typeof r&&void 0!==r.data){const t=r.expires;return t&&Date.now()>t?e:r.data}}static keys(){const e=[];var n=Object.keys(localStorage);return 0===t.prefix.length?n:(n.forEach((function(n){-1!==n.indexOf(t.prefix)&&e.push(n.replace(t.prefix,""))})),e)}static getAll(e){var n=t.keys();if(e){const r=[];return n.forEach((n=>{if(e.includes(n)){const e={};e[n]=t.get(n,null,null),r.push(e)}})),r}return n.map((e=>t.get(e,null,null)))}static remove(t,e){var n=this._getPrefixedKey(t,e);localStorage.removeItem(n)}static clear(e){t.prefix.length?this.keys().forEach((t=>{localStorage.removeItem(this._getPrefixedKey(t,e))})):localStorage.clear()}};r(U,"prefix",""),r(U,"_getPrefixedKey",(function(t,e){return(e=e||{}).noPrefix?t:U.prefix+t}));let F=U;t.AjaxUtil=g,t.ArrayUtil=A,t.AssertUtil=R,t.AudioPlayer=class{constructor(t){r(this,"audio"),this.audio=new Audio,this.audio.src=t}static speak(t,e={}){const n=new SpeechSynthesisUtterance;n.text=t,n.lang=e.lang||"zh-CN",n.volume=e.volume||1,n.rate=e.rate||1,n.pitch=e.pitch||1,window.speechSynthesis.speak(n)}play(){!this.muted&&this.audio.play()}pause(){this.audio.pause()}get muted(){return this.audio.muted}set muted(t){this.audio.muted=t}},t.BrowserUtil=b,t.CanvasDrawer=class{constructor(t){if(r(this,"context",null),"string"==typeof t&&!(t=document.querySelector("#"+t)))throw new Error("Element not found");if(!(t instanceof HTMLElement))throw new Error("Element is not an HTMLElement");{const e=t;if(!e.getContext)throw new Error("getContext is not available on this element");this.context=e.getContext("2d")}}drawLine({x:t,y:e},{x:n,y:r},s={}){if(!this.context)throw new Error("Canvas context is null or undefined");this.context.beginPath();const a=s.width||1,i=s.color||"#000";this.context.lineWidth=a,this.context.strokeStyle=i,this.context.moveTo(t,e),this.context.lineTo(n,r),this.context.stroke()}drawArc({x:t,y:e},n,r,s,a,i,o){if(!this.context)throw new Error("Canvas context is null or undefined");i?(this.context.fillStyle=o,this.context.beginPath(),this.context.arc(t,e,n,f.deg2Rad(r),f.deg2Rad(s),a),this.context.fill()):(this.context.strokeStyle=o,this.context.beginPath(),this.context.arc(t,e,n,f.deg2Rad(r),f.deg2Rad(s),a),this.context.stroke())}static createCanvas(t=1,e=1){const n=document.createElement("canvas");return t&&(n.width=t),e&&(n.height=e),n}},t.Color=v,t.Cookie=class{static set(t,e,n=30){if("string"!=typeof t||"string"!=typeof e||"number"!=typeof n)throw new Error("Invalid arguments");const r=new Date;r.setTime(r.getTime()+24*n*60*60*1e3),document.cookie=`${t}=${encodeURIComponent(e)};expires=${r.toUTCString()}`}static remove(t){var e=new Date;e.setTime(e.getTime()-1);var n=this.get(t);null!=n&&(document.cookie=t+"="+n+";expires="+e.toUTCString())}static get(t){var e=document.cookie.match(new RegExp("(^| )"+t+"=([^;]*)(;|$)"));return null!=e?e[2]:""}},t.CoordsUtil=_,t.DateUtil=O,t.DomUtil=S,t.ErrorType=a,t.EventDispatcher=P,t.EventType=s,t.FileUtil=T,t.GeoJsonUtil=M,t.GeoUtil=m,t.GraphicType=o,t.HashMap=L,t.ImageUtil=p,t.LayerType=i,t.LineSymbol=l,t.MathUtil=f,t.MeasureMode=c,t.MqttClient=N,t.ObjectState=h,t.ObjectUtil=d,t.OptimizeUtil=D,t.Storage=F,t.StringUtil=y,t.UrlUtil=I,t.Util=u,t.WebSocketClient=class extends P{constructor(t="ws://127.0.0.1:10088"){super(),r(this,"maxCheckTimes",10),r(this,"url"),r(this,"checkTimes",0),r(this,"connectStatus",!1),r(this,"client",null),this.maxCheckTimes=10,this.url=t,this.checkTimes=0,this.connect(),this.connCheckStatus(this.maxCheckTimes)}connect(){if(this.disconnect(),this.url)try{if(console.info("创建ws连接>>>"+this.url),this.client=new WebSocket(this.url),this.client){const t=this;this.client.onopen=function(e){t.dispatchEvent({type:s.WEB_SOCKET_CONNECT,message:e})},this.client.onmessage=function(e){t.connectStatus=!0,t.dispatchEvent({type:s.WEB_SOCKET_MESSAGE,message:e})},this.client.onclose=function(e){t.dispatchEvent({type:s.WEB_SOCKET_CLOSE,message:e})},this.checkTimes===this.maxCheckTimes&&(this.client.onerror=function(e){t.dispatchEvent({type:s.WEB_SOCKET_ERROR,message:e})})}}catch(t){console.error("创建ws连接失败"+this.url+":"+t)}}disconnect(){if(this.client)try{console.log("ws断开连接"+this.url),this.client.close(),this.client=null}catch(t){this.client=null}}connCheckStatus(t){this.checkTimes>t||setTimeout((()=>{this.checkTimes++,this.client&&0!==this.client.readyState&&1!==this.client.readyState&&this.connect(),this.connCheckStatus(t)}),2e3)}send(t){return this.client&&1===this.client.readyState?(this.client.send(t),!0):(console.error(this.url+"消息发送失败:"+t),!1)}heartbeat(){setTimeout((()=>{this.client&&1===this.client.readyState&&this.send("HeartBeat"),console.log("HeartBeat,"+this.url),setTimeout(this.heartbeat,3e4)}),1e3)}},Object.defineProperty(t,Symbol.toStringTag,{value:"Module"})}));
|
|
1
|
+
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("mqtt-browser")):"function"==typeof define&&define.amd?define(["exports","mqtt-browser"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self)["gis-common"]={},t.mqttBrowser)}(this,(function(t,e){"use strict";var n,s=Object.defineProperty,r=(t,e,n)=>((t,e,n)=>e in t?s(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n)(t,"symbol"!=typeof e?e+"":e,n),i=(t=>(t.MAP_RENDER="mapRender",t.MAP_READY="mapReady",t.MOUSE_CLICK="click",t.MOUSE_DOUBLE_CLICK="dblclick",t.MOUSE_MOVE="mousemove",t.MOUSE_IN="mousein",t.MOUSE_OUT="mouseout",t.MOUSE_RIGHT_CLICK="mouseRightClick",t.KEY_DOWN="keyDown",t.KEY_UP="keyUp",t.DRAW_ACTIVE="drawActive",t.DRAW_MOVE="drawMove",t.DRAW_COMPLETE="drawComplete",t.MQTT_CONNECT="mqttConnect",t.MQTT_ERROR="mqttError",t.MQTT_MESSAGE="mqttMessage",t.MQTT_CLOSE="mqttClose",t.WEB_SOCKET_CONNECT="webSocketConnect",t.WEB_SOCKET_ERROR="webSocketError",t.WEB_SOCKET_MESSAGE="webSocketMessage",t.WEB_SOCKET_CLOSE="webSocketClose",t))(i||{}),o=(t=>(t.LOGIN_EXPIRED="登录信息过期,请重新登录",t.CROSS_ERROR="跨域访问",t.UNEXIST_RESOURCE="资源不存在",t.TIMEOUT="请求超时",t.INTERNAL_ERROR="内部错误",t.NETWORK_ERROR="请求失败,请检查网络是否已连接",t.PROCESS_FAIL="处理失败",t.AUTH_VERIFY_ERROR="权限验证失败",t.NO_DATA_FOUND="未找到数据",t.DUPLICATE_INSTANCE="实例为单例模式,不允许重复构建",t.JSON_PARSE_ERROR="JSON解析失败,格式有误",t.JSON_VALUE_ERROR="JSON无此键",t.STRING_CHECK_LOSS="字符缺少关键字",t.PARAMETER_ERROR="验证数据类型失败",t.PARAMETER_ERROR_ARRAY="验证数据类型失败,必须是数组",t.PARAMETER_ERROR_STRING="验证数据类型失败,必须是字符",t.PARAMETER_ERROR_FUNCTION="验证数据类型失败,必须是函数",t.PARAMETER_ERROR_OBJECT="验证数据类型失败,必须是对象",t.PARAMETER_ERROR_INTEGER="验证数据类型失败,必须是整型",t.PARAMETER_ERROR_NUMBER="验证数据类型失败,必须是数值",t.PARAMETER_ERROR_LACK="验证数据类型失败,必须非空",t.DATA_ERROR="格式类型验证失败",t.DATA_ERROR_COORDINATE="格式类型验证失败,必须是坐标",t.DATA_ERROR_COLOR="格式类型验证失败,必须是颜色代码",t.DATA_ERROR_GEOJSON="格式类型验证失败,必须是GeoJSON",t))(o||{}),a=(t=>(t.SUPER_MAP_IMAGES="SuperMapImages",t.SUPER_MAP_DATA="SuperMapData",t.ARC_GIS_MAP_IMAGES="ArcGisMapImages",t.ARC_GIS_MAP_DATA="ArcGisMapData",t.OSGB_LAYER="OSGBLayer",t.S3M_GROUP="S3MGroup",t.TERRAIN_LAYER="TerrainFileLayer",t))(a||{}),l=(t=>(t.POINT="point",t.POLYLINE="polyline",t.POLYGON="polygon",t.BILLBOARD="billboard",t.CYLINDER="cylinder",t.ELLIPSOID="ellipsoid",t.LABEL="label",t.MODEL="model",t.WALL="wall",t))(l||{}),c=(t=>(t.DASH="10,5",t.DOT="3",t.DASHDOT="10,3,3,3",t.DASHDOTDOT="10,3,3,3,3,3",t))(c||{}),h=(t=>(t.DISTANCE="distance",t.AREA="area",t.HEIGHT="height",t))(h||{}),u=(t=>(t.ADD="add",t.REMOVE="remove",t.INIT="init",t))(u||{});const d={getDataType:t=>Object.prototype.toString.call(t).slice(8,-1),asArray(t){return this.isEmpty(t)?[]:Array.isArray(t)?t:[t]},asNumber:t=>Number.isNaN(Number(t))?0:Number(t),asString(t){if(this.isEmpty(t))return"";switch(this.getDataType(t)){case"Object":case"Array":return JSON.stringify(t);default:return t}},isEmpty(t){if(null==t)return!0;switch(this.getDataType(t)){case"String":return""===t.trim();case"Array":return!t.length;case"Object":return!Object.keys(t).length;case"Boolean":return!t;default:return!1}},json2form(t){const e=new FormData;return Object.keys(t).forEach((n=>{e.append(n,t[n]instanceof Object?JSON.stringify(t[n]):t[n])})),e},guid(){const t=function(){return(65536*(1+Math.random())|0).toString(16).substring(1)};return t()+t()+t()+t()+t()+t()+t()+t()},decodeDict(...t){let e="";if(t.length>1){const n=t.slice(1,t.length%2==0?t.length-1:t.length);for(let s=0;s<n.length;s+=2){const r=n[s];t[0]===r&&(e=n[s+1])}e||t.length%2!=0||(e=t[t.length-1])}else e=t[0];return e},extend(t,...e){let n,s,r,i;for(s=0,r=e.length;s<r;s++)for(n in i=e[s],i)t[n]=i[n];return t},convertToTree2(t,e="id",n="parentId",s="children"){const r=[];function i(o){const a=t.filter((t=>t[n]===o[e])).map((t=>(r.some((n=>n[e]===t[e]))||i(t),t)));a.length>0&&(o[s]=a)}return t.forEach((s=>{t.some((t=>t[n]===s[e]))||(i(s),r.push(s))})),r},asyncLoadScript:t=>new Promise(((e,n)=>{try{const s=document.createElement("script");s.type="text/javascript",s.src=t,"readyState"in s?s.onreadystatechange=function(){"complete"!==s.readyState&&"loaded"!==s.readyState||e(s)}:(s.onload=function(){e(s)},s.onerror=function(){n(new Error("Script failed to load for URL: "+t))}),document.body.appendChild(s)}catch(s){n(s)}})),loadStyle(t){t.forEach((t=>{const e=document.createElement("link");e.href=t,e.rel="stylesheet",e.type="text/css",e.onerror=function(){console.error(`Style loading failed for URL: ${t}`)},document.head.appendChild(e)}))},template:(t,e)=>t.replace(/\{ *([\w_-]+) *\}/g,((t,n)=>{const s=e[n];if(void 0===s)throw new Error(`${o.JSON_VALUE_ERROR}: ${t}`);return"function"==typeof s?s(e):s})),deleteEmptyProperty(t){return Object.fromEntries(Object.keys(t).filter((e=>!this.isEmpty(t[e]))).map((e=>[e,t[e]])))},deepAssign(t,...e){"object"==typeof t&&null!==t||(t={});for(const n of e)if("object"==typeof n&&null!==n)for(const e in n)Object.prototype.hasOwnProperty.call(n,e)&&("object"==typeof n[e]&&null!==n[e]?(t[e]||(t[e]=Array.isArray(n[e])?[]:{}),this.deepAssign(t[e],n[e])):t[e]=n[e]);return t},handleCopyValue(t){if(navigator.clipboard&&window.isSecureContext)return navigator.clipboard.writeText(t);{const e=document.createElement("textarea");return e.style.position="fixed",e.style.top=e.style.left="-100vh",e.style.opacity="0",e.value=t,document.body.appendChild(e),e.focus(),e.select(),new Promise(((t,n)=>{try{document.execCommand("copy"),t()}catch(s){n(new Error("copy failed"))}finally{e.remove()}}))}},isArray:t=>Array.isArray(t),isObject:t=>Object.prototype.toString.call(t).indexOf("Object")>-1,isNil:t=>void 0===t||"undefined"===t||null===t||"null"===t,isNumber:t=>"number"==typeof t&&!isNaN(t)||"string"==typeof t&&Number.isFinite(+t),isInteger:t=>parseInt(t)===t,isFunction(t){return!this.isNil(t)&&("function"==typeof t||null!==t.constructor&&t.constructor===Function)},isElement:t=>"object"==typeof t&&1===t.nodeType,checheVersion:(t,e)=>t.replace(/[^0-9]/gi,"")<e.replace(/[^0-9]/gi,"")},g={deepClone:t=>structuredClone(t),isEqual:(t,e)=>JSON.stringify(t)===JSON.stringify(e),parse:t=>t&&"string"==typeof t?JSON.parse(t):t},p={emptyImageUrl:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",getURL(t){let e,n;if(/^data:/i.test(t.src))return t.src;if("undefined"==typeof HTMLCanvasElement)return t.src;if(t instanceof HTMLCanvasElement)n=t;else{void 0===e&&(e=document.createElementNS("http://www.w3.org/1999/xhtml","canvas")),e.width=t.width,e.height=t.height;const s=e.getContext("2d");s&&(t instanceof ImageData?s.putImageData(t,0,0):s.drawImage(t,0,0,t.width,t.height)),n=e}return n.width>2048||n.height>2048?(console.warn("ImageUtil.getDataURL: Image converted to jpg for performance reasons",t),n.toDataURL("image/jpeg",.6)):n.toDataURL("image/png")},getBase64(t){return new Promise(((e,n)=>{let s=new Image;s.setAttribute("crossOrigin","Anonymous"),s.src=t,s.onload=()=>{let t=this.getURL(s);e(t)},s.onerror=n}))},parseBase64(t){let e=new RegExp("data:(?<type>.*?);base64,(?<data>.*)").exec(t);return e&&e.groups?{type:e.groups.type,ext:e.groups.type.split("/").slice(-1)[0],data:e.groups.data}:null},async copyImage(t){try{const e=await this.getBase64(t),n=this.parseBase64(e.dataURL);if(!n)throw new Error("Failed to parse base64 data.");let s=n.type,r=atob(n.data),i=new ArrayBuffer(r.length),o=new Uint8Array(i);for(let t=0;t<r.length;t++)o[t]=r.charCodeAt(t);let a=new Blob([i],{type:s});await navigator.clipboard.write([new ClipboardItem({[s]:a})])}catch(e){console.error("Failed to copy image to clipboard:",e)}}},f={jsonp(t,e){const n="_jsonp_"+d.guid(),s=document.getElementsByTagName("head")[0];t.includes("?")?t+="&callback="+n:t+="?callback="+n;let r=document.createElement("script");r.type="text/javascript",r.src=t,window[n]=function(t){e(null,t),s.removeChild(r),r=null,delete window[n]},s.appendChild(r)},get(t,e,n){if(d.isFunction(e)){const t=n;n=e,e=t}const s=this._getClient(n);if(s.open("GET",t,!0),e){for(const t in e.headers)s.setRequestHeader(t,e.headers[t]);s.withCredentials="include"===e.credentials,e.responseType&&(s.responseType=e.responseType)}return s.send(null),s},post(t,e={},n){let s;if("string"!=typeof t?(n=e.cb,s=e.postData,delete(e={...e}).cb,delete e.postData,t=e.url):("function"==typeof e&&(n=e,e={}),s=e.postData),!n)throw new Error("Callback function is required");const r=this._getClient(n);return r.open("POST",t,!0),e.headers=e.headers||{},e.headers["Content-Type"]||(e.headers["Content-Type"]="application/x-www-form-urlencoded"),Object.keys(e.headers).forEach((t=>{r.setRequestHeader(t,e.headers[t])})),"string"!=typeof s&&(s=JSON.stringify(s)),r.send(s),r},_wrapCallback:(t,e)=>function(){if(4===t.readyState)if(200===t.status)if("arraybuffer"===t.responseType){0===t.response.byteLength?e(new Error("http status 200 returned without content.")):e(null,{data:t.response,cacheControl:t.getResponseHeader("Cache-Control"),expires:t.getResponseHeader("Expires"),contentType:t.getResponseHeader("Content-Type")})}else e(null,t.responseText);else e(new Error(t.statusText+","+t.status))},_getClient(t){let e=null;try{e=new XMLHttpRequest}catch(n){throw new Error("XMLHttpRequest not supported.")}return e&&(e.onreadystatechange=this._wrapCallback(e,t)),e},getArrayBuffer(t,e,n){if(d.isFunction(e)){const t=n;n=e,e=t}return e||(e={}),e.responseType="arraybuffer",this.get(t,e,n)},getImage(t,e,n){return this.getArrayBuffer(e,n,((e,n)=>{if(e)t.onerror&&t.onerror(e);else if(n){const e=window.URL||window.webkitURL,s=t.onload;t.onload=()=>{s&&s(),e.revokeObjectURL(t.src)};const r=new Blob([new Uint8Array(n.data)],{type:n.contentType});t.cacheControl=n.cacheControl,t.expires=n.expires,t.src=n.data.byteLength?e.createObjectURL(r):p.emptyImageUrl}}))},getJSON(t,e,n){if(d.isFunction(e)){const t=n;n=e,e=t}const s=function(t,e){const s=e?g.parse(e):null;n&&n(t,s)};return e&&e.jsonp?this.jsonp(t,s):this.get(t,e,s)}},m={DEG2RAD:Math.PI/180,RAD2DEG:180/Math.PI,randInt:(t,e)=>t+Math.floor(Math.random()*(e-t+1)),randFloat:(t,e)=>t+Math.random()*(e-t),deg2Rad(t){return t*this.DEG2RAD},rad2Deg(t){return t*this.RAD2DEG},round:(t,e=2)=>Math.round(t*Math.pow(10,e))/Math.pow(10,e),clamp:(t,e,n)=>Math.max(e,Math.min(n,t))},y={toRadian:Math.PI/180,R:6371393,isLnglat:(t,e)=>!isNaN(t)&&!isNaN(e)&&!!(+e>-90&&+e<90&&+t>-180&&+t<180),distance:(t,e)=>Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2)),distanceByPoints(t,e){const{lng:n,lat:s}=t,{lng:r,lat:i}=e;let o=Math.cos(s*Math.PI/180)*Math.cos(i*Math.PI/180)*Math.cos((n-r)*Math.PI/180)+Math.sin(s*Math.PI/180)*Math.sin(i*Math.PI/180);o>1&&(o=1),o<-1&&(o=-1);return 6371e3*Math.acos(o)},formatLnglat(t,e){let n="";function s(t){const e=Math.floor(t),n=Math.floor(60*(t-e));return`${e}°${n}′${(3600*(t-e)-60*n).toFixed(2)}″`}return this.isLnglat(t,e)?n=s(t)+","+s(e):isNaN(t)?isNaN(e)||(n=s(e)):n=s(t),n},transformLnglat(t,e){function n(t){let e=/[sw]/i.test(t)?-1:1;const n=t.match(/[\d.]+/g)||[];let s=0;for(let r=0;r<n.length;r++)s+=parseFloat(n[r])/e,e*=60;return s}if(t&&e)return{lng:n(t),lat:n(e)}},rayCasting(t,e){for(var n=t.x,s=t.y,r=!1,i=0,o=e.length,a=o-1;i<o;a=i,i++){var l=e[i].x,c=e[i].y,h=e[a].x,u=e[a].y;if(l===n&&c===s||h===n&&u===s)return"on";if(c<s&&u>=s||c>=s&&u<s){var d=l+(s-c)*(h-l)/(u-c);if(d===n)return"on";d>n&&(r=!r)}}return r?"in":"out"},rotatePoint:(t,e,n)=>({x:(t.x-e.x)*Math.cos(Math.PI/180*-n)-(t.y-e.y)*Math.sin(Math.PI/180*-n)+e.x,y:(t.x-e.x)*Math.sin(Math.PI/180*-n)+(t.y-e.y)*Math.cos(Math.PI/180*-n)+e.y}),calcBearAndDis(t,e){const{x:n,y:s}=t,{x:r,y:i}=e,o=r-n,a=i-s,l=Math.sqrt(o*o+a*a);return{angle:(Math.atan2(a,o)*(180/Math.PI)+360+90)%360,distance:l}},calcBearAndDisByPoints(t,e){var n=1*t.lat,s=1*t.lng,r=1*e.lat,i=1*e.lng,o=Math.sin((i-s)*this.toRadian)*Math.cos(r*this.toRadian),a=Math.cos(n*this.toRadian)*Math.sin(r*this.toRadian)-Math.sin(n*this.toRadian)*Math.cos(r*this.toRadian)*Math.cos((i-s)*this.toRadian),l=Math.atan2(o,a)*(180/Math.PI),c=(r-n)*this.toRadian,h=(i-s)*this.toRadian,u=Math.sin(c/2)*Math.sin(c/2)+Math.cos(n*this.toRadian)*Math.cos(r*this.toRadian)*Math.sin(h/2)*Math.sin(h/2),d=2*Math.atan2(Math.sqrt(u),Math.sqrt(1-u));return{angle:l,distance:this.R*d}},distanceToSegment(t,e,n){const s=t.x,r=t.y,i=e.x,o=e.y,a=n.x,l=n.y,c=(a-i)*(s-i)+(l-o)*(r-o);if(c<=0)return Math.sqrt((s-i)*(s-i)+(r-o)*(r-o));const h=(a-i)*(a-i)+(l-o)*(l-o);if(c>=h)return Math.sqrt((s-a)*(s-a)+(r-l)*(r-l));const u=c/h,d=i+(a-i)*u,g=o+(l-o)*u;return Math.sqrt((s-d)*(s-d)+(r-g)*(r-g))},calcPointByBearAndDis(t,e,n){const s=m.deg2Rad(1*t.lat),r=m.deg2Rad(1*t.lng),i=n/this.R;e=m.deg2Rad(e);const o=Math.asin(Math.sin(s)*Math.cos(i)+Math.cos(s)*Math.sin(i)*Math.cos(e)),a=r+Math.atan2(Math.sin(e)*Math.sin(i)*Math.cos(s),Math.cos(i)-Math.sin(s)*Math.sin(o));return{lat:m.rad2Deg(o),lng:m.rad2Deg(a)}},mercatorTolonlat(t,e){var n=e/20037508.34*180;return{lng:t/20037508.34*180,lat:180/Math.PI*(2*Math.atan(Math.exp(n*Math.PI/180))-Math.PI/2)}},lonlatToMercator(t,e){var n=6378137;const s=t*Math.PI/180*n;var r=e*Math.PI/180;return{x:s,y:3189068.5*Math.log((1+Math.sin(r))/(1-Math.sin(r)))}},interpolate:({x:t,y:e,z:n=0},{x:s,y:r,z:i=0},o)=>({x:t+(s-t)*o,y:e+(r-e)*o,z:n+(i-n)*o})},E={checkStr(t,e){switch(e){case"phone":return/^1[3|4|5|6|7|8|9][0-9]{9}$/.test(t);case"tel":return/^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/.test(t);case"card":return/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(t);case"pwd":return/^[a-zA-Z]\w{5,17}$/.test(t);case"postal":return/[1-9]\d{5}(?!\d)/.test(t);case"QQ":return/^[1-9][0-9]{4,9}$/.test(t);case"email":return/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(t);case"money":return/^\d*(?:\.\d{0,2})?$/.test(t);case"URL":return/(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/.test(t);case"IP":return/((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))/.test(t);case"date":return/^(\d{4})\-(\d{2})\-(\d{2}) (\d{2})(?:\:\d{2}|:(\d{2}):(\d{2}))$/.test(t)||/^(\d{4})\-(\d{2})\-(\d{2})$/.test(t);case"number":return/^[0-9]$/.test(t);case"english":return/^[a-zA-Z]+$/.test(t);case"chinese":return/^[\u4E00-\u9FA5]+$/.test(t);case"lower":return/^[a-z]+$/.test(t);case"upper":return/^[A-Z]+$/.test(t);case"HTML":return/<("[^"]*"|'[^']*'|[^'">])*>/.test(t);default:return!0}},changeCase(t,e){switch(e=e||4){case 1:return t.replace(/\b\w+\b/g,(function(t){return t.substring(0,1).toUpperCase()+t.substring(1).toLowerCase()}));case 2:return t.replace(/\b\w+\b/g,(function(t){return t.substring(0,1).toLowerCase()+t.substring(1).toUpperCase()}));case 3:return t.split("").map((function(t){return/[a-z]/.test(t)?t.toUpperCase():t.toLowerCase()})).join("");case 4:return t.toUpperCase();case 5:return t.toLowerCase();default:return t}},tag:(t,...e)=>(e=e.map((t=>{switch(d.getDataType(t)){case"Object":return t||"{}";case"Array":return t||"[]";default:return t||""}})),t.reduce(((t,n,s)=>`${t}${e[s-1]}${n}`))),getByteLength:t=>t.replace(/[\u0391-\uFFE5]/g,"aa").length,subStringByte(t,e,n){var s=/[^\x00-\xff]/g;if(t.replace(s,"mm").length<=n)return t;for(var r=Math.floor(n/2);r<t.length;r++){let i=t.substring(e,r);if(i.replace(s,"mm").length>=n)return i}return t},string2Bytes(t){const e=[];let n;const s=t.length;for(let r=0;r<s;r++)n=t.charCodeAt(r),n>=65536&&n<=1114111?(e.push(n>>18&7|240),e.push(n>>12&63|128),e.push(n>>6&63|128),e.push(63&n|128)):n>=2048&&n<=65535?(e.push(n>>12&15|224),e.push(n>>6&63|128),e.push(63&n|128)):n>=128&&n<=2047?(e.push(n>>6&31|192),e.push(63&n|128)):e.push(255&n);return new Uint8Array(e)},bytes2String(t){if("string"==typeof t)return t;let e="";const n=t;for(let s=0;s<n.length;s++){const t=n[s].toString(2),r=t.match(/^1+?(?=0)/);if(r&&8==t.length){const t=r[0].length;let i=n[s].toString(2).slice(7-t);for(let e=1;e<t;e++)i+=n[e+s].toString(2).slice(2);e+=String.fromCharCode(parseInt(i,2)),s+=t-1}else e+=String.fromCharCode(n[s])}return e}},w=["Point","MultiPoint","LineString","MultiLineString","Polygon","MultiPolygon"],M={getGeoJsonType:t=>t.geometry?t.geometry.type:null,isGeoJson(t){const e=this.getGeoJsonType(t);if(e)for(let n=0,s=w.length;n<s;n++)if(w[n]===e)return!0;return!1},isGeoJsonPolygon(t){const e=this.getGeoJsonType(t);return!(!e||e!==w[4]&&e!==w[5])},isGeoJsonLine(t){const e=this.getGeoJsonType(t);return!(!e||e!==w[2]&&e!==w[3])},isGeoJsonPoint(t){const e=this.getGeoJsonType(t);return!(!e||e!==w[0]&&e!==w[1])},isGeoJsonMulti(t){const e=this.getGeoJsonType(t);return!!(e&&e.indexOf("Multi")>-1)},getGeoJsonCoordinates:t=>t.geometry?t.geometry.coordinates:[],getGeoJsonCenter(t,e){const n=this.getGeoJsonType(t);if(!n||!t.geometry)return null;const s=t.geometry.coordinates;if(!s)return null;let r=0,i=0,o=0;switch(n){case"Point":r=s[0],i=s[1],o++;break;case"MultiPoint":case"LineString":for(let t=0,e=s.length;t<e;t++)r+=s[t][0],i+=s[t][1],o++;break;case"MultiLineString":case"Polygon":for(let t=0,e=s.length;t<e;t++)for(let n=0,a=s[t].length;n<a;n++)r+=s[t][n][0],i+=s[t][n][1],o++;break;case"MultiPolygon":for(let t=0,e=s.length;t<e;t++)for(let n=0,a=s[t].length;n<a;n++)for(let e=0,l=s[t][n].length;e<l;e++)r+=s[t][n][e][0],i+=s[t][n][e][1],o++}const a=r/o,l=i/o;return e?(e.x=a,e.y=l,e):{x:a,y:l}},spliteGeoJsonMulti(t){const e=this.getGeoJsonType(t);if(!e||!t.geometry)return null;const n=t.geometry,s=t.properties||{},r=n.coordinates;if(!r)return null;const i=[];let o;switch(e){case"MultiPoint":o="Point";break;case"MultiLineString":o="LineString";break;case"MultiPolygon":o="Polygon"}if(o)for(let a=0,l=r.length;a<l;a++)i.push({type:"Feature",geometry:{type:o,coordinates:r[a]},properties:s});else i.push(t);return i},getGeoJsonByCoordinates(t){if(!Array.isArray(t))throw Error("coordinates 参数格式错误");let e;if(2===t.length&&"number"==typeof t[0]&&"number"==typeof t[1])e="Point";else if(Array.isArray(t[0])&&2===t[0].length)e="LineString";else{if(!Array.isArray(t[0])||!Array.isArray(t[0][0]))throw Error("coordinates 参数格式错误");{const n=t[0];if(n[0].join(",")===n[n.length-1].join(","))e="Polygon";else{if(!(t.length>1))throw Error("coordinates 参数格式错误");e="MultiPolygon"}}}return{type:"Feature",geometry:{type:e,coordinates:t}}}},R={assertEmpty(...t){t.forEach((t=>{if(d.isEmpty(t))throw Error(o.PARAMETER_ERROR_LACK+" -> "+t)}))},assertInteger(...t){t.forEach((t=>{if(!d.isInteger(t))throw Error(o.PARAMETER_ERROR_INTEGER+" -> "+t)}))},assertNumber(...t){t.forEach((t=>{if(!d.isNumber(t))throw Error(o.PARAMETER_ERROR_NUMBER+" -> "+t)}))},assertArray(...t){t.forEach((t=>{if(!d.isArray(t))throw Error(o.PARAMETER_ERROR_ARRAY+" -> "+t)}))},assertFunction(...t){t.forEach((t=>{if(!d.isFunction(t))throw Error(o.PARAMETER_ERROR_FUNCTION+" -> "+t)}))},assertObject(...t){t.forEach((t=>{if(!d.isObject(t))throw Error(o.PARAMETER_ERROR_OBJECT+" -> "+t)}))},assertColor(...t){t.forEach((t=>{if(!P.isColor(t))throw Error(o.DATA_ERROR_COLOR+" -> "+t)}))},assertLnglat(...t){t.forEach((t=>{if(!y.isLnglat(t.lng,t.lat))throw Error(o.DATA_ERROR_COORDINATE+" -> "+t)}))},assertGeoJson(...t){t.forEach((t=>{if(!M.isGeoJson(t))throw Error(o.DATA_ERROR_GEOJSON+" -> "+t)}))},assertContain(t,...e){let n=!1;for(let s=0,r=e.length||0;s<r;s++)n=t.indexOf(e[s])>=0;if(n)throw Error(o.STRING_CHECK_LOSS+" -> "+t)},assertStartWith(t,e){if(!t.startsWith(e))throw Error("字符串"+t+"开头不是 -> "+e)},assertEndWith(t,e){if(!t.endsWith(e))throw Error("字符串"+t+"结尾不是 -> "+e)},assertLegal(t,e){const n=E.checkStr(t,e);let s="";switch(e){case"phone":s="电话";break;case"tel":s="座机";break;case"card":s="身份证";break;case"pwd":s="密码";break;case"postal":s="邮政编码";break;case"QQ":s="QQ";break;case"email":s="邮箱";break;case"money":s="金额";break;case"URL":s="网址";break;case"IP":s="IP";break;case"date":s="日期时间";break;case"number":s="数字";break;case"english":s="英文";break;case"chinese":s="中文";break;case"lower":s="小写";break;case"upper":s="大写";break;case"HTML":s="HTML标记"}if(!n)throw Error(o.DATA_ERROR+" -> 不是"+s)}},A=Object.create(Array);A.groupBy=function(t){var e={};return this.forEach((function(n){var s=JSON.stringify(t(n));e[s]=e[s]||[],e[s].push(n)})),Object.keys(e).map((t=>e[t]))},A.distinct=function(t=t=>t){const e=[],n={};return this.forEach((s=>{const r=t(s),i=String(r);n[i]||(n[i]=!0,e.push(s))})),e},A.prototype.max=function(){return Math.max.apply({},this)},A.prototype.min=function(){return Math.min.apply({},this)},A.sum=function(){return this.length>0?this.reduce(((t=0,e=0)=>t+e)):0},A.avg=function(){return this.length?this.sum()/this.length:0},A.desc=function(t=t=>t){return this.sort(((e,n)=>t(n)-t(e)))},A.asc=function(t=t=>t){return this.sort(((e,n)=>t(e)-t(n)))},A.random=function(){return this[Math.floor(Math.random()*this.length)]},A.remove=function(t){const e=this.indexOf(t);return e>-1&&this.splice(e,1),this};const b={create:t=>[...new Array(t).keys()],union(...t){let e=[];return t.forEach((t=>{Array.isArray(t)&&(e=e.concat(t.filter((t=>!e.includes(t)))))})),e},intersection(...t){let e=t[0]||[];return t.forEach((t=>{Array.isArray(t)&&(e=e.filter((e=>t.includes(e))))})),e},unionAll:(...t)=>[...t].flat().filter((t=>!!t)),difference(...t){return 0===t.length?[]:this.union(...t).filter((e=>!this.intersection(...t).includes(e)))}};class C{static getSystem(){var t,e,n,s,r,i,o,a,l;const c=this.userAgent||(null==(t=this.navigator)?void 0:t.userAgent);let h="",u="";if(c.includes("Android")||c.includes("Adr"))h="Android",u=(null==(e=c.match(/Android ([\d.]+);/))?void 0:e[1])||"";else if(c.includes("CrOS"))h="Chromium OS",u=(null==(n=c.match(/MSIE ([\d.]+)/))?void 0:n[1])||(null==(s=c.match(/rv:([\d.]+)/))?void 0:s[1])||"";else if(c.includes("Linux")||c.includes("X11"))h="Linux",u=(null==(r=c.match(/Linux ([\d.]+)/))?void 0:r[1])||"";else if(c.includes("Ubuntu"))h="Ubuntu",u=(null==(i=c.match(/Ubuntu ([\d.]+)/))?void 0:i[1])||"";else if(c.includes("Windows")){let t=(null==(o=c.match(/^Mozilla\/\d.0 \(Windows NT ([\d.]+)[;)].*$/))?void 0:o[1])||"",e={"10.0":"10",6.4:"10 Technical Preview",6.3:"8.1",6.2:"8",6.1:"7","6.0":"Vista",5.2:"XP 64-bit",5.1:"XP",5.01:"2000 SP1","5.0":"2000","4.0":"NT","4.90":"ME"};h="Windows",u=t in e?e[t]:t}else c.includes("like Mac OS X")?(h="IOS",u=(null==(a=c.match(/OS ([\d_]+) like/))?void 0:a[1].replace(/_/g,"."))||""):c.includes("Macintosh")&&(h="macOS",u=(null==(l=c.match(/Mac OS X -?([\d_]+)/))?void 0:l[1].replace(/_/g,"."))||"");return{type:h,version:u}}static getExplorer(){var t;const e=this.userAgent||(null==(t=this.navigator)?void 0:t.userAgent);let n="",s="";if(/MSIE|Trident/.test(e)){let t=/MSIE\s(\d+\.\d+)/.exec(e)||/rv:(\d+\.\d+)/.exec(e);t&&(n="IE",s=t[1])}else if(/Edge/.test(e)){let t=/Edge\/(\d+\.\d+)/.exec(e);t&&(n="Edge",s=t[1])}else if(/Chrome/.test(e)&&/Google Inc/.test(this.navigator.vendor)){let t=/Chrome\/(\d+\.\d+)/.exec(e);t&&(n="Chrome",s=t[1])}else if(/Firefox/.test(e)){let t=/Firefox\/(\d+\.\d+)/.exec(e);t&&(n="Firefox",s=t[1])}else if(/Safari/.test(e)&&/Apple Computer/.test(this.navigator.vendor)){let t=/Version\/(\d+\.\d+)([^S]*)(Safari)/.exec(e);t&&(n="Safari",s=t[1])}return{type:n,version:s}}static switchFullScreen(t){if(t){const t=document.documentElement;t.requestFullscreen?t.requestFullscreen():"msRequestFullscreen"in t?t.msRequestFullscreen():"mozRequestFullScreen"in t?t.mozRequestFullScreen():"webkitRequestFullscreen"in t&&t.webkitRequestFullscreen()}else document.exitFullscreen?document.exitFullscreen():"msExitFullscreen"in document?document.msExitFullscreen():"mozCancelFullScreen"in document?document.mozCancelFullScreen():"webkitExitFullscreen"in document&&document.webkitExitFullscreen()}static isSupportWebGL(){if(!(null==this?void 0:this.document))return!1;const t=this.document.createElement("canvas"),e=t.getContext("webgl")||t.getContext("experimental-webgl");return e&&e instanceof WebGLRenderingContext}static getGPU(){let t="",e="";if(null==this?void 0:this.document){let n=this.document.createElement("canvas"),s=n.getContext("webgl")||n.getContext("experimental-webgl");if(s instanceof WebGLRenderingContext){let n=s.getExtension("WEBGL_debug_renderer_info");if(n){let r=s.getParameter(n.UNMASKED_RENDERER_WEBGL);t=(r.match(/ANGLE \((.+?),/)||[])[1]||"",e=(r.match(/, (.+?) (\(|vs_)/)||[])[1]||""}}}return{type:t,model:e}}static getLanguage(){var t,e;let n=(null==(t=this.navigator)?void 0:t.language)||(null==(e=this.navigator)?void 0:e.userLanguage);if("string"!=typeof n)return"";let s=n.split("-");return s[1]&&(s[1]=s[1].toUpperCase()),s.join("_")}static getTimeZone(){var t,e;return null==(e=null==(t=null==Intl?void 0:Intl.DateTimeFormat())?void 0:t.resolvedOptions())?void 0:e.timeZone}static async getScreenFPS(){return new Promise((function(t){let e=0,n=1,s=[],r=function(i){if(e>0)if(n<12)s.push(i-e),e=i,n++,requestAnimationFrame(r);else{s.sort(),s=s.slice(1,11);let e=s.reduce(((t,e)=>t+e));const n=10*Math.round(1e4/e/10);t(n)}else e=i,requestAnimationFrame(r)};requestAnimationFrame(r)}))}static async getIPAddress(){const t=/\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/,e=/\b(?:[A-F0-9]{1,4}:){7}[A-F0-9]{1,4}\b/i;let n=window.RTCPeerConnection||window.mozRTCPeerConnection||window.webkitRTCPeerConnection;const s=new Set,r=n=>{var r;const i=null==(r=null==n?void 0:n.candidate)?void 0:r.candidate;if(i)for(const o of[t,e]){const t=i.match(o);t&&s.add(t[0])}};return new Promise((function(t,e){const i=new n({iceServers:[{urls:"stun:stun.l.google.com:19302"},{urls:"stun:stun.services.mozilla.com"}]});i.addEventListener("icecandidate",r),i.createDataChannel(""),i.createOffer().then((t=>i.setLocalDescription(t)),e);let o,a=20,l=function(){try{i.removeEventListener("icecandidate",r),i.close()}catch{}o&&clearInterval(o)};o=setInterval((function(){let e=[...s];e.length?(l(),t(e[0])):a?a--:(l(),t(""))}),100)}))}static async getNetwork(){var t,e;let n="unknown",s=null==(t=this.navigator)?void 0:t.connection;return s&&(n=s.type||s.effectiveType,"2"!=n&&"unknown"!=n||(n="wifi")),{network:n,isOnline:(null==(e=this.navigator)?void 0:e.onLine)||!1,ip:await this.getIPAddress()}}}r(C,"document",null==window?void 0:window.document),r(C,"navigator",null==window?void 0:window.navigator),r(C,"userAgent",null==(n=null==window?void 0:window.navigator)?void 0:n.userAgent),r(C,"screen",null==window?void 0:window.screen);const _={PI:3.141592653589793,XPI:52.35987755982988,delta(t,e){const n=6378245,s=.006693421622965943;let r=this.transformLat(e-105,t-35),i=this.transformLon(e-105,t-35);const o=t/180*this.PI;let a=Math.sin(o);a=1-s*a*a;const l=Math.sqrt(a);return r=180*r/(n*(1-s)/(a*l)*this.PI),i=180*i/(n/l*Math.cos(o)*this.PI),{lat:r,lng:i}},outOfChina:(t,e)=>t<72.004||t>137.8347||(e<.8293||e>55.8271),gcjEncrypt(t,e){if(this.outOfChina(t,e))return{lat:t,lng:e};const n=this.delta(t,e);return{lat:t+n.lat,lng:e+n.lng}},gcjDecrypt(t,e){if(this.outOfChina(t,e))return{lat:t,lng:e};const n=this.delta(t,e);return{lat:t-n.lat,lng:e-n.lng}},gcjDecryptExact(t,e){let n=.01,s=.01,r=t-n,i=e-s,o=t+n,a=e+s,l=0,c=0,h=0;for(;;){l=(r+o)/2,c=(i+a)/2;const u=this.gcjEncrypt(l,c);if(n=u.lat-t,s=u.lng-e,Math.abs(n)<1e-9&&Math.abs(s)<1e-9)break;if(n>0?o=l:r=l,s>0?a=c:i=c,++h>1e4)break}return{lat:l,lng:c}},bdEncrypt(t,e){const n=e,s=t,r=Math.sqrt(n*n+s*s)+2e-5*Math.sin(s*this.XPI),i=Math.atan2(s,n)+3e-6*Math.cos(n*this.XPI),o=r*Math.cos(i)+.0065;return{lat:r*Math.sin(i)+.006,lng:o}},bdDecrypt(t,e){const n=e-.0065,s=t-.006,r=Math.sqrt(n*n+s*s)-2e-5*Math.sin(s*this.XPI),i=Math.atan2(s,n)-3e-6*Math.cos(n*this.XPI),o=r*Math.cos(i);return{lat:r*Math.sin(i),lng:o}},mercatorEncrypt(t,e){const n=20037508.34*e/180;let s=Math.log(Math.tan((90+t)*this.PI/360))/(this.PI/180);return s=20037508.34*s/180,{lat:s,lng:n}},mercatorDecrypt(t,e){const n=e/20037508.34*180;let s=t/20037508.34*180;return s=180/this.PI*(2*Math.atan(Math.exp(s*this.PI/180))-this.PI/2),{lat:s,lng:n}},transformLat(t,e){let n=2*t-100+3*e+.2*e*e+.1*t*e+.2*Math.sqrt(Math.abs(t));return n+=2*(20*Math.sin(6*t*this.PI)+20*Math.sin(2*t*this.PI))/3,n+=2*(20*Math.sin(e*this.PI)+40*Math.sin(e/3*this.PI))/3,n+=2*(160*Math.sin(e/12*this.PI)+320*Math.sin(e*this.PI/30))/3,n},transformLon(t,e){let n=300+t+2*e+.1*t*t+.1*t*e+.1*Math.sqrt(Math.abs(t));return n+=2*(20*Math.sin(6*t*this.PI)+20*Math.sin(2*t*this.PI))/3,n+=2*(20*Math.sin(t*this.PI)+40*Math.sin(t/3*this.PI))/3,n+=2*(150*Math.sin(t/12*this.PI)+300*Math.sin(t/30*this.PI))/3,n},random:({x:t,y:e},{x:n,y:s})=>({x:Math.random()*(n-t)+t,y:Math.random()*(s-e)+e}),deCompose(t,e,n){if(!Array.isArray(t))return n?e.call(n,t):e(t);const s=[];let r,i;for(let o=0,a=t.length;o<a;o++)r=t[o],d.isNil(r)?s.push(null):Array.isArray(r)?s.push(this.deCompose(r,e,n)):(i=n?e.call(n,r):e(r),s.push(i));return s}},S=Object.create(Date);S.prototype.format=function(t="yyyy-MM-dd hh:mm:ss"){const e={"M+":this.getMonth()+1,"d+":this.getDate(),"h+":this.getHours()%12,"H+":this.getHours(),"m+":this.getMinutes(),"s+":this.getSeconds(),"q+":Math.floor((this.getMonth()+3)/3),S:this.getMilliseconds()};/(y+)/.test(t)&&(t=t.replace(RegExp.$1,(this.getFullYear()+"").substr(4-RegExp.$1.length)));for(const n in e)if(new RegExp("("+n+")").test(t)){const s=1===n.length?1:Number(n.slice(1));t=t.replace(RegExp.$1,("00"+e[n]).substr((""+e[n]).length+s-(e[n]+"").length))}return t},S.prototype.addDate=function(t,e){const n=new Date(this);switch(t){case"y":n.setFullYear(this.getFullYear()+e);break;case"q":n.setMonth(this.getMonth()+3*e);break;case"M":n.setMonth(this.getMonth()+e);break;case"w":n.setDate(this.getDate()+7*e);break;case"d":default:n.setDate(this.getDate()+e);break;case"h":n.setHours(this.getHours()+e);break;case"m":n.setMinutes(this.getMinutes()+e);break;case"s":n.setSeconds(this.getSeconds()+e)}return n};const v={lastMonthDate:new Date((new Date).getFullYear(),(new Date).getMonth()-1,1),thisMonthDate:new Date((new Date).getFullYear(),(new Date).getMonth(),1),nextMonthDate:new Date((new Date).getFullYear(),(new Date).getMonth()+1,1),lastWeekDate:new Date((new Date).getFullYear(),(new Date).getMonth(),(new Date).getDate()+1-7-(new Date).getDay()),thisWeekDate:new Date((new Date).getFullYear(),(new Date).getMonth(),(new Date).getDate()+1-(new Date).getDay()),nextWeekDate:new Date((new Date).getFullYear(),(new Date).getMonth(),(new Date).getDate()+1+7-(new Date).getDay()),lastDayDate:new Date((new Date).getFullYear(),(new Date).getMonth(),(new Date).getDate()-1),thisDayDate:new Date((new Date).setHours(0,0,0,0)),nextDayDate:new Date((new Date).getFullYear(),(new Date).getMonth(),(new Date).getDate()+1),parseDate(t){if("string"==typeof t){var e=t.match(/^ *(\d{4})-(\d{1,2})-(\d{1,2}) *$/);if(e&&e.length>3)return new Date(parseInt(e[1]),parseInt(e[2])-1,parseInt(e[3]));if((e=t.match(/^ *(\d{4})-(\d{1,2})-(\d{1,2}) +(\d{1,2}):(\d{1,2}):(\d{1,2}) *$/))&&e.length>6)return new Date(parseInt(e[1]),parseInt(e[2])-1,parseInt(e[3]),parseInt(e[4]),parseInt(e[5]),parseInt(e[6]));if((e=t.match(/^ *(\d{4})-(\d{1,2})-(\d{1,2}) +(\d{1,2}):(\d{1,2}):(\d{1,2})\.(\d{1,9}) *$/))&&e.length>7)return new Date(parseInt(e[1]),parseInt(e[2])-1,parseInt(e[3]),parseInt(e[4]),parseInt(e[5]),parseInt(e[6]),parseInt(e[7]))}return null},formatDateInterval(t,e){const n=new Date(t),s=new Date(e).getTime()-n.getTime(),r=Math.floor(s/864e5),i=s%864e5,o=Math.floor(i/36e5),a=i%36e5,l=Math.floor(a/6e4),c=a%6e4,h=Math.round(c/1e3);let u="";return r>0&&(u+=r+"天"),o>0&&(u+=o+"时"),l>0&&(u+=l+"分"),h>0&&(u+=h+"秒"),0===r&&0===o&&0===l&&0===h&&(u="少于1秒"),u},formatterCounter(t){const e=function(t){return(t>10?"":"0")+(t||0)},n=t%3600,s=n%60;return`${e(Math.floor(t/3600))}:${e(Math.floor(n/60))}:${e(Math.round(s))}`},sleep(t){}};function T(t){return function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}(t).split(/\s+/)}const x={getStyle(t,e){var n;let s=t.style[e];if(!s||"auto"===s){const r=null==(n=document.defaultView)?void 0:n.getComputedStyle(t,null);s=r?r[e]:null,"auto"===s&&(s=null)}return s},create(t,e,n){const s=document.createElement(t);return s.className=e||"",n&&n.appendChild(s),s},remove(t){const e=t.parentNode;e&&e.removeChild(t)},empty(t){for(;t.firstChild;)t.removeChild(t.firstChild)},toFront(t){const e=t.parentNode;e&&e.lastChild!==t&&e.appendChild(t)},toBack(t){const e=t.parentNode;e&&e.firstChild!==t&&e.insertBefore(t,e.firstChild)},getClass:t=>((null==t?void 0:t.host)||t).className.toString(),hasClass(t,e){var n;if(null==(n=t.classList)?void 0:n.contains(e))return!0;const s=this.getClass(t);return s.length>0&&new RegExp(`(^|\\s)${e}(\\s|$)`).test(s)},addClass(t,e){if(void 0!==t.classList){const n=T(e);for(let e=0,s=n.length;e<s;e++)t.classList.add(n[e])}else if(!this.hasClass(t,e)){const n=this.getClass(t);this.setClass(t,(n?n+" ":"")+e)}},removeClass(t,e){if(void 0!==t.classList){T(e).forEach((e=>t.classList.remove(e)))}else this.setClass(t,(" "+this.getClass(t)+" ").replace(" "+e+" "," ").trim())},setClass(t,e){"classList"in t&&(t.classList.value="",e.split(" ").forEach((e=>t.classList.add(e))))},parseFromString:t=>(new DOMParser).parseFromString(t,"text/xml").children[0]},O={convertBase64ToBlob(t){const e=t.split(",")[0].split(":")[1].split(";")[0],n=atob(t.split(",")[1]),s=new Array(n.length);for(let i=0;i<n.length;i++)s[i]=n.charCodeAt(i);const r=new Uint8Array(s);return new Blob([r],{type:e})},convertBase64ToFile(t,e){const n=t.split(","),s=n[0].match(/:(.*?);/),r=s?s[1]:"image/png",i=atob(n[1]),o=new Uint8Array(i.length);for(let a=0;a<i.length;a++)o[a]=i.charCodeAt(a);return new File([o],e,{type:r})},downloadFromFile(t,e){if("object"==typeof t)if(t instanceof Blob)t=URL.createObjectURL(t);else{const e=JSON.stringify(t),n=new Blob([e],{type:"text/json"});t=window.URL.createObjectURL(n)}else if("string"==typeof t&&-1===t.indexOf("http")){const e=new Blob([t],{type:"text/json"});t=window.URL.createObjectURL(e)}var n=document.createElement("a");n.href=t,n.download=e||"",n.click(),window.URL.revokeObjectURL(n.href)}},I={debounce(t,e,n=!0){let s,r,i=null;const o=()=>{const a=Date.now()-s;a<e&&a>0?i=setTimeout(o,e-a):(i=null,n||(r=t.apply(this,undefined)))};return(...a)=>{s=Date.now();const l=n&&!i;return i||(i=setTimeout(o,e)),l&&(r=t.apply(this,a),i||(a=null)),r}},throttle(t,e,n=1){let s=0,r=null;return(...i)=>{if(1===n){const n=Date.now();n-s>=e&&(t.apply(this,i),s=n)}else 2===n&&(r||(r=setTimeout((()=>{r=null,t.apply(this,i)}),e)))}},memoize(t){const e=new Map;return(...n)=>{const s=JSON.stringify(n);if(e.has(s))return e.get(s);{const r=t.apply(this,n);return e.set(s,r),r}}},recurve(t,e=500,n=5e3){let s=0;setTimeout((()=>{s++,s<Math.floor(n/e)&&(t.call(this),setTimeout(this.recurve.bind(this,t,e,n),e))}),e)},once(t){let e=!1;return function(...n){if(!e)return e=!0,t(...n)}}},D={json2Query(t){var e=[];for(var n in t)if(t.hasOwnProperty(n)){var s=n,r=t[n];e.push(encodeURIComponent(s)+"="+encodeURIComponent(r))}return e.join("&")},query2Json(t=window.location.href,e=!0){const n=/([^&=]+)=([\w\W]*?)(&|$|#)/g,{search:s,hash:r}=new URL(t),i=[s,r];let o={};for(let a=0;a<i.length;a++){const t=i[a];if(t){const s=t.replace(/#|\//g,"").split("?");if(s.length>1)for(let t=1;t<s.length;t++){let r;for(;r=n.exec(s[t]);)o[r[1]]=e?decodeURIComponent(r[2]):r[2]}}}return o}};class P{constructor(t,e,n,s){r(this,"_r"),r(this,"_g"),r(this,"_b"),r(this,"_alpha"),this._validateColorChannel(t),this._validateColorChannel(e),this._validateColorChannel(n),this._r=t,this._g=e,this._b=n,this._alpha=m.clamp(s||1,0,1)}_validateColorChannel(t){if(t<0||t>255)throw new Error("Color channel must be between 0 and 255.")}get rgba(){return{r:this._r,g:this._g,b:this._b,a:this._alpha}}get hex(){return P.rgb2hex(this._r,this._g,this._b,this._alpha)}setAlpha(t){return this._alpha=m.clamp(t,0,1),this}setRgb(t,e,n){return this._validateColorChannel(t),this._validateColorChannel(e),this._validateColorChannel(n),this._r=t,this._g=e,this._b=n,this}static fromRgba(t){const e=t.match(/^rgba?\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([\d.]+))?\s*\)$/);if(!e)throw new Error("Invalid RGBA color value");const n=parseInt(e[1],10),s=parseInt(e[2],10),r=parseInt(e[3],10),i=e[5]?parseFloat(e[5]):1;return new P(n,s,r,i)}static fromHex(t,e=1){const n=t.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i,((t,e,n,s)=>e+e+n+n+s+s)),s=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(n);if(!s)throw new Error("Invalid HEX color value");const r=parseInt(s[1],16),i=parseInt(s[2],16),o=parseInt(s[3],16);return new P(r,i,o,e)}static fromHsl(t){const e=/hsl\((\d+),\s*([\d.]+)%,\s*([\d.]+)%\)/g.exec(t)||/hsla\((\d+),\s*([\d.]+)%,\s*([\d.]+)%,\s*([\d.]+)\)/g.exec(t);if(!e)throw new Error("Invalid HSL color value");const n=parseInt(e[1],10)/360,s=parseInt(e[2],10)/100,r=parseInt(e[3],10)/100,i=e[4]?parseFloat(e[4]):1;function o(t,e,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?t+6*(e-t)*n:n<.5?e:n<2/3?t+(e-t)*(2/3-n)*6:t}let a,l,c;if(0===s)a=l=c=r;else{const t=r<.5?r*(1+s):r+s-r*s,e=2*r-t;a=o(e,t,n+1/3),l=o(e,t,n),c=o(e,t,n-1/3)}return new P(Math.round(255*a),Math.round(255*l),Math.round(255*c),i)}static from(t){if(this.isRgb(t))return this.fromRgba(t);if(this.isHex(t))return this.fromHex(t);if(this.isHsl(t))return this.fromHsl(t);throw new Error("Invalid color value")}static rgb2hex(t,e,n,s){var r="#"+((1<<24)+(t<<16)+(e<<8)+n).toString(16).slice(1);if(void 0!==s){return r+Math.round(255*s).toString(16).padStart(2,"0")}return r}static isHex(t){return/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(t)}static isRgb(t){return/^rgba?\s*\(\s*\d+\s*,\s*\d+\s*,\s*\d+\s*(,\s*[\d.]+)?\s*\)$/.test(t)}static isHsl(t){return/^(hsl|hsla)\(\d+,\s*[\d.]+%,\s*[\d.]+%(,\s*[\d.]+)?\)$/.test(t)}static isColor(t){return this.isHex(t)||this.isRgb(t)||this.isHsl(t)}static random(){let t=Math.floor(256*Math.random()),e=Math.floor(256*Math.random()),n=Math.floor(256*Math.random()),s=Math.random();return new P(t,e,n,s)}}class L{constructor(){r(this,"_listeners"),r(this,"_mutex",{}),r(this,"_context")}addEventListener(t,e,n,s){void 0===this._listeners&&(this._listeners={}),this._context=n;const r=this._mutex,i=this._listeners;return void 0===i[t]&&(i[t]=[]),-1===i[t].indexOf(e)&&(s&&(r[t]=e),i[t].push(e)),this}hasEventListener(t,e){if(null===this._listeners||void 0===this._listeners)return!1;const n=this._listeners;return void 0!==n[t]&&-1!==n[t].indexOf(e)}removeEventListener(t,e){if(void 0===this._listeners)return;const n=this._listeners[t];if(this._mutex[t]===e&&(this._mutex[t]=null),void 0!==n){const t=n.map((t=>t.toString())).indexOf(e.toString());-1!==t&&n.splice(t,1)}}dispatchEvent(t){if(void 0===this._listeners)return;const e=this._listeners[t.type];if(void 0!==e){t.target=this;const n=e.slice(0);if(void 0!==this._mutex[t.type]){const e=n.find((e=>e===this._mutex[t.type]));if(e)return void e.call(this._context||this,t)}for(let e=0,s=n.length;e<s;e++){const s=n[e];"function"==typeof s&&s.call(this._context||this,t)}}}removeAllListener(){this._mutex={};for(const t in this._listeners)this._listeners[t]=[]}}class k extends Map{isEmpty(){return 0===this.size}_values(){return Array.from(this.values())}_keys(){return Array.from(this.keys())}_entries(){return Array.from(this.entries())}static fromEntries(t=[]){const e=new k;return t.forEach((t=>{Array.isArray(t)&&2===t.length&&e.set(t[0],t[1])})),e}static fromJson(t){const e=g.parse(t);return new k(Object.entries(e))}}const N=class t extends L{constructor(n=`ws://${window.document.domain}:20007/mqtt`,s={}){super(),r(this,"state"),r(this,"url"),r(this,"context"),r(this,"options"),r(this,"client"),r(this,"topics"),this.context=d.extend(t.defaultContext,s),this.options={connectTimeout:this.context.MQTT_TIMEOUTM,clientId:d.guid(),username:this.context.MQTT_USERNAME,password:this.context.MQTT_PASSWORD,clean:!0},this.url=n,this.client=e.connect(this.url,this.options),this._onConnect(),this._onMessage(),this.state=0,this.topics=[]}_onConnect(){this.client.on("connect",(()=>{this.state=1,console.log("链接mqtt成功==>"+this.url),this.dispatchEvent({type:i.MQTT_CONNECT,message:this})})),this.client.on("error",(t=>{console.log("链接mqtt报错",t),this.state=-1,this.dispatchEvent({type:i.MQTT_ERROR,message:this}),this.client.end(),this.client.reconnect()}))}_onMessage(){this.client.on("message",((t,e)=>{let n=e,s="";e instanceof Uint8Array&&(n=e.toString());try{s=g.parse(n)}catch(r){throw new Error(o.JSON_PARSE_ERROR)}this.dispatchEvent({type:i.MQTT_MESSAGE,message:{topic:t,data:s}})}))}sendMsg(t,e){this.client.connected?this.client.publish(t,e,{qos:1,retain:!0}):console.error("客户端未连接")}subscribe(t){return 1===this.state?this.client.subscribe(t,{qos:1},((e,n)=>{e instanceof Error?console.error("订阅失败==>"+t,e):(this.topics=b.union(this.topics,t),console.log("订阅成功==>"+t))})):this.addEventListener(i.MQTT_CONNECT,(e=>{this.client.subscribe(t,{qos:1},((e,n)=>{e instanceof Error?console.error("订阅失败==>"+t,e):(this.topics=b.union(this.topics,t),console.log("订阅成功==>"+t))}))})),this}unsubscribe(t){return this.client.unsubscribe(t,{qos:1},((e,n)=>{e instanceof Error?console.error(`取消订阅失败==>${t}`,e):(this.topics=b.difference(this.topics,t),console.log(`取消订阅成功==>${t}`))})),this}unsubscribeAll(){this.unsubscribe(this.topics)}unconnect(){this.client.end(),this.client=null,this.dispatchEvent({type:i.MQTT_CLOSE,message:null}),console.log("断开mqtt成功==>"+this.url)}};r(N,"defaultContext",{MQTT_USERNAME:"iRVMS-WEB",MQTT_PASSWORD:"novasky888",MQTT_TIMEOUTM:2e4});let U=N;const F=class t{static useLocal(){this.store=window.localStorage}static useSession(){this.store=window.sessionStorage}static set(t,e=null,n={}){var s=this._getPrefixedKey(t,n);try{const{expires:t}=n,r={data:e};t&&(r.expires=t),this.store.setItem(s,JSON.stringify(r))}catch(r){console&&console.warn(`Storage didn't successfully save the '{"${t}": "${e}"}' pair, because the Storage is full.`)}}static get(t,e,n){var s,r=this._getPrefixedKey(t,n);try{s=JSON.parse(this.store.getItem(r)||"")}catch(i){s=this.store[r]?{data:this.store.getItem(r)}:null}if(!s)return e;if("object"==typeof s&&void 0!==s.data){const t=s.expires;return t&&Date.now()>t?e:s.data}}static keys(){const e=[];var n=Object.keys(this.store);return 0===t.prefix.length?n:(n.forEach((function(n){-1!==n.indexOf(t.prefix)&&e.push(n.replace(t.prefix,""))})),e)}static getAll(e){var n=t.keys();if(e){const s=[];return n.forEach((n=>{if(e.includes(n)){const e={};e[n]=t.get(n,null,null),s.push(e)}})),s}return n.map((e=>t.get(e,null,null)))}static remove(t,e){var n=this._getPrefixedKey(t,e);this.store.removeItem(n)}static clear(e){t.prefix.length?this.keys().forEach((t=>{this.store.removeItem(this._getPrefixedKey(t,e))})):this.store.clear()}};r(F,"store",window.localStorage),r(F,"prefix",""),r(F,"_getPrefixedKey",(function(t,e){return(e=e||{}).noPrefix?t:F.prefix+t}));let G=F;t.AjaxUtil=f,t.ArrayUtil=b,t.AssertUtil=R,t.AudioPlayer=class{constructor(t){r(this,"audio"),this.audio=new Audio,this.audio.src=t}static speak(t,e={}){const n=new SpeechSynthesisUtterance;n.text=t,n.lang=e.lang||"zh-CN",n.volume=e.volume||1,n.rate=e.rate||1,n.pitch=e.pitch||1,window.speechSynthesis.speak(n)}play(){!this.muted&&this.audio.play()}pause(){this.audio.pause()}get muted(){return this.audio.muted}set muted(t){this.audio.muted=t}},t.BrowserUtil=C,t.CanvasDrawer=class{constructor(t){if(r(this,"context",null),"string"==typeof t&&!(t=document.querySelector("#"+t)))throw new Error("Element not found");if(!(t instanceof HTMLElement))throw new Error("Element is not an HTMLElement");{const e=t;if(!e.getContext)throw new Error("getContext is not available on this element");this.context=e.getContext("2d")}}drawLine({x:t,y:e},{x:n,y:s},r={}){if(!this.context)throw new Error("Canvas context is null or undefined");this.context.beginPath();const i=r.width||1,o=r.color||"#000";this.context.lineWidth=i,this.context.strokeStyle=o,this.context.moveTo(t,e),this.context.lineTo(n,s),this.context.stroke()}drawArc({x:t,y:e},n,s,r,i,o,a){if(!this.context)throw new Error("Canvas context is null or undefined");o?(this.context.fillStyle=a,this.context.beginPath(),this.context.arc(t,e,n,m.deg2Rad(s),m.deg2Rad(r),i),this.context.fill()):(this.context.strokeStyle=a,this.context.beginPath(),this.context.arc(t,e,n,m.deg2Rad(s),m.deg2Rad(r),i),this.context.stroke())}static createCanvas(t=1,e=1){const n=document.createElement("canvas");return t&&(n.width=t),e&&(n.height=e),n}},t.Color=P,t.Cookie=class{static set(t,e,n=30){if("string"!=typeof t||"string"!=typeof e||"number"!=typeof n)throw new Error("Invalid arguments");const s=new Date;s.setTime(s.getTime()+24*n*60*60*1e3),document.cookie=`${t}=${encodeURIComponent(e)};expires=${s.toUTCString()}`}static remove(t){var e=new Date;e.setTime(e.getTime()-1);var n=this.get(t);null!=n&&(document.cookie=t+"="+n+";expires="+e.toUTCString())}static get(t){var e=document.cookie.match(new RegExp("(^| )"+t+"=([^;]*)(;|$)"));return null!=e?e[2]:""}},t.CoordsUtil=_,t.DateUtil=v,t.DomUtil=x,t.ErrorType=o,t.EventDispatcher=L,t.EventType=i,t.FileUtil=O,t.GeoJsonUtil=M,t.GeoUtil=y,t.GraphicType=l,t.HashMap=k,t.ImageUtil=p,t.LayerType=a,t.LineSymbol=c,t.MathUtil=m,t.MeasureMode=h,t.MqttClient=U,t.ObjectState=u,t.ObjectUtil=g,t.OptimizeUtil=I,t.Storage=G,t.StringUtil=E,t.UrlUtil=D,t.Util=d,t.WebSocketClient=class extends L{constructor(t="ws://127.0.0.1:10088"){super(),r(this,"maxCheckTimes",10),r(this,"url"),r(this,"checkTimes",0),r(this,"connectStatus",!1),r(this,"client",null),this.maxCheckTimes=10,this.url=t,this.checkTimes=0,this.connect(),this.connCheckStatus(this.maxCheckTimes)}connect(){if(this.disconnect(),this.url)try{if(console.info("创建ws连接>>>"+this.url),this.client=new WebSocket(this.url),this.client){const t=this;this.client.onopen=function(e){t.dispatchEvent({type:i.WEB_SOCKET_CONNECT,message:e})},this.client.onmessage=function(e){t.connectStatus=!0,t.dispatchEvent({type:i.WEB_SOCKET_MESSAGE,message:e})},this.client.onclose=function(e){t.dispatchEvent({type:i.WEB_SOCKET_CLOSE,message:e})},this.checkTimes===this.maxCheckTimes&&(this.client.onerror=function(e){t.dispatchEvent({type:i.WEB_SOCKET_ERROR,message:e})})}}catch(t){console.error("创建ws连接失败"+this.url+":"+t)}}disconnect(){if(this.client)try{console.log("ws断开连接"+this.url),this.client.close(),this.client=null}catch(t){this.client=null}}connCheckStatus(t){this.checkTimes>t||setTimeout((()=>{this.checkTimes++,this.client&&0!==this.client.readyState&&1!==this.client.readyState&&this.connect(),this.connCheckStatus(t)}),2e3)}send(t){return this.client&&1===this.client.readyState?(this.client.send(t),!0):(console.error(this.url+"消息发送失败:"+t),!1)}heartbeat(){setTimeout((()=>{this.client&&1===this.client.readyState&&this.send("HeartBeat"),console.log("HeartBeat,"+this.url),setTimeout(this.heartbeat,3e4)}),1e3)}},Object.defineProperty(t,Symbol.toStringTag,{value:"Module"})}));
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { LngLat } from '../types';
|
|
2
2
|
declare const _default: {
|
|
3
3
|
assertEmpty(...arg: any[]): void;
|
|
4
|
+
assertInteger(...arg: any[]): void;
|
|
4
5
|
assertNumber(...arg: any[]): void;
|
|
5
6
|
assertArray(...arg: any[]): void;
|
|
6
7
|
assertFunction(...arg: any[]): void;
|
|
@@ -9,6 +10,8 @@ declare const _default: {
|
|
|
9
10
|
assertLnglat(...arg: LngLat[]): void;
|
|
10
11
|
assertGeoJson(...arg: any[]): void;
|
|
11
12
|
assertContain(str: string, ...args: string[]): void;
|
|
13
|
+
assertStartWith(value: string, prefix: string): void;
|
|
14
|
+
assertEndWith(value: string, prefix: string): void;
|
|
12
15
|
/**
|
|
13
16
|
* 判断字符串是否合法
|
|
14
17
|
*
|
|
@@ -1,33 +1,82 @@
|
|
|
1
|
-
|
|
1
|
+
interface BrowserType {
|
|
2
|
+
type: string;
|
|
3
|
+
version: string;
|
|
4
|
+
}
|
|
5
|
+
export default class BrowserUtil {
|
|
6
|
+
static readonly document: Document;
|
|
7
|
+
static readonly navigator: Navigator;
|
|
8
|
+
static readonly userAgent: string;
|
|
9
|
+
static readonly screen: Screen;
|
|
2
10
|
/**
|
|
3
|
-
*
|
|
11
|
+
* 获取系统类型
|
|
4
12
|
*
|
|
5
|
-
* @returns
|
|
13
|
+
* @returns 返回一个包含系统类型和版本的对象
|
|
6
14
|
*/
|
|
7
|
-
|
|
15
|
+
static getSystem(): BrowserType;
|
|
8
16
|
/**
|
|
9
|
-
*
|
|
17
|
+
* 获取浏览器类型信息
|
|
10
18
|
*
|
|
11
|
-
* @returns
|
|
19
|
+
* @returns 浏览器类型信息,包含浏览器类型和版本号
|
|
12
20
|
*/
|
|
13
|
-
|
|
21
|
+
static getExplorer(): BrowserType;
|
|
14
22
|
/**
|
|
15
23
|
* 切换全屏状态
|
|
16
24
|
*
|
|
17
25
|
* @param status 是否全屏
|
|
18
26
|
*/
|
|
19
|
-
switchFullScreen(status: boolean): void;
|
|
27
|
+
static switchFullScreen(status: boolean): void;
|
|
20
28
|
/**
|
|
21
|
-
*
|
|
29
|
+
* 判断当前浏览器是否支持WebGL
|
|
22
30
|
*
|
|
23
|
-
* @returns
|
|
31
|
+
* @returns 如果支持WebGL则返回true,否则返回false
|
|
24
32
|
*/
|
|
25
|
-
|
|
33
|
+
static isSupportWebGL(): boolean;
|
|
26
34
|
/**
|
|
27
|
-
* 获取
|
|
35
|
+
* 获取GPU信息
|
|
28
36
|
*
|
|
29
|
-
* @returns
|
|
37
|
+
* @returns 返回包含GPU类型和型号的对象
|
|
30
38
|
*/
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
39
|
+
static getGPU(): {
|
|
40
|
+
type: string;
|
|
41
|
+
model: string;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* 获取当前浏览器设置的语言
|
|
45
|
+
*
|
|
46
|
+
* @returns 返回浏览器设置的语言,格式为 "语言_地区",例如 "zh_CN"。如果获取失败,则返回 "Unknown"。
|
|
47
|
+
*/
|
|
48
|
+
static getLanguage(): string;
|
|
49
|
+
/**
|
|
50
|
+
* 获取当前环境的时区。
|
|
51
|
+
*
|
|
52
|
+
* @returns 返回当前环境的时区,若获取失败则返回 undefined。
|
|
53
|
+
*/
|
|
54
|
+
static getTimeZone(): string;
|
|
55
|
+
/**
|
|
56
|
+
* 获取屏幕帧率
|
|
57
|
+
*
|
|
58
|
+
* @returns 返回一个Promise,resolve为计算得到的屏幕帧率
|
|
59
|
+
* eg: const fps = await BrowserUtil.getScreenFPS()
|
|
60
|
+
*/
|
|
61
|
+
static getScreenFPS(): Promise<unknown>;
|
|
62
|
+
/**
|
|
63
|
+
* 获取IP地址
|
|
64
|
+
*
|
|
65
|
+
* @returns 返回一个Promise,当成功获取到IP地址时resolve,返回IP地址字符串;当获取失败时reject,返回undefined
|
|
66
|
+
*/
|
|
67
|
+
static getIPAddress(): Promise<unknown>;
|
|
68
|
+
/**
|
|
69
|
+
* 获取网络状态信息
|
|
70
|
+
*
|
|
71
|
+
* @returns 返回包含网络状态信息的对象,包含以下属性:
|
|
72
|
+
* - network: 网络类型,可能的值为 'wifi'、'4g' 等
|
|
73
|
+
* - isOnline: 是否在线,为 true 或 false
|
|
74
|
+
* - ip: 当前设备的 IP 地址
|
|
75
|
+
*/
|
|
76
|
+
static getNetwork(): Promise<{
|
|
77
|
+
network: string;
|
|
78
|
+
isOnline: boolean;
|
|
79
|
+
ip: unknown;
|
|
80
|
+
}>;
|
|
81
|
+
}
|
|
82
|
+
export {};
|
package/dist/utils/CommUtil.d.ts
CHANGED
package/package.json
CHANGED
package/CHANGELOG.md
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
此工具库的所有显著更改都将记录在此文件中,请参阅[标准版本](http://xxx)以获取提交指南。
|
|
4
|
-
|
|
5
|
-
## [0.1.2](http://git.xxx/343790edee6d5d09c5615ed94a40bcdd7bbfe781) (2024-09-06)
|
|
6
|
-
|
|
7
|
-
### Fixed
|
|
8
|
-
* 修改OptimizeUtil的防抖程序
|
|
9
|
-
|
|
10
|
-
## [0.1.1](http://git.xxx/316a0dd828161549f48ead0f414fb5c9ffb1e5cc) (2024-09-04)
|
|
11
|
-
|
|
12
|
-
### Added
|
|
13
|
-
* 进行typescript改造,增加types以方便智能代码提示
|