From 66f9ec56e02b26da82175cd83bdcd3773f0ddc1e Mon Sep 17 00:00:00 2001 From: zhangtao Date: Thu, 31 Jul 2025 22:54:49 +0800 Subject: [PATCH] =?UTF-8?q?feat(map):=20=E4=BD=BF=E7=94=A8=20OpenLayers=20?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=88=86=E5=B1=8F=E5=9C=B0=E5=9B=BE=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 重写 SplitScreenManager 类,实现基于 OpenLayers 的分屏地图管理- 新增 tiandituLayers.js 工具模块,用于创建天地图图层 - 更新 TiandituMap.vue 组件,支持 OpenLayers 地图渲染 -调整 SplitScreenMap.vue组件,使用新的分屏地图管理器 - 移除对 @arcgis/core 的依赖,改为使用 ol (OpenLayers) --- package-lock.json | 877 ++++++------------------------ package.json | 2 +- src/components/SplitScreenMap.vue | 99 +--- src/components/TiandituMap.vue | 59 +- src/config/tianditu.js | 19 +- src/utils/splitScreen.js | 416 ++++++++++---- src/utils/tiandituLayers.js | 83 +++ vite.config.js | 8 - 8 files changed, 602 insertions(+), 961 deletions(-) create mode 100644 src/utils/tiandituLayers.js diff --git a/package-lock.json b/package-lock.json index bf3c444..ac2513d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "name": "geo-vue-app", "version": "0.0.0", "dependencies": { - "@arcgis/core": "^4.33.11", + "ol": "^8.2.0", "vue": "^3.4.0" }, "devDependencies": { @@ -16,44 +16,6 @@ "vite": "^5.0.0" } }, - "node_modules/@arcgis/components-utils": { - "version": "4.33.12", - "resolved": "https://registry.npmmirror.com/@arcgis/components-utils/-/components-utils-4.33.12.tgz", - "integrity": "sha512-B3cISRLbWEfTTYyjwLR5M5CT38fq6EerAeV8h+nYZMu7Zijy8rWrFLpDXGmDu9eD+KaWZG74Zq065UQv3nhWtg==", - "license": "SEE LICENSE IN LICENSE.md", - "dependencies": { - "tslib": "^2.8.1" - } - }, - "node_modules/@arcgis/core": { - "version": "4.33.11", - "resolved": "https://registry.npmmirror.com/@arcgis/core/-/core-4.33.11.tgz", - "integrity": "sha512-mnBxie2VWktXylzEL0vTYY2brUFoLjyTlJI5Zlt8fQbTkqEr73QMOMkpM2zudFN18wGyWge1UvI1pTjWwtGLww==", - "license": "SEE LICENSE IN copyright.txt", - "dependencies": { - "@esri/arcgis-html-sanitizer": "~4.1.0", - "@esri/calcite-components": "^3.2.1", - "@vaadin/grid": "~24.7.6", - "@zip.js/zip.js": "~2.7.62", - "luxon": "~3.6.1", - "marked": "~15.0.12" - } - }, - "node_modules/@arcgis/lumina": { - "version": "4.33.12", - "resolved": "https://registry.npmmirror.com/@arcgis/lumina/-/lumina-4.33.12.tgz", - "integrity": "sha512-KSkL9AfZX6R6OyxTesa7QLIYedtX2Cje4+9PbcZY5R/txiqGHeunnF842r/xuuNGWrp0L6hQI9zCKCaZkPqzPg==", - "license": "SEE LICENSE IN LICENSE.md", - "dependencies": { - "@arcgis/components-utils": "4.33.12", - "@lit-labs/ssr": "^3.2.2", - "@lit-labs/ssr-client": "^1.1.7", - "@lit/context": "^1.1.5", - "csstype": "^3.1.3", - "lit": "^3.3.0", - "tslib": "^2.8.1" - } - }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", @@ -491,174 +453,18 @@ "node": ">=12" } }, - "node_modules/@esri/arcgis-html-sanitizer": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/@esri/arcgis-html-sanitizer/-/arcgis-html-sanitizer-4.1.0.tgz", - "integrity": "sha512-einEveDJ/k1180NOp78PB/4Hje9eBy3dyOGLLtLn6bSkizpUfCwuYBIXOA7Y3F/k/BsTQXgKqUVwQ0eiscWMdA==", - "license": "Apache-2.0", - "dependencies": { - "xss": "1.0.13" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@esri/calcite-components": { - "version": "3.2.1", - "resolved": "https://registry.npmmirror.com/@esri/calcite-components/-/calcite-components-3.2.1.tgz", - "integrity": "sha512-NRBW/bhT4sQM5RAZF7W8/VymaOLgIzaR6yTZFI270Ig4NiQ4DRexjdeo/SwDMBlswFtBw5iya+/h+fAur2+Hlg==", - "license": "SEE LICENSE.md", - "dependencies": { - "@arcgis/components-utils": "^4.33.0-next.121", - "@arcgis/lumina": "^4.33.0-next.121", - "@esri/calcite-ui-icons": "4.2.0", - "@floating-ui/dom": "^1.6.12", - "@floating-ui/utils": "^0.2.8", - "@types/sortablejs": "^1.15.8", - "color": "^5.0.0", - "composed-offset-position": "^0.0.6", - "dayjs": "^1.11.13", - "focus-trap": "^7.6.2", - "interactjs": "^1.10.27", - "lodash-es": "^4.17.21", - "sortablejs": "^1.15.6", - "timezone-groups": "^0.10.4", - "type-fest": "^4.30.1" - } - }, - "node_modules/@esri/calcite-ui-icons": { - "version": "4.2.0", - "resolved": "https://registry.npmmirror.com/@esri/calcite-ui-icons/-/calcite-ui-icons-4.2.0.tgz", - "integrity": "sha512-GS41gUt1tgnqG+U1a6yDRiKOHmuLST2uyOI7+cJ83JtLJ7CGduH9K6RERabTE2vRYbudaebI8jZgKNSNOHdGzw==", - "license": "SEE LICENSE.md", - "bin": { - "spriter": "bin/spriter.js" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.7.3", - "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.7.3.tgz", - "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.10" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.7.3", - "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.7.3.tgz", - "integrity": "sha512-uZA413QEpNuhtb3/iIKoYMSK07keHPYeXF02Zhd6e213j+d1NamLix/mCLxBUDW/Gx52sPH2m+chlUsyaBs/Ag==", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.7.3", - "@floating-ui/utils": "^0.2.10" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.10", - "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.10.tgz", - "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", - "license": "MIT" - }, - "node_modules/@interactjs/types": { - "version": "1.10.27", - "resolved": "https://registry.npmmirror.com/@interactjs/types/-/types-1.10.27.tgz", - "integrity": "sha512-BUdv0cvs4H5ODuwft2Xp4eL8Vmi3LcihK42z0Ft/FbVJZoRioBsxH+LlsBdK4tAie7PqlKGy+1oyOncu1nQ6eA==", - "license": "MIT" - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.4", "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", "license": "MIT" }, - "node_modules/@lit-labs/ssr": { - "version": "3.3.1", - "resolved": "https://registry.npmmirror.com/@lit-labs/ssr/-/ssr-3.3.1.tgz", - "integrity": "sha512-JlF1PempxvzrGEpRFrF+Ki0MHzR3HA51SK8Zv0cFpW9p0bPW4k0FeCwrElCu371UEpXF7RcaE2wgYaE1az0XKg==", - "license": "BSD-3-Clause", - "dependencies": { - "@lit-labs/ssr-client": "^1.1.7", - "@lit-labs/ssr-dom-shim": "^1.3.0", - "@lit/reactive-element": "^2.0.4", - "@parse5/tools": "^0.3.0", - "@types/node": "^16.0.0", - "enhanced-resolve": "^5.10.0", - "lit": "^3.1.2", - "lit-element": "^4.0.4", - "lit-html": "^3.1.2", - "node-fetch": "^3.2.8", - "parse5": "^7.1.1" - }, - "engines": { - "node": ">=13.9.0" - } - }, - "node_modules/@lit-labs/ssr-client": { - "version": "1.1.7", - "resolved": "https://registry.npmmirror.com/@lit-labs/ssr-client/-/ssr-client-1.1.7.tgz", - "integrity": "sha512-VvqhY/iif3FHrlhkzEPsuX/7h/NqnfxLwVf0p8ghNIlKegRyRqgeaJevZ57s/u/LiFyKgqksRP5n+LmNvpxN+A==", - "license": "BSD-3-Clause", - "dependencies": { - "@lit/reactive-element": "^2.0.4", - "lit": "^3.1.2", - "lit-html": "^3.1.2" - } - }, - "node_modules/@lit-labs/ssr-dom-shim": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.4.0.tgz", - "integrity": "sha512-ficsEARKnmmW5njugNYKipTm4SFnbik7CXtoencDZzmzo/dQ+2Q0bgkzJuoJP20Aj0F+izzJjOqsnkd6F/o1bw==", - "license": "BSD-3-Clause" - }, - "node_modules/@lit-labs/ssr/node_modules/@types/node": { - "version": "16.18.126", - "resolved": "https://registry.npmmirror.com/@types/node/-/node-16.18.126.tgz", - "integrity": "sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==", + "node_modules/@petamoriken/float16": { + "version": "3.9.2", + "resolved": "https://registry.npmmirror.com/@petamoriken/float16/-/float16-3.9.2.tgz", + "integrity": "sha512-VgffxawQde93xKxT3qap3OH+meZf7VaSB5Sqd4Rqc+FP5alWbpOyan/7tRbOAvynjpG3GpdtAuGU/NdhQpmrog==", "license": "MIT" }, - "node_modules/@lit/context": { - "version": "1.1.6", - "resolved": "https://registry.npmmirror.com/@lit/context/-/context-1.1.6.tgz", - "integrity": "sha512-M26qDE6UkQbZA2mQ3RjJ3Gzd8TxP+/0obMgE5HfkfLhEEyYE3Bui4A5XHiGPjy0MUGAyxB3QgVuw2ciS0kHn6A==", - "license": "BSD-3-Clause", - "dependencies": { - "@lit/reactive-element": "^1.6.2 || ^2.1.0" - } - }, - "node_modules/@lit/reactive-element": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/@lit/reactive-element/-/reactive-element-2.1.1.tgz", - "integrity": "sha512-N+dm5PAYdQ8e6UlywyyrgI2t++wFGXfHx+dSJ1oBrg6FAxUj40jId++EaRm80MKX5JnlH1sBsyZ5h0bcZKemCg==", - "license": "BSD-3-Clause", - "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.4.0" - } - }, - "node_modules/@open-wc/dedupe-mixin": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/@open-wc/dedupe-mixin/-/dedupe-mixin-1.4.0.tgz", - "integrity": "sha512-Sj7gKl1TLcDbF7B6KUhtvr+1UCxdhMbNY5KxdU5IfMFWqL8oy1ZeAcCANjoB1TL0AJTcPmcCFsCbHf8X2jGDUA==", - "license": "MIT" - }, - "node_modules/@parse5/tools": { - "version": "0.3.0", - "resolved": "https://registry.npmmirror.com/@parse5/tools/-/tools-0.3.0.tgz", - "integrity": "sha512-zxRyTHkqb7WQMV8kTNBKWb1BeOFUKXBXTBWuxg9H9hfvQB3IwP6Iw2U75Ia5eyRxPNltmY7E8YAlz6zWwUnjKg==", - "license": "MIT", - "dependencies": { - "parse5": "^7.0.0" - } - }, - "node_modules/@polymer/polymer": { - "version": "3.5.2", - "resolved": "https://registry.npmmirror.com/@polymer/polymer/-/polymer-3.5.2.tgz", - "integrity": "sha512-fWwImY/UH4bb2534DVSaX+Azs2yKg8slkMBHOyGeU2kKx7Xmxp6Lee0jP8p6B3d7c1gFUPB2Z976dTUtX81pQA==", - "license": "BSD-3-Clause", - "dependencies": { - "@webcomponents/shadycss": "^1.9.1" - } - }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.46.2", "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.46.2.tgz", @@ -958,199 +764,6 @@ "undici-types": "~7.8.0" } }, - "node_modules/@types/sortablejs": { - "version": "1.15.8", - "resolved": "https://registry.npmmirror.com/@types/sortablejs/-/sortablejs-1.15.8.tgz", - "integrity": "sha512-b79830lW+RZfwaztgs1aVPgbasJ8e7AXtZYHTELNXZPsERt4ymJdjV4OccDbHQAvHrCcFpbF78jkm0R6h/pZVg==", - "license": "MIT" - }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmmirror.com/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "license": "MIT" - }, - "node_modules/@vaadin/a11y-base": { - "version": "24.7.11", - "resolved": "https://registry.npmmirror.com/@vaadin/a11y-base/-/a11y-base-24.7.11.tgz", - "integrity": "sha512-zNjv1ZJSQlxZxK+CPSMG0uet6owb0lw/zKFFLKSFqNRfVqyzW+SViQoxE22StQ5r4dwBxyZXuutu3iisIFwiwA==", - "license": "Apache-2.0", - "dependencies": { - "@open-wc/dedupe-mixin": "^1.3.0", - "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.7.11", - "lit": "^3.0.0" - } - }, - "node_modules/@vaadin/checkbox": { - "version": "24.7.11", - "resolved": "https://registry.npmmirror.com/@vaadin/checkbox/-/checkbox-24.7.11.tgz", - "integrity": "sha512-x4UZ+y/eXrK2AOESxkssjqJ+eQO1kZlFpXNfeLOBwIX8+mzmQpnV4B5roC9hHbX4V/J+ijlaY9YnYAZJaz6Acg==", - "license": "Apache-2.0", - "dependencies": { - "@open-wc/dedupe-mixin": "^1.3.0", - "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.7.11", - "@vaadin/component-base": "~24.7.11", - "@vaadin/field-base": "~24.7.11", - "@vaadin/vaadin-lumo-styles": "~24.7.11", - "@vaadin/vaadin-material-styles": "~24.7.11", - "@vaadin/vaadin-themable-mixin": "~24.7.11", - "lit": "^3.0.0" - } - }, - "node_modules/@vaadin/component-base": { - "version": "24.7.11", - "resolved": "https://registry.npmmirror.com/@vaadin/component-base/-/component-base-24.7.11.tgz", - "integrity": "sha512-KyRJT8clpAxExouD7DDDU0b7jxus0W+TqyUgbdHXfyLxKinf9AFsYKRLmRyIusVYRK9mT2QgT82t0m7nuw0bQA==", - "license": "Apache-2.0", - "dependencies": { - "@open-wc/dedupe-mixin": "^1.3.0", - "@polymer/polymer": "^3.0.0", - "@vaadin/vaadin-development-mode-detector": "^2.0.0", - "@vaadin/vaadin-usage-statistics": "^2.1.0", - "lit": "^3.0.0" - } - }, - "node_modules/@vaadin/field-base": { - "version": "24.7.11", - "resolved": "https://registry.npmmirror.com/@vaadin/field-base/-/field-base-24.7.11.tgz", - "integrity": "sha512-5I1FVw9H/mJp9ZLurx/75/e0rjNLl8UGmNwCvV2pk7ibq7vrNzfa7dZSAgnp/MFBmvyZqHzUeZMpMnTPlfdbQQ==", - "license": "Apache-2.0", - "dependencies": { - "@open-wc/dedupe-mixin": "^1.3.0", - "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.7.11", - "@vaadin/component-base": "~24.7.11", - "lit": "^3.0.0" - } - }, - "node_modules/@vaadin/grid": { - "version": "24.7.11", - "resolved": "https://registry.npmmirror.com/@vaadin/grid/-/grid-24.7.11.tgz", - "integrity": "sha512-gZP7+vQDY6UZu0Lh27oIMzU2KEOcVe4n9336bHB6FaTZkovjMv7xpSfab/MWlHhdI7jETnW214pF5DnIVTHPcw==", - "license": "Apache-2.0", - "dependencies": { - "@open-wc/dedupe-mixin": "^1.3.0", - "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.7.11", - "@vaadin/checkbox": "~24.7.11", - "@vaadin/component-base": "~24.7.11", - "@vaadin/lit-renderer": "~24.7.11", - "@vaadin/text-field": "~24.7.11", - "@vaadin/vaadin-lumo-styles": "~24.7.11", - "@vaadin/vaadin-material-styles": "~24.7.11", - "@vaadin/vaadin-themable-mixin": "~24.7.11", - "lit": "^3.0.0" - } - }, - "node_modules/@vaadin/icon": { - "version": "24.7.11", - "resolved": "https://registry.npmmirror.com/@vaadin/icon/-/icon-24.7.11.tgz", - "integrity": "sha512-mJCdsQn7LzYMBdHk5MiyqfXJMe+i4AxBNDqCLC0akvB4pQFT9utWg3ighyPgcAGbnXhelU9pEu9EEhkhOZ2NYg==", - "license": "Apache-2.0", - "dependencies": { - "@open-wc/dedupe-mixin": "^1.3.0", - "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.7.11", - "@vaadin/vaadin-lumo-styles": "~24.7.11", - "@vaadin/vaadin-themable-mixin": "~24.7.11", - "lit": "^3.0.0" - } - }, - "node_modules/@vaadin/input-container": { - "version": "24.7.11", - "resolved": "https://registry.npmmirror.com/@vaadin/input-container/-/input-container-24.7.11.tgz", - "integrity": "sha512-6j0S2lG1ZMiVm06NDggHjtZ3AXEANP4wloM/GuhRP8Dot786f9ypkPqfWUqHV/LJPQ+kjpOvD6QsAF/xGm8mJQ==", - "license": "Apache-2.0", - "dependencies": { - "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.7.11", - "@vaadin/vaadin-lumo-styles": "~24.7.11", - "@vaadin/vaadin-material-styles": "~24.7.11", - "@vaadin/vaadin-themable-mixin": "~24.7.11", - "lit": "^3.0.0" - } - }, - "node_modules/@vaadin/lit-renderer": { - "version": "24.7.11", - "resolved": "https://registry.npmmirror.com/@vaadin/lit-renderer/-/lit-renderer-24.7.11.tgz", - "integrity": "sha512-IcUvORztp2USBuZnwwKr1VmamXQZTAs1QTpe+VWf9yglELX6lWAwA3fIAIAFwej+vBiO9v8XHPJK0bDiPiTLKA==", - "license": "Apache-2.0", - "dependencies": { - "lit": "^3.0.0" - } - }, - "node_modules/@vaadin/text-field": { - "version": "24.7.11", - "resolved": "https://registry.npmmirror.com/@vaadin/text-field/-/text-field-24.7.11.tgz", - "integrity": "sha512-vnx/DJPyUzy9yXuj/gWGUHWQGjPIaRfeezV5E7MBpQLrwRcK/uDbnc2MqSsVkLEkClGQangmvDm6svX6KCzq7Q==", - "license": "Apache-2.0", - "dependencies": { - "@open-wc/dedupe-mixin": "^1.3.0", - "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.7.11", - "@vaadin/component-base": "~24.7.11", - "@vaadin/field-base": "~24.7.11", - "@vaadin/input-container": "~24.7.11", - "@vaadin/vaadin-lumo-styles": "~24.7.11", - "@vaadin/vaadin-material-styles": "~24.7.11", - "@vaadin/vaadin-themable-mixin": "~24.7.11", - "lit": "^3.0.0" - } - }, - "node_modules/@vaadin/vaadin-development-mode-detector": { - "version": "2.0.7", - "resolved": "https://registry.npmmirror.com/@vaadin/vaadin-development-mode-detector/-/vaadin-development-mode-detector-2.0.7.tgz", - "integrity": "sha512-9FhVhr0ynSR3X2ao+vaIEttcNU5XfzCbxtmYOV8uIRnUCtNgbvMOIcyGBvntsX9I5kvIP2dV3cFAOG9SILJzEA==", - "license": "Apache-2.0" - }, - "node_modules/@vaadin/vaadin-lumo-styles": { - "version": "24.7.11", - "resolved": "https://registry.npmmirror.com/@vaadin/vaadin-lumo-styles/-/vaadin-lumo-styles-24.7.11.tgz", - "integrity": "sha512-MKRqX26XcvfHAWearEOpJmpj0Xg8G6PuMjHgkfqLEz9b9rX4xkIjKjFbrCjddujntmaGbzJfhKxWl+sj9Nkqzg==", - "license": "Apache-2.0", - "dependencies": { - "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.7.11", - "@vaadin/icon": "~24.7.11", - "@vaadin/vaadin-themable-mixin": "~24.7.11" - } - }, - "node_modules/@vaadin/vaadin-material-styles": { - "version": "24.7.11", - "resolved": "https://registry.npmmirror.com/@vaadin/vaadin-material-styles/-/vaadin-material-styles-24.7.11.tgz", - "integrity": "sha512-gqomj16K0vJYRnUIoH6TuvMMpS+XtALcDfkFQ51rj4icF+WpgrhEeFYEIx85Z4MSsE9ODMwytC+Cx4qPWBlcvQ==", - "license": "Apache-2.0", - "dependencies": { - "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.7.11", - "@vaadin/vaadin-themable-mixin": "~24.7.11" - } - }, - "node_modules/@vaadin/vaadin-themable-mixin": { - "version": "24.7.11", - "resolved": "https://registry.npmmirror.com/@vaadin/vaadin-themable-mixin/-/vaadin-themable-mixin-24.7.11.tgz", - "integrity": "sha512-/yjaJbMtRJQZgl6XH+aV6vtMt8lJA5NJwE/N4vPL87Wh3xcA+CIigedRlP9B7OeWhjZmrPJfjCdCktNJGq63BQ==", - "license": "Apache-2.0", - "dependencies": { - "@open-wc/dedupe-mixin": "^1.3.0", - "lit": "^3.0.0" - } - }, - "node_modules/@vaadin/vaadin-usage-statistics": { - "version": "2.1.3", - "resolved": "https://registry.npmmirror.com/@vaadin/vaadin-usage-statistics/-/vaadin-usage-statistics-2.1.3.tgz", - "integrity": "sha512-8r4TNknD7OJQADe3VygeofFR7UNAXZ2/jjBFP5dgI8+2uMfnuGYgbuHivasKr9WSQ64sPej6m8rDoM1uSllXjQ==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@vaadin/vaadin-development-mode-detector": "^2.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, "node_modules/@vitejs/plugin-vue": { "version": "5.2.4", "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", @@ -1265,48 +878,6 @@ "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==", "license": "MIT" }, - "node_modules/@webcomponents/shadycss": { - "version": "1.11.2", - "resolved": "https://registry.npmmirror.com/@webcomponents/shadycss/-/shadycss-1.11.2.tgz", - "integrity": "sha512-vRq+GniJAYSBmTRnhCYPAPq6THYqovJ/gzGThWbgEZUQaBccndGTi1hdiUP15HzEco0I6t4RCtXyX0rsSmwgPw==", - "license": "BSD-3-Clause" - }, - "node_modules/@zip.js/zip.js": { - "version": "2.7.70", - "resolved": "https://registry.npmmirror.com/@zip.js/zip.js/-/zip.js-2.7.70.tgz", - "integrity": "sha512-GkUtNfhrfR90xurdCUtFI6yDqlTI70dMolOZuyDAVNxvgn0uv8qvoGzbyYWcfkfTYBKNR4NJs6poQE/cr1pW3A==", - "license": "BSD-3-Clause", - "engines": { - "bun": ">=0.7.0", - "deno": ">=1.0.0", - "node": ">=16.5.0" - } - }, - "node_modules/color": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/color/-/color-5.0.0.tgz", - "integrity": "sha512-16BlyiuyLq3MLxpRWyOTiWsO3ii/eLQLJUQXBSNcxMBBSnyt1ee9YUdaozQp03ifwm5woztEZGDbk9RGVuCsdw==", - "license": "MIT", - "dependencies": { - "color-convert": "^3.0.1", - "color-string": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/color-convert": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-3.1.0.tgz", - "integrity": "sha512-TVoqAq8ZDIpK5lsQY874DDnu65CSsc9vzq0wLpNQ6UMBq81GSZocVazPiBbYGzngzBOIRahpkTzCLVe2at4MfA==", - "license": "MIT", - "dependencies": { - "color-name": "^2.0.0" - }, - "engines": { - "node": ">=14.6" - } - }, "node_modules/color-name": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/color-name/-/color-name-2.0.0.tgz", @@ -1316,38 +887,30 @@ "node": ">=12.20" } }, - "node_modules/color-string": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-string/-/color-string-2.0.1.tgz", - "integrity": "sha512-5z9FbYTZPAo8iKsNEqRNv+OlpBbDcoE+SY9GjLfDUHEfcNNV7tS9eSAlFHEaub/r5tBL9LtskAeq1l9SaoZ5tQ==", + "node_modules/color-parse": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/color-parse/-/color-parse-2.0.2.tgz", + "integrity": "sha512-eCtOz5w5ttWIUcaKLiktF+DxZO1R9KLNY/xhbV6CkhM7sR3GhVghmt6X6yOnzeaM24po+Z9/S1apbXMwA3Iepw==", "license": "MIT", "dependencies": { "color-name": "^2.0.0" - }, - "engines": { - "node": ">=18" } }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT" - }, - "node_modules/composed-offset-position": { - "version": "0.0.6", - "resolved": "https://registry.npmmirror.com/composed-offset-position/-/composed-offset-position-0.0.6.tgz", - "integrity": "sha512-Q7dLompI6lUwd7LWyIcP66r4WcS9u7AL2h8HaeipiRfCRPLMWqRx8fYsjb4OHi6UQFifO7XtNC2IlEJ1ozIFxw==", + "node_modules/color-rgba": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/color-rgba/-/color-rgba-3.0.0.tgz", + "integrity": "sha512-PPwZYkEY3M2THEHHV6Y95sGUie77S7X8v+h1r6LSAPF3/LL2xJ8duUXSrkic31Nzc4odPwHgUbiX/XuTYzQHQg==", "license": "MIT", - "peerDependencies": { - "@floating-ui/utils": "^0.2.5" + "dependencies": { + "color-parse": "^2.0.0", + "color-space": "^2.0.0" } }, - "node_modules/cssfilter": { - "version": "0.0.10", - "resolved": "https://registry.npmmirror.com/cssfilter/-/cssfilter-0.0.10.tgz", - "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==", - "license": "MIT" + "node_modules/color-space": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/color-space/-/color-space-2.3.2.tgz", + "integrity": "sha512-BcKnbOEsOarCwyoLstcoEztwT0IJxqqQkNwDuA3a65sICvvHL2yoeV13psoDFh5IuiOMnIOKdQDwB4Mk3BypiA==", + "license": "Unlicense" }, "node_modules/csstype": { "version": "3.1.3", @@ -1355,33 +918,11 @@ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "license": "MIT" }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/dayjs": { - "version": "1.11.13", - "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz", - "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", - "license": "MIT" - }, - "node_modules/enhanced-resolve": { - "version": "5.18.2", - "resolved": "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", - "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } + "node_modules/earcut": { + "version": "2.2.4", + "resolved": "https://registry.npmmirror.com/earcut/-/earcut-2.2.4.tgz", + "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==", + "license": "ISC" }, "node_modules/entities": { "version": "4.5.0", @@ -1440,50 +981,6 @@ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "license": "MIT" }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmmirror.com/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "license": "MIT", - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" - } - }, - "node_modules/focus-trap": { - "version": "7.6.5", - "resolved": "https://registry.npmmirror.com/focus-trap/-/focus-trap-7.6.5.tgz", - "integrity": "sha512-7Ke1jyybbbPZyZXFxEftUtxFGLMpE2n6A+z//m4CRDlj0hW+o3iYSmh8nFlYMurOiJVDmJRilUQtJr08KfIxlg==", - "license": "MIT", - "dependencies": { - "tabbable": "^6.2.0" - } - }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmmirror.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "license": "MIT", - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", @@ -1499,67 +996,51 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/interactjs": { - "version": "1.10.27", - "resolved": "https://registry.npmmirror.com/interactjs/-/interactjs-1.10.27.tgz", - "integrity": "sha512-y/8RcCftGAF24gSp76X2JS3XpHiUvDQyhF8i7ujemBz77hwiHDuJzftHx7thY8cxGogwGiPJ+o97kWB6eAXnsA==", + "node_modules/geotiff": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/geotiff/-/geotiff-2.1.3.tgz", + "integrity": "sha512-PT6uoF5a1+kbC3tHmZSUsLHBp2QJlHasxxxxPW47QIY1VBKpFB+FcDvX+MxER6UzgLQZ0xDzJ9s48B9JbOCTqA==", "license": "MIT", "dependencies": { - "@interactjs/types": "1.10.27" - } - }, - "node_modules/lit": { - "version": "3.3.1", - "resolved": "https://registry.npmmirror.com/lit/-/lit-3.3.1.tgz", - "integrity": "sha512-Ksr/8L3PTapbdXJCk+EJVB78jDodUMaP54gD24W186zGRARvwrsPfS60wae/SSCTCNZVPd1chXqio1qHQmu4NA==", - "license": "BSD-3-Clause", - "dependencies": { - "@lit/reactive-element": "^2.1.0", - "lit-element": "^4.2.0", - "lit-html": "^3.3.0" - } - }, - "node_modules/lit-element": { - "version": "4.2.1", - "resolved": "https://registry.npmmirror.com/lit-element/-/lit-element-4.2.1.tgz", - "integrity": "sha512-WGAWRGzirAgyphK2urmYOV72tlvnxw7YfyLDgQ+OZnM9vQQBQnumQ7jUJe6unEzwGU3ahFOjuz1iz1jjrpCPuw==", - "license": "BSD-3-Clause", - "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.4.0", - "@lit/reactive-element": "^2.1.0", - "lit-html": "^3.3.0" - } - }, - "node_modules/lit-html": { - "version": "3.3.1", - "resolved": "https://registry.npmmirror.com/lit-html/-/lit-html-3.3.1.tgz", - "integrity": "sha512-S9hbyDu/vs1qNrithiNyeyv64c9yqiW9l+DBgI18fL+MTvOtWoFR0FWiyq1TxaYef5wNlpEmzlXoBlZEO+WjoA==", - "license": "BSD-3-Clause", - "dependencies": { - "@types/trusted-types": "^2.0.2" - } - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "license": "MIT" - }, - "node_modules/luxon": { - "version": "3.6.1", - "resolved": "https://registry.npmmirror.com/luxon/-/luxon-3.6.1.tgz", - "integrity": "sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==", - "license": "MIT", + "@petamoriken/float16": "^3.4.7", + "lerc": "^3.0.0", + "pako": "^2.0.4", + "parse-headers": "^2.0.2", + "quick-lru": "^6.1.1", + "web-worker": "^1.2.0", + "xml-utils": "^1.0.2", + "zstddec": "^0.1.0" + }, "engines": { - "node": ">=12" + "node": ">=10.19" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/lerc": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/lerc/-/lerc-3.0.0.tgz", + "integrity": "sha512-Rm4J/WaHhRa93nCN2mwWDZFoRVF18G1f47C+kvQWyHGEZxFpTUi73p7lMVSAndyxGt6lJ2/CFbOcf9ra5p8aww==", + "license": "Apache-2.0" + }, "node_modules/magic-string": { "version": "0.30.17", "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.17.tgz", @@ -1569,18 +1050,6 @@ "@jridgewell/sourcemap-codec": "^1.5.0" } }, - "node_modules/marked": { - "version": "15.0.12", - "resolved": "https://registry.npmmirror.com/marked/-/marked-15.0.12.tgz", - "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 18" - } - }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz", @@ -1599,66 +1068,47 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "deprecated": "Use your platform's native DOMException instead", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "license": "MIT", - "engines": { - "node": ">=10.5.0" - } - }, - "node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "license": "MIT", + "node_modules/ol": { + "version": "8.2.0", + "resolved": "https://registry.npmmirror.com/ol/-/ol-8.2.0.tgz", + "integrity": "sha512-/m1ddd7Jsp4Kbg+l7+ozR5aKHAZNQOBAoNZ5pM9Jvh4Etkf0WGkXr9qXd7PnhmwiC1Hnc2Toz9XjCzBBvexfXw==", + "license": "BSD-2-Clause", "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "color-rgba": "^3.0.0", + "color-space": "^2.0.1", + "earcut": "^2.2.3", + "geotiff": "^2.0.7", + "pbf": "3.2.1", + "rbush": "^3.0.1" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/node-fetch" + "url": "https://opencollective.com/openlayers" } }, - "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmmirror.com/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "license": "MIT", + "node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", + "license": "(MIT AND Zlib)" + }, + "node_modules/parse-headers": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/parse-headers/-/parse-headers-2.0.6.tgz", + "integrity": "sha512-Tz11t3uKztEW5FEVZnj1ox8GKblWn+PvHY9TmJV5Mll2uHEwRdR/5Li1OlXoECjLYkApdhWy44ocONwXLiKO5A==", + "license": "MIT" + }, + "node_modules/pbf": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/pbf/-/pbf-3.2.1.tgz", + "integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==", + "license": "BSD-3-Clause", "dependencies": { - "entities": "^6.0.0" + "ieee754": "^1.1.12", + "resolve-protobuf-schema": "^2.1.0" }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "bin": { + "pbf": "bin/pbf" } }, "node_modules/picocolors": { @@ -1695,6 +1145,48 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/protocol-buffers-schema": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", + "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==", + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "6.1.2", + "resolved": "https://registry.npmmirror.com/quick-lru/-/quick-lru-6.1.2.tgz", + "integrity": "sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/quickselect": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/quickselect/-/quickselect-2.0.0.tgz", + "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==", + "license": "ISC" + }, + "node_modules/rbush": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/rbush/-/rbush-3.0.1.tgz", + "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==", + "license": "MIT", + "dependencies": { + "quickselect": "^2.0.0" + } + }, + "node_modules/resolve-protobuf-schema": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", + "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", + "license": "MIT", + "dependencies": { + "protocol-buffers-schema": "^3.3.1" + } + }, "node_modules/rollup": { "version": "4.46.2", "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.46.2.tgz", @@ -1735,12 +1227,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/sortablejs": { - "version": "1.15.6", - "resolved": "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.15.6.tgz", - "integrity": "sha512-aNfiuwMEpfBM/CN6LY0ibyhxPfPbyFeBTYJKCvzkJ2GkUpazIt3H+QIPAMHwqQ7tMKaHz1Qj+rJJCqljnf4p3A==", - "license": "MIT" - }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", @@ -1750,48 +1236,6 @@ "node": ">=0.10.0" } }, - "node_modules/tabbable": { - "version": "6.2.0", - "resolved": "https://registry.npmmirror.com/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", - "license": "MIT" - }, - "node_modules/tapable": { - "version": "2.2.2", - "resolved": "https://registry.npmmirror.com/tapable/-/tapable-2.2.2.tgz", - "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/timezone-groups": { - "version": "0.10.4", - "resolved": "https://registry.npmmirror.com/timezone-groups/-/timezone-groups-0.10.4.tgz", - "integrity": "sha512-AnkJYrbb7uPkDCEqGeVJiawZNiwVlSkkeX4jZg1gTEguClhyX+/Ezn07KB6DT29tG3UN418ldmS/W6KqGOTDjg==", - "license": "MIT", - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/undici-types": { "version": "7.8.0", "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-7.8.0.tgz", @@ -1882,30 +1326,23 @@ } } }, - "node_modules/web-streams-polyfill": { - "version": "3.3.3", - "resolved": "https://registry.npmmirror.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", - "license": "MIT", - "engines": { - "node": ">= 8" - } + "node_modules/web-worker": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/web-worker/-/web-worker-1.5.0.tgz", + "integrity": "sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==", + "license": "Apache-2.0" }, - "node_modules/xss": { - "version": "1.0.13", - "resolved": "https://registry.npmmirror.com/xss/-/xss-1.0.13.tgz", - "integrity": "sha512-clu7dxTm1e8Mo5fz3n/oW3UCXBfV89xZ72jM8yzo1vR/pIS0w3sgB3XV2H8Vm6zfGnHL0FzvLJPJEBhd86/z4Q==", - "license": "MIT", - "dependencies": { - "commander": "^2.20.3", - "cssfilter": "0.0.10" - }, - "bin": { - "xss": "bin/xss" - }, - "engines": { - "node": ">= 0.10.0" - } + "node_modules/xml-utils": { + "version": "1.10.2", + "resolved": "https://registry.npmmirror.com/xml-utils/-/xml-utils-1.10.2.tgz", + "integrity": "sha512-RqM+2o1RYs6T8+3DzDSoTRAUfrvaejbVHcp3+thnAtDKo8LskR+HomLajEy5UjTz24rpka7AxVBRR3g2wTUkJA==", + "license": "CC0-1.0" + }, + "node_modules/zstddec": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/zstddec/-/zstddec-0.1.0.tgz", + "integrity": "sha512-w2NTI8+3l3eeltKAdK8QpiLo/flRAr2p8AGeakfMZOXBxOg9HIu4LVDxBi81sYgVhFhdJjv1OrB5ssI8uFPoLg==", + "license": "MIT AND BSD-3-Clause" } } } diff --git a/package.json b/package.json index 5b1b268..7a17edd 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "preview": "vite preview" }, "dependencies": { - "@arcgis/core": "^4.33.11", + "ol": "^8.2.0", "vue": "^3.4.0" }, "devDependencies": { diff --git a/src/components/SplitScreenMap.vue b/src/components/SplitScreenMap.vue index 1592fe3..386d803 100644 --- a/src/components/SplitScreenMap.vue +++ b/src/components/SplitScreenMap.vue @@ -46,79 +46,42 @@ @@ -312,20 +271,4 @@ onUnmounted(() => { font-size: 13px; } } - -/* 分屏小部件样式定制 */ -:global(.esri-swipe__container) { - border: 2px solid #007ac8 !important; -} - -:global(.esri-swipe__divider) { - background-color: #007ac8 !important; - width: 4px !important; -} - -:global(.esri-swipe__divider::before) { - background-color: #005a96 !important; - border: 2px solid white !important; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3) !important; -} \ No newline at end of file diff --git a/src/components/TiandituMap.vue b/src/components/TiandituMap.vue index eebf6e1..34acde4 100644 --- a/src/components/TiandituMap.vue +++ b/src/components/TiandituMap.vue @@ -22,62 +22,46 @@ diff --git a/src/config/tianditu.js b/src/config/tianditu.js index 6b6a383..fc3ccdd 100644 --- a/src/config/tianditu.js +++ b/src/config/tianditu.js @@ -7,27 +7,30 @@ export const TIANDITU_CONFIG = { // 如果没有API Key,地图将无法正常显示 API_KEY: '4559200347e75489c4474f5b11846368', - // 天地图服务URL配置 + // 天地图服务URL配置 (使用子域名轮询) SERVICES: { // 矢量底图 - VECTOR: 'http://t{subDomain}.tianditu.gov.cn/vec_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=vec&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={level}&TILEROW={row}&TILECOL={col}&tk={key}', + VECTOR: 'http://t{0-7}.tianditu.gov.cn/vec_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=vec&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk={key}', // 矢量注记 - VECTOR_ANNOTATION: 'http://t{subDomain}.tianditu.gov.cn/cva_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cva&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={level}&TILEROW={row}&TILECOL={col}&tk={key}', + VECTOR_ANNOTATION: 'http://t{0-7}.tianditu.gov.cn/cva_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cva&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk={key}', // 影像底图 - SATELLITE: 'http://t{subDomain}.tianditu.gov.cn/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={level}&TILEROW={row}&TILECOL={col}&tk={key}', + SATELLITE: 'http://t{0-7}.tianditu.gov.cn/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk={key}', // 影像注记 - SATELLITE_ANNOTATION: 'http://t{subDomain}.tianditu.gov.cn/cia_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cia&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={level}&TILEROW={row}&TILECOL={col}&tk={key}' + SATELLITE_ANNOTATION: 'http://t{0-7}.tianditu.gov.cn/cia_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cia&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk={key}' }, // 服务器子域名 SUB_DOMAINS: ['0', '1', '2', '3', '4', '5', '6', '7'], - // 默认地图中心点(北京) - DEFAULT_CENTER: [116.4074, 39.9042], + // 默认地图中心点(上海) + DEFAULT_CENTER: [121.4737, 31.2304], // 默认缩放级别 - DEFAULT_ZOOM: 10 + DEFAULT_ZOOM: 14, + + // OpenLayers 投影配置 + PROJECTION: 'EPSG:4326' } \ No newline at end of file diff --git a/src/utils/splitScreen.js b/src/utils/splitScreen.js index 9bde3bc..0e7bcf3 100644 --- a/src/utils/splitScreen.js +++ b/src/utils/splitScreen.js @@ -1,68 +1,300 @@ -// splitScreen.js - 分屏地图工具类 +// splitScreen.js - OpenLayers 分屏地图工具类 // 提供分屏地图的创建、管理和控制功能 -import Swipe from '@arcgis/core/widgets/Swipe' +import Map from 'ol/Map' +import View from 'ol/View' +import TileLayer from 'ol/layer/Tile' +import XYZ from 'ol/source/XYZ' +import { fromLonLat } from 'ol/proj' /** * 分屏地图管理器 */ export class SplitScreenManager { - constructor(view) { - this.view = view - this.swipeWidget = null + constructor(container, options = {}) { + this.container = container + this.options = { + center: [116.4074, 39.9042], + zoom: 10, + ...options + } + + this.leftMap = null + this.rightMap = null this.isVertical = true this.position = 50 this.leadingLayers = [] this.trailingLayers = [] + this.splitElement = null + + this.init() } /** - * 创建分屏小部件 - * @param {Array} leadingLayers - 前景图层(右侧/下方显示) - * @param {Array} trailingLayers - 背景图层(左侧/上方显示) - * @param {Object} options - 配置选项 + * 初始化分屏地图 */ - createSwipe(leadingLayers = [], trailingLayers = [], options = {}) { - // 如果已存在分屏小部件,先销毁 - this.destroySwipe() + init() { + // 创建容器结构 + this.createContainerStructure() + + // 创建左侧地图 + this.leftMap = this.createMap(this.leftContainer, this.options) + + // 创建右侧地图 + this.rightMap = this.createMap(this.rightContainer, this.options) + + // 同步地图视图 + this.syncMaps() + + // 创建分割线 + this.createSplitLine() + } - // 保存图层引用 + /** + * 创建容器结构 + */ + createContainerStructure() { + // 清空容器 + this.container.innerHTML = '' + + if (this.isVertical) { + // 垂直分割 + // 创建左侧容器 + this.leftContainer = document.createElement('div') + this.leftContainer.className = 'split-left' + this.leftContainer.style.cssText = ` + position: absolute; + top: 0; + left: 0; + width: ${this.position}%; + height: 100%; + overflow: hidden; + ` + + // 创建右侧容器 + this.rightContainer = document.createElement('div') + this.rightContainer.className = 'split-right' + this.rightContainer.style.cssText = ` + position: absolute; + top: 0; + left: ${this.position}%; + width: ${100 - this.position}%; + height: 100%; + overflow: hidden; + ` + + // 创建分割线 + this.splitElement = document.createElement('div') + this.splitElement.className = 'split-line' + this.splitElement.style.cssText = ` + position: absolute; + top: 0; + left: ${this.position}%; + width: 4px; + height: 100%; + background: #007ac8; + cursor: col-resize; + z-index: 1000; + box-shadow: 0 0 10px rgba(0, 122, 200, 0.5); + ` + } else { + // 水平分割 + // 创建上方容器 + this.leftContainer = document.createElement('div') + this.leftContainer.className = 'split-top' + this.leftContainer.style.cssText = ` + position: absolute; + top: 0; + left: 0; + width: 100%; + height: ${this.position}%; + overflow: hidden; + ` + + // 创建下方容器 + this.rightContainer = document.createElement('div') + this.rightContainer.className = 'split-bottom' + this.rightContainer.style.cssText = ` + position: absolute; + top: ${this.position}%; + left: 0; + width: 100%; + height: ${100 - this.position}%; + overflow: hidden; + ` + + // 创建分割线 + this.splitElement = document.createElement('div') + this.splitElement.className = 'split-line' + this.splitElement.style.cssText = ` + position: absolute; + top: ${this.position}%; + left: 0; + width: 100%; + height: 4px; + background: #007ac8; + cursor: row-resize; + z-index: 1000; + box-shadow: 0 0 10px rgba(0, 122, 200, 0.5); + ` + } + + // 添加拖拽功能 + this.addDragFunctionality() + + // 添加到容器 + this.container.appendChild(this.leftContainer) + this.container.appendChild(this.rightContainer) + this.container.appendChild(this.splitElement) + } + + /** + * 创建地图 + */ + createMap(container, options) { + return new Map({ + target: container, + view: new View({ + center: fromLonLat(options.center), + zoom: options.zoom + }), + controls: [] + }) + } + + /** + * 同步地图视图 + */ + syncMaps() { + if (!this.leftMap || !this.rightMap) return + + // 同步左侧地图到右侧 + this.leftMap.getView().on('change', () => { + const view = this.leftMap.getView() + this.rightMap.getView().setCenter(view.getCenter()) + this.rightMap.getView().setZoom(view.getZoom()) + this.rightMap.getView().setRotation(view.getRotation()) + }) + + // 同步右侧地图到左侧 + this.rightMap.getView().on('change', () => { + const view = this.rightMap.getView() + this.leftMap.getView().setCenter(view.getCenter()) + this.leftMap.getView().setZoom(view.getZoom()) + this.leftMap.getView().setRotation(view.getRotation()) + }) + } + + /** + * 添加拖拽功能 + */ + addDragFunctionality() { + let isDragging = false + let startX = 0 + let startY = 0 + let startPosition = 0 + + const startDrag = (e) => { + isDragging = true + startX = e.clientX + startY = e.clientY + startPosition = this.position + document.body.style.cursor = this.isVertical ? 'col-resize' : 'row-resize' + document.addEventListener('mousemove', drag) + document.addEventListener('mouseup', stopDrag) + } + + const drag = (e) => { + if (!isDragging) return + + if (this.isVertical) { + // 垂直分割 - 水平拖拽 + const deltaX = e.clientX - startX + const containerWidth = this.container.offsetWidth + const newPosition = Math.max(10, Math.min(90, startPosition + (deltaX / containerWidth) * 100)) + this.setPosition(newPosition) + } else { + // 水平分割 - 垂直拖拽 + const deltaY = e.clientY - startY + const containerHeight = this.container.offsetHeight + const newPosition = Math.max(10, Math.min(90, startPosition + (deltaY / containerHeight) * 100)) + this.setPosition(newPosition) + } + } + + const stopDrag = () => { + isDragging = false + document.body.style.cursor = '' + document.removeEventListener('mousemove', drag) + document.removeEventListener('mouseup', stopDrag) + } + + this.splitElement.addEventListener('mousedown', startDrag) + } + + /** + * 创建分割线 + */ + createSplitLine() { + this.updateSplitPosition() + } + + /** + * 更新分割位置 + */ + updateSplitPosition() { + if (!this.leftContainer || !this.rightContainer || !this.splitElement) return + + if (this.isVertical) { + this.leftContainer.style.width = `${this.position}%` + this.rightContainer.style.left = `${this.position}%` + this.rightContainer.style.width = `${100 - this.position}%` + this.splitElement.style.left = `${this.position}%` + } else { + this.leftContainer.style.height = `${this.position}%` + this.rightContainer.style.top = `${this.position}%` + this.rightContainer.style.height = `${100 - this.position}%` + this.splitElement.style.top = `${this.position}%` + } + + // 重新渲染地图 + if (this.leftMap) this.leftMap.updateSize() + if (this.rightMap) this.rightMap.updateSize() + } + + /** + * 创建天地图图层 + */ + createTiandituLayer(url, apiKey) { + return new TileLayer({ + source: new XYZ({ + url: url.replace('{key}', apiKey), + tileGrid: undefined, + crossOrigin: 'anonymous' + }) + }) + } + + /** + * 设置图层 + */ + setLayers(leadingLayers = [], trailingLayers = []) { this.leadingLayers = leadingLayers this.trailingLayers = trailingLayers - - // 合并默认配置 - const config = { - view: this.view, - leadingLayers: leadingLayers, - trailingLayers: trailingLayers, - direction: options.direction || (this.isVertical ? 'vertical' : 'horizontal'), - position: options.position || this.position, - ...options - } - - // 创建分屏小部件 - this.swipeWidget = new Swipe(config) - - // 添加到视图 - this.view.ui.add(this.swipeWidget) - - // 监听位置变化 - this.swipeWidget.watch('position', (newPosition) => { - this.position = newPosition + + // 清空现有图层 + this.leftMap.getLayers().clear() + this.rightMap.getLayers().clear() + + // 添加图层到左侧地图(背景图层) + trailingLayers.forEach(layer => { + this.leftMap.addLayer(layer) + }) + + // 添加图层到右侧地图(前景图层) + leadingLayers.forEach(layer => { + this.rightMap.addLayer(layer) }) - - return this.swipeWidget - } - - /** - * 销毁分屏小部件 - */ - destroySwipe() { - if (this.swipeWidget) { - this.view.ui.remove(this.swipeWidget) - this.swipeWidget.destroy() - this.swipeWidget = null - } } /** @@ -71,12 +303,19 @@ export class SplitScreenManager { toggleDirection() { this.isVertical = !this.isVertical - if (this.swipeWidget) { - // 重新创建分屏小部件 - this.createSwipe(this.leadingLayers, this.trailingLayers, { - direction: this.isVertical ? 'vertical' : 'horizontal', - position: this.position - }) + // 重新创建容器结构 + this.createContainerStructure() + + // 重新创建地图 + this.leftMap = this.createMap(this.leftContainer, this.options) + this.rightMap = this.createMap(this.rightContainer, this.options) + + // 同步地图视图 + this.syncMaps() + + // 重新设置图层 + if (this.leadingLayers.length > 0 || this.trailingLayers.length > 0) { + this.setLayers(this.leadingLayers, this.trailingLayers) } return this.isVertical @@ -84,15 +323,10 @@ export class SplitScreenManager { /** * 设置分割线位置 - * @param {number} position - 位置百分比 (0-100) */ setPosition(position) { - this.position = Math.max(0, Math.min(100, position)) - - if (this.swipeWidget) { - this.swipeWidget.position = this.position - } - + this.position = Math.max(10, Math.min(90, position)) + this.updateSplitPosition() return this.position } @@ -118,55 +352,21 @@ export class SplitScreenManager { } /** - * 更新前景图层 - * @param {Array} layers - 新的前景图层 + * 销毁分屏地图 */ - updateLeadingLayers(layers) { - this.leadingLayers = layers - if (this.swipeWidget) { - this.swipeWidget.leadingLayers = layers + destroy() { + if (this.leftMap) { + this.leftMap.setTarget(undefined) + this.leftMap = null + } + if (this.rightMap) { + this.rightMap.setTarget(undefined) + this.rightMap = null + } + if (this.container) { + this.container.innerHTML = '' } } - - /** - * 更新背景图层 - * @param {Array} layers - 新的背景图层 - */ - updateTrailingLayers(layers) { - this.trailingLayers = layers - if (this.swipeWidget) { - this.swipeWidget.trailingLayers = layers - } - } - - /** - * 检查分屏小部件是否存在 - */ - isActive() { - return this.swipeWidget !== null - } -} - -/** - * 创建天地图分屏对比 - * @param {MapView} view - 地图视图 - * @param {Object} vectorLayers - 矢量图层 {base, annotation} - * @param {Object} satelliteLayers - 影像图层 {base, annotation} - * @param {Object} options - 配置选项 - */ -export function createTiandituSplitScreen(view, vectorLayers, satelliteLayers, options = {}) { - const manager = new SplitScreenManager(view) - - // 设置影像图层为前景(右侧/下方) - const leadingLayers = [satelliteLayers.base, satelliteLayers.annotation].filter(Boolean) - - // 矢量图层作为背景(左侧/上方) - const trailingLayers = [vectorLayers.base, vectorLayers.annotation].filter(Boolean) - - // 创建分屏 - manager.createSwipe(leadingLayers, trailingLayers, options) - - return manager } /** @@ -209,11 +409,9 @@ export class SplitScreenAnimator { /** * 动画移动分割线 - * @param {number} targetPosition - 目标位置 - * @param {number} duration - 动画时长(ms) */ async animateToPosition(targetPosition, duration = 1000) { - if (this.isAnimating || !this.manager.isActive()) { + if (this.isAnimating) { return false } @@ -256,7 +454,7 @@ export class SplitScreenAnimator { * 摆动动画 */ async wiggle(amplitude = 10, cycles = 3, duration = 1000) { - if (this.isAnimating || !this.manager.isActive()) { + if (this.isAnimating) { return false } diff --git a/src/utils/tiandituLayers.js b/src/utils/tiandituLayers.js new file mode 100644 index 0000000..b89c6a4 --- /dev/null +++ b/src/utils/tiandituLayers.js @@ -0,0 +1,83 @@ +// 天地图图层工具函数 +import TileLayer from 'ol/layer/Tile' +import XYZ from 'ol/source/XYZ' +import { TIANDITU_CONFIG } from '../config/tianditu.js' + +// 子域名计数器,用于轮询 +let subdomainCounter = 0 + +/** + * 获取下一个子域名 + * @returns {string} 子域名 + */ +function getNextSubdomain() { + const subdomain = TIANDITU_CONFIG.SUB_DOMAINS[subdomainCounter % TIANDITU_CONFIG.SUB_DOMAINS.length] + subdomainCounter++ + return subdomain +} + +/** + * 创建天地图图层 + * @param {string} serviceType - 服务类型 ('vector', 'satellite', 'vector_annotation', 'satellite_annotation') + * @param {string} id - 图层ID + * @returns {TileLayer} OpenLayers 图层 + */ +export function createTiandituLayer(serviceType, id) { + const serviceMap = { + 'vector': 'vec_w', + 'satellite': 'img_w', + 'vector_annotation': 'cva_w', + 'satellite_annotation': 'cia_w' + } + + const layerType = serviceMap[serviceType] + if (!layerType) { + throw new Error(`未知的服务类型: ${serviceType}`) + } + + // 获取图层名称 + const layerName = serviceType === 'vector' ? 'vec' : + serviceType === 'satellite' ? 'img' : + serviceType === 'vector_annotation' ? 'cva' : 'cia' + + return new TileLayer({ + id: id, + source: new XYZ({ + tileUrlFunction: function(tileCoord) { + if (!tileCoord) return undefined + + const z = tileCoord[0] + const x = tileCoord[1] + const y = tileCoord[2] + + // 使用轮询的子域名 + const subdomain = getNextSubdomain() + + return `http://t${subdomain}.tianditu.gov.cn/${layerType}/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=${layerName}&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX=${z}&TILEROW=${y}&TILECOL=${x}&tk=${TIANDITU_CONFIG.API_KEY}` + }, + crossOrigin: 'anonymous' + }) + }) +} + +/** + * 创建矢量地图图层组 + * @returns {Array} 图层数组 [底图, 注记] + */ +export function createVectorLayers() { + return [ + createTiandituLayer('vector', 'vector'), + createTiandituLayer('vector_annotation', 'vector-annotation') + ] +} + +/** + * 创建影像地图图层组 + * @returns {Array} 图层数组 [底图, 注记] + */ +export function createSatelliteLayers() { + return [ + createTiandituLayer('satellite', 'satellite'), + createTiandituLayer('satellite_annotation', 'satellite-annotation') + ] +} \ No newline at end of file diff --git a/vite.config.js b/vite.config.js index 5e41d27..55c8c73 100644 --- a/vite.config.js +++ b/vite.config.js @@ -4,14 +4,6 @@ import vue from '@vitejs/plugin-vue' // https://vitejs.dev/config/ export default defineConfig({ plugins: [vue()], - define: { - // 解决ArcGIS API中的process.env问题 - 'process.env': {} - }, - optimizeDeps: { - // 排除ArcGIS模块从预构建中,因为它们已经是优化的 - exclude: ['@arcgis/core'] - }, server: { // 允许从外部域加载资源 cors: true