Compare commits

...

38 Commits
master ... dev

Author SHA1 Message Date
zhaipx 32f4457012 fix:解决合并冲突 11 months ago
zhaipx 75249a4a63 Merge branch 'devzpx' into dev
# Conflicts:
#	src/components/map/SceneViewer.vue
#	src/utils/map/draw/drawPolyline.ts
11 months ago
WuChengbo fbad4dba03 Merge pull request 'dev-cbwu' (#8) from dev-cbwu into dev
Reviewed-on: #8
11 months ago
cbwu 1ae19f2896 feat: 地表辅助线(待完善) 11 months ago
cbwu fc4c74e21a fix: 修复绘制航线双击结束判定逻辑。 11 months ago
zhaipx 19c18e4212 feat: 1.增加绘制折线类的bProfile参数,用于指示绘制结束后是否进行地形剖面分析 2.封装折线段剖面分析数值解算函数 11 months ago
cbwu 0b9b0c2432 Merge remote-tracking branch 'origin/dev' into dev-cbwu 11 months ago
cbwu 97976393d4 feat: 绘制航线新增垂直辅助线。 11 months ago
zhaipx e50790c3e9 feat: 新增距离、方位角计算、面积测量交互接口,绘制折线、多边形时可选 11 months ago
zhaipx 2c45764989 Merge branch 'devzpx' into dev
# Conflicts:
#	src/components/map/BottomBar.vue
#	src/utils/DataIO.ts
#	src/utils/map/geocomputation.ts
11 months ago
zhaipx aa6d6a3105 feat: 添加geojson、kml接口,实现地形剖面分析的数值解算 11 months ago
WuChengbo 6221bca0c0 Merge pull request 'dev-cbwu' (#6) from dev-cbwu into dev
Reviewed-on: #6
11 months ago
cbwu a0851e54a7 fix: 修复天地图服务类WGS84加载错误的问题;三维服务使用单独的key 11 months ago
cbwu bbe84ec866 doc: 增加注释 11 months ago
cbwu ade03bc747 refactor: 拆分几何对象类的可选配置项类型接口定义 11 months ago
cbwu 4f2823f073 feat: 新增Polygon绘制类。 11 months ago
cbwu 1f5c7a3244 feat: 移除geometry.ts 11 months ago
cbwu bd13f1ce4b feat: 移除geometry.ts 11 months ago
zhaipx 32c0247870 perf: 优化状态条,恢复罗盘深色透明样式,调整相机初始视角 11 months ago
zhaipx 771a8b1c35 Merge branch 'devzpx' into dev
# Conflicts:
#	src/components/map/BottomBar.vue
#	src/utils/map/angle.ts
#	src/utils/map/geocomputation.ts
11 months ago
WuChengbo 5e87487db9 Merge pull request 'dev-cbwu' (#5) from dev-cbwu into dev
Reviewed-on: #5
11 months ago
zhaipx 8e6de37a61 feat: 增加距离测量、面积测量、方位角计算方法 11 months ago
cbwu 32d0bfb64c feat: 标记点功能新增label。 11 months ago
cbwu 09f3e998cb feat: 新增Marker图层存储所有Marker对象 11 months ago
cbwu d50f3fc842 fix: 修改状态栏坐标拾取方式(更精确) 11 months ago
cbwu df7d438554 perf: 优化图片显示清晰度。 11 months ago
cbwu a78e0b11d5 feat: 新增绘制标记点工具类。 11 months ago
cbwu bc9fa04169 feat: 新增获取地图静态资源工具类,新增标记点静态资源 11 months ago
WuChengbo 48cd08df94 Merge pull request 'fix: window全局挂载Cesium改为首字母大写' (#4) from devzpx into dev
Reviewed-on: #4
12 months ago
zhaipx 57d883c841 fix: window全局挂载Cesium改为首字母大写 12 months ago
WuChengbo 1a95bcfddc Merge pull request 'devzpx' (#3) from devzpx into dev
Reviewed-on: #3
12 months ago
zhaipx d19a9b94ec perf: 优化经度转换相关代码组织,度分秒精确至毫秒 12 months ago
zhaipx 3e32f4387e Merge remote-tracking branch 'origin/dev' into devzpx
# Conflicts:
#	src/components/map/SceneViewer.vue
#	src/global.d.ts
#	src/utils/map/coordinate.ts
#	src/utils/map/geometry.ts
12 months ago
zhaipx 3e449ebca0 feat: 增加地图实时经纬高、十进制经纬度与度分秒转换 12 months ago
WuChengbo 3fc8da9da0 Merge pull request 'feat: 新增Polyline的绘制与编辑(待完善)。fix: window下的Cesium,Viewer对象改成cesium,viewer小写' (#2) from dev-cbwu into dev
Reviewed-on: #2
12 months ago
WuChengbo 9fd2a9a65f Merge pull request 'feat: 增加地图罗盘、比例尺' (#1) from devzpx into dev
Reviewed-on: #1
12 months ago
cbwu eb3d03220c feat: 新增Polyline的绘制与编辑(待完善)。fix: window下的Cesium,Viewer对象改成cesium,viewer小写 12 months ago
zhaipx 07abfcbcd0 feat: 增加地图罗盘、比例尺 12 months ago

@ -1,3 +1,10 @@
/*
* @Author: cbwu 504-wuchengbo@htsdfp.com
* @Date: 2024-04-13 10:03:23
* @LastEditors: cbwu
* @LastEditTime: 2024-04-13 11:07:45
* @Description:
*/
module.exports = { module.exports = {
env: { env: {
browser: true, browser: true,
@ -36,15 +43,15 @@ module.exports = {
plugins: ['@typescript-eslint', 'vue'], plugins: ['@typescript-eslint', 'vue'],
rules: { rules: {
// eslinthttps://eslint.bootcss.com/docs/rules/ // eslinthttps://eslint.bootcss.com/docs/rules/
'no-var': 'error', // 要求使用 let 或 const 而不是 var 'no-var': 'off', // 要求使用 let 或 const 而不是 var
'no-multiple-empty-lines': ['warn', { max: 1 }], // 不允许多个空行 'no-multiple-empty-lines': ['warn', { max: 1 }], // 不允许多个空行
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-unexpected-multiline': 'error', // 禁止空余的多行 'no-unexpected-multiline': 'off', // 禁止空余的多行
'no-useless-escape': 'off', // 禁止不必要的转义字符 'no-useless-escape': 'off', // 禁止不必要的转义字符
// typeScript (https://typescript-eslint.io/rules) // typeScript (https://typescript-eslint.io/rules)
'@typescript-eslint/no-unused-vars': 'error', // 禁止定义未使用的变量 '@typescript-eslint/no-unused-vars': 'warn', // 禁止定义未使用的变量
'@typescript-eslint/prefer-ts-expect-error': 'error', // 禁止使用 @ts-ignore '@typescript-eslint/prefer-ts-expect-error': 'error', // 禁止使用 @ts-ignore
'@typescript-eslint/no-explicit-any': 'off', // 禁止使用 any 类型 '@typescript-eslint/no-explicit-any': 'off', // 禁止使用 any 类型
'@typescript-eslint/no-non-null-assertion': 'off', '@typescript-eslint/no-non-null-assertion': 'off',
@ -63,5 +70,6 @@ module.exports = {
semi: false, semi: false,
}, },
], ],
'linebreak-style': [0, 'error', 'windows'], //取消对LF和CRLF的检查
}, },
} }

@ -1,9 +1,9 @@
{ {
"singleQuote": true, "singleQuote": true,
"semi": false, "semi": false,
"bracketSpacing": true, "bracketSpacing": true,
"htmlWhitespaceSensitivity": "ignore", "htmlWhitespaceSensitivity": "ignore",
"endOfLine": "auto", "endOfLine": "lf",
"trailingComma": "all", "trailingComma": "all",
"tabWidth": 2 "tabWidth": 2
} }

@ -1,4 +1,5 @@
/node_modules/* /node_modules/*
/dist/* /dist/*
/html/* /html/*
/public/* /public/*
*cesium*

@ -19,8 +19,6 @@ commit 提交信息时,必须是 **git commit -m 'fix: xxx'** 符合类型的
'build',//编译相关的修改,例如发布版本、对项目构建或者依赖的改动 'build',//编译相关的修改,例如发布版本、对项目构建或者依赖的改动
``` ```
## 地图库 ## 地图库
- 地图采用开源的Cesium.js库版本为1.108.注不要随意升级版本天地图三维地形服务目前只支持1.108实测1.109也能用,更高版本则无法使用。 - 地图采用开源的Cesium.js库版本为1.108.注不要随意升级版本天地图三维地形服务目前只支持1.108实测1.109也能用,更高版本则无法使用。

@ -1,3 +1,10 @@
<!--
* @Author: cbwu 504-wuchengbo@htsdfp.com
* @Date: 2024-03-07 09:19:24
* @LastEditors: cbwu
* @LastEditTime: 2024-04-02 13:19:05
* @Description:
-->
<!doctype html> <!doctype html>
<html lang="en"> <html lang="en">
<head> <head>

@ -19,6 +19,8 @@
"dependencies": { "dependencies": {
"axios": "^1.6.7", "axios": "^1.6.7",
"cesium": "1.108", "cesium": "1.108",
"cesium-navigation-es6": "^3.0.8",
"echarts": "^5.5.0",
"pinia": "^2.1.7", "pinia": "^2.1.7",
"vue": "^3.4.21" "vue": "^3.4.21"
}, },

@ -11,6 +11,12 @@ dependencies:
cesium: cesium:
specifier: '1.108' specifier: '1.108'
version: 1.108.0 version: 1.108.0
cesium-navigation-es6:
specifier: ^3.0.8
version: 3.0.8
echarts:
specifier: ^5.5.0
version: 5.5.0
pinia: pinia:
specifier: ^2.1.7 specifier: ^2.1.7
version: 2.1.7(typescript@5.4.2)(vue@3.4.21) version: 2.1.7(typescript@5.4.2)(vue@3.4.21)
@ -127,7 +133,7 @@ packages:
dev: true dev: true
/@ampproject/remapping@2.3.0: /@ampproject/remapping@2.3.0:
resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==, tarball: https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.3.0.tgz}
engines: {node: '>=6.0.0'} engines: {node: '>=6.0.0'}
dependencies: dependencies:
'@jridgewell/gen-mapping': 0.3.5 '@jridgewell/gen-mapping': 0.3.5
@ -143,12 +149,12 @@ packages:
dev: true dev: true
/@babel/compat-data@7.23.5: /@babel/compat-data@7.23.5:
resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==, tarball: https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.23.5.tgz}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
dev: true dev: true
/@babel/core@7.24.0: /@babel/core@7.24.0:
resolution: {integrity: sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==} resolution: {integrity: sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==, tarball: https://registry.npmmirror.com/@babel/core/-/core-7.24.0.tgz}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
dependencies: dependencies:
'@ampproject/remapping': 2.3.0 '@ampproject/remapping': 2.3.0
@ -185,7 +191,7 @@ packages:
dev: true dev: true
/@babel/generator@7.23.6: /@babel/generator@7.23.6:
resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==, tarball: https://registry.npmmirror.com/@babel/generator/-/generator-7.23.6.tgz}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
dependencies: dependencies:
'@babel/types': 7.24.0 '@babel/types': 7.24.0
@ -195,7 +201,7 @@ packages:
dev: true dev: true
/@babel/helper-compilation-targets@7.23.6: /@babel/helper-compilation-targets@7.23.6:
resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==, tarball: https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
dependencies: dependencies:
'@babel/compat-data': 7.23.5 '@babel/compat-data': 7.23.5
@ -206,12 +212,12 @@ packages:
dev: true dev: true
/@babel/helper-environment-visitor@7.22.20: /@babel/helper-environment-visitor@7.22.20:
resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==, tarball: https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
dev: true dev: true
/@babel/helper-function-name@7.23.0: /@babel/helper-function-name@7.23.0:
resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==, tarball: https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
dependencies: dependencies:
'@babel/template': 7.24.0 '@babel/template': 7.24.0
@ -219,21 +225,21 @@ packages:
dev: true dev: true
/@babel/helper-hoist-variables@7.22.5: /@babel/helper-hoist-variables@7.22.5:
resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==, tarball: https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
dependencies: dependencies:
'@babel/types': 7.24.0 '@babel/types': 7.24.0
dev: true dev: true
/@babel/helper-module-imports@7.22.15: /@babel/helper-module-imports@7.22.15:
resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==, tarball: https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
dependencies: dependencies:
'@babel/types': 7.24.0 '@babel/types': 7.24.0
dev: true dev: true
/@babel/helper-module-transforms@7.23.3(@babel/core@7.24.0): /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.0):
resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==, tarball: https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
peerDependencies: peerDependencies:
'@babel/core': ^7.0.0 '@babel/core': ^7.0.0
@ -247,14 +253,14 @@ packages:
dev: true dev: true
/@babel/helper-simple-access@7.22.5: /@babel/helper-simple-access@7.22.5:
resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==, tarball: https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
dependencies: dependencies:
'@babel/types': 7.24.0 '@babel/types': 7.24.0
dev: true dev: true
/@babel/helper-split-export-declaration@7.22.6: /@babel/helper-split-export-declaration@7.22.6:
resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==, tarball: https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
dependencies: dependencies:
'@babel/types': 7.24.0 '@babel/types': 7.24.0
@ -269,12 +275,12 @@ packages:
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
/@babel/helper-validator-option@7.23.5: /@babel/helper-validator-option@7.23.5:
resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==, tarball: https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
dev: true dev: true
/@babel/helpers@7.24.0: /@babel/helpers@7.24.0:
resolution: {integrity: sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==} resolution: {integrity: sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==, tarball: https://registry.npmmirror.com/@babel/helpers/-/helpers-7.24.0.tgz}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
dependencies: dependencies:
'@babel/template': 7.24.0 '@babel/template': 7.24.0
@ -301,7 +307,7 @@ packages:
'@babel/types': 7.24.0 '@babel/types': 7.24.0
/@babel/template@7.24.0: /@babel/template@7.24.0:
resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==, tarball: https://registry.npmmirror.com/@babel/template/-/template-7.24.0.tgz}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
dependencies: dependencies:
'@babel/code-frame': 7.23.5 '@babel/code-frame': 7.23.5
@ -310,7 +316,7 @@ packages:
dev: true dev: true
/@babel/traverse@7.24.0: /@babel/traverse@7.24.0:
resolution: {integrity: sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==} resolution: {integrity: sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==, tarball: https://registry.npmmirror.com/@babel/traverse/-/traverse-7.24.0.tgz}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
dependencies: dependencies:
'@babel/code-frame': 7.23.5 '@babel/code-frame': 7.23.5
@ -564,7 +570,7 @@ packages:
dev: true dev: true
/@esbuild/aix-ppc64@0.19.12: /@esbuild/aix-ppc64@0.19.12:
resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==, tarball: https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [ppc64] cpu: [ppc64]
os: [aix] os: [aix]
@ -573,7 +579,7 @@ packages:
optional: true optional: true
/@esbuild/android-arm64@0.19.12: /@esbuild/android-arm64@0.19.12:
resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==, tarball: https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [arm64] cpu: [arm64]
os: [android] os: [android]
@ -582,7 +588,7 @@ packages:
optional: true optional: true
/@esbuild/android-arm@0.19.12: /@esbuild/android-arm@0.19.12:
resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==, tarball: https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [arm] cpu: [arm]
os: [android] os: [android]
@ -591,7 +597,7 @@ packages:
optional: true optional: true
/@esbuild/android-x64@0.19.12: /@esbuild/android-x64@0.19.12:
resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==, tarball: https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [x64] cpu: [x64]
os: [android] os: [android]
@ -600,7 +606,7 @@ packages:
optional: true optional: true
/@esbuild/darwin-arm64@0.19.12: /@esbuild/darwin-arm64@0.19.12:
resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==, tarball: https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
@ -609,7 +615,7 @@ packages:
optional: true optional: true
/@esbuild/darwin-x64@0.19.12: /@esbuild/darwin-x64@0.19.12:
resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==, tarball: https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
@ -618,7 +624,7 @@ packages:
optional: true optional: true
/@esbuild/freebsd-arm64@0.19.12: /@esbuild/freebsd-arm64@0.19.12:
resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==, tarball: https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [arm64] cpu: [arm64]
os: [freebsd] os: [freebsd]
@ -627,7 +633,7 @@ packages:
optional: true optional: true
/@esbuild/freebsd-x64@0.19.12: /@esbuild/freebsd-x64@0.19.12:
resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==, tarball: https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [x64] cpu: [x64]
os: [freebsd] os: [freebsd]
@ -636,7 +642,7 @@ packages:
optional: true optional: true
/@esbuild/linux-arm64@0.19.12: /@esbuild/linux-arm64@0.19.12:
resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==, tarball: https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
@ -645,7 +651,7 @@ packages:
optional: true optional: true
/@esbuild/linux-arm@0.19.12: /@esbuild/linux-arm@0.19.12:
resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==, tarball: https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
@ -654,7 +660,7 @@ packages:
optional: true optional: true
/@esbuild/linux-ia32@0.19.12: /@esbuild/linux-ia32@0.19.12:
resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==, tarball: https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [ia32] cpu: [ia32]
os: [linux] os: [linux]
@ -663,7 +669,7 @@ packages:
optional: true optional: true
/@esbuild/linux-loong64@0.19.12: /@esbuild/linux-loong64@0.19.12:
resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==, tarball: https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [loong64] cpu: [loong64]
os: [linux] os: [linux]
@ -672,7 +678,7 @@ packages:
optional: true optional: true
/@esbuild/linux-mips64el@0.19.12: /@esbuild/linux-mips64el@0.19.12:
resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==, tarball: https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [mips64el] cpu: [mips64el]
os: [linux] os: [linux]
@ -681,7 +687,7 @@ packages:
optional: true optional: true
/@esbuild/linux-ppc64@0.19.12: /@esbuild/linux-ppc64@0.19.12:
resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==, tarball: https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [ppc64] cpu: [ppc64]
os: [linux] os: [linux]
@ -690,7 +696,7 @@ packages:
optional: true optional: true
/@esbuild/linux-riscv64@0.19.12: /@esbuild/linux-riscv64@0.19.12:
resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==, tarball: https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [riscv64] cpu: [riscv64]
os: [linux] os: [linux]
@ -699,7 +705,7 @@ packages:
optional: true optional: true
/@esbuild/linux-s390x@0.19.12: /@esbuild/linux-s390x@0.19.12:
resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==, tarball: https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [s390x] cpu: [s390x]
os: [linux] os: [linux]
@ -708,7 +714,7 @@ packages:
optional: true optional: true
/@esbuild/linux-x64@0.19.12: /@esbuild/linux-x64@0.19.12:
resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==, tarball: https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
@ -717,7 +723,7 @@ packages:
optional: true optional: true
/@esbuild/netbsd-x64@0.19.12: /@esbuild/netbsd-x64@0.19.12:
resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==, tarball: https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [x64] cpu: [x64]
os: [netbsd] os: [netbsd]
@ -726,7 +732,7 @@ packages:
optional: true optional: true
/@esbuild/openbsd-x64@0.19.12: /@esbuild/openbsd-x64@0.19.12:
resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==, tarball: https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [x64] cpu: [x64]
os: [openbsd] os: [openbsd]
@ -735,7 +741,7 @@ packages:
optional: true optional: true
/@esbuild/sunos-x64@0.19.12: /@esbuild/sunos-x64@0.19.12:
resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==, tarball: https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [x64] cpu: [x64]
os: [sunos] os: [sunos]
@ -744,7 +750,7 @@ packages:
optional: true optional: true
/@esbuild/win32-arm64@0.19.12: /@esbuild/win32-arm64@0.19.12:
resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==, tarball: https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [arm64] cpu: [arm64]
os: [win32] os: [win32]
@ -753,7 +759,7 @@ packages:
optional: true optional: true
/@esbuild/win32-ia32@0.19.12: /@esbuild/win32-ia32@0.19.12:
resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==, tarball: https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [ia32] cpu: [ia32]
os: [win32] os: [win32]
@ -762,7 +768,7 @@ packages:
optional: true optional: true
/@esbuild/win32-x64@0.19.12: /@esbuild/win32-x64@0.19.12:
resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==, tarball: https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
@ -828,7 +834,7 @@ packages:
dev: true dev: true
/@jridgewell/gen-mapping@0.3.5: /@jridgewell/gen-mapping@0.3.5:
resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==, tarball: https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz}
engines: {node: '>=6.0.0'} engines: {node: '>=6.0.0'}
dependencies: dependencies:
'@jridgewell/set-array': 1.2.1 '@jridgewell/set-array': 1.2.1
@ -837,12 +843,12 @@ packages:
dev: true dev: true
/@jridgewell/resolve-uri@3.1.2: /@jridgewell/resolve-uri@3.1.2:
resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, tarball: https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz}
engines: {node: '>=6.0.0'} engines: {node: '>=6.0.0'}
dev: true dev: true
/@jridgewell/set-array@1.2.1: /@jridgewell/set-array@1.2.1:
resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==, tarball: https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.2.1.tgz}
engines: {node: '>=6.0.0'} engines: {node: '>=6.0.0'}
dev: true dev: true
@ -850,7 +856,7 @@ packages:
resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
/@jridgewell/trace-mapping@0.3.25: /@jridgewell/trace-mapping@0.3.25:
resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==, tarball: https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz}
dependencies: dependencies:
'@jridgewell/resolve-uri': 3.1.2 '@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/sourcemap-codec': 1.4.15
@ -932,7 +938,7 @@ packages:
dev: false dev: false
/@rollup/rollup-android-arm-eabi@4.12.1: /@rollup/rollup-android-arm-eabi@4.12.1:
resolution: {integrity: sha512-iU2Sya8hNn1LhsYyf0N+L4Gf9Qc+9eBTJJJsaOGUp+7x4n2M9dxTt8UvhJl3oeftSjblSlpCfvjA/IfP3g5VjQ==} resolution: {integrity: sha512-iU2Sya8hNn1LhsYyf0N+L4Gf9Qc+9eBTJJJsaOGUp+7x4n2M9dxTt8UvhJl3oeftSjblSlpCfvjA/IfP3g5VjQ==, tarball: https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.1.tgz}
cpu: [arm] cpu: [arm]
os: [android] os: [android]
requiresBuild: true requiresBuild: true
@ -940,7 +946,7 @@ packages:
optional: true optional: true
/@rollup/rollup-android-arm64@4.12.1: /@rollup/rollup-android-arm64@4.12.1:
resolution: {integrity: sha512-wlzcWiH2Ir7rdMELxFE5vuM7D6TsOcJ2Yw0c3vaBR3VOsJFVTx9xvwnAvhgU5Ii8Gd6+I11qNHwndDscIm0HXg==} resolution: {integrity: sha512-wlzcWiH2Ir7rdMELxFE5vuM7D6TsOcJ2Yw0c3vaBR3VOsJFVTx9xvwnAvhgU5Ii8Gd6+I11qNHwndDscIm0HXg==, tarball: https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.1.tgz}
cpu: [arm64] cpu: [arm64]
os: [android] os: [android]
requiresBuild: true requiresBuild: true
@ -948,7 +954,7 @@ packages:
optional: true optional: true
/@rollup/rollup-darwin-arm64@4.12.1: /@rollup/rollup-darwin-arm64@4.12.1:
resolution: {integrity: sha512-YRXa1+aZIFN5BaImK+84B3uNK8C6+ynKLPgvn29X9s0LTVCByp54TB7tdSMHDR7GTV39bz1lOmlLDuedgTwwHg==} resolution: {integrity: sha512-YRXa1+aZIFN5BaImK+84B3uNK8C6+ynKLPgvn29X9s0LTVCByp54TB7tdSMHDR7GTV39bz1lOmlLDuedgTwwHg==, tarball: https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.1.tgz}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
requiresBuild: true requiresBuild: true
@ -956,7 +962,7 @@ packages:
optional: true optional: true
/@rollup/rollup-darwin-x64@4.12.1: /@rollup/rollup-darwin-x64@4.12.1:
resolution: {integrity: sha512-opjWJ4MevxeA8FhlngQWPBOvVWYNPFkq6/25rGgG+KOy0r8clYwL1CFd+PGwRqqMFVQ4/Qd3sQu5t7ucP7C/Uw==} resolution: {integrity: sha512-opjWJ4MevxeA8FhlngQWPBOvVWYNPFkq6/25rGgG+KOy0r8clYwL1CFd+PGwRqqMFVQ4/Qd3sQu5t7ucP7C/Uw==, tarball: https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.1.tgz}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
requiresBuild: true requiresBuild: true
@ -964,7 +970,7 @@ packages:
optional: true optional: true
/@rollup/rollup-linux-arm-gnueabihf@4.12.1: /@rollup/rollup-linux-arm-gnueabihf@4.12.1:
resolution: {integrity: sha512-uBkwaI+gBUlIe+EfbNnY5xNyXuhZbDSx2nzzW8tRMjUmpScd6lCQYKY2V9BATHtv5Ef2OBq6SChEP8h+/cxifQ==} resolution: {integrity: sha512-uBkwaI+gBUlIe+EfbNnY5xNyXuhZbDSx2nzzW8tRMjUmpScd6lCQYKY2V9BATHtv5Ef2OBq6SChEP8h+/cxifQ==, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.1.tgz}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
requiresBuild: true requiresBuild: true
@ -972,7 +978,7 @@ packages:
optional: true optional: true
/@rollup/rollup-linux-arm64-gnu@4.12.1: /@rollup/rollup-linux-arm64-gnu@4.12.1:
resolution: {integrity: sha512-0bK9aG1kIg0Su7OcFTlexkVeNZ5IzEsnz1ept87a0TUgZ6HplSgkJAnFpEVRW7GRcikT4GlPV0pbtVedOaXHQQ==} resolution: {integrity: sha512-0bK9aG1kIg0Su7OcFTlexkVeNZ5IzEsnz1ept87a0TUgZ6HplSgkJAnFpEVRW7GRcikT4GlPV0pbtVedOaXHQQ==, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.1.tgz}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [glibc] libc: [glibc]
@ -981,7 +987,7 @@ packages:
optional: true optional: true
/@rollup/rollup-linux-arm64-musl@4.12.1: /@rollup/rollup-linux-arm64-musl@4.12.1:
resolution: {integrity: sha512-qB6AFRXuP8bdkBI4D7UPUbE7OQf7u5OL+R94JE42Z2Qjmyj74FtDdLGeriRyBDhm4rQSvqAGCGC01b8Fu2LthQ==} resolution: {integrity: sha512-qB6AFRXuP8bdkBI4D7UPUbE7OQf7u5OL+R94JE42Z2Qjmyj74FtDdLGeriRyBDhm4rQSvqAGCGC01b8Fu2LthQ==, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.1.tgz}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [musl] libc: [musl]
@ -990,7 +996,7 @@ packages:
optional: true optional: true
/@rollup/rollup-linux-riscv64-gnu@4.12.1: /@rollup/rollup-linux-riscv64-gnu@4.12.1:
resolution: {integrity: sha512-sHig3LaGlpNgDj5o8uPEoGs98RII8HpNIqFtAI8/pYABO8i0nb1QzT0JDoXF/pxzqO+FkxvwkHZo9k0NJYDedg==} resolution: {integrity: sha512-sHig3LaGlpNgDj5o8uPEoGs98RII8HpNIqFtAI8/pYABO8i0nb1QzT0JDoXF/pxzqO+FkxvwkHZo9k0NJYDedg==, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.1.tgz}
cpu: [riscv64] cpu: [riscv64]
os: [linux] os: [linux]
libc: [glibc] libc: [glibc]
@ -999,7 +1005,7 @@ packages:
optional: true optional: true
/@rollup/rollup-linux-x64-gnu@4.12.1: /@rollup/rollup-linux-x64-gnu@4.12.1:
resolution: {integrity: sha512-nD3YcUv6jBJbBNFvSbp0IV66+ba/1teuBcu+fBBPZ33sidxitc6ErhON3JNavaH8HlswhWMC3s5rgZpM4MtPqQ==} resolution: {integrity: sha512-nD3YcUv6jBJbBNFvSbp0IV66+ba/1teuBcu+fBBPZ33sidxitc6ErhON3JNavaH8HlswhWMC3s5rgZpM4MtPqQ==, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.1.tgz}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [glibc] libc: [glibc]
@ -1008,7 +1014,7 @@ packages:
optional: true optional: true
/@rollup/rollup-linux-x64-musl@4.12.1: /@rollup/rollup-linux-x64-musl@4.12.1:
resolution: {integrity: sha512-7/XVZqgBby2qp/cO0TQ8uJK+9xnSdJ9ct6gSDdEr4MfABrjTyrW6Bau7HQ73a2a5tPB7hno49A0y1jhWGDN9OQ==} resolution: {integrity: sha512-7/XVZqgBby2qp/cO0TQ8uJK+9xnSdJ9ct6gSDdEr4MfABrjTyrW6Bau7HQ73a2a5tPB7hno49A0y1jhWGDN9OQ==, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.1.tgz}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [musl] libc: [musl]
@ -1017,7 +1023,7 @@ packages:
optional: true optional: true
/@rollup/rollup-win32-arm64-msvc@4.12.1: /@rollup/rollup-win32-arm64-msvc@4.12.1:
resolution: {integrity: sha512-CYc64bnICG42UPL7TrhIwsJW4QcKkIt9gGlj21gq3VV0LL6XNb1yAdHVp1pIi9gkts9gGcT3OfUYHjGP7ETAiw==} resolution: {integrity: sha512-CYc64bnICG42UPL7TrhIwsJW4QcKkIt9gGlj21gq3VV0LL6XNb1yAdHVp1pIi9gkts9gGcT3OfUYHjGP7ETAiw==, tarball: https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.1.tgz}
cpu: [arm64] cpu: [arm64]
os: [win32] os: [win32]
requiresBuild: true requiresBuild: true
@ -1025,7 +1031,7 @@ packages:
optional: true optional: true
/@rollup/rollup-win32-ia32-msvc@4.12.1: /@rollup/rollup-win32-ia32-msvc@4.12.1:
resolution: {integrity: sha512-LN+vnlZ9g0qlHGlS920GR4zFCqAwbv2lULrR29yGaWP9u7wF5L7GqWu9Ah6/kFZPXPUkpdZwd//TNR+9XC9hvA==} resolution: {integrity: sha512-LN+vnlZ9g0qlHGlS920GR4zFCqAwbv2lULrR29yGaWP9u7wF5L7GqWu9Ah6/kFZPXPUkpdZwd//TNR+9XC9hvA==, tarball: https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.1.tgz}
cpu: [ia32] cpu: [ia32]
os: [win32] os: [win32]
requiresBuild: true requiresBuild: true
@ -1033,7 +1039,7 @@ packages:
optional: true optional: true
/@rollup/rollup-win32-x64-msvc@4.12.1: /@rollup/rollup-win32-x64-msvc@4.12.1:
resolution: {integrity: sha512-n+vkrSyphvmU0qkQ6QBNXCGr2mKjhP08mPRM/Xp5Ck2FV4NrHU+y6axzDeixUrCBHVUS51TZhjqrKBBsHLKb2Q==} resolution: {integrity: sha512-n+vkrSyphvmU0qkQ6QBNXCGr2mKjhP08mPRM/Xp5Ck2FV4NrHU+y6axzDeixUrCBHVUS51TZhjqrKBBsHLKb2Q==, tarball: https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.1.tgz}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
requiresBuild: true requiresBuild: true
@ -1654,7 +1660,7 @@ packages:
dev: true dev: true
/browserslist@4.23.0: /browserslist@4.23.0:
resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==, tarball: https://registry.npmmirror.com/browserslist/-/browserslist-4.23.0.tgz}
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true hasBin: true
dependencies: dependencies:
@ -1696,9 +1702,15 @@ packages:
dev: true dev: true
/caniuse-lite@1.0.30001594: /caniuse-lite@1.0.30001594:
resolution: {integrity: sha512-VblSX6nYqyJVs8DKFMldE2IVCJjZ225LW00ydtUWwh5hk9IfkTOffO6r8gJNsH0qqqeAF8KrbMYA2VEwTlGW5g==} resolution: {integrity: sha512-VblSX6nYqyJVs8DKFMldE2IVCJjZ225LW00ydtUWwh5hk9IfkTOffO6r8gJNsH0qqqeAF8KrbMYA2VEwTlGW5g==, tarball: https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001594.tgz}
dev: true dev: true
/cesium-navigation-es6@3.0.8:
resolution: {integrity: sha512-RyoY9T02fE9pRNgXCmOD8QlSV5XJ2LPf+O9IpYEkTcyiUztOIwVQwdeT0heHvk+R1eM8jAG6YnRPvfyDsRonEA==}
dependencies:
cesium: 1.108.0
dev: false
/cesium@1.108.0: /cesium@1.108.0:
resolution: {integrity: sha512-8hhRC7O13g6jVws14A16CGcKKdPAZ4xiRUqyrMZ40qCbAoPbsufQY7dFJQ2EE9vR/FGehbon+q8/OBwweQlRaQ==} resolution: {integrity: sha512-8hhRC7O13g6jVws14A16CGcKKdPAZ4xiRUqyrMZ40qCbAoPbsufQY7dFJQ2EE9vR/FGehbon+q8/OBwweQlRaQ==}
engines: {node: '>=14.0.0'} engines: {node: '>=14.0.0'}
@ -1873,7 +1885,7 @@ packages:
dev: true dev: true
/convert-source-map@2.0.0: /convert-source-map@2.0.0:
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, tarball: https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz}
dev: true dev: true
/copy-descriptor@0.1.1: /copy-descriptor@0.1.1:
@ -2203,8 +2215,15 @@ packages:
resolution: {integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==} resolution: {integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==}
dev: false dev: false
/echarts@5.5.0:
resolution: {integrity: sha512-rNYnNCzqDAPCr4m/fqyUFv7fD9qIsd50S6GDFgO1DxZhncCsNsG7IfUlAlvZe5oSEQxtsjnHiUuppzccry93Xw==, tarball: https://registry.npmmirror.com/echarts/-/echarts-5.5.0.tgz}
dependencies:
tslib: 2.3.0
zrender: 5.5.0
dev: false
/electron-to-chromium@1.4.694: /electron-to-chromium@1.4.694:
resolution: {integrity: sha512-kM3SwvGTYpBFJSc8jm4IYVMIOzDmAGd/Ry96O9elRiM6iEwHKNKhtXyFGzpfMMIGZD84W4/hyaULlMmNVvLQlQ==} resolution: {integrity: sha512-kM3SwvGTYpBFJSc8jm4IYVMIOzDmAGd/Ry96O9elRiM6iEwHKNKhtXyFGzpfMMIGZD84W4/hyaULlMmNVvLQlQ==, tarball: https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.694.tgz}
dev: true dev: true
/emoji-regex@8.0.0: /emoji-regex@8.0.0:
@ -2870,7 +2889,7 @@ packages:
dev: true dev: true
/fsevents@2.3.3: /fsevents@2.3.3:
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, tarball: https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin] os: [darwin]
requiresBuild: true requiresBuild: true
@ -2896,7 +2915,7 @@ packages:
dev: true dev: true
/gensync@1.0.0-beta.2: /gensync@1.0.0-beta.2:
resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, tarball: https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
dev: true dev: true
@ -2994,7 +3013,7 @@ packages:
dev: true dev: true
/globals@11.12.0: /globals@11.12.0:
resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, tarball: https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz}
engines: {node: '>=4'} engines: {node: '>=4'}
dev: true dev: true
@ -3513,7 +3532,7 @@ packages:
dev: false dev: false
/jsesc@2.5.2: /jsesc@2.5.2:
resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==, tarball: https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz}
engines: {node: '>=4'} engines: {node: '>=4'}
hasBin: true hasBin: true
dev: true dev: true
@ -3546,7 +3565,7 @@ packages:
dev: true dev: true
/json5@2.2.3: /json5@2.2.3:
resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, tarball: https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz}
engines: {node: '>=6'} engines: {node: '>=6'}
hasBin: true hasBin: true
dev: true dev: true
@ -3694,7 +3713,7 @@ packages:
dev: false dev: false
/lru-cache@5.1.1: /lru-cache@5.1.1:
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, tarball: https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz}
dependencies: dependencies:
yallist: 3.1.1 yallist: 3.1.1
dev: true dev: true
@ -3886,7 +3905,7 @@ packages:
dev: true dev: true
/node-releases@2.0.14: /node-releases@2.0.14:
resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==, tarball: https://registry.npmmirror.com/node-releases/-/node-releases-2.0.14.tgz}
dev: true dev: true
/normalize-path@3.0.0: /normalize-path@3.0.0:
@ -5141,8 +5160,12 @@ packages:
strip-bom: 3.0.0 strip-bom: 3.0.0
dev: true dev: true
/tslib@2.3.0:
resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==, tarball: https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz}
dev: false
/tslib@2.6.2: /tslib@2.6.2:
resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, tarball: https://registry.npmmirror.com/tslib/-/tslib-2.6.2.tgz}
/type-check@0.4.0: /type-check@0.4.0:
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
@ -5246,7 +5269,7 @@ packages:
dev: true dev: true
/update-browserslist-db@1.0.13(browserslist@4.23.0): /update-browserslist-db@1.0.13(browserslist@4.23.0):
resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==, tarball: https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
browserslist: '>= 4.21.0' browserslist: '>= 4.21.0'
@ -5475,7 +5498,7 @@ packages:
dev: true dev: true
/yallist@3.1.1: /yallist@3.1.1:
resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, tarball: https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz}
dev: true dev: true
/yallist@4.0.0: /yallist@4.0.0:
@ -5509,3 +5532,9 @@ packages:
resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==}
engines: {node: '>=12.20'} engines: {node: '>=12.20'}
dev: true dev: true
/zrender@5.5.0:
resolution: {integrity: sha512-O3MilSi/9mwoovx77m6ROZM7sXShR/O/JIanvzTwjN3FORfLSr81PsUGd7jlaYOeds9d8tw82oP44+3YucVo+w==, tarball: https://registry.npmmirror.com/zrender/-/zrender-5.5.0.tgz}
dependencies:
tslib: 2.3.0
dev: false

File diff suppressed because one or more lines are too long

@ -1,14 +1,17 @@
<template> <template>
<div id="map"> <div id="map">
<SceneViewer id="scene-viewer"></SceneViewer> <SceneViewer id="scene-viewer"></SceneViewer>
<BottomBar></BottomBar>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import SceneViewer from './components/map/SceneViewer.vue' import SceneViewer from './components/map/SceneViewer.vue'
import BottomBar from '@/components/map/BottomBar.vue'
</script> </script>
<style scoped> <style>
@import 'styles/cesium-compass.css';
#map { #map {
width: 100vw; width: 100vw;
height: 100vh; height: 100vh;

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1712711935675" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4388" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32"><path d="M512 956.672c-28.068571-38.345143-92.397714-128.128-156.050286-230.180571-110.262857-176.694857-168.521143-309.229714-168.521143-383.268572 0-86.802286 33.755429-168.411429 95.085715-229.778286A322.267429 322.267429 0 0 1 512 18.285714c86.692571 0 168.192 33.792 229.485714 95.158857a322.980571 322.980571 0 0 1 95.085715 229.76c0 74.057143-58.276571 206.592-168.521143 383.286858-63.652571 102.034286-128 191.817143-156.050286 230.180571z" fill="#345DFF" p-id="4389"></path><path d="M512 36.571429a304.091429 304.091429 0 0 0-216.557714 89.782857A304.822857 304.822857 0 0 0 205.714286 343.222857c0 26.002286 8.685714 75.757714 50.066285 165.010286 27.776 59.867429 66.633143 129.974857 115.547429 208.365714 53.961143 86.509714 108.434286 164.205714 140.672 208.950857 32.219429-44.726857 86.710857-122.441143 140.672-208.950857 48.914286-78.390857 87.771429-148.498286 115.547429-208.365714 41.380571-89.252571 50.066286-139.008 50.066285-165.028572a304.822857 304.822857 0 0 0-89.728-216.832A304.091429 304.091429 0 0 0 512 36.571429m0-36.571429c189.348571 0 342.857143 153.654857 342.857143 343.222857 0 189.531429-342.857143 644.205714-342.857143 644.205714S169.142857 532.754286 169.142857 343.222857c0-189.568 153.508571-343.222857 342.857143-343.222857z" fill="#FFFFFF" p-id="4390"></path><path d="M516.571429 347.428571m-182.857143 0a182.857143 182.857143 0 1 0 365.714285 0 182.857143 182.857143 0 1 0-365.714285 0Z" fill="#FFFFFF" p-id="4391"></path><path d="M352 1005.714286a155.428571 18.285714 0 1 0 310.857143 0 155.428571 18.285714 0 1 0-310.857143 0Z" fill="#B7B7B7" p-id="4392"></path></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

@ -0,0 +1,92 @@
<!--
文件描述地图底部信息条
创建时间2024/3/29 8:53
创建人Zhaipeixiu
-->
<script setup lang="ts">
import { Angle } from '@/utils/map/angle.ts'
import {ScreenSpaceEventHandler, Math, ScreenSpaceEventType, Cartographic} from 'cesium'
import {onMounted, ref} from "vue";
import {cartesian2ToCartesian3} from "@/utils/map/coordinate.ts";
let nowLatStr: string, nowLonStr: string
let lonlatStr = ref('')
let isDecimal = ref(true)
onMounted(()=>{
let _viewer = window.viewer
let canvas = _viewer.scene.canvas
let handler = new ScreenSpaceEventHandler(canvas)
handler.setInputAction((e:any)=> {
//
let position = cartesian2ToCartesian3(_viewer, e.endPosition)
if (position) {
//
let cartographic = _viewer.scene.globe.ellipsoid.cartesianToCartographic(position);
try{
//
nowLatStr = Math.toDegrees(cartographic.latitude).toFixed(7) //
nowLonStr = Math.toDegrees(cartographic.longitude).toFixed(7) //
let camera_alt = (_viewer.camera.positionCartographic.height / 1000) //
// 250-80
let needElevation: boolean = camera_alt < 250 && (_viewer.camera.pitch < -(Math.PI/180)*80)
let elevStr = needElevation? Cartographic.fromCartesian(position).height.toFixed(2)+'m'?? '' : '高度过高'
if(isDecimal.value) { //
lonlatStr.value = `经度: ${nowLonStr}°, 纬度: ${nowLatStr}°, 高度: ${elevStr}`
}
else {
lonlatStr.value = `经度: ${Angle.DecimalDegree2DMS(nowLonStr)}, 纬度: ${Angle.DecimalDegree2DMS(nowLatStr)},
高度: ${elevStr}`
}
} catch (e) {}
}
}, ScreenSpaceEventType.MOUSE_MOVE)
})
function lonlatClick() {
let elevStr = lonlatStr.value.split('高度')[1]
if(isDecimal.value){
lonlatStr.value = `经度: ${Angle.DecimalDegree2DMS(nowLonStr)}, 纬度: ${Angle.DecimalDegree2DMS(nowLatStr)}, 高度` + elevStr
}
else {
lonlatStr.value = `经度: ${nowLonStr}°, 纬度: ${nowLatStr}°, 高度` + elevStr
}
isDecimal.value = !isDecimal.value
}
</script>
<template>
<div id="map-footer">
<button id="lonlatText" @click="lonlatClick">
{{ lonlatStr }}
</button>
</div>
</template>
<style scoped>
#map-footer {
position: absolute;
bottom: 1px;
left: 0;
width: 100vw;
height: 1.7rem;
background-color: rgba(47, 53, 60, 0.8);
color: #fff;
font-size: 0.7rem;
text-align: center;
z-index: 1;
padding: 0;
display: flex;
align-items: center;
justify-content: center;
}
#lonlatText{
background: none;
border: none;
color: #ffffff;
font-size: 0.8rem;
}
#lonlatText:hover{
cursor: pointer;
}
</style>

@ -1,11 +1,17 @@
<!--
* @Author: cbwu 504-wuchengbo@htsdfp.com
* @Date: 2024-03-07 14:15:35
* @LastEditors: cbwu
* @LastEditTime: 2024-04-16 19:06:50
* @Description:
-->
<template> <template>
<div id="cesium-viewer" ref="viewerDivRef"></div> <div id="cesium-viewer" ref="viewerDivRef"></div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { onMounted, ref } from 'vue' import { onMounted, ref } from 'vue'
// import * as Cesium from 'cesium' import { Viewer, Ion, Cartesian3, CustomDataSource, Color } from 'cesium'
import { Viewer } from 'cesium'
import 'cesium/Build/Cesium/Widgets/widgets.css' import 'cesium/Build/Cesium/Widgets/widgets.css'
import { import {
TDTLayerType, TDTLayerType,
@ -13,15 +19,18 @@ import {
getTDTProvider, getTDTProvider,
getTDTTerrainProvider, getTDTTerrainProvider,
} from '@/utils/map/TDTProvider' } from '@/utils/map/TDTProvider'
import { initViewer, perfViewer } from '@/utils/map/sceneViewer' import { initViewer, perfViewer, showNavigator } from '@/utils/map/sceneViewer'
import { flyToChina } from '@/utils/map/camera' import { flyToChina } from '@/utils/map/camera'
import CreatePolyline from '@/utils/map/draw/drawPolyline'
import { inputGeoJson } from '@/utils/DataIO.ts'
// import DrawPoint from '@/utils/map/draw/drawPoint'
import { DrawPolygon } from '@/utils/map/draw/drawPolygon'
const viewerDivRef = ref<HTMLDivElement>() const viewerDivRef = ref<HTMLDivElement>()
let viewer: Viewer let viewer: Viewer
window.CESIUM_BASE_URL = 'node_modules/cesium/Build/Cesium/' window.CESIUM_BASE_URL = 'node_modules/cesium/Build/Cesium/'
// window.CESIUM_BASE_URL = 'libs/cesium/' // // window.CESIUM_BASE_URL = 'libs/cesium/' //
window.Cesium.Ion.defaultAccessToken = Ion.defaultAccessToken =
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI3YjU4MjJlMS0wMWE4LTRhOWQtYjQ1OC04MTgzMzFhMzQ5ZjAiLCJpZCI6MTE1ODUxLCJpYXQiOjE2NjkyMDM1MzN9.8ajEuv3VKYg8wvFiQlUWWY6Ng6JfY4PuVgRyStL1B-E' 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI3YjU4MjJlMS0wMWE4LTRhOWQtYjQ1OC04MTgzMzFhMzQ5ZjAiLCJpZCI6MTE1ODUxLCJpYXQiOjE2NjkyMDM1MzN9.8ajEuv3VKYg8wvFiQlUWWY6Ng6JfY4PuVgRyStL1B-E'
// //
// window.Cesium.Camera.DEFAULT_VIEW_RECTANGLE = // window.Cesium.Camera.DEFAULT_VIEW_RECTANGLE =
@ -39,6 +48,8 @@ onMounted(() => {
perfViewer(viewer) perfViewer(viewer)
// //
flyToChina(viewer) flyToChina(viewer)
//
showNavigator(viewer)
// //
viewer.imageryLayers.addImageryProvider( viewer.imageryLayers.addImageryProvider(
@ -50,9 +61,18 @@ onMounted(() => {
) )
// //
viewer.terrainProvider = getTDTTerrainProvider() viewer.terrainProvider = getTDTTerrainProvider()
//
const markerLayer = new CustomDataSource('Marker')
viewer.dataSources.add(markerLayer)
// window // window
window.Viewer = viewer window.viewer = viewer
inputGeoJson(viewer)
//
const drawPolyline = new CreatePolyline(viewer,true,true,{})
drawPolyline.start()
// const drawPolygon = new DrawPolygon(viewer,true)
// drawPolygon.start()
}) })
</script> </script>

@ -0,0 +1,16 @@
<!--
文件描述工具条
创建时间2024/4/16 10:54
创建人Zhaipeixiu
-->
<script setup lang="ts">
</script>
<template>
</template>
<style scoped>
</style>

11
src/global.d.ts vendored

@ -1,14 +1,21 @@
/*
* @Author: cbwu 504-wuchengbo@htsdfp.com
* @Date: 2024-03-07 13:57:05
* @LastEditors: cbwu
* @LastEditTime: 2024-04-10 15:47:36
* @Description:
*/
// import * as Cesium from 'cesium' // import * as Cesium from 'cesium'
import type { Cesium, Viewer } from 'cesium' import type { Cesium, Viewer } from 'cesium'
// 扩展全局变量 // 扩展全局变量
declare global { declare global {
// 定义全局Cesium类型 // 定义全局Cesium类型
const Cesium: Cesium // const Cesium: Cesium
// 允许扩展 Window // 允许扩展 Window
interface Window { interface Window {
Cesium: Cesium Cesium: Cesium
CESIUM_BASE_URL: string CESIUM_BASE_URL: string
Viewer: Viewer viewer: Viewer
} }
} }

@ -0,0 +1,189 @@
/*重写比例尺、罗盘、缩放控件样式 */
/*比例尺背景*/
.distance-legend {
position: absolute;
padding-left: 0;
padding-right: 0;
right: .1rem;
height: 2rem;
bottom: .2rem;
font-weight: bolder;
box-sizing: content-box;
z-index: 2;
}
/*比例尺文本*/
.distance-legend-label {
display: inline-block;
font-family: 'Roboto', sans-serif;
padding-left: .5rem;
font-size: .8rem;
color: #FFFFFF;
width: 7.5rem;
text-align: center;
}
/*比例尺线段*/
.distance-legend-scale-bar {
border-left: .1rem solid #FFFFFF;
border-right: .1rem solid #FFFFFF;
border-bottom: .1rem solid #FFFFFF;
position: absolute;
height: .7rem;
top: 1rem;
}
@media print {
.distance-legend {
display: none;
}
}
@media screen and (max-width: 700px),
screen and (max-height: 420px) {
.distance-legend {
display: none;
}
}
/*缩放按钮外边框*/
.navigation-controls {
position: absolute;
right: 1.8rem;
top: 65vh;
width: 2rem;
border: 1px solid rgba(255, 255, 255, 0.8);
border-radius: .3rem .3rem .3rem .3rem;
font-weight: 300;
-webkit-touch-callout: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.naviagation-control:active {
color: #FFF;
}
.navigation-control-last {
cursor: pointer;
border-bottom: 1px solid #b5b4b4;
border-bottom: 0;
}
/* + 按钮*/
.navigation-control-icon-zoom-in {
position: relative;
text-align: center;
font-size: 1.2rem;
color: #FFFFFF;
padding-bottom: 4px;
}
.navigation-control-icon-zoom-in:hover {
background: rgba(204, 204, 204, 0.78);
border-radius: .3rem .3rem 0 0;
}
/* - 按钮*/
.navigation-control-icon-zoom-out {
position: relative;
text-align: center;
font-size: 1.4rem;
color: #FFFFFF;
}
.navigation-control-icon-zoom-out:hover {
background: rgba(204, 204, 204, 0.78);
border-radius: 0 0 .3rem .3rem;
}
/* reset 按钮*/
.navigation-control-icon-reset {
position: relative;
height: 0;
fill: rgba(255, 255, 255, 0.8);
padding: 0 0 0 0; /* 显示reset按钮 padding: 0 0 1.5rem 0; */
box-sizing: content-box;
}
/*罗盘*/
.compass {
pointer-events: auto;
position: absolute;
right: 0;
top: 50vh;
width: 6rem;
height: 6rem;
overflow: hidden;
}
.compass-outer-ring {
position: absolute;
top: 0;
width: 6rem;;
height: 6rem;;
fill: rgba(255, 255, 255, 0.5);
}
.compass-outer-ring-background {
position: absolute;
top: 14px;
left: 14px;
width: 44px;
height: 44px;
border-radius: 44px;
border: 12px solid rgba(47, 53, 60, 0.8);
box-sizing: content-box;
}
.compass-gyro {
pointer-events: none;
position: absolute;
top: 0;
width: 95px;
height: 95px;
fill: #faf6f6;
}
.compass-gyro-active {
fill: #68ADFE;
}
.compass-gyro-background {
position: absolute;
top: 31px;
left: 31px;
width: 2rem;
height: 2rem;
border-radius: 33px;
background-color: rgba(47, 53, 60, 0.8);
border: 1px solid rgba(255, 255, 255, 0.2);
box-sizing: content-box;
}
.compass-gyro-background:hover+.compass-gyro {
fill: #68ADFE;
}
.compass-rotation-marker {
position: absolute;
top: 0;
width: 95px;
height: 95px;
fill: #68ADFE;
}
@media screen and (max-width: 700px),
screen and (max-height: 420px) {
.navigation-controls {
display: none;
}
.compass {
display: none;
}
}
@media print {
.navigation-controls {
display: none;
}
.compass {
display: none;
}
}

@ -0,0 +1,27 @@
/*
* @Author: cbwu 504-wuchengbo@htsdfp.com
* @Date: 2024-04-13 10:36:06
* @LastEditors: cbwu
* @LastEditTime: 2024-04-16 13:47:55
* @Description:
*/
import { Color, Cartesian2, HeightReference } from 'cesium'
export interface EntityOptions {
id?: string
name?: string
show?: boolean
pixelSize?: number //点大小
outlineColor?: Color //轮廓线颜色
color?: Color //点颜色
fillColor?: Color //填充颜色
fill?: boolean //是否填充
width?: number //线宽
outlineWidth?: number
text?: string //标注内容
font?: string //字体
pixelOffset?: Cartesian2 //偏移量
image?: string //图片url
imageWidth?: number //图片宽
imageHeight?: number //图片高
heightReference?: HeightReference
}

@ -0,0 +1,24 @@
/**
2024/4/11 13:33
Zhaipeixiu
*/
import {Viewer, GeoJsonDataSource, Color, KmlDataSource} from "cesium";
export const inputGeoJson = (viewer: Viewer) => {
viewer.dataSources.add(GeoJsonDataSource.load("/js.json",{
stroke: Color.WHITE, //轮廓颜色,注意:颜色必须大写
strokeWidth: 5,
fill: Color.BLUE.withAlpha(0.3), //填充颜色,透明度
}))
}
export const inputKML = (viewer: Viewer) => {
let kmlUrl = "./Assets/gdpPerCapita2008.kmz";
let kmlDataPromise = KmlDataSource.load(kmlUrl);
console.log(kmlDataPromise);
kmlDataPromise.then(function (dataSource) {
console.log(dataSource);
viewer.dataSources.add(dataSource);
})
}

@ -0,0 +1,11 @@
/*
* @Author: cbwu 504-wuchengbo@htsdfp.com
* @Date: 2024-04-10 11:21:35
* @LastEditors: cbwu
* @LastEditTime: 2024-04-10 11:29:01
* @Description:
*/
// 获取地图assets静态资源
export const getMapAssetsFile = (url: string) => {
return new URL(`../assets/map/${url}`, import.meta.url).href
}

@ -0,0 +1,61 @@
/**
2024/4/15 9:52
Zhaipeixiu
*/
import {getDistance, getElevation} from "@/utils/map/geocomputation.ts";
import {Cartesian3, Viewer} from "cesium";
type ProfileResult = {
distanceArray:number[],
elevationArray:number[],
}
/**
*
* @param viewer Viewer
* @param start
* @param end
* @param interval 线 m
* @return 线
*/
export function elevationProfile(viewer: Viewer, start:Cartesian3, end:Cartesian3, interval: number)
{
let breakPointsHeight:number[] = [] //断点的高程m
let distanceFromStart:number[] = [] //断点至起点的距离m
// 计算首尾点距离 m
let totalLen = getDistance(start, end) * 1000
// 获取起点高度
breakPointsHeight.push(getElevation(viewer, start))
distanceFromStart.push(0)
//断点数量
let breakNum = Math.floor(totalLen/interval)
// 如果采样间隔小于首尾点距离,则获取每个断点的坐标 并获取其高度
if(breakNum>=1){
for (let i = 1; i <= breakNum; i++) {
let breakP = Cartesian3.lerp(start, end, i/breakNum, new Cartesian3())
breakPointsHeight.push(getElevation(viewer, breakP))
distanceFromStart.push(getDistance(start,breakP)*1000)
}
}
// 获取终点高度
breakPointsHeight.push(getElevation(viewer, end))
distanceFromStart.push(totalLen)
return { distanceArray:distanceFromStart, elevationArray:breakPointsHeight }
}
/**
* 线
* @param viewer Viewer
* @param polyline 线
* @param interval 线 m
* @return 线线
*/
export function profileAnalyse(viewer: Viewer, polyline:Cartesian3[],interval: number){
let result:ProfileResult = { distanceArray:[], elevationArray:[] }
for (let i = 0; i < polyline.length - 2; i++) {
let temp = elevationProfile(viewer,polyline[i],polyline[i+1],interval)
result.elevationArray = result.elevationArray.concat(temp.elevationArray)
result.distanceArray = result.distanceArray.concat(temp.distanceArray)
}
return result
}

@ -1,9 +1,18 @@
/*
* @Author: cbwu 504-wuchengbo@htsdfp.com
* @Date: 2024-03-07 16:04:55
* @LastEditors: cbwu
* @LastEditTime: 2024-04-15 16:06:06
* @Description:
*/
// 天地图影像服务 // 天地图影像服务
import { import {
WebMapTileServiceImageryProvider, WebMapTileServiceImageryProvider,
GeographicTilingScheme, GeographicTilingScheme,
WebMercatorTilingScheme, WebMercatorTilingScheme,
} from 'cesium' } from 'cesium'
import axios from 'axios'
//地图服务枚举类型_c为墨卡托投影_w为经纬度投影 //地图服务枚举类型_c为墨卡托投影_w为经纬度投影
enum TDTLayerType { enum TDTLayerType {
Vec = 'vec', //矢量底图 Vec = 'vec', //矢量底图
@ -20,6 +29,7 @@ enum TDTProjectionType {
} }
//天地图token //天地图token
const TDT_tk = '1c5b7cbf9da7d33b221f68c32b6a1791' const TDT_tk = '1c5b7cbf9da7d33b221f68c32b6a1791'
const TDT_tk3D = '910a4befdfd04d5423268b0aced82248'
// 服务域名 // 服务域名
const tdtUrl = 'https://t{s}.tianditu.gov.cn' const tdtUrl = 'https://t{s}.tianditu.gov.cn'
// 服务负载子域 // 服务负载子域
@ -27,7 +37,7 @@ const subdomains = ['0', '1', '2', '3', '4', '5', '6', '7']
/** /**
* *
* @param layerType : * @param layerType :
* @param projectionType :WGS84 * @param projectionType :
* @param minimumLevel : * @param minimumLevel :
* @param maximumLevel : * @param maximumLevel :
* @returns :ImageryProvider * @returns :ImageryProvider
@ -45,7 +55,7 @@ export function getTDTProvider(
: new WebMercatorTilingScheme() : new WebMercatorTilingScheme()
const tileMatrixLabels = const tileMatrixLabels =
projectionType == TDTProjectionType.WGS84 projectionType == TDTProjectionType.WGS84
? new Array(19).fill(1).map((v, i) => `${i}`) ? new Array(19).fill(1).map((v, i) => `${i + 1}`)
: undefined : undefined
const imageryProvider = new WebMapTileServiceImageryProvider({ const imageryProvider = new WebMapTileServiceImageryProvider({
//影像底图 //影像底图
@ -75,13 +85,32 @@ export function getTDTTerrainProvider() {
const url = const url =
tdtUrl.replace('{s}', subdomains[i]) + tdtUrl.replace('{s}', subdomains[i]) +
'/mapservice/swdx?T=elv_c&tk=' + '/mapservice/swdx?T=elv_c&tk=' +
TDT_tk TDT_tk3D
terrainUrls.push(url) terrainUrls.push(url)
} }
const provider = new Cesium.GeoTerrainProvider({ const provider = new window.Cesium.GeoTerrainProvider({
urls: terrainUrls, urls: terrainUrls,
}) })
return provider return provider
} }
/**
*
* @param word
*/
export function Geocoder(word: string) {
let url = `http://api.tianditu.gov.cn/geocoder?ds={"keyWord":"${word}"}&tk=`
return axios.get(url + TDT_tk)
}
/**
*
* @param lon
* @param lat
*/
export function reverseGeocoder(lon: number, lat: number) {
let url = `http://api.tianditu.gov.cn/geocoder?postStr={'lon':${lon},'lat':${lat},'ver':1}&type=geocode&tk=`
return axios.get(url + TDT_tk)
}
export { TDTLayerType, TDTProjectionType } export { TDTLayerType, TDTProjectionType }

@ -0,0 +1,67 @@
import { getAzimuth } from '@/utils/map/geocomputation.ts'
import { Cartesian3 } from 'cesium'
class Angle {
constructor() {}
/**
*
* @param decimal_var
* @constructor
*/
static DecimalDegree2DMS(decimal_var: number | string) {
if (!decimal_var.toString().includes('.'))
return decimal_var.toString() + "°0'0''"
let decimalStr = decimal_var.toString().split('.')
let degreeStr = decimalStr[0]
if (decimalStr[1]) {
let minutes =
(Number(decimalStr[1]) / Math.pow(10, decimalStr[1].length)) * 60
if (!minutes.toString().includes('.'))
return degreeStr + '°' + minutes.toString() + "'0''"
let minuteSecondsStr = minutes.toString().split('.')
if (minuteSecondsStr[1]) {
let secondStr =
(Number(minuteSecondsStr[1]) /
Math.pow(10, minuteSecondsStr[1].length)) *
60
return (
degreeStr +
'°' +
minuteSecondsStr[0] +
"'" +
secondStr.toFixed(3) +
"''"
)
}
}
return ''
}
/**
*
* @param p1
* @param p2
* @param digits 1
*/
static getAzimuth(p1: Cartesian3, p2: Cartesian3, digits = 1) {
return getAzimuth(p1, p2, digits)
}
/**
*
* @param degree
*/
static degree2rad(degree: number): number {
return (Math.PI / 180) * degree
}
/**
*
* @param rad
*/
static rad2degree(rad: number): number {
return (180 / Math.PI) * rad
}
}
export { Angle }

@ -1,20 +1,20 @@
// 场景相机相关操作 // 场景相机相关操作
import { Viewer, Cartesian3, Math } from 'cesium' import { Viewer, Cartesian3, Math } from 'cesium'
/** /**
* *
* @param viewer :Viewer * @param viewer :Viewer
*/ */
function flyToChina(viewer: Viewer) { function flyToChina(viewer: Viewer) {
viewer.camera.flyTo({ viewer.camera.flyTo({
destination: Cartesian3.fromDegrees(103.84, 31.15, 10350000), destination: Cartesian3.fromDegrees(103.84, 31.15, 10350000),
orientation: { orientation: {
heading: Math.toRadians(348.4202942851978), heading: Math.toRadians(0),
pitch: Math.toRadians(-89.74026687972041), pitch: Math.toRadians(-90),
roll: Math.toRadians(0), roll: Math.toRadians(0),
}, },
complete: function callback() { complete: function callback() {
// 定位完成之后的回调函数 // 定位完成之后的回调函数
}, },
}) })
} }
export { flyToChina } export { flyToChina }

@ -1,37 +1,50 @@
/* /*
* @Author: cbwu 504-wuchengbo@htsdfp.com * @Author: cbwu 504-wuchengbo@htsdfp.com
* @Date: 2024-03-22 09:11:54 * @Date: 2024-03-22 09:11:54
* @LastEditors: cbwu * @LastEditors: cbwu
* @LastEditTime: 2024-03-26 13:33:42 * @LastEditTime: 2024-04-13 10:49:36
* @Description: * @Description:
*/ */
import { Cartesian2, Viewer, Math, Cartographic } from 'cesium' import { Cartesian2, Viewer, Math, Cartographic, Cartesian3 } from 'cesium'
/**
* /**
* @param viewer *
* @param windowPosition : * @param viewer
* @returns : * @param windowPosition :
*/ * @returns :
function cartesian2ToCartesian3(viewer: Viewer, windowPosition: Cartesian2) { */
const ray = viewer.camera.getPickRay(windowPosition) function cartesian2ToCartesian3(viewer: Viewer, windowPosition: Cartesian2) {
if (ray != undefined) { const ray = viewer.camera.getPickRay(windowPosition)
return viewer.scene.globe.pick(ray, viewer.scene) if (ray != undefined) {
} else return undefined return viewer.scene.globe.pick(ray, viewer.scene)
} } else return undefined
/** }
* /**
* @param viewer *
* @param windowPosition : * @param viewer
* @returns :WGS84 * @param windowPosition :
*/ * @returns :WGS84
function cartesian2ToWGS84(viewer: Viewer, windowPosition: Cartesian2) { */
const cartesian3 = cartesian2ToCartesian3(viewer, windowPosition) function cartesian2ToWGS84(viewer: Viewer, windowPosition: Cartesian2) {
if (cartesian3 != undefined) { const cartesian3 = cartesian2ToCartesian3(viewer, windowPosition)
const cartographic = Cartographic.fromCartesian(cartesian3) if (cartesian3 != undefined) {
const lon = Math.toDegrees(cartographic.longitude) // 经度 return cartesian3ToWGS84(cartesian3)
const lat = Math.toDegrees(cartographic.latitude) // 纬度 } else return []
const alt = cartographic.height // 高度 }
return [lon, lat, alt] /**
} else return [] * WGS84
} * @param pos
export { cartesian2ToCartesian3, cartesian2ToWGS84 } * @returns
*/
function cartesian3ToWGS84(pos: Cartesian3) {
if (pos) {
const cartographic = Cartographic.fromCartesian(pos)
const lon = Math.toDegrees(cartographic.longitude) // 经度
const lat = Math.toDegrees(cartographic.latitude) // 纬度
const alt = cartographic.height // 高度
return [lon, lat, alt]
}
return []
}
export { cartesian2ToCartesian3, cartesian2ToWGS84, cartesian3ToWGS84 }

@ -0,0 +1,50 @@
/*
* @Author: cbwu 504-wuchengbo@htsdfp.com
* @Date: 2024-03-27 09:51:04
* @LastEditors: cbwu
* @LastEditTime: 2024-04-13 10:46:43
* @Description:
*/
import {
Viewer,
ScreenSpaceEventHandler,
Cartesian3,
Color,
ScreenSpaceEventType,
Entity,
DataSource,
} from 'cesium'
import { BillBoard } from '../geometry/billboard'
import { cartesian2ToCartesian3 } from '../coordinate'
export default class DrawPoint {
viewer: Viewer
handler: ScreenSpaceEventHandler
markerLayer: DataSource
constructor(viewer: Viewer) {
this.viewer = viewer
this.handler = new ScreenSpaceEventHandler(this.viewer.scene.canvas)
this.markerLayer = viewer.dataSources.getByName('Marker')[0]
}
//开始绘制
public start() {
this.handler.setInputAction(
this.leftClickCallBack,
ScreenSpaceEventType.LEFT_CLICK,
)
}
//结束绘制
public end() {
this.handler.removeInputAction(ScreenSpaceEventType.LEFT_CLICK)
this.handler.destroy()
}
//左键Click事件
private leftClickCallBack = (
event: ScreenSpaceEventHandler.PositionedEvent,
) => {
const cartesian3 = cartesian2ToCartesian3(this.viewer, event.position)
if (cartesian3) {
this.markerLayer.entities.add(new BillBoard(cartesian3))
this.viewer.scene.requestRender()
}
}
}

@ -0,0 +1,179 @@
/*
* @Author: cbwu 504-wuchengbo@htsdfp.com
* @Date: 2024-04-11 13:53:40
* @LastEditors: cbwu
* @LastEditTime: 2024-04-12 15:18:40
* @Description:
*/
import {
CallbackProperty,
Cartesian3,
Color,
Entity,
PolylineDashMaterialProperty,
Rectangle,
ScreenSpaceEventHandler,
ScreenSpaceEventType,
Viewer,
} from 'cesium'
import {cartesian2ToCartesian3} from '@/utils/map/coordinate'
import {PolygonEntity} from '../geometry/polygonEntity'
import {getPolygonArea} from "@/utils/map/geocomputation.ts";
import {TextLabel} from "@/utils/map/geometry/textLabel.ts";
export class DrawPolygon {
viewer: Viewer
handler: ScreenSpaceEventHandler
polygon: PolygonEntity | null
positions: Cartesian3[] = []
trackingLine: Entity | null
trackingLinePositions: Cartesian3[] = []
bMove: boolean = false
bMeasure = false
bLongClick: boolean = false
constructor(viewer: Viewer, isMeasure: boolean=false) {
this.viewer = viewer
this.bMeasure = isMeasure
this.handler = new ScreenSpaceEventHandler(viewer.scene.canvas)
this.polygon = null
this.trackingLine = null
}
public start() {
// 左单击加点
this.handler.setInputAction(
this.leftClickCallBack,
ScreenSpaceEventType.LEFT_CLICK,
)
// 移动动态绘制
this.handler.setInputAction(
this.moveCallBack,
ScreenSpaceEventType.MOUSE_MOVE,
)
// 左双击结束
this.handler.setInputAction(
this.leftDoubleClickCallBack,
ScreenSpaceEventType.LEFT_DOUBLE_CLICK,
)
}
//左单击回调事件
private leftClickCallBack = (
event: ScreenSpaceEventHandler.PositionedEvent,
) => {
const pickedObject = this.viewer.scene.pick(event.position)
// console.log(pickedObject)
if (pickedObject) {
//点击同一位置,返回
if (
pickedObject.id.id ===
this.polygon?.controlPointsID[this.positions.length - 1]
) {
console.log('********click the same point')
return
}
}
console.log('****************leftClick!')
const cartesian3 = cartesian2ToCartesian3(this.viewer, event.position)
if (cartesian3 != undefined) {
if (this.positions.length <= 2) {
this.positions.push(cartesian3)
this.trackingLinePositions.push(cartesian3)
} else {
this.polygon!.modifyPoint(cartesian3, -1)
this.polygon!.showControlPoint(-1, true)
//多创建一个点,用于鼠标移动实时变化
this.polygon!.addPoint(cartesian3, -1)
this.polygon!.showControlPoint(-1, false)
this.trackingLinePositions[2] = cartesian3
}
this.bMove = true
this.viewer.scene.requestRender() //刷新
}
}
//移动回调事件
private moveCallBack = (event: ScreenSpaceEventHandler.MotionEvent) => {
if (this.bMove) {
const cartesian3 = cartesian2ToCartesian3(this.viewer, event.endPosition)
if (cartesian3 != undefined) {
if (this.positions.length === 1) {
//更新追踪线坐标
this.trackingLinePositions[1] = cartesian3
// this.positions[1] = cartesian3
if (!this.trackingLine) {
//创建追踪线对象
this.trackingLine = this.createTrackingLine(
this.trackingLinePositions,
)
this.viewer.entities.add(this.trackingLine)
}
}
if (this.positions.length === 2) {
//移除追踪直线
if (this.trackingLine) {
this.viewer.entities.remove(this.trackingLine)
}
this.positions.push(cartesian3)
console.log(
'*********PositionsLength:' + this.positions.length.toString(),
)
//创建多边形
if (!this.polygon) {
this.polygon = new PolygonEntity(this.positions)
this.viewer.dataSources.add(this.polygon)
// 实时移动不显示控制点
this.polygon.showControlPoint(-1, false)
}
}
//实时改变多边形
if (this.positions.length >= 3) {
this.polygon!.modifyPoint(cartesian3, -1)
}
this.viewer.scene.requestRender() //刷新
}
}
}
//左双击回调事件
private leftDoubleClickCallBack = (event: ScreenSpaceEventHandler.PositionedEvent) => {
if (!this.polygon) return
this.bMove = false
//移除多余的点
this.polygon.removePoint(-1)
this.polygon.removePoint(-1)
if(this.bMeasure){
//计算面积
let area = getPolygonArea(this.positions)
//添加label
new TextLabel(this.viewer,this.getCenter(),`面积: ${(area/1000000).toFixed(2)}k㎡`)
}
}
//创建追踪线
createTrackingLine(positions: Cartesian3[]) {
return new Entity({
polyline: {
positions: new CallbackProperty(() => {
return positions
}, false),
width: 2,
material: new PolylineDashMaterialProperty({
color: Color.GREEN,
dashLength: 15, //短划线长度
}),
clampToGround: true,
},
})
}
// 获取多边形的外接矩形
public getRectangle(): Rectangle {
return Rectangle.fromCartesianArray(this.positions)
}
// 获取几何中心
public getCenter(): Cartesian3 {
let rec = this.getRectangle()
return Cartesian3.fromRadians((rec.east + rec.west) / 2, (rec.south + rec.north) / 2)
}
}

@ -0,0 +1,274 @@
/*
* @Author: cbwu 504-wuchengbo@htsdfp.com
* @Date: 2024-03-27 08:43:44
* @LastEditors: cbwu
* @LastEditTime: 2024-04-22 16:19:27
* @Description: Polyline
*/
import {
Viewer,
ScreenSpaceEventHandler,
Cartesian3,
Color,
ScreenSpaceEventType,
Entity,
CallbackProperty,
PolylineDashMaterialProperty,
Cartesian2,
} from 'cesium'
import {
cartesian2ToCartesian3,
cartesian3ToWGS84,
} from '@/utils/map/coordinate'
// import { PointEntity, PolylineEntity } from '@/utils/map/geometry'
import { PolylineEntity } from '../geometry/polylineEntity'
import { PointEntity } from '@/utils/map/geometry/pointEntity'
import EditGeometry from '@/utils/map/draw/editGeometry'
import { getDistance } from '@/utils/map/geocomputation.ts'
import { Angle } from '@/utils/map/angle.ts'
import { TextLabel } from '@/utils/map/geometry/textLabel.ts'
import { EntityOptions } from '@/types/entityoptions.ts'
import {profileAnalyse} from "@/utils/map/SpatialAnalysis.ts";
export default class CreatePolyline {
viewer: Viewer
handler: ScreenSpaceEventHandler
polyline: PolylineEntity | null
dashLine: Entity | null
trackingLine: Entity | null
trackingLinePositions: Cartesian3[] = []
controlPoints: Entity[] | null
modifyPoint: any = null
clickedGeometry: Entity | null = null
moveSelectedPoint: PointEntity | null = null
positions: Cartesian3[] = []
bMove: boolean = false
bMeasure: boolean | undefined = false //是否处于测距模式
bProfile: boolean | undefined = false //是否处于测距模式
totalDistance: number = 0
bLongClick: boolean = false
clickTimeout: any
altitudeOffset: number = 20 //相对高度
vDashLinePosition: Cartesian3[][] = [] //垂直辅助线坐标数组
// 存储第一次点击的信息
firstClickPosition: Cartesian2 | null = null
firstClickTime: number | null = null
// layer: CustomDataSource
defaultStyle: EntityOptions = {
// id: 'Polyline' + String(PolylineEntity.id),
// name: 'Polyline' + String(PolylineEntity.id + 1),
show: true,
width: 2,
color: Color.GREEN,
}
constructor(viewer: Viewer, bMeasure: boolean=false,bProfile: boolean=false,options?: EntityOptions) {
this.viewer = viewer
this.bMeasure = bMeasure
this.bProfile = bProfile
this.handler = new ScreenSpaceEventHandler(this.viewer.scene.canvas)
this.polyline = null
this.trackingLine = null
this.dashLine = null
this.totalDistance = 0
this.controlPoints = []
this.defaultStyle = { ...this.defaultStyle, ...options }
}
// 开始绘制
public start() {
// 左单击加点
this.handler.setInputAction(
this.leftClickCallBack,
ScreenSpaceEventType.LEFT_CLICK,
)
// 移动动态绘制
this.handler.setInputAction(
this.moveCallBack,
ScreenSpaceEventType.MOUSE_MOVE,
)
// 左双击结束
this.handler.setInputAction(
this.leftDoubleClickCallBack,
ScreenSpaceEventType.LEFT_DOUBLE_CLICK,
)
// 右击回退上一步
this.handler.setInputAction(
this.rightClickCallBack,
ScreenSpaceEventType.RIGHT_CLICK,
)
}
public end() {
this.handler.removeInputAction(ScreenSpaceEventType.LEFT_CLICK)
}
//左单击回调事件
private leftClickCallBack = (
event: ScreenSpaceEventHandler.PositionedEvent,
) => {
//根据屏幕坐标判断是否为同一点
if (this.isSamplePosition(event.position.clone())) return
let cartesian3 = cartesian2ToCartesian3(this.viewer, event.position)
if (cartesian3 != undefined) {
if (!this.polyline) {
this.polyline = new PolylineEntity(this.positions)
this.dashLine = this.createTrackingLine(this.positions)
this.viewer.entities.add(this.dashLine)
this.viewer.dataSources.add(this.polyline)
}
const oldPosition = cartesian3
//计算高度偏移后的新坐标
cartesian3 = this.calculateAltitudeOffsetPosition(
cartesian3,
this.altitudeOffset,
)
this.polyline.addPoint(cartesian3)
this.trackingLinePositions[0] = cartesian3
//垂直辅助线
const n = this.positions.length - 1
const ptArr = [oldPosition, cartesian3]
this.vDashLinePosition[n] = ptArr
this.viewer.entities.add(this.createTrackingLine(this.vDashLinePosition[n], Color.WHITE))
//添加地表控制点
const groundControlPoint = new PointEntity(this.vDashLinePosition[n][0])
this.viewer.entities.add(groundControlPoint)
this.bMove = true
this.viewer.scene.requestRender() //刷新
// 计算2点距离
if(this.positions.length>=2 && this.bMeasure){
let distance = getDistance(this.positions[this.positions.length-1],this.positions[this.positions.length-2])
this.totalDistance += distance
// 计算2点方位角
let azimuth = Angle.getAzimuth(this.positions[this.positions.length-2],this.positions[this.positions.length-1])
// 计算2点的中间点
let midPoint = Cartesian3.midpoint(this.positions[this.positions.length-1],this.positions[this.positions.length-2],new Cartesian3())
// 添加label
let labelText = `距离: ${distance.toFixed(2)}km, 方位角: ${azimuth}°`
new TextLabel(this.viewer, midPoint,labelText)
}
}
}
// 移动回调事件
private moveCallBack = (event: ScreenSpaceEventHandler.MotionEvent) => {
if (this.bMove) {
let cartesian3 = cartesian2ToCartesian3(this.viewer, event.endPosition)
if (cartesian3 != undefined) {
//计算高度偏移后的新坐标
cartesian3 = this.calculateAltitudeOffsetPosition(
cartesian3,
this.altitudeOffset,
)
//更新追踪线坐标
this.trackingLinePositions[1] = cartesian3
if (!this.trackingLine) {
//创建追踪线对象
this.trackingLine = this.createTrackingLine(
this.trackingLinePositions,
)
this.viewer.entities.add(this.trackingLine)
}
}
this.viewer.scene.requestRender() //刷新
}
}
// 左双击回调事件
private leftDoubleClickCallBack = (event: ScreenSpaceEventHandler.PositionedEvent,) => {
if (!this.polyline) return
this.bMove = false
const cartesian3 = cartesian2ToCartesian3(this.viewer, event.position)
if (cartesian3 != undefined) {
// 移除追踪线
if (!this.trackingLine) {
this.viewer.entities.remove(this.trackingLine!)
}
}
if(this.bMeasure){
// 添加总距离label
new TextLabel(this.viewer,this.positions[this.positions.length-1],
`总距离: ${this.totalDistance.toFixed(2)}km`)
}
if(this.bProfile){
// 计算剖面点高度
let profile = profileAnalyse(this.viewer,this.positions,100)
// TODO: 弹出地形剖面折线图
console.log(profile)
}
this.clearEvent()
console.log('end:' + this.positions.length.toString())
console.log(this.positions)
console.log(this.polyline.controlPointsID.length)
//结束绘制进入编辑模式
this.polyline.removeControlPoints()
const editTool = new EditGeometry(this.viewer, this.polyline.geometry!)
editTool.start()
}
// 右击回调事件
private rightClickCallBack = () => {
if (!this.controlPoints) return
if (this.controlPoints.length > 1) {
const lastPoint = this.positions.pop()
this.positions[this.positions.length - 1] = lastPoint!
this.viewer.entities.remove(this.controlPoints.pop() as Entity)
}
}
private clearEvent() {
this.handler.removeInputAction(ScreenSpaceEventType.LEFT_CLICK)
this.handler.removeInputAction(ScreenSpaceEventType.MOUSE_MOVE)
this.handler.removeInputAction(ScreenSpaceEventType.LEFT_DOUBLE_CLICK)
}
//计算高度偏移后的坐标
calculateAltitudeOffsetPosition(
oldPosition: Cartesian3,
altitudeOffset: number,
): Cartesian3 {
const newGeoPosition = cartesian3ToWGS84(oldPosition)
newGeoPosition[2] = newGeoPosition[2] + altitudeOffset
return Cartesian3.fromDegrees(
newGeoPosition[0],
newGeoPosition[1],
newGeoPosition[2],
)
}
//创建追踪线
createTrackingLine(positions: Cartesian3[],color: Color=Color.GREEN) {
return new Entity({
polyline: {
positions: new CallbackProperty(() => {
return positions
}, false),
width: 2,
material: new PolylineDashMaterialProperty({
color: color,
dashLength: 12, //短划线长度
}),
// clampToGround: true,
},
})
}
//判断点击是否同一位置
isSamplePosition(clickPosition: Cartesian2) {
if (this.firstClickPosition) {
const dist = Cartesian2.distance(this.firstClickPosition, clickPosition)
if (dist <= 3) {
console.log('********click the same point0')
return true
}
}
this.firstClickPosition = clickPosition
// const pickedObject = this.viewer.scene.pick(clickPosition)
// if (pickedObject) {
// //点击同一位置,返回
// if (
// pickedObject.id.id ===
// this.polyline?.controlPointsID[this.positions.length - 1]
// ) {
// console.log('********click the same point')
// return
// }
// }
return false
}
}

@ -0,0 +1,314 @@
/*
* @Author: cbwu 504-wuchengbo@htsdfp.com
* @Date: 2024-03-27 11:06:45
* @LastEditors: cbwu
* @LastEditTime: 2024-04-22 16:49:15
* @Description:
*/
import {
Viewer,
ScreenSpaceEventHandler,
PointGraphics,
PolylineGraphics,
Cartesian3,
ConstantProperty,
ScreenSpaceEventType,
Entity,
ConstantPositionProperty,
defined,
CallbackProperty,
PolylineDashMaterialProperty,
Color,
Cartographic,
} from 'cesium'
import { cartesian2ToCartesian3 } from '@/utils/map/coordinate'
import { getClosestPoint, isOnLineSegment } from '@/utils/map/geocomputation'
import { PointEntity } from '@/utils/map/geometry/pointEntity'
export default class EditGeometry {
viewer: Viewer
editHandler: ScreenSpaceEventHandler
geometry: Entity //要编辑的几何对象
oldPositions: Cartesian3[] = [] //存储未修改前的坐标
positions: Cartesian3[] = [] //要编辑的几个对象坐标
controlPointsID: string[] = [] //节点控制点ID数组
groundPointsID: string[] = [] //地表控制点ID数组
groundDashLineID: string[] = [] //垂直辅助线ID数组
groundDashLinesPosition: Cartesian3[][] = [] //垂直辅助线坐标数组
heightPoint: PointEntity | null = null //高度控制点
groundPoint: PointEntity | null = null //地表控制点
clickedGeometry: Entity | null = null
clickDownPosition: Cartesian3 | null = null
moveSelectedPoint: PointEntity | null = null
bDrag: boolean = false //拖动标识
bLongClick: boolean = false //长按标识
clickTimeout: any
constructor(viewer: Viewer, editGeometry: Entity) {
this.viewer = viewer
this.editHandler = new ScreenSpaceEventHandler(this.viewer.scene.canvas)
this.geometry = editGeometry
this.positions = editGeometry.polyline?.positions?.getValue(
this.viewer.clock.currentTime,
)
this.oldPositions = this.positions
// 创建控制点
this.positions.forEach((value, index) => {
this.createPoint(value, index)
//地表点
const groundPosition = this.calculateGroundPosition(value)
this.createGroundPoint(value, index)
//垂直辅助线
const ptArr = [value, groundPosition]
this.groundDashLinesPosition[index] = ptArr
this.createGroundDashLine(this.groundDashLinesPosition[index], index)
})
}
public start() {
this.editHandler.setInputAction(
this.leftDownClickCallBack,
ScreenSpaceEventType.LEFT_DOWN,
)
this.editHandler.setInputAction(
this.moveCallBack,
ScreenSpaceEventType.MOUSE_MOVE,
)
this.editHandler.setInputAction(
this.leftUpClickCallBack,
ScreenSpaceEventType.LEFT_UP,
)
}
//左键点击回调
private leftClickCallBack = (
event: ScreenSpaceEventHandler.PositionedEvent,
) => {
const pickedObject = this.viewer.scene.pick(event.position)
// 点中控制点
if (
defined(pickedObject) &&
defined(pickedObject.id) &&
pickedObject.id.point instanceof PointGraphics
) {
console.log('You clicked a point entity.')
this.controlPoint = pickedObject.id
console.log(this.controlPoint?.subId)
this.bDrag = true
this.forbidDrawWorld(true)
}
}
//左键按下回调
private leftDownClickCallBack = (
event: ScreenSpaceEventHandler.PositionedEvent,
) => {
// 清除可能已经设置的单击定时器
clearTimeout(this.clickTimeout)
// 判断是不是长按(100ms)
this.clickTimeout = setTimeout(() => {
this.bLongClick = true
}, 100)
const pickedObject = this.viewer.scene.pick(event.position)
//点中实体对象
if (defined(pickedObject) && defined(pickedObject.id)) {
// 记录点击的几何对象及位置
this.clickedGeometry = pickedObject.id
this.clickDownPosition = this.viewer.scene.pickPosition(event.position)
// // 判断是否同一实体
// if (this.geometry != pickedObject.id) {
// this.geometry = pickedObject.id
// if (
// pickedObject instanceof PolylineGraphics &&
// pickedObject.positions
// ) {
// this.oldPositions = this.geometry!.polyline!.positions?.getValue(
// this.viewer.clock.currentTime,
// )
// }
// }
// 点中控制点
if (pickedObject.id.point instanceof PointGraphics) {
console.log('You clicked a point entity.')
if (pickedObject.id.point.type === 0) {
console.log('You clicked a HeightPoint entity.')
this.heightPoint = pickedObject.id
} else if (pickedObject.id.point.type === 1) {
console.log('You clicked a GroundPoint entity.')
this.groundPoint = pickedObject.id
}
// console.log(this.heightPoint?.subId)
this.bDrag = true
this.forbidDrawWorld(true)
}
}
}
//移动回调
private moveCallBack = (event: ScreenSpaceEventHandler.MotionEvent) => {
const pickedObject = this.viewer.scene.pick(event.endPosition)
// 悬停控制点放大
if (
pickedObject &&
pickedObject.id &&
pickedObject.id.point instanceof PointGraphics
) {
if (pickedObject.id.point instanceof PointGraphics) {
if (
this.moveSelectedPoint == null ||
this.moveSelectedPoint.id !== pickedObject.id.id
) {
this.moveSelectedPoint = pickedObject.id
this.moveSelectedPoint!.point!.pixelSize = new ConstantProperty(
this.moveSelectedPoint!.options.pixelSize! + 1,
)
// console.log(this.moveSelectedPoint)
}
this.viewer.scene.requestRender() //刷新
}
} else {
// 离开控制点恢复原始大小
if (this.moveSelectedPoint) {
this.moveSelectedPoint!.point!.pixelSize = new ConstantProperty(
this.moveSelectedPoint!.options.pixelSize! - 1,
)
this.moveSelectedPoint = null
this.viewer.scene.requestRender() //刷新
}
}
if (!this.heightPoint || !this.bDrag) return
console.log('************************left down')
const cartesian3 = cartesian2ToCartesian3(this.viewer, event.endPosition)
if (cartesian3) {
// 修改节点坐标
this.modifyPoint(cartesian3, this.heightPoint.subId)
// this.geometry?.modifyPoint(cartesian3, this.controlPoint.subId)
this.viewer.scene.requestRender() //刷新
}
}
//左键松开回调
private leftUpClickCallBack = (
event: ScreenSpaceEventHandler.PositionedEvent,
) => {
clearTimeout(this.clickTimeout)
// 单击添加点
if (
!this.bLongClick &&
this.clickedGeometry?.polyline instanceof PolylineGraphics
) {
console.log('点中线,加点')
this.addPoint()
}
this.bLongClick = false
this.bDrag = false
this.forbidDrawWorld(false)
}
// 左键双击回调
private leftDoubleClickCallBack = (
event: ScreenSpaceEventHandler.PositionedEvent,
) => {
// this.geometry.
}
// Viewer操作控制
forbidDrawWorld(isForbid: boolean) {
this.viewer.scene.screenSpaceCameraController.enableRotate = !isForbid
this.viewer.scene.screenSpaceCameraController.enableTilt = !isForbid
this.viewer.scene.screenSpaceCameraController.enableTranslate = !isForbid
this.viewer.scene.screenSpaceCameraController.enableInputs = !isForbid
}
// 添加点
addPoint() {
for (let i = 0; i < this.positions.length - 1; ++i) {
if (
isOnLineSegment(
this.positions[i],
this.positions[i + 1],
this.clickDownPosition!,
)
) {
// 修改线坐标
const pt = getClosestPoint(
this.positions[i],
this.positions[i + 1],
this.clickDownPosition!,
)
this.positions.splice(i + 1, 0, pt)
// 新建控制点
this.createPoint(pt, i + 1)
// 修改控制点的subid
for (let index = i + 2; index < this.controlPointsID.length; ++index) {
const point = this.geometry.entityCollection.getById(
this.controlPointsID[index],
) as PointEntity
point!.subId = point!.subId + 1
}
return
}
}
}
/**
*
* @param pos
* @param index
*/
modifyPoint(pos: Cartesian3, index: number) {
// 修改线坐标
this.positions.splice(index, 1, pos)
// 修改控制点坐标
this.heightPoint!.position = new ConstantPositionProperty(pos)
}
/**
*
* @param pos
* @param index ,0
*/
createPoint(pos: Cartesian3, index: number) {
// if (this.geometry) {
const point = new PointEntity(pos)
point.parent = this.geometry
point.subId = index
this.geometry.entityCollection.add(point)
this.controlPointsID.splice(index, 0, point.id)
// }
}
/**
*
* @param pos
* @param index ,0
*/
createGroundPoint(pos: Cartesian3, index: number) {
const point = new PointEntity(pos)
point.parent = this.geometry
point.subId = index
point.type = 1
this.geometry.entityCollection.add(point)
this.groundPointsID.splice(index, 0, point.id)
}
/**
* 线
* @param pos 线
* @param index ,0
*/
createGroundDashLine(positions: Cartesian3[], index: number) {
const vDashLine = new Entity({
polyline: {
positions: new CallbackProperty(() => {
return positions
}, false),
width: 2,
material: new PolylineDashMaterialProperty({
color: Color.WHITE,
dashLength: 12, //短划线长度
}),
},
})
this.groundDashLineID.splice(index, 0, vDashLine.id)
this.geometry.entityCollection.add(vDashLine)
}
//获取地表坐标
calculateGroundPosition(pos: Cartesian3) {
// 输入的当前点的笛卡尔坐标
const cartographic = Cartographic.fromCartesian(pos)
// 经度、纬度不变,将地面高度加上需要上升的距离, 假设垂直升高1000米
cartographic.height -= cartographic.height
// 最后使用Cesium.Cartographic.toCartesian将刚才得到的Cartographic对象转换为笛卡尔坐标
return Cartographic.toCartesian(cartographic)
}
}

@ -0,0 +1,185 @@
/*
* @Author: cbwu 504-wuchengbo@htsdfp.com
* @Date: 2024-03-15 08:43:26
* @LastEditors: cbwu
* @LastEditTime: 2024-04-13 10:49:27
* @FilePath: \GCSMap\src\utils\drawer.ts
* @Description:
*/
import {
Viewer,
ScreenSpaceEventHandler,
ScreenSpaceEventType,
CustomDataSource,
Cartesian3,
CallbackProperty,
PolygonHierarchy,
Color,
} from 'cesium'
import { cartesian2ToCartesian3 } from '@/utils/map/coordinate'
import {
PointEntity,
PolylineEntity,
PolygonEntity,
} from '@/utils/map/geometry'
class Drawer {
viewer: Viewer
type: string
handler: ScreenSpaceEventHandler
layer: CustomDataSource
polyline: PolylineEntity | null
polygon: PolygonEntity | null
positions: Cartesian3[] = []
n_Points: number
bMove: boolean
clickTimeout: any
constructor(viewer: Viewer, type: string) {
this.viewer = viewer
this.type = type
this.handler = new ScreenSpaceEventHandler(this.viewer.canvas)
this.polyline = null
this.polygon = null
this.n_Points = 0
this.bMove = false
this.positions = []
this.clickTimeout = null
if (viewer.dataSources.getByName(type).length === 0) {
this.layer = new CustomDataSource(type)
viewer.dataSources.add(this.layer)
} else {
this.layer = viewer.dataSources.getByName(type)[0]
}
}
// 开始绘制
public start() {
// 左单击加点
this.handler.setInputAction(
this.leftClickCallBack,
ScreenSpaceEventType.LEFT_CLICK,
)
// 移动动态绘制
this.handler.setInputAction(
this.moveCallBack,
ScreenSpaceEventType.MOUSE_MOVE,
)
// 左双击结束
this.handler.setInputAction(
this.leftDoubleClickCallBack,
ScreenSpaceEventType.LEFT_DOUBLE_CLICK,
)
}
public end() {
this.handler.removeInputAction(ScreenSpaceEventType.LEFT_CLICK)
}
//左单击回调事件
private leftClickCallBack = (
event: ScreenSpaceEventHandler.PositionedEvent,
) => {
// 清除可能已经设置的单击定时器
clearTimeout(this.clickTimeout)
console.log('**************************** click')
// 设置一个新的定时器,用于判断是单击还是双击
this.clickTimeout = setTimeout(() => {
console.log('**************************** run')
const cartesian3 = cartesian2ToCartesian3(this.viewer, event.position)
if (cartesian3 != undefined) {
if (this.bMove) {
this.positions.pop()
this.bMove = false
}
this.positions.push(cartesian3)
this.createGeometry(this.type)
// 创建控制点
const point = new PointEntity(
this.positions[this.positions.length - 1],
{
color: Color.WHITE,
pixelSize: 6,
},
)
point.parent = this.polygon!
this.layer.entities.add(point)
this.viewer.scene.requestRender() //刷新
}
}, 100)
}
// 移动回调事件
private moveCallBack = (event: ScreenSpaceEventHandler.MotionEvent) => {
const cartesian3 = cartesian2ToCartesian3(this.viewer, event.endPosition)
if (cartesian3 != undefined) {
if (this.positions.length >= 1) {
if (!this.bMove) {
this.positions.push(cartesian3)
this.bMove = true
} else {
this.positions[this.positions.length - 1] = cartesian3
}
if (this.type === 'Polygon') {
// 多边形创建临时线
if (this.positions.length === 2) {
this.createGeometry('Polyline')
}
if (this.positions.length > 2) {
this.polyline!.show = false
}
}
}
this.viewer.scene.requestRender() //刷新
}
}
// 左双击回调事件
private leftDoubleClickCallBack = (
event: ScreenSpaceEventHandler.PositionedEvent,
) => {
// 清除可能已经设置的单击定时器
clearTimeout(this.clickTimeout)
console.log('**************************** double click')
const cartesian3 = cartesian2ToCartesian3(this.viewer, event.position)
if (cartesian3 != undefined) {
this.positions.pop()
this.positions.push(cartesian3)
}
this.clearEvent()
console.log('end:' + this.positions.length.toString())
console.log(this.positions)
}
clearEvent() {
this.handler.removeInputAction(ScreenSpaceEventType.LEFT_CLICK)
this.handler.removeInputAction(ScreenSpaceEventType.MOUSE_MOVE)
this.handler.removeInputAction(ScreenSpaceEventType.LEFT_DOUBLE_CLICK)
}
// 创建几何体
createGeometry(type: string) {
switch (type) {
case 'Polyline':
if (this.polyline == null) {
this.polyline = new PolylineEntity(
new CallbackProperty(() => {
return this.positions
}, false),
)
this.layer.entities.add(this.polyline)
// this.viewer.entities.add(this.polyline)
}
break
case 'Polygon':
if (this.polygon == null) {
this.polygon = new PolygonEntity(
new CallbackProperty(() => {
return new PolygonHierarchy(this.positions)
}, false),
)
this.layer.entities.add(this.polygon)
// this.viewer.entities.add(this.polygon)
console.log('Polygon created!')
}
break
default:
break
}
}
}
export { Drawer }

@ -1,7 +1,165 @@
/* /*
* @Author: cbwu 504-wuchengbo@htsdfp.com * @Author: cbwu 504-wuchengbo@htsdfp.com
* @Date: 2024-03-22 15:42:49 * @Date: 2024-03-22 15:42:49
* @LastEditors: cbwu * @LastEditors: cbwu
* @LastEditTime: 2024-03-22 15:43:23 * @LastEditTime: 2024-04-01 14:05:43
* @Description: * @Description:
*/ */
import {Cartesian3, Cartographic, EllipsoidGeodesic, Math as Cesium_Math, Matrix4, Transforms, Viewer} from 'cesium'
import {Angle} from "@/utils/map/angle.ts";
/**
* 线
* @param lineStart 线[longitude1, latitude1, height1]
* @param lineEnd 线:[longitude2, latitude2, height2]
* @param point :[[longitude3, latitude3, height3]]
* @returns
*/
function getClosestPoint(
lineStart: Cartesian3,
lineEnd: Cartesian3,
point: Cartesian3,
): Cartesian3 {
// 计算直线方向向量
const lineDirection = new Cartesian3()
Cartesian3.subtract(lineEnd, lineStart, lineDirection)
Cartesian3.normalize(lineDirection, lineDirection)
// 计算点到直线起点的向量
const pointToStart = new Cartesian3()
Cartesian3.subtract(point, lineStart, pointToStart)
// 计算投影长度,即点到直线的向量在直线方向向量上的分量长度
const projectionLength = Cartesian3.dot(pointToStart, lineDirection)
// 使用标量乘法和向量加法确定交点
const closestPoint = new Cartesian3()
Cartesian3.multiplyByScalar(lineDirection, projectionLength, closestPoint)
Cartesian3.add(lineStart, closestPoint, closestPoint)
return closestPoint
}
/**
* 线
* @param lineStart 线[longitude1, latitude1, height1]
* @param lineEnd 线[longitude2, latitude2, height2]
* @param pointToCheck 线[longitude3, latitude3, height3]
* @param tolerance
* @returns 线
*/
function isOnLineSegment(
lineStart: Cartesian3,
lineEnd: Cartesian3,
pointToCheck: Cartesian3,
tolerance: number = Cesium_Math.EPSILON1,
): boolean {
const dist_AP = Cartesian3.distance(lineStart, pointToCheck)
const dist_BP = Cartesian3.distance(lineEnd, pointToCheck)
const dist_AB = Cartesian3.distance(lineStart, lineEnd)
const isCollinear = Math.abs(dist_AP + dist_BP - dist_AB) < tolerance
return isCollinear
/*
const startToEnd = new Cartesian3()
const startToPoint = new Cartesian3()
const endToPoint = new Cartesian3()
// 计算向量
Cartesian3.subtract(lineEnd, lineStart, startToEnd)
Cartesian3.subtract(pointToCheck, lineStart, startToPoint)
Cartesian3.subtract(pointToCheck, lineEnd, endToPoint)
// 判断共线
const cross = Cartesian3.cross(startToEnd, startToPoint, new Cartesian3())
console.log('cross:' + Cartesian3.magnitude(cross).toString())
// Math.EPSILON6 是一个非常小的值,用来防止浮点数计算的误差
const isCollinear = Cartesian3.magnitude(cross) < tolerance
// 判断点是否在线段之间
let isBetween = false
if (isCollinear) {
const dotProduct1 = Cartesian3.dot(startToEnd, startToPoint)
const dotProduct2 = Cartesian3.dot(startToEnd, endToPoint)
isBetween = dotProduct1 >= 0 && dotProduct2 <= 0
}
return isBetween
*/
}
/**
*
* @param p1
* @param p2
*/
function getDistance(p1:Cartesian3, p2: Cartesian3): number
{
let point1cartographic = Cartographic.fromCartesian(p1);
let point2cartographic = Cartographic.fromCartesian(p2);
/**根据经纬度计算出距离**/
let geodesic = new EllipsoidGeodesic()
geodesic.setEndPoints(point1cartographic, point2cartographic)
return geodesic.surfaceDistance/1000
}
/**
*
* @param p1
* @param p2
* @param digits 1
*/
function getAzimuth(p1:Cartesian3, p2: Cartesian3, digits=1): string
{
// 建立局部坐标系北为y东为xp1为原点
const localMatrix = Transforms.eastNorthUpToFixedFrame(p1)
//求世界坐标到局部坐标的变换矩阵
const worldToLocalMatrix = Matrix4.inverse(localMatrix, new Matrix4())
//p1在局部坐标系的位置即局部坐标原点
const localPosition1 = Matrix4.multiplyByPoint(worldToLocalMatrix, p1, new Cartesian3())
//p2在局部坐标系的位置
const localPosition2 = Matrix4.multiplyByPoint(worldToLocalMatrix, p2, new Cartesian3())
//弧度
const angle = Math.atan2(localPosition2.x - localPosition1.x, localPosition2.y - localPosition1.y)
//转为角度
let theta = angle * (180 / Math.PI);
theta = theta < 0 ? theta + 360 : theta
return theta.toFixed(digits)
}
/**
*
* @param vertexs
*/
function getPolygonArea(vertexs: Cartesian3[]) {
let area = 0
for (let i = 0; i < vertexs.length; i++) {
let j = (i + 1) % vertexs.length
area += vertexs[i].x * vertexs[j].y
area -= vertexs[i].y * vertexs[j].x
}
area /= 2
return Math.abs(area)
}
/**
*
* @param viewer Viewer
* @param pos Cartographic|Cartesian3|[lon,lat]
*/
export function getElevation(viewer: Viewer, pos: Cartographic|Cartesian3|number[]){
let cartographic = undefined
if(pos instanceof Array){
cartographic = Cartographic.fromDegrees(Angle.degree2rad(pos[0]), Angle.degree2rad(pos[1]))
return viewer.scene.globe.getHeight(cartographic)??-99.2024
}
else if(pos instanceof Cartesian3){
cartographic = Cartographic.fromCartesian(pos)
return viewer.scene.globe.getHeight(cartographic)??-99.2024
}
else{
return viewer.scene.globe.getHeight(pos)??-99.2024
}
}
export { getClosestPoint, isOnLineSegment, getDistance, getAzimuth, getPolygonArea }

@ -1,134 +0,0 @@
/*
* @Author: cbwu 504-wuchengbo@htsdfp.com
* @Date: 2024-03-20 08:55:59
* @LastEditors: cbwu
* @LastEditTime: 2024-03-26 09:00:46
* @Description:
*/
import {
Entity,
Cartesian3,
Color,
PrimitiveCollection,
PointPrimitiveCollection,
PolylineGeometry,
PointGraphics,
Property,
PolylineGraphics,
PolygonGraphics,
} from 'cesium'
type EntityOptions = {
id?: string
name?: string
show?: boolean
pixelSize?: number
color?: Color
fillColor?: Color
fill?: boolean
width?: number
outlineWidth?: number
}
// 点
class PointEntity extends Entity {
static id: number = 0
options: EntityOptions = {
id: 'Point' + String(PointEntity.id),
name: 'Point' + String(PointEntity.id + 1),
show: true,
pixelSize: 10,
color: Color.GREEN,
outlineWidth: 0,
}
constructor(position: Cartesian3, options?: EntityOptions) {
super({
// id: options?.id || String(PointEntity.id),
position: position,
})
this.options = { ...this.options, ...options }
this.name = this.options.name
this.point = new PointGraphics({ ...this.options })
PointEntity.id++
}
}
// 线
class PolylineEntity extends Entity {
static id: number = 0
options: EntityOptions = {
id: 'Polyline' + String(PolylineEntity.id),
name: 'Polyline' + String(PolylineEntity.id + 1),
show: true,
width: 2,
color: Color.GREEN,
}
constructor(ptArr: Cartesian3[] | Property, options?: EntityOptions) {
super({
// id: options?.id || String(PolylineEntity.id),
})
this.options = { ...this.options, ...options }
this.name = this.options.name
this.polyline = new PolylineGraphics({
positions: ptArr,
show: this.options.show,
width: this.options.width,
material: this.options.color,
})
PolylineEntity.id++
}
}
// 多边形
class PolygonEntity extends Entity {
static id: number = 0
options: EntityOptions = {
id: 'Polygon' + String(PolygonEntity.id),
name: 'Polygon' + String(PolygonEntity.id + 1),
show: true,
width: 2,
color: Color.RED,
fillColor: Color.RED.withAlpha(0.5),
fill: true,
}
constructor(ptArr: Cartesian3[] | Property, options?: EntityOptions) {
super({
// id: options?.id || String(PolygonEntity.id),
})
this.options = { ...this.options, ...options }
this.name = this.options.name
this.polygon = new PolygonGraphics({
show: this.options.show,
hierarchy: ptArr,
material: this.options.fillColor, //填充颜色
fill: this.options.fill, //是否填充
outlineWidth: this.options.width, //线宽
outlineColor: this.options.color, //线颜色
})
PolygonEntity.id++
}
}
// 线
class Polyline extends PrimitiveCollection {
constructor(ptArr: Cartesian3[]) {
super()
this.add(this.createPoints(ptArr))
this.add(this.createPolyline(ptArr))
// this.id
}
private createPoints(posArr: Cartesian3[]) {
const points = new PointPrimitiveCollection()
for (const pos in posArr) {
points.add({
position: pos,
color: Color.RED,
pixelSize: 10,
})
}
return points
}
private createPolyline(posArr: Cartesian3[]) {
return new PolylineGeometry({
positions: posArr,
width: 2,
colors: new Array(posArr.length).fill(Color.fromCssColorString('green')),
})
}
}
export { PointEntity, Polyline, PolylineEntity, PolygonEntity }

@ -0,0 +1,144 @@
/*
* @Author: cbwu 504-wuchengbo@htsdfp.com
* @Date: 2024-03-28 16:22:58
* @LastEditors: cbwu
* @LastEditTime: 2024-04-22 11:32:00
* @Description:
*/
import {
// EntityCollection,
Entity,
Cartesian3,
Color,
ConstantPositionProperty,
CustomDataSource,
} from 'cesium'
import { PointEntity } from './pointEntity'
import { EntityOptions } from '@/types/entityoptions'
export abstract class BaseGeometry extends CustomDataSource {
static ID: number
// abstract subId: number
geometry: Entity | null = null
positions: Cartesian3[] = []
controlPointsID: string[] = [] //存储
options: EntityOptions = {
// id: 'Point' + String(PointEntity.ID),
// name: 'Point' + String(PointEntity.ID + 1),
show: true,
// pixelSize: 10,
width: 2,
color: Color.GREEN,
outlineWidth: 0,
}
constructor() {
super()
}
/**
* ,
* @param pos
* @param index 0
* @param bAddControlPoint
* @bAddControlPoint
*/
public addPoint(
pos: Cartesian3,
index: number = -1,
bAddControlPoint: boolean = true,
) {
if (index === -1) {
//插入尾部
this.positions.push(pos)
if (bAddControlPoint)
this.createControlPoint(pos, this.positions.length - 1)
} else if (index >= 0 && index < this.positions.length) {
this.positions.splice(index, 0, pos)
if (bAddControlPoint) this.createControlPoint(pos, index)
} else {
return
}
}
/**
*
* @param index
* @returns
*/
public removePoint(index: number = -1) {
if (index === -1 || index === this.positions.length - 1) {
//移除尾部元素
this.positions.pop()
} else if (index >= 0 && index < this.positions.length) {
this.positions.splice(index, 1)
} else {
return
}
//移除控制点
this.removeControlPoint(index)
}
/**
*
* @param pos
* @param index
*/
public modifyPoint(pos: Cartesian3, index: number) {
if (index === -1) {
index = this.positions.length - 1
}
if (index >= 0 && index < this.positions.length) {
this.positions.splice(index, 1, pos)
if (this.controlPointsID[index]) {
//修改控制点坐标
const point = this.entities.getById(this.controlPointsID[index])
if (point) {
point.position = new ConstantPositionProperty(pos)
}
}
}
}
/**
*
* @param pos
* @param index ,0
*/
public createControlPoint(pos: Cartesian3, index: number) {
// if (this.geometry) {
const point = new PointEntity(pos)
point.parent = this.geometry!
point.subId = index
this.entities.add(point)
this.controlPointsID.splice(index, 0, point.id)
// }
}
/**
*
* @param index
*/
public removeControlPoint(index: number) {
if (index === -1) index = this.controlPointsID.length - 1
if (this.controlPointsID[index]) {
this.entities.removeById(this.controlPointsID[index])
this.controlPointsID.splice(index, 1)
}
}
/**
*
*/
removeControlPoints() {
this.controlPointsID.forEach((value) => {
this.entities.removeById(value)
})
this.controlPointsID = []
}
/**
*
* @param index
* @param bShow
*/
showControlPoint(index: number, bShow: boolean) {
if (index === -1) index = this.controlPointsID.length - 1
if (this.controlPointsID[index]) {
const point = this.entities.getById(this.controlPointsID[index])
if (point) point.show = bShow
}
}
}

@ -0,0 +1,36 @@
/*
* @Author: cbwu 504-wuchengbo@htsdfp.com
* @Date: 2024-04-10 08:53:12
* @LastEditors: cbwu
* @LastEditTime: 2024-04-13 10:45:00
* @Description: 广
*/
import { Entity, Cartesian3, Cartesian2, HeightReference } from 'cesium'
import { getMapAssetsFile } from '@/utils/getAssets'
export class BillBoard extends Entity {
static ID: number = 0
public subId: number = 0 //用于作为其他几何体的控制点时标记节点号
constructor(position: Cartesian3) {
super({
position: position,
billboard: {
show: true,
image: getMapAssetsFile('marker.svg'),
width: 32,
height: 32,
scale: 1,
// 设置实体贴地
heightReference: HeightReference.CLAMP_TO_GROUND,
disableDepthTestDistance: Number.POSITIVE_INFINITY, // 可能会提高在不同角度下的清晰度
},
label: {
text: 'Maker1',
font: '32px sans-serif',
scale: 0.5,
pixelOffset: new Cartesian2(45, -5),
heightReference: HeightReference.CLAMP_TO_GROUND,
disableDepthTestDistance: Number.POSITIVE_INFINITY, // 可能会提高在不同角度下的清晰度
},
})
}
}

@ -0,0 +1,57 @@
/*
* @Author: cbwu 504-wuchengbo@htsdfp.com
* @Date: 2024-03-28 16:35:33
* @LastEditors: cbwu
* @LastEditTime: 2024-04-16 13:57:15
* @Description:
*/
import {
Entity,
Cartesian3,
Color,
PointGraphics,
LabelGraphics,
HeightReference,
} from 'cesium'
import { EntityOptions } from '@/types/entityoptions'
// 点
class PointEntity extends Entity {
static ID: number = 0
public subId: number = 0 //用于作为其他几何体的控制点时标记节点号
public type: number = 0 //用于判断是线上节点(0)还是地表控制点(1)
options: EntityOptions = {
id: 'Point' + String(PointEntity.ID),
name: 'Point' + String(PointEntity.ID + 1),
show: true,
pixelSize: 8,
color: Color.WHITE,
outlineColor: Color.GREEN,
outlineWidth: 0,
// heightReference: HeightReference.NONE,
}
constructor(position: Cartesian3, options?: EntityOptions) {
super({
position: position,
})
this.options = { ...this.options, ...options }
//点对象
this.point = new PointGraphics({
pixelSize: this.options.pixelSize,
color: this.options.color,
outlineColor: this.options.outlineColor,
outlineWidth: this.options.outlineWidth,
disableDepthTestDistance: 50000,
// heightReference: this.options.heightReference,
})
// 标注对象
this.label = new LabelGraphics({
text: this.options.text,
font: this.options.font,
pixelOffset: this.options.pixelOffset,
})
PointEntity.ID++
}
}
export { PointEntity }

@ -0,0 +1,56 @@
/*
* @Author: cbwu 504-wuchengbo@htsdfp.com
* @Date: 2024-04-11 09:26:56
* @LastEditors: cbwu
* @LastEditTime: 2024-04-13 10:45:27
* @Description: Polygon
*/
import {
Entity,
Cartesian3,
Color,
CallbackProperty,
PolygonHierarchy,
} from 'cesium'
import { BaseGeometry } from './baseGeometry'
import { EntityOptions } from '@/types/entityoptions'
export class PolygonEntity extends BaseGeometry {
static ID: number = 0
// positions: Cartesian3[] = []
controlPointsID: string[] = []
options: EntityOptions = {
id: 'Polygon' + String(PolygonEntity.ID),
name: 'Polygon' + String(PolygonEntity.ID + 1),
show: true,
width: 2,
color: Color.RED,
fillColor: Color.RED.withAlpha(0.5),
fill: true,
}
constructor(ptArr: Cartesian3[], options?: EntityOptions) {
super()
this.positions = ptArr
this.options = { ...this.options, ...options }
this.geometry = new Entity({
show: this.options.show,
name: this.options.name,
polygon: {
hierarchy: new CallbackProperty(() => {
return new PolygonHierarchy(this.positions)
}, false),
material: this.options.fillColor, //填充颜色
fill: this.options.fill, //是否填充
outline: true,
// outlineWidth: this.options.width, //线宽
outlineColor: this.options.color, //线颜色
},
})
this.entities.add(this.geometry)
// 添加控制点
ptArr.forEach((pt, index) => {
this.createControlPoint(pt, index)
})
PolygonEntity.ID++
}
}

@ -0,0 +1,58 @@
/*
* @Author: cbwu 504-wuchengbo@htsdfp.com
* @Date: 2024-03-28 16:49:02
* @LastEditors: cbwu
* @LastEditTime: 2024-04-16 11:12:08
* @Description: Polyline
*/
import {
Entity,
Cartesian3,
Color,
CallbackProperty,
PolylineDashMaterialProperty,
} from 'cesium'
import { BaseGeometry } from './baseGeometry'
import { EntityOptions } from '@/types/entityoptions'
export class PolylineEntity extends BaseGeometry {
static ID: number = 0
// positions: Cartesian3[] = []
controlPointsID: string[] = []
options: EntityOptions = {
// id: 'Polyline' + String(PolylineEntity.ID),
name: 'Polyline' + String(PolylineEntity.ID + 1),
show: true,
width: 3,
color: Color.GREEN,
}
constructor(ptArr: Cartesian3[], options?: EntityOptions) {
super()
this.options = { ...this.options, ...options }
// console.log(this.options)
this.positions = ptArr
// console.log(this.positions)
// 创建线实体对象
this.geometry = new Entity({
name: this.options.name,
polyline: {
positions: new CallbackProperty(() => {
return this.positions
}, false),
show: this.options.show,
width: this.options.width,
material: this.options.color,
// depthFailMaterial: new PolylineDashMaterialProperty({
// color: Color.GREEN,
// dashLength: 15, //短划线长度
// }),
},
})
this.entities.add(this.geometry)
// 添加控制点
ptArr.forEach((pt, index) => {
this.createControlPoint(pt, index)
})
PolylineEntity.ID++
}
}

@ -0,0 +1,85 @@
/*
* @Author: cbwu 504-wuchengbo@htsdfp.com
* @Date: 2024-04-16 18:59:56
* @LastEditors: cbwu
* @LastEditTime: 2024-04-22 09:11:33
* @Description:
*/
import {
Cartesian3,
Entity,
Color,
Viewer,
Cartesian2,
HorizontalOrigin,
VerticalOrigin,
HeightReference,
} from 'cesium'
/**
2024/4/16 11:44
Zhaipeixiu
*/
export type textLabelOptions = {
showBackground?: boolean //显示背景
backgroundColor?: Color //背景色
backgroundPadding?: any //padding值
fillColor: Color
horizontalOrigin?: any //水平对齐方式
verticalOrigin?: any //竖直对齐方式
outlineColor?: any
outlineWidth?: any
}
export class TextLabel {
_viewer: Viewer | undefined = undefined
_defaultStyle: textLabelOptions = {
showBackground: true, //显示背景
backgroundColor: Color.BLACK, //背景色
backgroundPadding: new Cartesian2(10, 10), //padding值
fillColor: Color.WHITE,
outlineColor: Color.WHITESMOKE,
outlineWidth: 1.0,
horizontalOrigin: HorizontalOrigin.CENTER, //对齐方式
verticalOrigin: VerticalOrigin.CENTER,
}
_cesiumLabel: Entity | undefined = undefined
// 构造函数新建label并显示
constructor(
viewer: Viewer,
position: Cartesian3,
text: string,
options?: textLabelOptions,
) {
this._viewer = viewer
this._defaultStyle = { ...this._defaultStyle, ...options }
this._cesiumLabel = new Entity({
position: position,
name: 'default',
label: {
text: text,
scale: 0.6,
pixelOffset: new Cartesian2(20, -20),
showBackground: this._defaultStyle.showBackground, //显示背景
backgroundColor: this._defaultStyle.backgroundColor, //背景色
backgroundPadding: this._defaultStyle.backgroundPadding, //padding值
fillColor: this._defaultStyle.fillColor,
outlineColor: this._defaultStyle.outlineColor,
outlineWidth: this._defaultStyle.outlineWidth,
horizontalOrigin: this._defaultStyle.horizontalOrigin, //对齐方式
verticalOrigin: this._defaultStyle.verticalOrigin,
heightReference: HeightReference.CLAMP_TO_GROUND,
},
})
this._viewer.entities.add(this._cesiumLabel)
}
//移除label
public remove() {
if (this._cesiumLabel !== undefined && this._viewer !== null)
this._viewer.entities.remove(this._cesiumLabel)
}
}

@ -1,90 +1,113 @@
/* /*
* @Author: cbwu 504-wuchengbo@htsdfp.com * @Author: cbwu 504-wuchengbo@htsdfp.com
* @Date: 2024-03-13 09:32:21 * @Date: 2024-03-13 09:32:21
* @LastEditors: cbwu * @LastEditors: cbwu
* @LastEditTime: 2024-03-26 13:27:27 * @LastEditTime: 2024-04-16 10:58:25
* @Description: * @Description:
*/ */
// Viewer初始化 // Viewer初始化
import { import {
Viewer, Viewer,
TileMapServiceImageryProvider, TileMapServiceImageryProvider,
ImageryLayer, ScreenSpaceEventType,
RequestScheduler, ImageryLayer,
SceneMode, RequestScheduler,
buildModuleUrl, SceneMode,
} from 'cesium' Rectangle,
buildModuleUrl,
//离线地球底图 } from 'cesium'
const earth_native = TileMapServiceImageryProvider.fromUrl( import CesiumNavigation from 'cesium-navigation-es6'
// 'node_modules/cesium/Build/CesiumUnminified/Assets/Textures/NaturalEarthII',
buildModuleUrl('Assets/Textures/NaturalEarthII'), //离线地球底图
) const earth_native = TileMapServiceImageryProvider.fromUrl(
/** // 'node_modules/cesium/Build/CesiumUnminified/Assets/Textures/NaturalEarthII',
* Viewer buildModuleUrl('Assets/Textures/NaturalEarthII'),
* @param container :idHTML )
* @returns :viewer /**
*/ * Viewer
function initViewer(container: string | Element): Viewer { * @param container :idHTML
//未联网状态加载默认本地底图,保证地球有底图显示 * @returns :viewer
const viewer = new Viewer(container as HTMLElement, { */
infoBox: false, //是否显示点击要素之后显示的信息 function initViewer(container: string | Element): Viewer {
homeButton: false, //是否显示Home按钮 //未联网状态加载默认本地底图,保证地球有底图显示
navigationHelpButton: false, //是否显示帮助信息控件 const viewer = new Viewer(container as HTMLElement, {
timeline: false, //是否显示时间线控件 infoBox: false, //是否显示点击要素之后显示的信息
animation: false, //是否显示动画控件 homeButton: false, //是否显示Home按钮
sceneModePicker: true, //是否显示投影方式控件 navigationHelpButton: false, //是否显示帮助信息控件
sceneMode: SceneMode.SCENE3D, //设置场景模式3D球体 timeline: false, //是否显示时间线控件
// terrain: Cesium.Terrain.fromWorldTerrain(), animation: false, //是否显示动画控件
baseLayerPicker: false, //是否显示图层选择控件 sceneModePicker: true, //是否显示投影方式控件
requestRenderMode: true, //启用请求渲染模式 sceneMode: SceneMode.SCENE3D, //设置场景模式3D球体
scene3DOnly: false, //每个几何实例将只能以3D渲染以节省GPU内存 // terrain: Cesium.Terrain.fromWorldTerrain(),
fullscreenButton: false, //右下角 全屏控件 baseLayerPicker: false, //是否显示图层选择控件
orderIndependentTranslucency: false, requestRenderMode: true, //启用请求渲染模式
contextOptions: { webgl: { alpha: true } }, scene3DOnly: false, //每个几何实例将只能以3D渲染以节省GPU内存
maximumRenderTimeChange: Infinity, // 无操作时自动渲染帧率设为数字会消耗性能Infinity为无操作不渲染 fullscreenButton: false, //右下角 全屏控件
// mapProjection: new Cesium.WebMercatorProjection(), orderIndependentTranslucency: false,
baseLayer: ImageryLayer.fromProviderAsync(earth_native, {}), contextOptions: { webgl: { alpha: true } },
}) maximumRenderTimeChange: Infinity, // 无操作时自动渲染帧率设为数字会消耗性能Infinity为无操作不渲染
//去除cesium logo隐藏版本信息 // mapProjection: new Cesium.WebMercatorProjection(),
const creditContainer = viewer.cesiumWidget.creditContainer as HTMLDivElement baseLayer: ImageryLayer.fromProviderAsync(earth_native, {}),
creditContainer.style.display = 'none' })
// 水雾特效 //去除cesium logo隐藏版本信息
viewer.scene.globe.showGroundAtmosphere = true const creditContainer = viewer.cesiumWidget.creditContainer as HTMLDivElement
// 设置更高的缩放惯性以使缩放操作更平滑 creditContainer.style.display = 'none'
viewer.scene.screenSpaceCameraController.inertiaZoom = 0.9 // 开启深度检测
// 限制相机缩放 viewer.scene.globe.depthTestAgainstTerrain = true
viewer.scene.screenSpaceCameraController.minimumZoomDistance = 200 //相机的高度的最小值 // 水雾特效
viewer.scene.screenSpaceCameraController.maximumZoomDistance = 20000000 //相机高度的最大值 viewer.scene.globe.showGroundAtmosphere = true
// 去掉entity的点击事件双击、单击 // 设置更高的缩放惯性以使缩放操作更平滑
viewer.cesiumWidget.screenSpaceEventHandler.removeInputAction( viewer.scene.screenSpaceCameraController.inertiaZoom = 0.9
Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK, // 限制相机缩放
) viewer.scene.screenSpaceCameraController.minimumZoomDistance = 200 //相机的高度的最小值
viewer.cesiumWidget.screenSpaceEventHandler.removeInputAction( viewer.scene.screenSpaceCameraController.maximumZoomDistance = 10350000 //相机高度的最大值
Cesium.ScreenSpaceEventType.LEFT_CLICK, // 设置设备像素比,可能会影响渲染性能
) // viewer.resolutionScale = window.devicePixelRatio
return viewer // 视图重绘后确保清晰度
} viewer.scene.preRender.addEventListener(function () {
if (viewer.resolutionScale !== window.devicePixelRatio) {
/** viewer.resolutionScale = window.devicePixelRatio
* }
* @param viewer :Viewer })
*/ // 去掉entity的点击事件双击、单击
function perfViewer(viewer: Viewer) { viewer.cesiumWidget.screenSpaceEventHandler.removeInputAction(
// 抗锯齿 ScreenSpaceEventType.LEFT_DOUBLE_CLICK,
// 是否支持图像渲染像素化处理 )
// if (Cesium.FeatureDetection.supportsImageRenderingPixelated()) { viewer.cesiumWidget.screenSpaceEventHandler.removeInputAction(
// viewer.resolutionScale = window.devicePixelRatio ScreenSpaceEventType.LEFT_CLICK,
// } )
viewer.scene.postProcessStages.fxaa.enabled = true return viewer
// 关闭太阳,月亮,天空盒,雾等相关特效 }
viewer.scene.moon.show = false
viewer.scene.fog.enabled = false /**
viewer.scene.sun.show = false *
viewer.scene.skyBox.show = false * @param viewer :Viewer
// 优化加载WMTS图层速度 */
RequestScheduler.maximumRequestsPerServer = 18 // 设置cesium请求调度器的最大并发数量 function perfViewer(viewer: Viewer) {
RequestScheduler.throttleRequests = false //关闭请求调度器的请求节流 // 抗锯齿
} // 是否支持图像渲染像素化处理
// if (Cesium.FeatureDetection.supportsImageRenderingPixelated()) {
export { initViewer, perfViewer } // viewer.resolutionScale = window.devicePixelRatio
// }
viewer.scene.postProcessStages.fxaa.enabled = true
// 关闭太阳,月亮,天空盒,雾等相关特效
viewer.scene.moon.show = false
viewer.scene.fog.enabled = false
viewer.scene.sun.show = false
viewer.scene.skyBox.show = false
// 优化加载WMTS图层速度
RequestScheduler.maximumRequestsPerServer = 18 // 设置cesium请求调度器的最大并发数量
RequestScheduler.throttleRequests = false //关闭请求调度器的请求节流
}
function showNavigator(viewer: Viewer) {
const options: any = {}
// 用于在使用重置导航重置地图视图时设置默认视图控制。接受的值是Cesium.Cartographic 和 Cesium.Rectangle
options.defaultResetView = Rectangle.fromDegrees(80, 22, 130, 50)
options.enableCompass = true //罗盘组件 true启用false禁用
options.enableCompassOuterRing = true //罗盘外环组件 true启用false禁用
options.enableZoomControls = true //缩放组件 true启用false禁用
options.enableDistanceLegend = true //比例尺组件 true启用false禁用
new CesiumNavigation(viewer, options)
}
export { initViewer, perfViewer, showNavigator }

Loading…
Cancel
Save