工具
This commit is contained in:
86
package-lock.json
generated
86
package-lock.json
generated
@ -13,9 +13,11 @@
|
|||||||
"@electron-toolkit/utils": "^4.0.0",
|
"@electron-toolkit/utils": "^4.0.0",
|
||||||
"@ztree/ztree_v3": "^3.5.48",
|
"@ztree/ztree_v3": "^3.5.48",
|
||||||
"axios": "^1.11.0",
|
"axios": "^1.11.0",
|
||||||
|
"clipboard": "^2.0.11",
|
||||||
|
"dayjs": "^1.11.18",
|
||||||
|
"echarts": "^6.0.0",
|
||||||
"electron-updater": "^6.3.9",
|
"electron-updater": "^6.3.9",
|
||||||
"element-plus": "^2.10.4",
|
"element-plus": "^2.10.4",
|
||||||
"js-md5": "^0.8.3",
|
|
||||||
"mitt": "^3.0.1",
|
"mitt": "^3.0.1",
|
||||||
"pinia": "^3.0.3",
|
"pinia": "^3.0.3",
|
||||||
"pinia-plugin-persistedstate": "^4.4.1",
|
"pinia-plugin-persistedstate": "^4.4.1",
|
||||||
@ -30,7 +32,7 @@
|
|||||||
"@electron-toolkit/eslint-config-ts": "^3.0.0",
|
"@electron-toolkit/eslint-config-ts": "^3.0.0",
|
||||||
"@electron-toolkit/tsconfig": "^1.0.1",
|
"@electron-toolkit/tsconfig": "^1.0.1",
|
||||||
"@types/jquery": "^3.5.32",
|
"@types/jquery": "^3.5.32",
|
||||||
"@types/node": "^22.16.5",
|
"@types/node": "^22.18.1",
|
||||||
"@types/plist": "^3.0.5",
|
"@types/plist": "^3.0.5",
|
||||||
"@types/verror": "^1.10.11",
|
"@types/verror": "^1.10.11",
|
||||||
"@types/vue-i18n": "^6.1.3",
|
"@types/vue-i18n": "^6.1.3",
|
||||||
@ -2649,9 +2651,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@types/node": {
|
"node_modules/@types/node": {
|
||||||
"version": "22.16.5",
|
"version": "22.18.1",
|
||||||
"resolved": "https://registry.npmmirror.com/@types/node/-/node-22.16.5.tgz",
|
"resolved": "https://registry.npmmirror.com/@types/node/-/node-22.18.1.tgz",
|
||||||
"integrity": "sha512-bJFoMATwIGaxxx8VJPeM8TonI8t579oRvgAuT8zFugJsJZgzqv0Fu8Mhp68iecjzG7cnN3mO2dJQ5uUM2EFrgQ==",
|
"integrity": "sha512-rzSDyhn4cYznVG+PCzGe1lwuMYJrcBS1fc3JqSa2PvtABwWo+dZ1ij5OVok3tqfpEBCBoaR4d7upFJk73HRJDw==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"undici-types": "~6.21.0"
|
"undici-types": "~6.21.0"
|
||||||
@ -4647,6 +4649,17 @@
|
|||||||
"url": "https://github.com/sponsors/sindresorhus"
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/clipboard": {
|
||||||
|
"version": "2.0.11",
|
||||||
|
"resolved": "https://registry.npmmirror.com/clipboard/-/clipboard-2.0.11.tgz",
|
||||||
|
"integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"good-listener": "^1.2.2",
|
||||||
|
"select": "^1.1.2",
|
||||||
|
"tiny-emitter": "^2.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/cliui": {
|
"node_modules/cliui": {
|
||||||
"version": "8.0.1",
|
"version": "8.0.1",
|
||||||
"resolved": "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz",
|
"resolved": "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz",
|
||||||
@ -5196,9 +5209,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/dayjs": {
|
"node_modules/dayjs": {
|
||||||
"version": "1.11.13",
|
"version": "1.11.18",
|
||||||
"resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz",
|
"resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.18.tgz",
|
||||||
"integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==",
|
"integrity": "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/de-indent": {
|
"node_modules/de-indent": {
|
||||||
@ -5361,6 +5374,12 @@
|
|||||||
"node": ">=0.4.0"
|
"node": ">=0.4.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/delegate": {
|
||||||
|
"version": "3.2.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/delegate/-/delegate-3.2.0.tgz",
|
||||||
|
"integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/delegates": {
|
"node_modules/delegates": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmmirror.com/delegates/-/delegates-1.0.0.tgz",
|
"resolved": "https://registry.npmmirror.com/delegates/-/delegates-1.0.0.tgz",
|
||||||
@ -5610,6 +5629,16 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/echarts": {
|
||||||
|
"version": "6.0.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/echarts/-/echarts-6.0.0.tgz",
|
||||||
|
"integrity": "sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==",
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"dependencies": {
|
||||||
|
"tslib": "2.3.0",
|
||||||
|
"zrender": "6.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/ejs": {
|
"node_modules/ejs": {
|
||||||
"version": "3.1.10",
|
"version": "3.1.10",
|
||||||
"resolved": "https://registry.npmmirror.com/ejs/-/ejs-3.1.10.tgz",
|
"resolved": "https://registry.npmmirror.com/ejs/-/ejs-3.1.10.tgz",
|
||||||
@ -7248,6 +7277,15 @@
|
|||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/good-listener": {
|
||||||
|
"version": "1.2.2",
|
||||||
|
"resolved": "https://registry.npmmirror.com/good-listener/-/good-listener-1.2.2.tgz",
|
||||||
|
"integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"delegate": "^3.1.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/gopd": {
|
"node_modules/gopd": {
|
||||||
"version": "1.2.0",
|
"version": "1.2.0",
|
||||||
"resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz",
|
"resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz",
|
||||||
@ -8453,11 +8491,6 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "BSD-3-Clause"
|
"license": "BSD-3-Clause"
|
||||||
},
|
},
|
||||||
"node_modules/js-md5": {
|
|
||||||
"version": "0.8.3",
|
|
||||||
"resolved": "https://registry.npmmirror.com/js-md5/-/js-md5-0.8.3.tgz",
|
|
||||||
"integrity": "sha512-qR0HB5uP6wCuRMrWPTrkMaev7MJZwJuuw4fnwAzRgP4J4/F8RwtodOKpGp4XpqsLBFzzgqIO42efFAyz2Et6KQ=="
|
|
||||||
},
|
|
||||||
"node_modules/js-tokens": {
|
"node_modules/js-tokens": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz",
|
"resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz",
|
||||||
@ -10986,6 +11019,12 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/select": {
|
||||||
|
"version": "1.1.2",
|
||||||
|
"resolved": "https://registry.npmmirror.com/select/-/select-1.1.2.tgz",
|
||||||
|
"integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/semver": {
|
"node_modules/semver": {
|
||||||
"version": "6.3.1",
|
"version": "6.3.1",
|
||||||
"resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz",
|
"resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz",
|
||||||
@ -12243,6 +12282,12 @@
|
|||||||
"node": ">= 10.0.0"
|
"node": ">= 10.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/tiny-emitter": {
|
||||||
|
"version": "2.1.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
|
||||||
|
"integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/tiny-typed-emitter": {
|
"node_modules/tiny-typed-emitter": {
|
||||||
"version": "2.1.0",
|
"version": "2.1.0",
|
||||||
"resolved": "https://registry.npmmirror.com/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz",
|
"resolved": "https://registry.npmmirror.com/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz",
|
||||||
@ -12461,6 +12506,12 @@
|
|||||||
"typescript": ">=4.8.4"
|
"typescript": ">=4.8.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/tslib": {
|
||||||
|
"version": "2.3.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
|
||||||
|
"integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==",
|
||||||
|
"license": "0BSD"
|
||||||
|
},
|
||||||
"node_modules/type-check": {
|
"node_modules/type-check": {
|
||||||
"version": "0.4.0",
|
"version": "0.4.0",
|
||||||
"resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz",
|
"resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz",
|
||||||
@ -13886,6 +13937,15 @@
|
|||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 10"
|
"node": ">= 10"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"node_modules/zrender": {
|
||||||
|
"version": "6.0.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/zrender/-/zrender-6.0.0.tgz",
|
||||||
|
"integrity": "sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg==",
|
||||||
|
"license": "BSD-3-Clause",
|
||||||
|
"dependencies": {
|
||||||
|
"tslib": "2.3.0"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,8 @@
|
|||||||
"@electron-toolkit/utils": "^4.0.0",
|
"@electron-toolkit/utils": "^4.0.0",
|
||||||
"@ztree/ztree_v3": "^3.5.48",
|
"@ztree/ztree_v3": "^3.5.48",
|
||||||
"axios": "^1.11.0",
|
"axios": "^1.11.0",
|
||||||
|
"clipboard": "^2.0.11",
|
||||||
|
"dayjs": "^1.11.18",
|
||||||
"echarts": "^6.0.0",
|
"echarts": "^6.0.0",
|
||||||
"electron-updater": "^6.3.9",
|
"electron-updater": "^6.3.9",
|
||||||
"element-plus": "^2.10.4",
|
"element-plus": "^2.10.4",
|
||||||
@ -42,7 +44,7 @@
|
|||||||
"@electron-toolkit/eslint-config-ts": "^3.0.0",
|
"@electron-toolkit/eslint-config-ts": "^3.0.0",
|
||||||
"@electron-toolkit/tsconfig": "^1.0.1",
|
"@electron-toolkit/tsconfig": "^1.0.1",
|
||||||
"@types/jquery": "^3.5.32",
|
"@types/jquery": "^3.5.32",
|
||||||
"@types/node": "^22.16.5",
|
"@types/node": "^22.18.1",
|
||||||
"@types/plist": "^3.0.5",
|
"@types/plist": "^3.0.5",
|
||||||
"@types/verror": "^1.10.11",
|
"@types/verror": "^1.10.11",
|
||||||
"@types/vue-i18n": "^6.1.3",
|
"@types/vue-i18n": "^6.1.3",
|
||||||
|
4
src/renderer/src/icons/svg/turn.svg
Normal file
4
src/renderer/src/icons/svg/turn.svg
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="12" height="12" viewBox="0 0 12 12" fill="none">
|
||||||
|
<path d="M3.06995 0.0336822C3.30345 -0.0134909 3.72175 0.0203715 4.04432 0.0203715L8.80938 0.0203715C9.40915 0.0203715 10.1307 -0.0457695 10.6647 0.0603036C11.1902 0.1647 11.5443 0.463472 11.7725 0.858946C12.0226 1.29218 11.9994 1.8259 11.9994 2.52278L11.9994 10.1232C11.9994 11.3662 11.3459 12 10.0774 12L3.41699 12C3.05145 12 2.7978 11.9615 2.78966 11.6805C2.77859 11.2992 3.13767 11.3345 3.59051 11.3345L9.62358 11.3345C9.9666 11.3345 10.3532 11.3732 10.5979 11.3078C10.9435 11.2156 11.2516 10.9028 11.3187 10.5225C11.3785 10.1841 11.3321 9.80816 11.3321 9.41772L11.3321 2.70913C11.3321 2.34708 11.3626 1.95707 11.3321 1.59103C11.2915 1.1051 10.9141 0.772719 10.5312 0.699218C10.2419 0.643685 9.88335 0.685907 9.54349 0.685907L3.55046 0.685907C3.25907 0.685907 2.87412 0.72524 2.803 0.446314C2.74999 0.238375 2.86113 0.0758638 3.06995 0.0336822ZM4.9653 7.34125L2.00215 7.34125C1.65943 7.34125 1.32269 7.37425 1.04113 7.31463C0.477442 7.19527 0.00413877 6.69706 2.77496e-05 6.02349C-0.00437695 5.30309 0.516243 4.73537 1.24135 4.67911C1.82735 4.63364 2.47369 4.67911 3.11 4.67911L4.9653 4.67911C5.01246 4.16292 4.79863 2.94146 5.29899 2.94872C5.53703 2.95217 5.7177 3.11918 5.87293 3.24155C6.7027 3.89572 7.45568 4.47287 8.31552 5.11836C8.57959 5.3166 9.11366 5.62915 9.10303 6.05011C9.09247 6.46816 8.55953 6.78468 8.30218 6.98186C7.46283 7.62495 6.69288 8.19646 5.84623 8.83205C5.69609 8.94478 5.46648 9.11088 5.2456 9.05833C4.76802 8.9447 5.0393 7.88096 4.9653 7.34125Z" fill="#FFFFFF" >
|
||||||
|
</path>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.6 KiB |
138
src/renderer/src/utils/HighDefinitionScreenshot.ts
Normal file
138
src/renderer/src/utils/HighDefinitionScreenshot.ts
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
export function processBase64Images(base64Data1, base64Data2, callback) {
|
||||||
|
if (!base64Data1 || !base64Data2) {
|
||||||
|
alert("请输入两个Base64图像数据");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 创建Image对象并加载第一个Base64图像
|
||||||
|
const img1 = new Image();
|
||||||
|
img1.onload = function () {
|
||||||
|
// 创建Image对象并加载第二个Base64图像
|
||||||
|
const img2 = new Image();
|
||||||
|
img2.onload = function () {
|
||||||
|
// 计算拼接后的Canvas尺寸(这里示例为水平拼接,垂直拼接可调整计算方式)
|
||||||
|
const totalWidth = img1.width + img2.width;
|
||||||
|
const maxHeight = Math.max(img1.height, img2.height);
|
||||||
|
console.log("maxHeight", maxHeight);
|
||||||
|
const resultCanvas = document.createElement("canvas");
|
||||||
|
// 设置结果Canvas的尺寸
|
||||||
|
resultCanvas.width = totalWidth;
|
||||||
|
resultCanvas.height = maxHeight;
|
||||||
|
|
||||||
|
// 获取Canvas绘图上下文
|
||||||
|
const ctx = resultCanvas.getContext("2d");
|
||||||
|
|
||||||
|
// 绘制第一个图像(左上角开始)
|
||||||
|
ctx.drawImage(img1, 0, 0);
|
||||||
|
|
||||||
|
// 绘制第二个图像(第一个图像右侧)
|
||||||
|
ctx.drawImage(img2, img1.width, 0);
|
||||||
|
|
||||||
|
// 获取拼接后的Base64结果(默认为PNG格式,可指定其他格式如JPEG)
|
||||||
|
const resultBase64Data = resultCanvas.toDataURL("image/png");
|
||||||
|
callback(resultBase64Data);
|
||||||
|
console.log("图像拼接完成,Base64结果已生成");
|
||||||
|
};
|
||||||
|
img2.src = base64Data1;
|
||||||
|
};
|
||||||
|
img1.src = base64Data2;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 拼接两个Base64图像并返回新的Base64
|
||||||
|
* @param {string} base641 第一个Base64图像数据
|
||||||
|
* @param {number} width1 第一个图像要截取的宽度
|
||||||
|
* @param {string} base642 第二个Base64图像数据
|
||||||
|
* @param {number} width2 第二个图像要截取的宽度
|
||||||
|
* @param {string} [format='image/png'] 输出图像格式
|
||||||
|
* @param {number} [quality=1.0] 输出图像质量(0-1),仅对支持的格式有效
|
||||||
|
* @returns {Promise<string>} 拼接后的Base64图像数据
|
||||||
|
*/
|
||||||
|
export function combineBase64Images(
|
||||||
|
base641,
|
||||||
|
width1,
|
||||||
|
base642,
|
||||||
|
width2,
|
||||||
|
format = "image/png",
|
||||||
|
quality = 1.0
|
||||||
|
) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
// 创建canvas元素
|
||||||
|
const canvas = document.createElement("canvas");
|
||||||
|
const ctx = canvas.getContext("2d");
|
||||||
|
|
||||||
|
// 设置canvas宽度和高度
|
||||||
|
canvas.width = width1 + width2;
|
||||||
|
canvas.height = 0; // 高度将在图像加载后确定
|
||||||
|
|
||||||
|
// 创建图像对象
|
||||||
|
const img1 = new Image();
|
||||||
|
const img2 = new Image();
|
||||||
|
|
||||||
|
// 错误处理
|
||||||
|
function handleError(error) {
|
||||||
|
reject(new Error(`图像处理错误: ${error.message}`));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 监听两个图像都加载完成
|
||||||
|
let loadedCount = 0;
|
||||||
|
function checkAllLoaded() {
|
||||||
|
loadedCount++;
|
||||||
|
if (loadedCount === 2) {
|
||||||
|
drawAndResolve();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 图像1加载事件
|
||||||
|
img1.onload = function () {
|
||||||
|
checkAllLoaded();
|
||||||
|
};
|
||||||
|
|
||||||
|
// 图像2加载事件
|
||||||
|
img2.onload = function () {
|
||||||
|
checkAllLoaded();
|
||||||
|
};
|
||||||
|
|
||||||
|
// 图像加载错误事件
|
||||||
|
img1.onerror = img2.onerror = handleError;
|
||||||
|
|
||||||
|
// 加载图像
|
||||||
|
img1.src = base641;
|
||||||
|
img2.src = base642;
|
||||||
|
|
||||||
|
// 绘制图像并解析为Base64
|
||||||
|
function drawAndResolve() {
|
||||||
|
try {
|
||||||
|
// 确定canvas高度为两个图像高度的最大值
|
||||||
|
const height1 = img1.height;
|
||||||
|
const height2 = img2.height;
|
||||||
|
canvas.height = Math.max(height1, height2);
|
||||||
|
|
||||||
|
// 清除画布
|
||||||
|
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
||||||
|
|
||||||
|
// 绘制第一个图像的左侧部分 (从左往右截取width1)
|
||||||
|
ctx.drawImage(img1, 0, 0, width1, height1, 0, 0, width1, canvas.height);
|
||||||
|
|
||||||
|
// 绘制第二个图像的右侧部分 (从右往左截取width2)
|
||||||
|
// 计算在原图上的截取起点 (从右侧开始)
|
||||||
|
const sourceX = img2.width - width2;
|
||||||
|
ctx.drawImage(
|
||||||
|
img2,
|
||||||
|
sourceX,
|
||||||
|
0,
|
||||||
|
width2,
|
||||||
|
height2,
|
||||||
|
width1,
|
||||||
|
0,
|
||||||
|
width2,
|
||||||
|
canvas.height
|
||||||
|
);
|
||||||
|
|
||||||
|
// 将canvas内容转换为Base64
|
||||||
|
const resultBase64 = canvas.toDataURL(format, quality);
|
||||||
|
resolve(resultBase64);
|
||||||
|
} catch (error) {
|
||||||
|
handleError(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
@ -1,3 +1,4 @@
|
|||||||
|
const { ipcRenderer } = require('electron')
|
||||||
export const $changeComponentShow = (selector: any, state: any, styleStr: any = false) => {
|
export const $changeComponentShow = (selector: any, state: any, styleStr: any = false) => {
|
||||||
$(selector).css({ visibility: state ? 'visible' : 'hidden' })
|
$(selector).css({ visibility: state ? 'visible' : 'hidden' })
|
||||||
if (styleStr) {
|
if (styleStr) {
|
||||||
@ -17,3 +18,13 @@ export const $changeComponentPop = (selector: any, state: any, styleStr: any = f
|
|||||||
if (str[0] === 'z-index') $(selector).css({ zIndex: str[1] })
|
if (str[0] === 'z-index') $(selector).css({ zIndex: str[1] })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const $sendElectronChanel = (chanel: any, arg: any = null) => {
|
||||||
|
console.log('发送给electron', chanel, arg);
|
||||||
|
ipcRenderer.send(chanel, arg);
|
||||||
|
};
|
||||||
|
export const $recvElectronChanel = (chanel: any, cb: any) => {
|
||||||
|
console.log('接收来自electron', chanel);
|
||||||
|
ipcRenderer.once(chanel, cb);
|
||||||
|
};
|
||||||
|
|
||||||
|
@ -128,28 +128,28 @@ const menuList: any = ref([
|
|||||||
// fun: this.showSecondMenu,
|
// fun: this.showSecondMenu,
|
||||||
key: 'tool',
|
key: 'tool',
|
||||||
children: [
|
children: [
|
||||||
// 'routePlan',
|
'routePlan',
|
||||||
// 'clearRoute',
|
'clearRoute',
|
||||||
// 'graffiti',
|
'graffiti',
|
||||||
// // stopGraffiti: "结束涂鸦",
|
// stopGraffiti: "结束涂鸦",
|
||||||
// 'clearGraffiti',
|
'clearGraffiti',
|
||||||
// 'path',
|
'path',
|
||||||
// 'coorLocation',
|
'coorLocation',
|
||||||
// 'mouseLocation',
|
'mouseLocation',
|
||||||
// 'annotationAggregation',
|
'annotationAggregation',
|
||||||
// 'annotation',
|
'annotation',
|
||||||
// 'screenShot',
|
'screenShot',
|
||||||
// 'highQuality',
|
'highQuality',
|
||||||
// 'videoRecord',
|
'videoRecord',
|
||||||
// 'pressModel',
|
'pressModel',
|
||||||
// 'terrainDig',
|
'terrainDig',
|
||||||
// 'tilesetClipping',
|
'tilesetClipping',
|
||||||
// 'clearTilesetClipping',
|
'clearTilesetClipping',
|
||||||
// 'projConvert',
|
'projConvert',
|
||||||
// 'projectionConvert',
|
'projectionConvert',
|
||||||
// 'gdbImport',
|
'gdbImport',
|
||||||
// 'circleStatistics',
|
'circleStatistics',
|
||||||
// 'polygonStatistics'
|
'polygonStatistics'
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -22,6 +22,11 @@ import { ref, reactive, getCurrentInstance } from 'vue'
|
|||||||
import { useTreeNode } from '../tree/hooks/treeNode'
|
import { useTreeNode } from '../tree/hooks/treeNode'
|
||||||
import { TreeApi } from '@/api/tree'
|
import { TreeApi } from '@/api/tree'
|
||||||
import { renderMethods } from '../tree/hooks/renderTreeNode'
|
import { renderMethods } from '../tree/hooks/renderTreeNode'
|
||||||
|
import { processBase64Images, combineBase64Images } from '@/utils/HighDefinitionScreenshot'
|
||||||
|
import { $sendElectronChanel, $recvElectronChanel } from '@/utils/communication'
|
||||||
|
import { ElMessage } from 'element-plus'
|
||||||
|
import dayjs from 'dayjs'
|
||||||
|
import fs from 'fs'
|
||||||
const { proxy } = getCurrentInstance()
|
const { proxy } = getCurrentInstance()
|
||||||
const { t } = useI18n()
|
const { t } = useI18n()
|
||||||
const { findParentId, findTreeIndex, cusAddNodes } = useTreeNode()
|
const { findParentId, findTreeIndex, cusAddNodes } = useTreeNode()
|
||||||
@ -43,7 +48,7 @@ eventBus.on('graffitiObj', (data) => {
|
|||||||
})
|
})
|
||||||
const methodMap = {
|
const methodMap = {
|
||||||
// 轨迹运动
|
// 轨迹运动
|
||||||
trajectoryMotion: ()=>{
|
trajectoryMotion: () => {
|
||||||
// let draw = new YJ.Draw.DrawPolyline(window.earth)
|
// let draw = new YJ.Draw.DrawPolyline(window.earth)
|
||||||
// draw.start((err, positions) => {
|
// draw.start((err, positions) => {
|
||||||
// if (positions.length > 1) {}
|
// if (positions.length > 1) {}
|
||||||
@ -83,7 +88,7 @@ const methodMap = {
|
|||||||
// console.log('addOtherSource', res)
|
// console.log('addOtherSource', res)
|
||||||
// 上树
|
// 上树
|
||||||
cusAddNodes(window.treeObj, params.parentId, [params])
|
cusAddNodes(window.treeObj, params.parentId, [params])
|
||||||
eventBus.emit("openDialog", 'wallStereoscopic');
|
eventBus.emit('openDialog', 'wallStereoscopic')
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
@ -223,14 +228,70 @@ const methodMap = {
|
|||||||
//卷帘对比
|
//卷帘对比
|
||||||
annotation() {
|
annotation() {
|
||||||
clickChange.annotation = !clickChange.annotation
|
clickChange.annotation = !clickChange.annotation
|
||||||
// if (clickChange.annotation) {
|
if (clickChange.annotation) {
|
||||||
// YJ.Global.splitScreen.on(window.earth)
|
YJ.Global.splitScreen.on(window.earth)
|
||||||
// } else {
|
} else {
|
||||||
// YJ.Global.splitScreen.off()
|
YJ.Global.splitScreen.off()
|
||||||
// }
|
}
|
||||||
},
|
},
|
||||||
//屏幕截图
|
//屏幕截图
|
||||||
screenShot() {},
|
async screenShot() {
|
||||||
|
function downloadScreen(res) {
|
||||||
|
let base64 = res.replace(/^data:image\/\w+;base64,/, '')
|
||||||
|
console.log('base64', base64)
|
||||||
|
let dataBuffer = new Buffer(base64, 'base64')
|
||||||
|
$sendElectronChanel('saveFile', {
|
||||||
|
title: '保存图片',
|
||||||
|
filename: dayjs().format('YYYYMMDDHHmmss') + '截图',
|
||||||
|
filters: [{ name: '保存图片', extensions: ['jpg'] }]
|
||||||
|
})
|
||||||
|
$recvElectronChanel('selectedFileItem', (e, path) => {
|
||||||
|
console.log('path', fs.writeFile)
|
||||||
|
fs.writeFile(path, dataBuffer, (res) => {
|
||||||
|
console.log(res)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if (window.splitScreen || window.multiViewportMode) {
|
||||||
|
let res = ''
|
||||||
|
let res2 = ''
|
||||||
|
let sdk
|
||||||
|
if (window.splitScreen) {
|
||||||
|
sdk = YJ.Global.splitScreen.getSdk()
|
||||||
|
} else {
|
||||||
|
sdk = YJ.Global.multiViewportMode.getSdk()
|
||||||
|
}
|
||||||
|
await new YJ.Global.ScreenShot(sdk.sdkD, (data) => {
|
||||||
|
res = data
|
||||||
|
})
|
||||||
|
await new YJ.Global.ScreenShot(sdk.sdkP, (data) => {
|
||||||
|
res2 = data
|
||||||
|
})
|
||||||
|
if (window.multiViewportMode) {
|
||||||
|
processBase64Images(res, res2, (mergedBase64) => {
|
||||||
|
downloadScreen(mergedBase64)
|
||||||
|
// window.multiViewportMode = false;
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
let doms = document.querySelectorAll('.cesium-widget')
|
||||||
|
let leftWidth = doms[0].offsetWidth
|
||||||
|
let rightWidth = doms[1].offsetWidth
|
||||||
|
combineBase64Images(res2, leftWidth, res, rightWidth)
|
||||||
|
.then((result) => {
|
||||||
|
downloadScreen(result)
|
||||||
|
// window.splitScreen = false;
|
||||||
|
})
|
||||||
|
.catch((err) => console.error('拼接失败:', err))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
let res = ''
|
||||||
|
await new YJ.Global.ScreenShot(window.earth, (data) => {
|
||||||
|
res = data
|
||||||
|
})
|
||||||
|
downloadScreen(res)
|
||||||
|
}
|
||||||
|
},
|
||||||
//高清出图
|
//高清出图
|
||||||
highQuality() {
|
highQuality() {
|
||||||
// eventBus.emit('screenShotDialog')
|
// eventBus.emit('screenShotDialog')
|
||||||
@ -239,27 +300,130 @@ const methodMap = {
|
|||||||
//视频录制
|
//视频录制
|
||||||
videoRecord() {
|
videoRecord() {
|
||||||
clickChange.videoRecord = !clickChange.videoRecord
|
clickChange.videoRecord = !clickChange.videoRecord
|
||||||
|
|
||||||
|
let time = 3
|
||||||
|
this.$changeComponentShow('#secondMenu', false)
|
||||||
|
// const onKeyDown = (e) => {
|
||||||
|
|
||||||
|
// if (e.keyCode === 27) {
|
||||||
|
// item.status = !item.status;
|
||||||
|
// $sendElectronChanel("endRecoder");
|
||||||
|
// document.removeEventListener("keydown", onKeyDown);
|
||||||
|
// }
|
||||||
|
// };
|
||||||
|
if (clickChange.videoRecord) {
|
||||||
|
// document.addEventListener("keydown", onKeyDown);
|
||||||
|
let loading = $root_home.openLoading(time, {
|
||||||
|
background: 'rgba(0,0,0,0)',
|
||||||
|
fullscreen: false,
|
||||||
|
customClass: 'timer'
|
||||||
|
})
|
||||||
|
let timer = ''
|
||||||
|
const p = document.createElement('p')
|
||||||
|
p.style.color = '#fff'
|
||||||
|
p.innerHTML = '再次点击录制结束'
|
||||||
|
document.getElementsByClassName('el-loading-spinner')[0].appendChild(p)
|
||||||
|
let func = () => {
|
||||||
|
loading.setText(time--)
|
||||||
|
if (time == -1) {
|
||||||
|
clearInterval(timer)
|
||||||
|
loading.close()
|
||||||
|
console.log('开始了')
|
||||||
|
p.remove()
|
||||||
|
$sendElectronChanel('startRecoder')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func()
|
||||||
|
timer = setInterval(func, 1000)
|
||||||
|
} else {
|
||||||
|
$sendElectronChanel('endRecoder')
|
||||||
|
// document.removeEventListener("keydown", onKeyDown);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
//压模
|
//压模
|
||||||
pressModel() {},
|
pressModel() {},
|
||||||
//地形开挖
|
//地形开挖
|
||||||
terrainDig() {
|
terrainDig() {
|
||||||
|
// if (window.checkAuthIsValid) {
|
||||||
|
// new YJ.Analysis.TerrainExcavation(window.Earth1);
|
||||||
eventBus.emit('terrainExcavationDialog')
|
eventBus.emit('terrainExcavationDialog')
|
||||||
|
// } else {
|
||||||
|
// this.$message({
|
||||||
|
// message: '您没有该功能的权限',
|
||||||
|
// type: 'warning'
|
||||||
|
// })
|
||||||
|
// }
|
||||||
},
|
},
|
||||||
//剖切
|
//剖切
|
||||||
tilesetClipping() {},
|
tilesetClipping() {
|
||||||
|
// if (window.checkAuthIsValid) {
|
||||||
|
let selectedNode = window.treeObj.getSelectedNodes()
|
||||||
|
if (selectedNode.length < 1) {
|
||||||
|
ElMessage({
|
||||||
|
message: '请在图层指挥舱选中对应模型进行操作',
|
||||||
|
type: 'warning'
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (!(selectedNode[0].sourceType === 'tileset' || selectedNode[0].sourceType === 'bim')) {
|
||||||
|
ElMessage({
|
||||||
|
message: '选中的节点不能进行剖切',
|
||||||
|
type: 'warning'
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
let tileset = window.earth.entityMap.get(selectedNode[0].id)
|
||||||
|
let draw = new YJ.Draw.DrawPolygon(window.earth)
|
||||||
|
draw.start((err, pos) => {
|
||||||
|
let section = new YJ.Analysis.Section(window.earth, tileset.entity, {
|
||||||
|
positions: pos
|
||||||
|
})
|
||||||
|
// _entityMap.set(selectedNode.source_id + 'pouqie', section)
|
||||||
|
})
|
||||||
|
// } else {
|
||||||
|
// this.$message({
|
||||||
|
// message: '您没有该功能的权限',
|
||||||
|
// type: 'warning'
|
||||||
|
// })
|
||||||
|
// }
|
||||||
|
},
|
||||||
//删除剖切
|
//删除剖切
|
||||||
clearTilesetClipping() {},
|
clearTilesetClipping() {
|
||||||
|
YJ.Analysis.ClearSection()
|
||||||
|
},
|
||||||
//度分秒
|
//度分秒
|
||||||
projConvert() {},
|
projConvert() {
|
||||||
|
eventBus.emit('projConvertDialog')
|
||||||
|
},
|
||||||
//投影转换
|
//投影转换
|
||||||
projectionConvert() {},
|
projectionConvert() {
|
||||||
|
eventBus.emit('ProjectionConvertDialog')
|
||||||
|
},
|
||||||
//GDB导入
|
//GDB导入
|
||||||
gdbImport() {},
|
gdbImport() {},
|
||||||
//圆形统计
|
//圆形统计
|
||||||
circleStatistics() {},
|
circleStatistics() {
|
||||||
|
// if (window.checkAuthIsValid) {
|
||||||
|
eventBus.emit('goodsSearchCircleDialog')
|
||||||
|
// } else {
|
||||||
|
// this.$message({
|
||||||
|
// message: '您没有该功能的权限',
|
||||||
|
// type: 'warning'
|
||||||
|
// })
|
||||||
|
// }
|
||||||
|
},
|
||||||
//多边形统计
|
//多边形统计
|
||||||
polygonStatistics() {}
|
polygonStatistics() {
|
||||||
|
// if (window.checkAuthIsValid) {
|
||||||
|
eventBus.emit('goodsSearchPolgonDialog')
|
||||||
|
|
||||||
|
// } else {
|
||||||
|
// this.$message({
|
||||||
|
// message: "您没有该功能的权限",
|
||||||
|
// type: "warning",
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleClick = (value = 'projectionDistanceMeasure') => {
|
const handleClick = (value = 'projectionDistanceMeasure') => {
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
<div class="row" style="align-items: flex-start">
|
<div class="row" style="align-items: flex-start">
|
||||||
<div class="col" style="flex: 0 0 120px">
|
<div class="col" style="flex: 0 0 120px">
|
||||||
<span class="label">等高线</span>
|
<span class="label">等高线</span>
|
||||||
<input class="btn-switch show" type="checkbox" />
|
<input class="btn-switch show" type="checkbox" v-model="show" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -145,6 +145,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<template #footer>
|
<template #footer>
|
||||||
|
<button @click="sure">确定</button>
|
||||||
<button @click="close">取消</button>
|
<button @click="close">取消</button>
|
||||||
</template>
|
</template>
|
||||||
</Dialog>
|
</Dialog>
|
||||||
@ -158,16 +159,24 @@ import Dialog from '@/components/dialog/baseDialog.vue'
|
|||||||
const baseDialog: any = ref(null)
|
const baseDialog: any = ref(null)
|
||||||
const eventBus: any = inject('bus')
|
const eventBus: any = inject('bus')
|
||||||
|
|
||||||
|
var show: any = ref(true)
|
||||||
eventBus.on('contourDialog', () => {
|
eventBus.on('contourDialog', () => {
|
||||||
baseDialog.value?.open()
|
baseDialog.value?.open()
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
YJ.Global.Contour(window.earth)
|
YJ.Global.Contour(window.earth)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
const closeCallBack = (e) => {}
|
const closeCallBack = (e) => {
|
||||||
|
YJ.Global.ContourReset()
|
||||||
|
show.value = true
|
||||||
|
}
|
||||||
const close = (e) => {
|
const close = (e) => {
|
||||||
baseDialog.value?.close()
|
baseDialog.value?.close()
|
||||||
}
|
}
|
||||||
|
const sure = (e) => {
|
||||||
|
YJ.Global.ContourStartDraw(window.earth, show.value)
|
||||||
|
baseDialog.value?.close()
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss"></style>
|
<style scoped lang="scss"></style>
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
title="坐标定位"
|
title="坐标定位"
|
||||||
left="180px"
|
left="180px"
|
||||||
top="100px"
|
top="100px"
|
||||||
|
width="418px"
|
||||||
:closeCallback="closeCallBack"
|
:closeCallback="closeCallBack"
|
||||||
>
|
>
|
||||||
<template #content>
|
<template #content>
|
||||||
|
@ -0,0 +1,340 @@
|
|||||||
|
<template>
|
||||||
|
<Dialog
|
||||||
|
v-if="show"
|
||||||
|
ref="baseDialog"
|
||||||
|
title="物质统计"
|
||||||
|
left="180px"
|
||||||
|
top="100px"
|
||||||
|
:closeCallback="closeCallBack"
|
||||||
|
>
|
||||||
|
<template #content>
|
||||||
|
<div id="goodSearchEchart" style="width: 100%; height: 100%"></div>
|
||||||
|
</template>
|
||||||
|
<template #footer>
|
||||||
|
<button>绘制</button>
|
||||||
|
</template>
|
||||||
|
</Dialog>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { ref, reactive } from 'vue'
|
||||||
|
import { inject } from 'vue'
|
||||||
|
import { nextTick } from 'vue'
|
||||||
|
import { ElMessage } from 'element-plus'
|
||||||
|
import Dialog from '@/components/dialog/baseDialog.vue'
|
||||||
|
|
||||||
|
const baseDialog: any = ref(null)
|
||||||
|
const eventBus: any = inject('bus')
|
||||||
|
const shpTotalDict: any = reactive({
|
||||||
|
shlwz_jzzp: '救灾帐篷',
|
||||||
|
mb: '棉被',
|
||||||
|
mymdy: '棉衣、棉大衣',
|
||||||
|
mjb: '毛巾被',
|
||||||
|
mt: '毛毯',
|
||||||
|
dgnsd: '睡袋',
|
||||||
|
zdc: '折叠床',
|
||||||
|
jycs: '简易厕所',
|
||||||
|
xpct: '橡皮船(艇)',
|
||||||
|
cfz: '冲锋舟',
|
||||||
|
jsc: '救生船',
|
||||||
|
jsy: '救生衣',
|
||||||
|
jsq: '救生圈',
|
||||||
|
bzd: '编织袋',
|
||||||
|
md: '麻袋',
|
||||||
|
csb: '抽水泵',
|
||||||
|
fdj: '发电机',
|
||||||
|
yjd: '应急灯',
|
||||||
|
jzzp: '救灾帐篷',
|
||||||
|
jzyb: '救灾衣被',
|
||||||
|
jygj: '救援工具'
|
||||||
|
})
|
||||||
|
|
||||||
|
var draw: any = reactive([])
|
||||||
|
|
||||||
|
var show: any = ref(false)
|
||||||
|
eventBus.on('goodsSearchCircleDialog', () => {
|
||||||
|
console.log('kkkkkk')
|
||||||
|
// baseDialog.value?.open()
|
||||||
|
draw = new YJ.Draw.DrawCircle(window.earth)
|
||||||
|
draw.start((err, positions) => {
|
||||||
|
console.log('err, positions', err, positions)
|
||||||
|
if (!err && positions.center.lng) {
|
||||||
|
show.value = true
|
||||||
|
let nodes = booleanOverlaps(positions)
|
||||||
|
console.log('goodsSearchCircle', nodes)
|
||||||
|
renderCanvas(nodes)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
function booleanOverlaps(positions1, flag = 'circle') {
|
||||||
|
let cross = undefined
|
||||||
|
function set3Array(positions) {
|
||||||
|
let arr = []
|
||||||
|
positions.forEach((item) => {
|
||||||
|
arr.push([item.lng, item.lat])
|
||||||
|
})
|
||||||
|
arr.push(arr[0])
|
||||||
|
return arr
|
||||||
|
}
|
||||||
|
|
||||||
|
let getNode = (types) => {
|
||||||
|
let treeObj = window.treeObj
|
||||||
|
let res = []
|
||||||
|
types.forEach((type) => {
|
||||||
|
let nodes = treeObj.getNodesByParam('sourceType', type, null)
|
||||||
|
// console.log("nodes",nodes)
|
||||||
|
res = res.concat(nodes)
|
||||||
|
})
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
//绘制的区域
|
||||||
|
// console.log("[set3Array(positions1)]", [set3Array(positions1)])
|
||||||
|
// 获取物资处(特定的标注类型)
|
||||||
|
let allNodes = getNode(['point', 'vr', 'picture', 'Feature'])
|
||||||
|
console.log('allNodes', allNodes)
|
||||||
|
let itemInArea = [] //区域内的类型符合的标注
|
||||||
|
|
||||||
|
for (let i = 0; i < allNodes.length; i++) {
|
||||||
|
let item = allNodes[i]
|
||||||
|
let getAllItemInArea = (lng, lat) => {
|
||||||
|
if (flag == 'circle') {
|
||||||
|
let { center, radius } = positions1
|
||||||
|
let distance = new YJ.Tools().randomString(center, { lng, lat })
|
||||||
|
distance < radius && itemInArea.push(item)
|
||||||
|
} else {
|
||||||
|
let polygon1 = turf.polygon([set3Array(positions1)])
|
||||||
|
let pt = turf.point([lng, lat])
|
||||||
|
turf.booleanPointInPolygon(pt, polygon1) && itemInArea.push(item)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(item, item.sourceType, 'ooooo')
|
||||||
|
switch (item.sourceType) {
|
||||||
|
case 'point':
|
||||||
|
case 'vr':
|
||||||
|
case 'picture':
|
||||||
|
let params = JSON.parse(item.params)
|
||||||
|
console.log('params', params)
|
||||||
|
let lng = params.position.lng
|
||||||
|
let lat = params.position.lat
|
||||||
|
getAllItemInArea(lng, lat)
|
||||||
|
break
|
||||||
|
case 'Feature':
|
||||||
|
if (item.detail.geometry.type == 'Point') {
|
||||||
|
lng = item.detail.geometry.coordinates[0]
|
||||||
|
lat = item.detail.geometry.coordinates[1]
|
||||||
|
getAllItemInArea(lng, lat)
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return itemInArea
|
||||||
|
}
|
||||||
|
function renderCanvas(nodes) {
|
||||||
|
console.log('nodes', nodes)
|
||||||
|
|
||||||
|
let x: any = []
|
||||||
|
let y: any = []
|
||||||
|
nodes.forEach((item) => {
|
||||||
|
// shp物资统计
|
||||||
|
if (item.sourceType == 'Feature') {
|
||||||
|
let obj = JSON.parse(JSON.stringify(item.detail.properties))
|
||||||
|
for (const key in obj) {
|
||||||
|
let name = key
|
||||||
|
if (shpTotalDict[key]) {
|
||||||
|
name = shpTotalDict[key]
|
||||||
|
// 把相同名称的物资数量相加,名称相同时,累加数据
|
||||||
|
let index = x.findIndex((item) => item === name)
|
||||||
|
if (index !== -1) {
|
||||||
|
y[index] = y[index] + Number(obj[key])
|
||||||
|
} else {
|
||||||
|
x.push(name)
|
||||||
|
y.push(Number(obj[key]))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let params = JSON.parse(item.params)
|
||||||
|
if (params.attribute && params.attribute.goods) {
|
||||||
|
let goods = params.attribute.goods.content
|
||||||
|
console.log('goods', goods)
|
||||||
|
if (goods.length) {
|
||||||
|
// $root_home_index.goodSearchDialog = false;
|
||||||
|
goods.forEach((good) => {
|
||||||
|
// 把相同名称的物资数量相加,名称相同时,累加数据
|
||||||
|
let index = x.findIndex((item) => item === good.name)
|
||||||
|
if (index !== -1) {
|
||||||
|
y[index] = y[index] + Number(good.cnt)
|
||||||
|
} else {
|
||||||
|
x.push(good.name)
|
||||||
|
y.push(Number(good.cnt))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
console.log('x,y')
|
||||||
|
console.log(x)
|
||||||
|
console.log(y)
|
||||||
|
let notZeroX = []
|
||||||
|
let notZeroY = []
|
||||||
|
for (let i = 0; i < y.length; i++) {
|
||||||
|
if (y[i] != 0) {
|
||||||
|
notZeroX.push(x[i])
|
||||||
|
notZeroY.push(y[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(notZeroX)
|
||||||
|
console.log(notZeroY)
|
||||||
|
x = notZeroX
|
||||||
|
y = notZeroY
|
||||||
|
if (!x.length) show.value = false
|
||||||
|
if (show.value) {
|
||||||
|
nextTick(() => {
|
||||||
|
let option = {
|
||||||
|
grid: {
|
||||||
|
top: '20%',
|
||||||
|
left: '5%',
|
||||||
|
right: '5%',
|
||||||
|
bottom: '8%',
|
||||||
|
containLabel: true
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'axis',
|
||||||
|
axisPointer: {
|
||||||
|
type: 'shadow',
|
||||||
|
label: {
|
||||||
|
show: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
formatter(params) {
|
||||||
|
var data = ''
|
||||||
|
for (var i = 0; i < params.length; i++) {
|
||||||
|
if (params[i].seriesName == '随访率') {
|
||||||
|
data += params[i].seriesName + ': ' + params[i].value + '%'
|
||||||
|
} else {
|
||||||
|
data += params[i].seriesName + ': ' + params[i].value + '<br/>'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
data: ['总量'],
|
||||||
|
top: '5%',
|
||||||
|
left: '5%',
|
||||||
|
right: '5%',
|
||||||
|
bottom: '5%',
|
||||||
|
textStyle: {
|
||||||
|
color: '#fff'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
xAxis: {
|
||||||
|
// type: "category",
|
||||||
|
axisLine: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
axisTick: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
axisLabel: {
|
||||||
|
show: true,
|
||||||
|
width: 40, //将内容的宽度固定
|
||||||
|
overflow: 'truncate', //超出的部分截断
|
||||||
|
truncate: '...', //截断的部分用...代替
|
||||||
|
rotate: 30,
|
||||||
|
interval: 0,
|
||||||
|
textStyle: {
|
||||||
|
color: '#fff' //X轴文字颜色
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
yAxis: [
|
||||||
|
{
|
||||||
|
type: 'value',
|
||||||
|
name: '(数量)',
|
||||||
|
nameTextStyle: {
|
||||||
|
color: '#fff'
|
||||||
|
},
|
||||||
|
splitLine: {
|
||||||
|
show: true,
|
||||||
|
lineStyle: {
|
||||||
|
color: '#eeeeee'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
axisTick: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
axisLine: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
axisLabel: {
|
||||||
|
show: true,
|
||||||
|
textStyle: {
|
||||||
|
color: '#fff'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'value',
|
||||||
|
gridIndex: 0,
|
||||||
|
min: 50,
|
||||||
|
max: 100,
|
||||||
|
splitNumber: 8,
|
||||||
|
splitLine: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
axisLine: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
axisTick: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
axisLabel: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
splitArea: {
|
||||||
|
show: false,
|
||||||
|
areaStyle: {
|
||||||
|
color: ['rgba(250,250,250,0.0)', 'rgba(250,250,250,0.05)']
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: '数量',
|
||||||
|
type: 'bar',
|
||||||
|
label: {
|
||||||
|
show: true,
|
||||||
|
position: 'top'
|
||||||
|
},
|
||||||
|
barWidth: 15,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
color: '#fdcb6c'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
var dom = document.getElementById('goodSearchEchart')
|
||||||
|
var myChart = (window as any).echarts.init(dom)
|
||||||
|
option.xAxis.data = x
|
||||||
|
option.series[0].data = y
|
||||||
|
myChart.setOption(option)
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
ElMessage({
|
||||||
|
message: '该区域没有物资',
|
||||||
|
type: 'warning'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const closeCallBack = (e) => {}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss"></style>
|
@ -0,0 +1,328 @@
|
|||||||
|
<template>
|
||||||
|
<Dialog
|
||||||
|
v-if="show"
|
||||||
|
ref="baseDialog"
|
||||||
|
title="物质统计"
|
||||||
|
left="180px"
|
||||||
|
top="100px"
|
||||||
|
:closeCallback="closeCallBack"
|
||||||
|
>
|
||||||
|
<template #content>
|
||||||
|
<div id="goodSearchEchart2" style="width: 100%; height: 100%"></div>
|
||||||
|
</template>
|
||||||
|
<template #footer>
|
||||||
|
<button>绘制</button>
|
||||||
|
</template>
|
||||||
|
</Dialog>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { ref, reactive } from 'vue'
|
||||||
|
import { inject } from 'vue'
|
||||||
|
import { nextTick } from 'vue'
|
||||||
|
import { ElMessage } from 'element-plus'
|
||||||
|
import Dialog from '@/components/dialog/baseDialog.vue'
|
||||||
|
|
||||||
|
const baseDialog: any = ref(null)
|
||||||
|
const eventBus: any = inject('bus')
|
||||||
|
const shpTotalDict: any = reactive({
|
||||||
|
shlwz_jzzp: '救灾帐篷',
|
||||||
|
mb: '棉被',
|
||||||
|
mymdy: '棉衣、棉大衣',
|
||||||
|
mjb: '毛巾被',
|
||||||
|
mt: '毛毯',
|
||||||
|
dgnsd: '睡袋',
|
||||||
|
zdc: '折叠床',
|
||||||
|
jycs: '简易厕所',
|
||||||
|
xpct: '橡皮船(艇)',
|
||||||
|
cfz: '冲锋舟',
|
||||||
|
jsc: '救生船',
|
||||||
|
jsy: '救生衣',
|
||||||
|
jsq: '救生圈',
|
||||||
|
bzd: '编织袋',
|
||||||
|
md: '麻袋',
|
||||||
|
csb: '抽水泵',
|
||||||
|
fdj: '发电机',
|
||||||
|
yjd: '应急灯',
|
||||||
|
jzzp: '救灾帐篷',
|
||||||
|
jzyb: '救灾衣被',
|
||||||
|
jygj: '救援工具'
|
||||||
|
})
|
||||||
|
|
||||||
|
var draw: any = reactive([])
|
||||||
|
|
||||||
|
var show: any = ref(false)
|
||||||
|
eventBus.on('goodsSearchPolgonDialog', () => {
|
||||||
|
draw = new YJ.Draw.DrawPolygon(window.earth)
|
||||||
|
draw.start((err, params) => {
|
||||||
|
if (!err && params.length > 2) {
|
||||||
|
show.value = true
|
||||||
|
let nodes = booleanOverlaps(params, 'polygon')
|
||||||
|
renderCanvas(nodes)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
function booleanOverlaps(positions1, flag = 'circle') {
|
||||||
|
let cross = undefined
|
||||||
|
function set3Array(positions) {
|
||||||
|
let arr = []
|
||||||
|
positions.forEach((item) => {
|
||||||
|
arr.push([item.lng, item.lat])
|
||||||
|
})
|
||||||
|
arr.push(arr[0])
|
||||||
|
return arr
|
||||||
|
}
|
||||||
|
|
||||||
|
let getNode = (types) => {
|
||||||
|
let treeObj = window.treeObj
|
||||||
|
let res = []
|
||||||
|
types.forEach((type) => {
|
||||||
|
let nodes = treeObj.getNodesByParam('sourceType', type, null)
|
||||||
|
res = res.concat(nodes)
|
||||||
|
})
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
//绘制的区域
|
||||||
|
// 获取物资处(特定的标注类型)
|
||||||
|
let allNodes = getNode(['point', 'vr', 'picture', 'Feature'])
|
||||||
|
let itemInArea = [] //区域内的类型符合的标注
|
||||||
|
|
||||||
|
for (let i = 0; i < allNodes.length; i++) {
|
||||||
|
let item = allNodes[i]
|
||||||
|
let getAllItemInArea = (lng, lat) => {
|
||||||
|
if (flag == 'circle') {
|
||||||
|
let { center, radius } = positions1
|
||||||
|
let distance = new YJ.Tools().randomString(center, { lng, lat })
|
||||||
|
distance < radius && itemInArea.push(item)
|
||||||
|
} else {
|
||||||
|
let polygon1 = turf.polygon([set3Array(positions1)])
|
||||||
|
let pt = turf.point([lng, lat])
|
||||||
|
turf.booleanPointInPolygon(pt, polygon1) && itemInArea.push(item)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
switch (item.sourceType) {
|
||||||
|
case 'point':
|
||||||
|
case 'vr':
|
||||||
|
case 'picture':
|
||||||
|
let params = JSON.parse(item.params)
|
||||||
|
let lng = params.position.lng
|
||||||
|
let lat = params.position.lat
|
||||||
|
getAllItemInArea(lng, lat)
|
||||||
|
break
|
||||||
|
case 'Feature':
|
||||||
|
if (item.detail.geometry.type == 'Point') {
|
||||||
|
lng = item.detail.geometry.coordinates[0]
|
||||||
|
lat = item.detail.geometry.coordinates[1]
|
||||||
|
getAllItemInArea(lng, lat)
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return itemInArea
|
||||||
|
}
|
||||||
|
function renderCanvas(nodes) {
|
||||||
|
let x: any = []
|
||||||
|
let y: any = []
|
||||||
|
nodes.forEach((item) => {
|
||||||
|
// shp物资统计
|
||||||
|
if (item.sourceType == 'Feature') {
|
||||||
|
let obj = JSON.parse(JSON.stringify(item.detail.properties))
|
||||||
|
for (const key in obj) {
|
||||||
|
let name = key
|
||||||
|
if (shpTotalDict[key]) {
|
||||||
|
name = shpTotalDict[key]
|
||||||
|
// 把相同名称的物资数量相加,名称相同时,累加数据
|
||||||
|
let index = x.findIndex((item) => item === name)
|
||||||
|
if (index !== -1) {
|
||||||
|
y[index] = y[index] + Number(obj[key])
|
||||||
|
} else {
|
||||||
|
x.push(name)
|
||||||
|
y.push(Number(obj[key]))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let params = JSON.parse(item.params)
|
||||||
|
if (params.attribute && params.attribute.goods) {
|
||||||
|
let goods = params.attribute.goods.content
|
||||||
|
if (goods.length) {
|
||||||
|
// $root_home_index.goodSearchDialog = false;
|
||||||
|
goods.forEach((good) => {
|
||||||
|
// 把相同名称的物资数量相加,名称相同时,累加数据
|
||||||
|
let index = x.findIndex((item) => item === good.name)
|
||||||
|
if (index !== -1) {
|
||||||
|
y[index] = y[index] + Number(good.cnt)
|
||||||
|
} else {
|
||||||
|
x.push(good.name)
|
||||||
|
y.push(Number(good.cnt))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
console.log('x,y')
|
||||||
|
console.log(x)
|
||||||
|
console.log(y)
|
||||||
|
let notZeroX = []
|
||||||
|
let notZeroY = []
|
||||||
|
for (let i = 0; i < y.length; i++) {
|
||||||
|
if (y[i] != 0) {
|
||||||
|
notZeroX.push(x[i])
|
||||||
|
notZeroY.push(y[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(notZeroX)
|
||||||
|
console.log(notZeroY)
|
||||||
|
x = notZeroX
|
||||||
|
y = notZeroY
|
||||||
|
if (!x.length) show.value = false
|
||||||
|
if (show.value) {
|
||||||
|
nextTick(() => {
|
||||||
|
let option = {
|
||||||
|
grid: {
|
||||||
|
top: '20%',
|
||||||
|
left: '5%',
|
||||||
|
right: '5%',
|
||||||
|
bottom: '8%',
|
||||||
|
containLabel: true
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'axis',
|
||||||
|
axisPointer: {
|
||||||
|
type: 'shadow',
|
||||||
|
label: {
|
||||||
|
show: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
formatter(params) {
|
||||||
|
var data = ''
|
||||||
|
for (var i = 0; i < params.length; i++) {
|
||||||
|
if (params[i].seriesName == '随访率') {
|
||||||
|
data += params[i].seriesName + ': ' + params[i].value + '%'
|
||||||
|
} else {
|
||||||
|
data += params[i].seriesName + ': ' + params[i].value + '<br/>'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
data: ['总量'],
|
||||||
|
top: '5%',
|
||||||
|
left: '5%',
|
||||||
|
right: '5%',
|
||||||
|
bottom: '5%',
|
||||||
|
textStyle: {
|
||||||
|
color: '#fff'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
xAxis: {
|
||||||
|
// type: "category",
|
||||||
|
axisLine: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
axisTick: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
axisLabel: {
|
||||||
|
show: true,
|
||||||
|
width: 40, //将内容的宽度固定
|
||||||
|
overflow: 'truncate', //超出的部分截断
|
||||||
|
truncate: '...', //截断的部分用...代替
|
||||||
|
rotate: 30,
|
||||||
|
interval: 0,
|
||||||
|
textStyle: {
|
||||||
|
color: '#fff' //X轴文字颜色
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
yAxis: [
|
||||||
|
{
|
||||||
|
type: 'value',
|
||||||
|
name: '(数量)',
|
||||||
|
nameTextStyle: {
|
||||||
|
color: '#fff'
|
||||||
|
},
|
||||||
|
splitLine: {
|
||||||
|
show: true,
|
||||||
|
lineStyle: {
|
||||||
|
color: '#eeeeee'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
axisTick: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
axisLine: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
axisLabel: {
|
||||||
|
show: true,
|
||||||
|
textStyle: {
|
||||||
|
color: '#fff'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'value',
|
||||||
|
gridIndex: 0,
|
||||||
|
min: 50,
|
||||||
|
max: 100,
|
||||||
|
splitNumber: 8,
|
||||||
|
splitLine: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
axisLine: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
axisTick: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
axisLabel: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
splitArea: {
|
||||||
|
show: false,
|
||||||
|
areaStyle: {
|
||||||
|
color: ['rgba(250,250,250,0.0)', 'rgba(250,250,250,0.05)']
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: '数量',
|
||||||
|
type: 'bar',
|
||||||
|
label: {
|
||||||
|
show: true,
|
||||||
|
position: 'top'
|
||||||
|
},
|
||||||
|
barWidth: 15,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
color: '#fdcb6c'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
var dom = document.getElementById('goodSearchEchart2')
|
||||||
|
var myChart = (window as any).echarts.init(dom)
|
||||||
|
option.xAxis.data = x
|
||||||
|
option.series[0].data = y
|
||||||
|
myChart.setOption(option)
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
ElMessage({
|
||||||
|
message: '该区域没有物资',
|
||||||
|
type: 'warning'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const closeCallBack = (e) => {}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss"></style>
|
@ -59,7 +59,7 @@ eventBus.on('graffitiDialog', () => {
|
|||||||
graffiti = new YJ.Obj.Graffiti(window.earth, {
|
graffiti = new YJ.Obj.Graffiti(window.earth, {
|
||||||
width: width.value
|
width: width.value
|
||||||
})
|
})
|
||||||
}, 0)
|
}, 10)
|
||||||
})
|
})
|
||||||
|
|
||||||
const closeCallBack = (e) => {}
|
const closeCallBack = (e) => {}
|
||||||
|
283
src/renderer/src/views/components/propertyBox/ProjConvert.vue
Normal file
283
src/renderer/src/views/components/propertyBox/ProjConvert.vue
Normal file
@ -0,0 +1,283 @@
|
|||||||
|
<template>
|
||||||
|
<Dialog
|
||||||
|
ref="baseDialog"
|
||||||
|
class="proj-convert"
|
||||||
|
title="度分秒格式转换"
|
||||||
|
left="180px"
|
||||||
|
top="100px"
|
||||||
|
width="515px"
|
||||||
|
:closeCallback="closeCallBack"
|
||||||
|
>
|
||||||
|
<template #content v-if="status1">
|
||||||
|
<span class="custom-divider"></span>
|
||||||
|
<div class="div-item">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col input-select-box">
|
||||||
|
<span class="label" style="flex: 0 0 60px">输入格式</span>
|
||||||
|
<div class="input-select"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="div-item item" data-type="0">
|
||||||
|
<span class="custom-divider"></span>
|
||||||
|
<p style="font-size: 16px; padding-bottom: 6px; margin-top: 10px; margin-bottom: 5px">
|
||||||
|
<span style="margin-right: 10px">度</span>
|
||||||
|
<span style="font-size: 12px; margin-bottom: 5px; color: #f16c55">例如116.6°, 39.9°</span>
|
||||||
|
</p>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col">
|
||||||
|
<span class="label" style="flex: auto">经度</span>
|
||||||
|
<input class="input lng" type="number" min="-180" max="180" value="0" title="" />
|
||||||
|
</div>
|
||||||
|
<div class="col" style="margin: 0">
|
||||||
|
<span class="label">纬度</span>
|
||||||
|
<input class="input lat" type="number" min="-90" max="90" value="0" title="" />
|
||||||
|
</div>
|
||||||
|
<div class="col" style="flex: 0 0 24px">
|
||||||
|
<i
|
||||||
|
class="icon-copy-box"
|
||||||
|
title="复制"
|
||||||
|
data-clipboard-action="copy"
|
||||||
|
data-clipboard-target=".input"
|
||||||
|
style="cursor: pointer"
|
||||||
|
>
|
||||||
|
<svg class="icon-copy" style="margin: 4px; margin-bottom: 0px">
|
||||||
|
<use xlink:href="#yj-icon-copy"></use>
|
||||||
|
</svg>
|
||||||
|
</i>
|
||||||
|
<button class="convert" style="margin-left: 10px">转 换</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="div-item item" data-type="1">
|
||||||
|
<span class="custom-divider"></span>
|
||||||
|
<p style="font-size: 16px; padding-bottom: 6px; margin-top: 10px; margin-bottom: 5px">
|
||||||
|
<span style="margin-right: 10px">度分</span>
|
||||||
|
<span style="font-size: 12px; margin-bottom: 5px; color: #f16c55"
|
||||||
|
>例如95°10.1702', 49°12.4015'</span
|
||||||
|
>
|
||||||
|
</p>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col" style="flex-direction: column">
|
||||||
|
<div class="row" style="margin-bottom: 15px">
|
||||||
|
<span class="label">经度</span>
|
||||||
|
<input
|
||||||
|
class="input lng-dm-d"
|
||||||
|
style="flex: 1"
|
||||||
|
type="number"
|
||||||
|
min="-180"
|
||||||
|
max="180"
|
||||||
|
value="0"
|
||||||
|
title=""
|
||||||
|
/>
|
||||||
|
<span class="label" style="flex: 0 0 14px; margin: 0 10px">度</span>
|
||||||
|
<input
|
||||||
|
class="input lng-dm-m"
|
||||||
|
style="flex: 1"
|
||||||
|
type="number"
|
||||||
|
min="0"
|
||||||
|
max="60"
|
||||||
|
value="0"
|
||||||
|
title=""
|
||||||
|
/>
|
||||||
|
<span class="label" style="flex: 0 0 14px; margin: 0 10px">分</span>
|
||||||
|
<span class="top-line"></span>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<span class="label">纬度</span>
|
||||||
|
<input
|
||||||
|
class="input lat-dm-d"
|
||||||
|
style="flex: 1"
|
||||||
|
type="number"
|
||||||
|
min="-90"
|
||||||
|
max="90"
|
||||||
|
value="0"
|
||||||
|
title=""
|
||||||
|
/>
|
||||||
|
<span class="label" style="flex: 0 0 14px; margin: 0 10px">度</span>
|
||||||
|
<input
|
||||||
|
class="input lat-dm-m"
|
||||||
|
style="flex: 1"
|
||||||
|
type="number"
|
||||||
|
min="0"
|
||||||
|
max="60"
|
||||||
|
value="0"
|
||||||
|
title=""
|
||||||
|
/>
|
||||||
|
<span class="label" style="flex: 0 0 14px; margin: 0 10px">分</span>
|
||||||
|
<span class="bottom-line"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col" style="flex: 0 0 24px; margin: 0">
|
||||||
|
<i
|
||||||
|
class="icon-copy-box"
|
||||||
|
title="复制"
|
||||||
|
data-clipboard-action="copy"
|
||||||
|
data-clipboard-target=".input"
|
||||||
|
style="cursor: pointer; position: relative; left: -30px"
|
||||||
|
>
|
||||||
|
<svg class="icon-copy" style="margin: 4px; margin-bottom: 0px">
|
||||||
|
<use xlink:href="#yj-icon-copy"></use>
|
||||||
|
</svg>
|
||||||
|
</i>
|
||||||
|
<button class="convert" style="margin-left: 10px">转 换</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="div-item item" data-type="2">
|
||||||
|
<span class="custom-divider"></span>
|
||||||
|
<p style="font-size: 16px; padding-bottom: 6px; margin-top: 10px; margin-bottom: 5px">
|
||||||
|
<span style="margin-right: 10px">度分秒</span>
|
||||||
|
<span style="font-size: 12px; margin-bottom: 5px; color: #f16c55"
|
||||||
|
>例如11°18'54.37", 39°13'46.57"</span
|
||||||
|
>
|
||||||
|
</p>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col" style="flex-direction: column">
|
||||||
|
<div class="row" style="margin-bottom: 15px">
|
||||||
|
<span class="label">经度</span>
|
||||||
|
<input
|
||||||
|
class="input lng-dms-d"
|
||||||
|
style="flex: 1"
|
||||||
|
type="number"
|
||||||
|
min="-180"
|
||||||
|
max="180"
|
||||||
|
value="0"
|
||||||
|
title=""
|
||||||
|
/>
|
||||||
|
<span class="label" style="flex: 0 0 14px; margin: 0 10px">度</span>
|
||||||
|
<input
|
||||||
|
class="input lng-dms-m"
|
||||||
|
style="flex: 1"
|
||||||
|
type="number"
|
||||||
|
min="0"
|
||||||
|
max="60"
|
||||||
|
value="0"
|
||||||
|
title=""
|
||||||
|
/>
|
||||||
|
<span class="label" style="flex: 0 0 14px; margin: 0 10px">分</span>
|
||||||
|
<input
|
||||||
|
class="input lng-dms-s"
|
||||||
|
style="flex: 1"
|
||||||
|
type="number"
|
||||||
|
min="0"
|
||||||
|
max="60"
|
||||||
|
value="0"
|
||||||
|
title=""
|
||||||
|
/>
|
||||||
|
<span class="label" style="flex: 0 0 14px; margin: 0 10px">秒</span>
|
||||||
|
<span class="top-line"></span>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<span class="label">纬度</span>
|
||||||
|
<input
|
||||||
|
class="input lat-dms-d"
|
||||||
|
style="flex: 1"
|
||||||
|
type="number"
|
||||||
|
min="-90"
|
||||||
|
max="90"
|
||||||
|
value="0"
|
||||||
|
title=""
|
||||||
|
/>
|
||||||
|
<span class="label" style="flex: 0 0 14px; margin: 0 10px">度</span>
|
||||||
|
<input
|
||||||
|
class="input lat-dms-m"
|
||||||
|
style="flex: 1"
|
||||||
|
type="number"
|
||||||
|
min="0"
|
||||||
|
max="60"
|
||||||
|
value="0"
|
||||||
|
title=""
|
||||||
|
/>
|
||||||
|
<span class="label" style="flex: 0 0 14px; margin: 0 10px">分</span>
|
||||||
|
<input
|
||||||
|
class="input lat-dms-s"
|
||||||
|
style="flex: 1"
|
||||||
|
type="number"
|
||||||
|
min="0"
|
||||||
|
max="60"
|
||||||
|
value="0"
|
||||||
|
title=""
|
||||||
|
/>
|
||||||
|
<span class="label" style="flex: 0 0 14px; margin: 0 10px">秒</span>
|
||||||
|
<span class="bottom-line"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col" style="flex: 0 0 24px; margin: 0">
|
||||||
|
<i
|
||||||
|
class="icon-copy-box"
|
||||||
|
title="复制"
|
||||||
|
data-clipboard-action="copy"
|
||||||
|
data-clipboard-target=".input"
|
||||||
|
style="cursor: pointer; position: relative; left: -30px"
|
||||||
|
>
|
||||||
|
<svg class="icon-copy" style="margin: 4px; margin-bottom: 0px">
|
||||||
|
<use xlink:href="#yj-icon-copy"></use>
|
||||||
|
</svg>
|
||||||
|
</i>
|
||||||
|
<button class="convert" style="margin-left: 10px">转 换</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<span class="custom-divider" style="order: 10; margin-top: 12px"></span>
|
||||||
|
</template>
|
||||||
|
<template #footer>
|
||||||
|
<button @click="close">关闭</button>
|
||||||
|
</template>
|
||||||
|
</Dialog>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { ref, reactive } from 'vue'
|
||||||
|
import { inject } from 'vue'
|
||||||
|
import Dialog from '@/components/dialog/baseDialog.vue'
|
||||||
|
import Clipboard from 'clipboard'
|
||||||
|
import { ElMessage } from 'element-plus'
|
||||||
|
|
||||||
|
const baseDialog: any = ref(null)
|
||||||
|
const eventBus: any = inject('bus')
|
||||||
|
|
||||||
|
var status1: any = ref(false)
|
||||||
|
var tools: any = reactive([])
|
||||||
|
eventBus.on('projConvertDialog', () => {
|
||||||
|
baseDialog.value?.open()
|
||||||
|
if (status1.value) {
|
||||||
|
reset()
|
||||||
|
status1.value = false
|
||||||
|
}
|
||||||
|
status1.value = !status1.value
|
||||||
|
setTimeout(() => {
|
||||||
|
tools = new YJ.Tools(window.earth)
|
||||||
|
tools.projConvert(status1.value, () => {
|
||||||
|
status1.value = false
|
||||||
|
})
|
||||||
|
}, 100)
|
||||||
|
})
|
||||||
|
|
||||||
|
const closeCallBack = (e) => {
|
||||||
|
status1.value = false
|
||||||
|
}
|
||||||
|
const reset = () => {
|
||||||
|
let contentElm = document
|
||||||
|
.getElementsByClassName('proj-convert')[0]
|
||||||
|
.getElementsByClassName('content')[0]
|
||||||
|
contentElm.getElementsByClassName('lng-dms-d')[0].value = null
|
||||||
|
contentElm.getElementsByClassName('lng-dms-m')[0].value = null
|
||||||
|
contentElm.getElementsByClassName('lng-dms-s')[0].value = null
|
||||||
|
contentElm.getElementsByClassName('lat-dms-d')[0].value = null
|
||||||
|
contentElm.getElementsByClassName('lat-dms-m')[0].value = null
|
||||||
|
contentElm.getElementsByClassName('lat-dms-s')[0].value = null
|
||||||
|
contentElm.getElementsByClassName('lng')[0].value = null
|
||||||
|
contentElm.getElementsByClassName('lat')[0].value = null
|
||||||
|
}
|
||||||
|
const close = (e) => {
|
||||||
|
baseDialog.value?.close()
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
::v-deep .content > div {
|
||||||
|
display: flex !important;
|
||||||
|
flex-direction: column !important;
|
||||||
|
}
|
||||||
|
</style>
|
@ -0,0 +1,171 @@
|
|||||||
|
<template>
|
||||||
|
<Dialog
|
||||||
|
ref="baseDialog"
|
||||||
|
class="projection-convert"
|
||||||
|
title="投影转换"
|
||||||
|
left="180px"
|
||||||
|
top="100px"
|
||||||
|
width="634px"
|
||||||
|
:closeCallback="closeCallBack"
|
||||||
|
>
|
||||||
|
<template #content v-if="status1">
|
||||||
|
<span class="custom-divider"></span>
|
||||||
|
<div style="width: 585px; display: flex">
|
||||||
|
<div class="row left" style="flex: 1; margin-bottom: 0">
|
||||||
|
<div
|
||||||
|
style="
|
||||||
|
margin: 10px 0;
|
||||||
|
flex: 1;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
flex: 1;
|
||||||
|
justify-content: space-between;
|
||||||
|
"
|
||||||
|
>
|
||||||
|
<span class="lable-left-line">源坐标</span>
|
||||||
|
<button class="btn pick" style="margin-left: 15px">
|
||||||
|
<svg class="icon-edit"><use xlink:href="#yj-icon-edit"></use></svg>坐标拾取
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
class="btn sourceCopy"
|
||||||
|
data-clipboard-action="copy"
|
||||||
|
data-clipboard-target=".input"
|
||||||
|
style="margin-left: 5px"
|
||||||
|
>
|
||||||
|
<svg class="icon-copy"><use xlink:href="#yj-icon-copy"></use></svg>复制
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div style="display: flex; margin-bottom: 12px; align-items: center">
|
||||||
|
<span class="label" style="flex: 0 0 60px">椭圆基准</span>
|
||||||
|
<div class="datalist_left"></div>
|
||||||
|
</div>
|
||||||
|
<div style="display: flex; margin-bottom: 12px; align-items: center">
|
||||||
|
<span class="label" style="flex: 0 0 60px">经度(x)</span>
|
||||||
|
<input class="input left-x" type="number" title="" />
|
||||||
|
</div>
|
||||||
|
<div style="display: flex; margin-bottom: 10px; align-items: center">
|
||||||
|
<span class="label" style="flex: 0 0 60px">纬度(y)</span>
|
||||||
|
<input class="input left-y" type="number" title="" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
style="
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
margin: 28px 15px 0 15px;
|
||||||
|
"
|
||||||
|
>
|
||||||
|
<button class="btn convert">
|
||||||
|
<svg-icon name="turn" :size="11" color="rgba(255, 255, 255, 1)"></svg-icon>
|
||||||
|
转换
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="row right" style="flex: 1; margin-bottom: 0">
|
||||||
|
<div
|
||||||
|
style="
|
||||||
|
margin: 10px 0;
|
||||||
|
height: 32px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
flex: 1;
|
||||||
|
justify-content: space-between;
|
||||||
|
"
|
||||||
|
>
|
||||||
|
<span class="lable-left-line">目标坐标</span>
|
||||||
|
<button
|
||||||
|
class="btn copy"
|
||||||
|
data-clipboard-action="copy"
|
||||||
|
data-clipboard-target=".input"
|
||||||
|
style="margin-left: 20px"
|
||||||
|
>
|
||||||
|
<svg class="icon-copy"><use xlink:href="#yj-icon-copy"></use></svg>复制
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div style="display: flex; margin-bottom: 12px; align-items: center">
|
||||||
|
<span class="label" style="flex: 0 0 60px">椭圆基准</span>
|
||||||
|
<div class="datalist_right"></div>
|
||||||
|
</div>
|
||||||
|
<div style="display: flex; margin-bottom: 12px; align-items: center">
|
||||||
|
<span class="label" style="flex: 0 0 60px">经度(x)</span>
|
||||||
|
<input class="input right-x" readonly="readonly" />
|
||||||
|
</div>
|
||||||
|
<div style="display: flex; margin-bottom: 10px; align-items: center">
|
||||||
|
<span class="label" style="flex: 0 0 60px">纬度(y)</span>
|
||||||
|
<input class="input right-y" readonly="readonly" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<span class="custom-divider"></span>
|
||||||
|
</template>
|
||||||
|
<template #footer>
|
||||||
|
<button @click="close">关闭</button>
|
||||||
|
</template>
|
||||||
|
</Dialog>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { ref, reactive } from 'vue'
|
||||||
|
import { inject } from 'vue'
|
||||||
|
import Dialog from '@/components/dialog/baseDialog.vue'
|
||||||
|
import Clipboard from 'clipboard'
|
||||||
|
import { ElMessage } from 'element-plus'
|
||||||
|
|
||||||
|
const baseDialog: any = ref(null)
|
||||||
|
const eventBus: any = inject('bus')
|
||||||
|
|
||||||
|
var status1: any = ref(false)
|
||||||
|
var tools: any = reactive([])
|
||||||
|
eventBus.on('ProjectionConvertDialog', () => {
|
||||||
|
baseDialog.value?.open()
|
||||||
|
if (status1.value) {
|
||||||
|
reset()
|
||||||
|
status1.value = false
|
||||||
|
tools && tools.projectionConvert(status1.value, () => {})
|
||||||
|
}
|
||||||
|
status1.value = !status1.value
|
||||||
|
setTimeout(() => {
|
||||||
|
tools = new YJ.Tools(window.earth)
|
||||||
|
tools.projectionConvert(status1.value, () => {
|
||||||
|
status1.value = false
|
||||||
|
})
|
||||||
|
}, 100)
|
||||||
|
})
|
||||||
|
|
||||||
|
const closeCallBack = (e) => {
|
||||||
|
status1.value = false
|
||||||
|
tools && tools.projectionConvert(status1.value, () => {})
|
||||||
|
}
|
||||||
|
const reset = () => {
|
||||||
|
let contentElm = document
|
||||||
|
.getElementsByClassName('projection-convert')[0]
|
||||||
|
.getElementsByClassName('content')[0]
|
||||||
|
contentElm.getElementsByClassName('left-x')[0].value = null
|
||||||
|
contentElm.getElementsByClassName('left-y')[0].value = null
|
||||||
|
contentElm.getElementsByClassName('right-x')[0].value = null
|
||||||
|
contentElm.getElementsByClassName('right-y')[0].value = null
|
||||||
|
}
|
||||||
|
const close = (e) => {
|
||||||
|
baseDialog.value?.close()
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
::v-deep .content > div {
|
||||||
|
display: flex !important;
|
||||||
|
flex-direction: column !important;
|
||||||
|
}
|
||||||
|
::v-deep .content .cy_datalist input {
|
||||||
|
background: rgba(var(--color-sdk-base-rgb), 0.2) !important;
|
||||||
|
border: unset;
|
||||||
|
}
|
||||||
|
::v-deep .content input[type='number'] {
|
||||||
|
font-size: 16px !important;
|
||||||
|
// font-weight: 700 !important;
|
||||||
|
color: var(--color-sdk-auxiliary-public) !important;
|
||||||
|
}
|
||||||
|
</style>
|
@ -1,4 +1,4 @@
|
|||||||
<!-- <template>
|
<template>
|
||||||
<Dialog ref="baseDialog" title="地形开挖" left="180px" top="100px" :closeCallback="closeCallBack">
|
<Dialog ref="baseDialog" title="地形开挖" left="180px" top="100px" :closeCallback="closeCallBack">
|
||||||
<template #content>
|
<template #content>
|
||||||
<span class="custom-divider"></span>
|
<span class="custom-divider"></span>
|
||||||
@ -43,7 +43,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<template #footer>
|
<template #footer>
|
||||||
<button @click="close">取消</button>
|
<button @click="close">关闭</button>
|
||||||
</template>
|
</template>
|
||||||
</Dialog>
|
</Dialog>
|
||||||
</template>
|
</template>
|
||||||
@ -62,7 +62,7 @@ var excavation: any = reactive([])
|
|||||||
eventBus.on('terrainExcavationDialog', () => {
|
eventBus.on('terrainExcavationDialog', () => {
|
||||||
baseDialog.value?.open()
|
baseDialog.value?.open()
|
||||||
|
|
||||||
excavation = new (window as any).YJ.Analysis.TerrainExcavation(this.sdk, { height: 10 })
|
excavation = new (window as any).YJ.Analysis.TerrainExcavation(window.earth, { height: 10 })
|
||||||
})
|
})
|
||||||
|
|
||||||
const changeHeight = () => {
|
const changeHeight = () => {
|
||||||
@ -76,7 +76,9 @@ const heightInput = () => {
|
|||||||
height.value = dom.max * 1
|
height.value = dom.max * 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const closeCallBack = (e) => {}
|
const closeCallBack = (e) => {
|
||||||
|
height.value = 10
|
||||||
|
}
|
||||||
const close = (e) => {
|
const close = (e) => {
|
||||||
baseDialog.value?.close()
|
baseDialog.value?.close()
|
||||||
}
|
}
|
||||||
@ -88,4 +90,4 @@ const clear = (e) => {
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss"></style> -->
|
<style scoped lang="scss"></style>
|
||||||
|
@ -113,7 +113,7 @@ eventBus.on('viewShedDialog', () => {
|
|||||||
e_horizontalViewAngle.removeEventListener('change', changeFun)
|
e_horizontalViewAngle.removeEventListener('change', changeFun)
|
||||||
e_horizontalViewAngle.addEventListener('input', inputFun)
|
e_horizontalViewAngle.addEventListener('input', inputFun)
|
||||||
e_horizontalViewAngle.addEventListener('change', changeFun)
|
e_horizontalViewAngle.addEventListener('change', changeFun)
|
||||||
})
|
}, 10)
|
||||||
})
|
})
|
||||||
function inputFun() {
|
function inputFun() {
|
||||||
let contentElm = document.getElementsByClassName('view-shed')[0]
|
let contentElm = document.getElementsByClassName('view-shed')[0]
|
||||||
|
@ -32,7 +32,11 @@
|
|||||||
<!-- <FlyRoam ref="FlyRoam"></FlyRoam> -->
|
<!-- <FlyRoam ref="FlyRoam"></FlyRoam> -->
|
||||||
<CoorLocation ref="CoorLocation"></CoorLocation>
|
<CoorLocation ref="CoorLocation"></CoorLocation>
|
||||||
<ScreenShot ref="ScreenShot"></ScreenShot>
|
<ScreenShot ref="ScreenShot"></ScreenShot>
|
||||||
<!-- <TerrainExcavation ref="TerrainExcavation"></TerrainExcavation> -->
|
<TerrainExcavation ref="TerrainExcavation"></TerrainExcavation>
|
||||||
|
<ProjConvert ref="ProjConvert"></ProjConvert>
|
||||||
|
<ProjectionConvert ref="ProjectionConvert"></ProjectionConvert>
|
||||||
|
<GoodsSearchCircle ref="GoodsSearchCircle"></GoodsSearchCircle>
|
||||||
|
<GoodsSearchPolgon ref="GoodsSearchPolgon"></GoodsSearchPolgon>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
@ -66,6 +70,10 @@ import FlyRoam from '../components/propertyBox/FlyRoam.vue'
|
|||||||
import CoorLocation from '../components/propertyBox/CoorLocation.vue'
|
import CoorLocation from '../components/propertyBox/CoorLocation.vue'
|
||||||
import ScreenShot from '../components/propertyBox/ScreenShot.vue'
|
import ScreenShot from '../components/propertyBox/ScreenShot.vue'
|
||||||
import TerrainExcavation from '../components/propertyBox/TerrainExcavation.vue'
|
import TerrainExcavation from '../components/propertyBox/TerrainExcavation.vue'
|
||||||
|
import ProjConvert from '../components/propertyBox/ProjConvert.vue'
|
||||||
|
import ProjectionConvert from '../components/propertyBox/ProjectionConvert.vue'
|
||||||
|
import GoodsSearchCircle from '../components/propertyBox/GoodsSearchCircle.vue'
|
||||||
|
import GoodsSearchPolgon from '../components/propertyBox/GoodsSearchPolgon.vue'
|
||||||
|
|
||||||
import { GisApi } from '@/api/gisApi'
|
import { GisApi } from '@/api/gisApi'
|
||||||
|
|
||||||
@ -123,7 +131,7 @@ eventBus.on('openDialog', async (sourceType: any, id: any) => {
|
|||||||
currentComponent.value = circleObject
|
currentComponent.value = circleObject
|
||||||
await nextTick()
|
await nextTick()
|
||||||
dynamicComponentRef.value?.open(id, 'circle')
|
dynamicComponentRef.value?.open(id, 'circle')
|
||||||
break;
|
break
|
||||||
case 'rectangle':
|
case 'rectangle':
|
||||||
currentComponent.value = polygonObject
|
currentComponent.value = polygonObject
|
||||||
await nextTick()
|
await nextTick()
|
||||||
|
Reference in New Issue
Block a user