feat:引入naiveUI,实现工具条雏形,实现距离测量

devzpx
zhaipx 1 month ago
parent 2da9f05c19
commit 819d0d32e5

@ -17,10 +17,12 @@
"preinstall": "node ./scripts/preinstall.js" "preinstall": "node ./scripts/preinstall.js"
}, },
"dependencies": { "dependencies": {
"@vicons/ionicons5": "^0.13.0",
"axios": "^1.6.7", "axios": "^1.6.7",
"cesium": "1.108", "cesium": "1.108",
"cesium-navigation-es6": "^3.0.8", "cesium-navigation-es6": "^3.0.8",
"echarts": "^5.5.0", "echarts": "^5.5.0",
"naive-ui": "^2.35.0",
"pinia": "^2.1.7", "pinia": "^2.1.7",
"vue": "^3.4.21" "vue": "^3.4.21"
}, },

@ -5,6 +5,9 @@ settings:
excludeLinksFromLockfile: false excludeLinksFromLockfile: false
dependencies: dependencies:
'@vicons/ionicons5':
specifier: ^0.13.0
version: 0.13.0
axios: axios:
specifier: ^1.6.7 specifier: ^1.6.7
version: 1.6.7 version: 1.6.7
@ -17,6 +20,9 @@ dependencies:
echarts: echarts:
specifier: ^5.5.0 specifier: ^5.5.0
version: 5.5.0 version: 5.5.0
naive-ui:
specifier: ^2.35.0
version: 2.41.0(vue@3.4.21)
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)
@ -535,6 +541,22 @@ packages:
chalk: 5.3.0 chalk: 5.3.0
dev: true dev: true
/@css-render/plugin-bem@0.15.14(css-render@0.15.14):
resolution: {integrity: sha512-QK513CJ7yEQxm/P3EwsI+d+ha8kSOcjGvD6SevM41neEMxdULE+18iuQK6tEChAWMOQNQPLG/Rw3Khb69r5neg==, tarball: https://registry.npmmirror.com/@css-render/plugin-bem/-/plugin-bem-0.15.14.tgz}
peerDependencies:
css-render: ~0.15.14
dependencies:
css-render: 0.15.14
dev: false
/@css-render/vue3-ssr@0.15.14(vue@3.4.21):
resolution: {integrity: sha512-//8027GSbxE9n3QlD73xFY6z4ZbHbvrOVB7AO6hsmrEzGbg+h2A09HboUyDgu+xsmj7JnvJD39Irt+2D0+iV8g==, tarball: https://registry.npmmirror.com/@css-render/vue3-ssr/-/vue3-ssr-0.15.14.tgz}
peerDependencies:
vue: ^3.0.11
dependencies:
vue: 3.4.21(typescript@5.4.2)
dev: false
/@csstools/css-parser-algorithms@2.6.0(@csstools/css-tokenizer@2.2.3): /@csstools/css-parser-algorithms@2.6.0(@csstools/css-tokenizer@2.2.3):
resolution: {integrity: sha512-YfEHq0eRH98ffb5/EsrrDspVWAuph6gDggAE74ZtjecsmyyWpW768hOyiONa8zwWGbIWYfa2Xp4tRTrpQQ00CQ==} resolution: {integrity: sha512-YfEHq0eRH98ffb5/EsrrDspVWAuph6gDggAE74ZtjecsmyyWpW768hOyiONa8zwWGbIWYfa2Xp4tRTrpQQ00CQ==}
engines: {node: ^14 || ^16 || >=18} engines: {node: ^14 || ^16 || >=18}
@ -569,6 +591,10 @@ packages:
postcss-selector-parser: 6.0.15 postcss-selector-parser: 6.0.15
dev: true dev: true
/@emotion/hash@0.8.0:
resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==, tarball: https://registry.npmmirror.com/@emotion/hash/-/hash-0.8.0.tgz}
dev: false
/@esbuild/aix-ppc64@0.19.12: /@esbuild/aix-ppc64@0.19.12:
resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==, tarball: https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz} 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'}
@ -862,6 +888,10 @@ packages:
'@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/sourcemap-codec': 1.4.15
dev: true dev: true
/@juggle/resize-observer@3.4.0:
resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==, tarball: https://registry.npmmirror.com/@juggle/resize-observer/-/resize-observer-3.4.0.tgz}
dev: false
/@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1: /@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1:
resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==}
dependencies: dependencies:
@ -1073,6 +1103,20 @@ packages:
resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
dev: true dev: true
/@types/katex@0.16.7:
resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==, tarball: https://registry.npmmirror.com/@types/katex/-/katex-0.16.7.tgz}
dev: false
/@types/lodash-es@4.17.12:
resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==, tarball: https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz}
dependencies:
'@types/lodash': 4.17.14
dev: false
/@types/lodash@4.17.14:
resolution: {integrity: sha512-jsxagdikDiDBeIRaPYtArcT8my4tN1og7MtMRquFT3XNA6axxyHDRUemqDz/taRDdOUn0GnGHRCuff4q48sW9A==, tarball: https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.14.tgz}
dev: false
/@types/node@20.11.25: /@types/node@20.11.25:
resolution: {integrity: sha512-TBHyJxk2b7HceLVGFcpAUjsa5zIdsPWlR6XHfyGzd0SFu+/NFgQgMAl96MSDZgQDvJAvV6BKsFOrt6zIL09JDw==} resolution: {integrity: sha512-TBHyJxk2b7HceLVGFcpAUjsa5zIdsPWlR6XHfyGzd0SFu+/NFgQgMAl96MSDZgQDvJAvV6BKsFOrt6zIL09JDw==}
dependencies: dependencies:
@ -1224,6 +1268,10 @@ packages:
resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
dev: true dev: true
/@vicons/ionicons5@0.13.0:
resolution: {integrity: sha512-zvZKBPjEXKN7AXNo2Na2uy+nvuv6SP4KAMQxpKL2vfHMj0fSvuw7JZcOPCjQC3e7ayssKnaoFVAhbYcW6v41qQ==, tarball: https://registry.npmmirror.com/@vicons/ionicons5/-/ionicons5-0.13.0.tgz}
dev: false
/@vitejs/plugin-vue@5.0.4(vite@5.1.5)(vue@3.4.21): /@vitejs/plugin-vue@5.0.4(vite@5.1.5)(vue@3.4.21):
resolution: {integrity: sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==} resolution: {integrity: sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==}
engines: {node: ^18.0.0 || >=20.0.0} engines: {node: ^18.0.0 || >=20.0.0}
@ -1546,6 +1594,10 @@ packages:
engines: {node: '>=8'} engines: {node: '>=8'}
dev: true dev: true
/async-validator@4.2.5:
resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==, tarball: https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz}
dev: false
/asynckit@0.4.0: /asynckit@0.4.0:
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
dev: false dev: false
@ -1961,6 +2013,13 @@ packages:
engines: {node: '>=12 || >=16'} engines: {node: '>=12 || >=16'}
dev: true dev: true
/css-render@0.15.14:
resolution: {integrity: sha512-9nF4PdUle+5ta4W5SyZdLCCmFd37uVimSjg1evcTqKJCyvCEEj12WKzOSBNak6r4im4J4iYXKH1OWpUV5LBYFg==, tarball: https://registry.npmmirror.com/css-render/-/css-render-0.15.14.tgz}
dependencies:
'@emotion/hash': 0.8.0
csstype: 3.0.11
dev: false
/css-select@4.3.0: /css-select@4.3.0:
resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==}
dependencies: dependencies:
@ -2005,14 +2064,30 @@ packages:
css-tree: 1.1.3 css-tree: 1.1.3
dev: true dev: true
/csstype@3.0.11:
resolution: {integrity: sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==, tarball: https://registry.npmmirror.com/csstype/-/csstype-3.0.11.tgz}
dev: false
/csstype@3.1.3: /csstype@3.1.3:
resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==, tarball: https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz}
/dargs@8.1.0: /dargs@8.1.0:
resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==}
engines: {node: '>=12'} engines: {node: '>=12'}
dev: true dev: true
/date-fns-tz@3.2.0(date-fns@3.6.0):
resolution: {integrity: sha512-sg8HqoTEulcbbbVXeg84u5UnlsQa8GS5QXMqjjYIhS4abEVVKIUwe0/l/UhrZdKaL/W5eWZNlbTeEIiOXTcsBQ==, tarball: https://registry.npmmirror.com/date-fns-tz/-/date-fns-tz-3.2.0.tgz}
peerDependencies:
date-fns: ^3.0.0 || ^4.0.0
dependencies:
date-fns: 3.6.0
dev: false
/date-fns@3.6.0:
resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==, tarball: https://registry.npmmirror.com/date-fns/-/date-fns-3.6.0.tgz}
dev: false
/de-indent@1.0.2: /de-indent@1.0.2:
resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==}
dev: true dev: true
@ -2670,6 +2745,10 @@ packages:
engines: {node: '>= 0.6'} engines: {node: '>= 0.6'}
dev: true dev: true
/evtd@0.2.4:
resolution: {integrity: sha512-qaeGN5bx63s/AXgQo8gj6fBkxge+OoLddLniox5qtLAEY5HSnuSlISXVPxnSae1dWblvTh4/HoMIB+mbMsvZzw==, tarball: https://registry.npmmirror.com/evtd/-/evtd-0.2.4.tgz}
dev: false
/execa@8.0.1: /execa@8.0.1:
resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==}
engines: {node: '>=16.17'} engines: {node: '>=16.17'}
@ -3157,6 +3236,11 @@ packages:
hasBin: true hasBin: true
dev: true dev: true
/highlight.js@11.11.1:
resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==, tarball: https://registry.npmmirror.com/highlight.js/-/highlight.js-11.11.1.tgz}
engines: {node: '>=12.0.0'}
dev: false
/html-tags@3.3.1: /html-tags@3.3.1:
resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==}
engines: {node: '>=8'} engines: {node: '>=8'}
@ -3664,6 +3748,10 @@ packages:
p-locate: 6.0.0 p-locate: 6.0.0
dev: true dev: true
/lodash-es@4.17.21:
resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==, tarball: https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz}
dev: false
/lodash.camelcase@4.3.0: /lodash.camelcase@4.3.0:
resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==}
dev: true dev: true
@ -3705,8 +3793,7 @@ packages:
dev: true dev: true
/lodash@4.17.21: /lodash@4.17.21:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, tarball: https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz}
dev: true
/long@5.2.3: /long@5.2.3:
resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==}
@ -3872,6 +3959,33 @@ packages:
resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==}
dev: true dev: true
/naive-ui@2.41.0(vue@3.4.21):
resolution: {integrity: sha512-KnmLg+xPLwXV8QVR7ZZ69eCjvel7R5vru8+eFe4VoAJHEgqAJgVph6Zno9K2IVQRpSF3GBGea3tjavslOR4FAA==, tarball: https://registry.npmmirror.com/naive-ui/-/naive-ui-2.41.0.tgz}
peerDependencies:
vue: ^3.0.0
dependencies:
'@css-render/plugin-bem': 0.15.14(css-render@0.15.14)
'@css-render/vue3-ssr': 0.15.14(vue@3.4.21)
'@types/katex': 0.16.7
'@types/lodash': 4.17.14
'@types/lodash-es': 4.17.12
async-validator: 4.2.5
css-render: 0.15.14
csstype: 3.1.3
date-fns: 3.6.0
date-fns-tz: 3.2.0(date-fns@3.6.0)
evtd: 0.2.4
highlight.js: 11.11.1
lodash: 4.17.21
lodash-es: 4.17.21
seemly: 0.3.9
treemate: 0.3.11
vdirs: 0.1.8(vue@3.4.21)
vooks: 0.2.12(vue@3.4.21)
vue: 3.4.21(typescript@5.4.2)
vueuc: 0.4.64(vue@3.4.21)
dev: false
/nanoid@3.3.7: /nanoid@3.3.7:
resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
@ -4549,6 +4663,10 @@ packages:
source-map-js: 1.0.2 source-map-js: 1.0.2
dev: true dev: true
/seemly@0.3.9:
resolution: {integrity: sha512-bMLcaEqhIViiPbaumjLN8t1y+JpD/N8SiyYOyp0i0W6RgdyLWboIsUWAbZojF//JyerxPZR5Tgda+x3Pdne75A==, tarball: https://registry.npmmirror.com/seemly/-/seemly-0.3.9.tgz}
dev: false
/semver@6.3.1: /semver@6.3.1:
resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
hasBin: true hasBin: true
@ -5142,6 +5260,10 @@ packages:
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
dev: true dev: true
/treemate@0.3.11:
resolution: {integrity: sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==, tarball: https://registry.npmmirror.com/treemate/-/treemate-0.3.11.tgz}
dev: false
/ts-api-utils@1.2.1(typescript@5.4.2): /ts-api-utils@1.2.1(typescript@5.4.2):
resolution: {integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==} resolution: {integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==}
engines: {node: '>=16'} engines: {node: '>=16'}
@ -5308,6 +5430,15 @@ packages:
engines: {node: '>= 0.8'} engines: {node: '>= 0.8'}
dev: true dev: true
/vdirs@0.1.8(vue@3.4.21):
resolution: {integrity: sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw==, tarball: https://registry.npmmirror.com/vdirs/-/vdirs-0.1.8.tgz}
peerDependencies:
vue: ^3.0.11
dependencies:
evtd: 0.2.4
vue: 3.4.21(typescript@5.4.2)
dev: false
/vite-plugin-svg-icons@2.0.1(vite@5.1.5): /vite-plugin-svg-icons@2.0.1(vite@5.1.5):
resolution: {integrity: sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==} resolution: {integrity: sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==}
peerDependencies: peerDependencies:
@ -5363,6 +5494,15 @@ packages:
fsevents: 2.3.3 fsevents: 2.3.3
dev: true dev: true
/vooks@0.2.12(vue@3.4.21):
resolution: {integrity: sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==, tarball: https://registry.npmmirror.com/vooks/-/vooks-0.2.12.tgz}
peerDependencies:
vue: ^3.0.0
dependencies:
evtd: 0.2.4
vue: 3.4.21(typescript@5.4.2)
dev: false
/vue-demi@0.14.7(vue@3.4.21): /vue-demi@0.14.7(vue@3.4.21):
resolution: {integrity: sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==} resolution: {integrity: sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==}
engines: {node: '>=12'} engines: {node: '>=12'}
@ -5430,6 +5570,21 @@ packages:
'@vue/shared': 3.4.21 '@vue/shared': 3.4.21
typescript: 5.4.2 typescript: 5.4.2
/vueuc@0.4.64(vue@3.4.21):
resolution: {integrity: sha512-wlJQj7fIwKK2pOEoOq4Aro8JdPOGpX8aWQhV8YkTW9OgWD2uj2O8ANzvSsIGjx7LTOc7QbS7sXdxHi6XvRnHPA==, tarball: https://registry.npmmirror.com/vueuc/-/vueuc-0.4.64.tgz}
peerDependencies:
vue: ^3.0.11
dependencies:
'@css-render/vue3-ssr': 0.15.14(vue@3.4.21)
'@juggle/resize-observer': 3.4.0
css-render: 0.15.14
evtd: 0.2.4
seemly: 0.3.9
vdirs: 0.1.8(vue@3.4.21)
vooks: 0.2.12(vue@3.4.21)
vue: 3.4.21(typescript@5.4.2)
dev: false
/which-boxed-primitive@1.0.2: /which-boxed-primitive@1.0.2:
resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
dependencies: dependencies:

@ -1,13 +1,19 @@
<template> <template>
<n-message-provider>
<n-dialog-provider>
<div id="map"> <div id="map">
<SceneViewer id="scene-viewer"></SceneViewer> <SceneViewer id="scene-viewer"></SceneViewer>
<BottomBar></BottomBar> <BottomBar></BottomBar>
<toolbar></toolbar>
</div> </div>
</n-dialog-provider>
</n-message-provider>
</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' import BottomBar from '@/components/map/BottomBar.vue'
import Toolbar from "@/components/toolbar.vue";
</script> </script>
<style> <style>

@ -0,0 +1,242 @@
import * as Cesium from 'cesium'
export default class MeasureDistance {
constructor(viewer) {
this.viewer = viewer
this.isMeasure = false
this.initEvents()
this.positions = []
this.temPositions = [] // 鼠标移动时产生的临时点
this.vertexEntities = [] // 节点元素
this.lineEntity = undefined // 折线元素
this.totalDistance = 0 // 总距离
}
initEvents(){
this.handler = new Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas)
}
//激活
activate() {
this.registerEvents(); //注册鼠标事件
this.isMeasure = true;
this.totalDistance = 0 // 总距离
//设置鼠标样式
this.viewer._element.style.cursor = 'crosshair';
this.viewer.enableCursorStyle = true;
this.temPositions = [];
this.positions = [];
this.viewer.scene.globe.depthTestAgainstTerrain = true
}
//禁用
deactivate() {
if (!this.isMeasure) return;
this.unRegisterEvents();
this.viewer._element.style.cursor = 'default';
this.viewer.enableCursorStyle = true;
this.isMeasure = false;
this.viewer.scene.globe.depthTestAgainstTerrain = false
}
//清空绘制
clear() {
//清除线对象
this.viewer.entities.remove(this.lineEntity);
this.lineEntity = undefined;
//清除节点
this.vertexEntities.forEach(item => {
this.viewer.entities.remove(item);
});
this.vertexEntities = [];
}
//创建线对象
createLineEntity() {
this.lineEntity = this.viewer.entities.add({
polyline: {
positions: new Cesium.CallbackProperty(e => {
return this.temPositions;
}, false),
width: 2,
material: Cesium.Color.YELLOW,
// depthFailMaterial: Cesium.Color.YELLOW,
clampToGround: true,
disableDepthTestDistance:99000000,
heightReference:Cesium.HeightReference.CLAMP_TO_GROUND
}
})
}
//创建线节点
createVertex() {
let vertexEntity = new Cesium.Entity({
id: "MeasureDistanceVertex" + this.positions[this.positions.length - 1],
position: this.positions[this.positions.length - 1],
point: {
color: Cesium.Color.FUCHSIA,
pixelSize: 6,
disableDepthTestDistance:99000000,
heightReference:Cesium.HeightReference.CLAMP_TO_GROUND,
},
label:{
text: this.spaceDistance(this.positions) + "km",
font: "2rem sans-serif",
fillColor: Cesium.Color.WHITE,
style: Cesium.LabelStyle.FILL,
pixelOffset: new Cesium.Cartesian2(20, -10),
eyeOffset: new Cesium.Cartesian3(0, 0, 0),
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
// distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 20000),
scale: 0.5,
showBackground: true,
backgroundColor: new Cesium.Color(0.165, 0.165, 0.165, 0.5),
backgroundPadding: new Cesium.Cartesian2(10, 10),
disableDepthTestDistance:99000000,
heightReference:Cesium.HeightReference.CLAMP_TO_GROUND
},
});
this.vertexEntities.push(vertexEntity)
this.viewer.entities.add(vertexEntity)
}
//创建起点
createStartEntity() {
let vertexEntity = this.viewer.entities.add({
position: this.positions[0],
type: "MeasureDistanceVertex",
point: {
show: true,
pixelSize: 10,
color: Cesium.Color.RED,
outlineColor: Cesium.Color.WHITE,
outlineWidth: 1,
disableDepthTestDistance:99000000,
heightReference:Cesium.HeightReference.CLAMP_TO_GROUND,
},
});
this.vertexEntities.push(vertexEntity)
}
//创建终点节点
createEndEntity() {
let vertexEntity = this.viewer.entities.add({
position: this.positions[this.positions.length - 1],
type: "MeasureDistanceVertex",
label:{
text: "总距离:" + this.totalDistance.toFixed(3) + "km",
font: "2.5rem sans-serif",
fillColor: Cesium.Color.WHITE,
style: Cesium.LabelStyle.FILL,
pixelOffset: new Cesium.Cartesian2(20, -60),
eyeOffset: new Cesium.Cartesian3(0, 0, 30),
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
// distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 20000),
scale: 0.5,
showBackground: true,
backgroundColor: new Cesium.Color(0.165, 0.165, 0.165, 0.99),
backgroundPadding: new Cesium.Cartesian2(10, 10),
disableDepthTestDistance:99000000,
heightReference:Cesium.HeightReference.CLAMP_TO_GROUND
},
// billboard: {
// // image: "../../static/images/end.png",
// scaleByDistance: new Cesium.NearFarScalar(300, 1, 1200, 0.4), //设置随图缩放距离和比例
// distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 20000), //设置可见距离 10000米可见
// verticalOrigin: Cesium.VerticalOrigin.BOTTOM
// },
point: {
pixelSize: 10,
color: Cesium.Color.RED,
outlineColor: Cesium.Color.WHITE,
outlineWidth: 1,
heightReference:Cesium.HeightReference.CLAMP_TO_GROUND,
disableDepthTestDistance:99000000
},
});
this.vertexEntities.push(vertexEntity)
}
//注册鼠标事件
registerEvents() {
this.leftClickEvent();
this.rightClickEvent();
this.mouseMoveEvent();
}
//左键点击事件
leftClickEvent() {
//单击鼠标左键画点点击事件
this.handler.setInputAction(e => {
let position = this.viewer.scene.pickPosition(e.position);
if (!position) {
const ellipsoid = this.viewer.scene.globe.ellipsoid;
position = this.viewer.scene.camera.pickEllipsoid(e.position, ellipsoid);
}
if (!position) return;
this.positions.push(position);
if (this.positions.length === 1) { //首次点击
this.createLineEntity();
this.createStartEntity();
return;
}
this.createVertex();
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
}
//鼠标移动事件
mouseMoveEvent() {
this.handler.setInputAction(e => {
if (!this.isMeasure) return;
let position = this.viewer.scene.pickPosition(e.endPosition);
if (!position) {
position = this.viewer.scene.camera.pickEllipsoid(e.startPosition, this.viewer.scene.globe.ellipsoid);
}
if (!position) return;
this.handleMoveEvent(position);
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
}
//处理鼠标移动
handleMoveEvent(position) {
if (this.positions.length < 1) return;
this.temPositions = this.positions.concat(position);
}
//右键事件
rightClickEvent() {
this.handler.setInputAction(e => {
if (!this.isMeasure || this.positions.length < 1) {
this.deactivate();
this.clear()
} else {
this.createEndEntity();
this.lineEntity.polyline = {
positions: this.positions,
width: 2,
material: Cesium.Color.YELLOW,
depthFailMaterial: Cesium.Color.YELLOW
};
this.deactivate();
}
}, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
}
//解除鼠标事件
unRegisterEvents() {
this.handler.removeInputAction(Cesium.ScreenSpaceEventType.RIGHT_CLICK);
this.handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
this.handler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE);
}
/**
* 计算距离
* @param positions 长度大于1的Cartesian3数组
*/
spaceDistance(positions) {
let l = positions.length
let point1cartographic = Cesium.Cartographic.fromCartesian(positions[l-1]);
let point2cartographic = Cesium.Cartographic.fromCartesian(positions[l-2]);
/**根据经纬度计算出距离**/
let geodesic = new Cesium.EllipsoidGeodesic();
geodesic.setEndPoints(point1cartographic, point2cartographic);
this.totalDistance += geodesic.surfaceDistance/1000
return (geodesic.surfaceDistance/1000).toFixed(3);
}
}

@ -0,0 +1,16 @@
<!--
文件描述Cesium地图的图层管理器组件
创建时间2024/5/20 11:25
创建人Zhaipeixiu
-->
<script setup lang="ts">
</script>
<template>
</template>
<style scoped>
</style>

@ -24,6 +24,7 @@ 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 CreatePolyline from '@/utils/map/draw/drawPolyline'
import ProfileAnalysis from "@/components/ProfileAnalysis.vue"; import ProfileAnalysis from "@/components/ProfileAnalysis.vue";
import MeasureDistance from "@/assets/js/cesium-map/measureDistance";
const viewerDivRef = ref<HTMLDivElement>() const viewerDivRef = ref<HTMLDivElement>()
let viewer: Viewer let viewer: Viewer
@ -64,14 +65,16 @@ onMounted(() => {
// window // window
window.viewer = viewer window.viewer = viewer
window.measureViewer = new MeasureDistance(viewer);
// //
const drawPolyline = new CreatePolyline(viewer,false,true,{}) // const drawPolyline = new CreatePolyline(viewer,false,true,{})
linePoints.value = drawPolyline.positions.length // linePoints.value = drawPolyline.positions.length
drawPolyline.start() // drawPolyline.start()
profileChart.value?.openDia() // profileChart.value?.openDia()
profileChart.value?.drawChart([0,1,2,3,4,5,6,7,8,9], //
[-70,800,300,400,23,232,435,243,234,343], // 线
[90,900,900,600,235,262,535,643,734,443]) // profileChart.value?.drawChart_TerrainProfile([0,1,2,3,4,5,6,7,8,9],
// [-70,800,300,400,23,232,435,243,234,343])
}) })

@ -3,14 +3,142 @@
创建时间2024/4/16 10:54 创建时间2024/4/16 10:54
创建人Zhaipeixiu 创建人Zhaipeixiu
--> -->
<script setup lang="ts"> <script setup>
import { CashOutline} from '@vicons/ionicons5'
import { NTooltip, useMessage } from 'naive-ui'
// import {UploadFileInfo} from "naive-ui";
// import {DataSource} from "cesium";
import MeasureDistance from "@/assets/js/cesium-map/measureDistance";
import {ref} from "vue";
const message = useMessage();
let file, measureDis;
let options = [
{
label: 'Drive My Car',
value: 'Drive My Car'
}
];
let layerValue = ref('test');
let MeasureOptions = [
{
label: '距离测量',
key: 'distance'
},
{
label: '面积测量',
key: 'area'
},
{
label: '清除',
key: 'clear'
},
]
//
function handleSelect(key) {
if(key === 'distance') {
measure();
}
else if(key === 'area') {
}else if(key === 'clear') {
measureEnd()
}
}
function handleFile(event) {
file = event.target.files[0]
console.log(file)
let kmlDataPromise = window.Cesium.KmlDataSource.load(file, {
camera: window.viewer.scene.camera,
canvas: window.viewer.scene.canvas,
screenOverlayContainer: window.viewer.container,
clampToGround: true,
});
console.log(kmlDataPromise);
kmlDataPromise.then(function (dataSource) {
// console.log(dataSource);
window.viewer.dataSources.add(dataSource);
window.viewer.flyTo(dataSource);
});
}
function measure(){
measureDis = new MeasureDistance(window.viewer)
measureDis.activate()
}
function measureEnd(){
if(measureDis.vertexEntities.length>0){
measureDis.deactivate()
measureDis.clear()
measureDis.viewer.scene.requestRender()
}else{
message.warning('无可清除元素')
}
}
</script> </script>
<template> <template>
<n-flex id="panel">
<n-popselect v-model:value="layerValue" :options="options" size="medium">
<n-button>
图层管理
</n-button>
</n-popselect>
<n-button>
添加文件
</n-button>
<n-button>
地形分析
</n-button>
<n-button>
编辑工具
</n-button>
<n-dropdown :options="MeasureOptions" @select="handleSelect">
<n-button tertiary circle type="info">
<template #icon>
<n-icon><CashOutline /></n-icon>
</template>
</n-button>
</n-dropdown>
<n-button>
绘制工具
</n-button>
<n-button>
显示/隐藏
</n-button>
</n-flex>
<!--<div id="panel">-->
<!-- -->
<!--&lt;!&ndash; <input type="file" @change="handleFile" >&ndash;&gt;-->
<!-- <n-upload action="" @change="handleFinish" >-->
<!-- <n-button secondary type="info" >上传文件</n-button>-->
<!-- </n-upload>-->
<!-- <n-popover trigger="hover">-->
<!-- <template #trigger>-->
<!-- <n-button class="toolbts" @click="measure" size="small" icon="el-icon-edit-outline"></n-button>-->
<!-- </template>-->
<!-- <span>测距</span>-->
<!-- </n-popover>-->
<!-- <n-popover trigger="hover">-->
<!-- <template #trigger>-->
<!-- <n-button class="toolbts" @click="measureEnd" size="small" icon=el-icon-delete></n-button>-->
<!-- </template>-->
<!-- <span>清除</span>-->
<!-- </n-popover>-->
<!--</div>-->
</template> </template>
<style scoped> <style scoped>
#panel{
position: absolute;
top: 40px;
left: 2px;
width: 50vw;
height: 1rem;
}
</style> </style>

1
src/global.d.ts vendored

@ -17,5 +17,6 @@ declare global {
Cesium: Cesium Cesium: Cesium
CESIUM_BASE_URL: string CESIUM_BASE_URL: string
viewer: Viewer viewer: Viewer
measureViewer: any;
} }
} }

@ -3,8 +3,10 @@ import './style.css'
import App from './App.vue' import App from './App.vue'
import { createPinia } from 'pinia' import { createPinia } from 'pinia'
import 'virtual:svg-icons-register' import 'virtual:svg-icons-register'
import naive from "naive-ui";
const pinia = createPinia() const pinia = createPinia()
const app = createApp(App) const app = createApp(App)
app.use(naive)
app.use(pinia) app.use(pinia)
app.mount('#app') app.mount('#app')

@ -42,6 +42,7 @@ export default class CreatePolyline {
clickedGeometry: Entity | null = null clickedGeometry: Entity | null = null
moveSelectedPoint: PointEntity | null = null moveSelectedPoint: PointEntity | null = null
positions: Cartesian3[] = [] positions: Cartesian3[] = []
pointNum: number = 0
bMove: boolean = false bMove: boolean = false
bMeasure: boolean | undefined = false //是否处于测距模式 bMeasure: boolean | undefined = false //是否处于测距模式
bProfile: boolean | undefined = false //是否处于测距模式 bProfile: boolean | undefined = false //是否处于测距模式
@ -121,6 +122,7 @@ export default class CreatePolyline {
this.altitudeOffset, this.altitudeOffset,
) )
this.polyline.addPoint(cartesian3) this.polyline.addPoint(cartesian3)
this.pointNum += 1
this.trackingLinePositions[0] = cartesian3 this.trackingLinePositions[0] = cartesian3
//垂直辅助线 //垂直辅助线
const n = this.positions.length - 1 const n = this.positions.length - 1

Loading…
Cancel
Save