diff --git a/.eslintrc.cjs b/.eslintrc.cjs index d6c9537..6e8698b 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -2,17 +2,17 @@ module.exports = { root: true, env: { browser: true, es2020: true }, extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:react-hooks/recommended', + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:react-hooks/recommended", ], - ignorePatterns: ['dist', '.eslintrc.cjs'], - parser: '@typescript-eslint/parser', - plugins: ['react-refresh'], + ignorePatterns: ["dist", ".eslintrc.cjs"], + parser: "@typescript-eslint/parser", + plugins: ["react-refresh"], rules: { - 'react-refresh/only-export-components': [ - 'warn', + "react-refresh/only-export-components": [ + "warn", { allowConstantExport: true }, ], }, -} +}; diff --git a/index.html b/index.html index e4b78ea..fd32c6e 100644 --- a/index.html +++ b/index.html @@ -2,9 +2,13 @@ - + - Vite + React + TS + 遥感产品数据云
diff --git a/package-lock.json b/package-lock.json index 124be42..67d91a9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,13 +8,20 @@ "name": "landcover", "version": "0.0.0", "dependencies": { - "@antv/l7": "^2.20.5", - "@antv/larkmap": "^1.4.10", + "@antv/l7": "^2.11.0", + "@antv/l7-draw": "^3.1.0", + "@antv/larkmap": "^1.4.4", + "@turf/turf": "^6.5.0", + "@types/turf": "^3.5.32", "antd": "^5.12.2", + "lodash": "^4.17.21", "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "react-router-dom": "^6.21.0" }, "devDependencies": { + "@types/lodash": "^4.14.202", + "@types/node": "^20.10.5", "@types/react": "^18.2.43", "@types/react-dom": "^18.2.17", "@typescript-eslint/eslint-plugin": "^6.14.0", @@ -24,6 +31,7 @@ "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.5", "less": "^4.2.0", + "prettier": "^3.1.1", "typescript": "^5.2.2", "vite": "^5.0.8" } @@ -139,9 +147,9 @@ "integrity": "sha512-4ddpsiHN9Pd4UIlWuKVK1C4IiZIdbwQvy9i7DUSI3xNJ89FPUFt8lxDYj8GzzfdllV0NkJTRxnG+FvLk0llidg==" }, "node_modules/@antv/g-device-api": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/@antv/g-device-api/-/g-device-api-1.4.8.tgz", - "integrity": "sha512-V92kMQtBo8y7UzKPRaUwEBpU9m32POF55bcNCB6cqbVBCy5wjq/crfxJo3PD1Lmy+mxonUKBGQto7OCnrjIMbA==", + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/@antv/g-device-api/-/g-device-api-1.4.10.tgz", + "integrity": "sha512-csPzj91BPZinnjTvQ1CURkq9auuo0Wl5nD1xGfWZmpUnQQwZzEUQiBvLdU8LtCoS4nkcJ9GNvZ7d06IEYZfHhg==", "dependencies": { "@antv/util": "^3.3.4", "@webgpu/types": "^0.1.34", @@ -150,76 +158,59 @@ "tslib": "^2.5.3" } }, + "node_modules/@antv/g-device-api/node_modules/@antv/util": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@antv/util/-/util-3.3.5.tgz", + "integrity": "sha512-bVv1loamL/MgUEN9dNt7VKAsghO4Wgb+kzr8B9TgkM5tHgKk++xiTwi3pejIdgU8DDkzcyaRsO+VTOXJt8jLng==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "flru": "^1.0.2", + "gl-matrix": "^3.3.0", + "tslib": "^2.3.1" + } + }, "node_modules/@antv/g-device-api/node_modules/eventemitter3": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" }, "node_modules/@antv/l7": { - "version": "2.20.5", - "resolved": "https://registry.npmjs.org/@antv/l7/-/l7-2.20.5.tgz", - "integrity": "sha512-3r9lQQHhhE8GIFbiDhSZmptq4m0BCfE9kHIH/eTPoatuOowIuZGfZ57utUUU73zYRWLf6SUBS3JP+/mLYSWGjA==", - "dependencies": { - "@antv/l7-component": "2.20.5", - "@antv/l7-core": "2.20.5", - "@antv/l7-layers": "2.20.5", - "@antv/l7-maps": "2.20.5", - "@antv/l7-scene": "2.20.5", - "@antv/l7-source": "2.20.5", - "@antv/l7-utils": "2.20.5", + "version": "2.20.9", + "resolved": "https://registry.npmjs.org/@antv/l7/-/l7-2.20.9.tgz", + "integrity": "sha512-4WQaaz0/eZkYc/48gR4h8O3Nq9Le8b4ghdHpiAHdOPK3AvUKr/GyAQcjkLK6g31IVZ0oiWD0sEvzKYk0pJqr/A==", + "dependencies": { + "@antv/l7-component": "2.20.9", + "@antv/l7-core": "2.20.9", + "@antv/l7-layers": "2.20.9", + "@antv/l7-maps": "2.20.9", + "@antv/l7-scene": "2.20.9", + "@antv/l7-source": "2.20.9", + "@antv/l7-utils": "2.20.9", "@babel/runtime": "^7.7.7", "webpack-bundle-analyzer": "^4.9.1" } }, "node_modules/@antv/l7-component": { - "version": "2.20.5", - "resolved": "https://registry.npmjs.org/@antv/l7-component/-/l7-component-2.20.5.tgz", - "integrity": "sha512-dXB8ROK5TrAB+HgjBQnG4oN6AgAcOVR0dTiW2ZnT2R7Xw7U+425rY6bz0ULpaBpUABQZGm+aYHsiGAVdDLQp6w==", + "version": "2.20.9", + "resolved": "https://registry.npmjs.org/@antv/l7-component/-/l7-component-2.20.9.tgz", + "integrity": "sha512-FssjP+F1VZvauRR9wlUBSxcBIYxcwvU1tEqZVIPzcQ/JayCjFaI4ea24u6kvN4qSIkl/RW+4ZnTaR66ztnHqHw==", "dependencies": { - "@antv/l7-core": "2.20.5", - "@antv/l7-utils": "2.20.5", + "@antv/l7-core": "2.20.9", + "@antv/l7-utils": "2.20.9", "@babel/runtime": "^7.7.7", "eventemitter3": "^4.0.0", "inversify": "^5.0.1", - "reflect-metadata": "^0.1.13", + "reflect-metadata": "^0.2.1", "supercluster": "^7.0.0" } }, - "node_modules/@antv/l7-composite-layers": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/@antv/l7-composite-layers/-/l7-composite-layers-0.16.4.tgz", - "integrity": "sha512-LgFLPfcNHXmQHUXxRlVGQevSRXCNHXjS7h6rrCcXOKJNNvGOn5bilqKHFHqxoareAXy8WTg+gKKcxUdObNcZUg==", - "dependencies": { - "@antv/event-emitter": "^0.1.2", - "@antv/scale": "^0.4.12", - "@antv/util": "^2.0.14", - "@turf/bbox": "^6.5.0", - "@turf/bbox-polygon": "^6.5.0", - "@turf/transform-scale": "^6.5.0", - "kdbush": "^3.0.0", - "lodash-es": "^4.17.21", - "reselect": "^4.1.8" - }, - "peerDependencies": { - "@antv/l7": "^2.11.5" - } - }, - "node_modules/@antv/l7-composite-layers/node_modules/@antv/util": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/@antv/util/-/util-2.0.17.tgz", - "integrity": "sha512-o6I9hi5CIUvLGDhth0RxNSFDRwXeywmt6ExR4+RmVAzIi48ps6HUy+svxOCayvrPBN37uE6TAc2KDofRo0nK9Q==", - "dependencies": { - "csstype": "^3.0.8", - "tslib": "^2.0.3" - } - }, "node_modules/@antv/l7-core": { - "version": "2.20.5", - "resolved": "https://registry.npmjs.org/@antv/l7-core/-/l7-core-2.20.5.tgz", - "integrity": "sha512-szeERmOqW+GV6yY0QNd6A8f/s6IFI38WlnXRHOMMdtLu13zt/LRYaNOoZMWW0wAKa/icgTjy/fzqkuC83Sfrjg==", + "version": "2.20.9", + "resolved": "https://registry.npmjs.org/@antv/l7-core/-/l7-core-2.20.9.tgz", + "integrity": "sha512-PtwEvdqyw0asNTBCGNrUVs8TVb9Pbs+9XH47xG2SECSVUktpeIJEhbnnUHBl+hDqnqZK5+DlyZz8RslwOnsrQA==", "dependencies": { "@antv/async-hook": "^2.2.9", - "@antv/l7-utils": "2.20.5", + "@antv/l7-utils": "2.20.9", "@babel/runtime": "^7.7.7", "@mapbox/tiny-sdf": "^1.2.5", "@turf/helpers": "^6.1.4", @@ -230,7 +221,7 @@ "hammerjs": "^2.0.8", "inversify": "^5.0.1", "inversify-inject-decorators": "^3.1.0", - "reflect-metadata": "^0.1.13", + "reflect-metadata": "^0.2.1", "viewport-mercator-project": "^6.2.1" } }, @@ -264,15 +255,15 @@ } }, "node_modules/@antv/l7-layers": { - "version": "2.20.5", - "resolved": "https://registry.npmjs.org/@antv/l7-layers/-/l7-layers-2.20.5.tgz", - "integrity": "sha512-kz0fFDOylSK4msWrocVsffpuot5T0XElxvXomcnSLq9jRH5x0GHxKzrIOlQ6iUusaU3w5ZxJ4H6Nhu5DNvzs8g==", + "version": "2.20.9", + "resolved": "https://registry.npmjs.org/@antv/l7-layers/-/l7-layers-2.20.9.tgz", + "integrity": "sha512-3yDE/iu3a/T8AgcsGEey2LnOUyffBEh5S+aoKBF+NLsxRrWwAkOxrlB0Yt4phdniYeD3ZBZsrA67wi1QZY5lfA==", "dependencies": { "@antv/async-hook": "^2.2.9", - "@antv/l7-core": "2.20.5", - "@antv/l7-maps": "2.20.5", - "@antv/l7-source": "2.20.5", - "@antv/l7-utils": "2.20.5", + "@antv/l7-core": "2.20.9", + "@antv/l7-maps": "2.20.9", + "@antv/l7-source": "2.20.9", + "@antv/l7-utils": "2.20.9", "@babel/runtime": "^7.7.7", "@mapbox/martini": "^0.2.0", "@turf/clone": "^6.5.0", @@ -294,12 +285,17 @@ "reflect-metadata": "^0.1.13" } }, + "node_modules/@antv/l7-layers/node_modules/reflect-metadata": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", + "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==" + }, "node_modules/@antv/l7-map": { - "version": "2.20.5", - "resolved": "https://registry.npmjs.org/@antv/l7-map/-/l7-map-2.20.5.tgz", - "integrity": "sha512-9KoGIadepSBqzmZRbcbrSCtffCmFwUPfGliQqBSYNn/ZWcqyBKCJCyvQqu2P6q/HcWF/deg8G33+Nmnpra93Vg==", + "version": "2.20.9", + "resolved": "https://registry.npmjs.org/@antv/l7-map/-/l7-map-2.20.9.tgz", + "integrity": "sha512-Nnd4TL2U2BsRlsN4TD3LsLKhbEAY6w4tr2MmyRQ5cPPGJo552CmUnLVD0W0XKQaFi5z8ThfMIja4XgcRxfE/0w==", "dependencies": { - "@antv/l7-utils": "2.20.5", + "@antv/l7-utils": "2.20.9", "@babel/runtime": "^7.7.7", "@mapbox/point-geometry": "^0.1.0", "@mapbox/unitbezier": "^0.0.0", @@ -309,48 +305,48 @@ } }, "node_modules/@antv/l7-maps": { - "version": "2.20.5", - "resolved": "https://registry.npmjs.org/@antv/l7-maps/-/l7-maps-2.20.5.tgz", - "integrity": "sha512-Lv2PtADM2RP+IBFoWm81yrwfZE4Hvuj15rbeSBXISd+9vZdVaxYceFxClvEtDJq4x1bj0+cjQLCtMr4pltDb1g==", + "version": "2.20.9", + "resolved": "https://registry.npmjs.org/@antv/l7-maps/-/l7-maps-2.20.9.tgz", + "integrity": "sha512-kPKALocvUH1OM79MTap/dhnybpnvORVY8kyOZffkTEEPpmo2xhWhaowxj8/mhmgvnCurAiQRR9O9U4eCc4hpXQ==", "dependencies": { "@amap/amap-jsapi-loader": "^1.0.1", - "@antv/l7-core": "2.20.5", - "@antv/l7-map": "2.20.5", - "@antv/l7-utils": "2.20.5", + "@antv/l7-core": "2.20.9", + "@antv/l7-map": "2.20.9", + "@antv/l7-utils": "2.20.9", "@babel/runtime": "^7.7.7", "gl-matrix": "^3.1.0", "inversify": "^5.0.1", "mapbox-gl": "^1.2.1", "maplibre-gl": "^3.5.2", - "reflect-metadata": "^0.1.13", + "reflect-metadata": "^0.2.1", "viewport-mercator-project": "^6.2.1" } }, "node_modules/@antv/l7-renderer": { - "version": "2.20.5", - "resolved": "https://registry.npmjs.org/@antv/l7-renderer/-/l7-renderer-2.20.5.tgz", - "integrity": "sha512-0WONfggP9zsPVwts6oNSv3gpDdQbx2hDhjrjbI7wRgbCM7Ib4Q7RMbHQ5lgyq43H5GYeduZqehNbV4zcPLiw9A==", + "version": "2.20.9", + "resolved": "https://registry.npmjs.org/@antv/l7-renderer/-/l7-renderer-2.20.9.tgz", + "integrity": "sha512-KXPIfom0xcXquP0mvEWyp9axjugazITVj4MOBCWfBAR/Bh06eTw0m3syNgIY7Etb4aWY9zf24kVvnxAwy4lMhg==", "dependencies": { - "@antv/g-device-api": "^1.3.6", - "@antv/l7-core": "2.20.5", - "@antv/l7-utils": "2.20.5", + "@antv/g-device-api": "^1.4.5", + "@antv/l7-core": "2.20.9", + "@antv/l7-utils": "2.20.9", "@babel/runtime": "^7.7.7", "inversify": "^5.0.1", - "reflect-metadata": "^0.1.13", + "reflect-metadata": "^0.2.1", "regl": "1.6.1" } }, "node_modules/@antv/l7-scene": { - "version": "2.20.5", - "resolved": "https://registry.npmjs.org/@antv/l7-scene/-/l7-scene-2.20.5.tgz", - "integrity": "sha512-lgxgu94rrEfaxDxwDCayTjhPKnEoW2yMzpocXR++oROrryvxq4GKr5JawNe86MxTKJGrpzZTQH/oTrICBSxeHw==", - "dependencies": { - "@antv/l7-component": "2.20.5", - "@antv/l7-core": "2.20.5", - "@antv/l7-layers": "2.20.5", - "@antv/l7-maps": "2.20.5", - "@antv/l7-renderer": "2.20.5", - "@antv/l7-utils": "2.20.5", + "version": "2.20.9", + "resolved": "https://registry.npmjs.org/@antv/l7-scene/-/l7-scene-2.20.9.tgz", + "integrity": "sha512-n0E6xYY5CrJVczZZG1QNVzHQNVX0fQAg/TO2MkkRl0KhJx19bRYuKwdho10n65xWZ/NNExA64gjCXxKH3/AqeA==", + "dependencies": { + "@antv/l7-component": "2.20.9", + "@antv/l7-core": "2.20.9", + "@antv/l7-layers": "2.20.9", + "@antv/l7-maps": "2.20.9", + "@antv/l7-renderer": "2.20.9", + "@antv/l7-utils": "2.20.9", "@babel/runtime": "^7.7.7", "eventemitter3": "^4.0.7", "inversify": "^5.0.1", @@ -358,14 +354,19 @@ "reflect-metadata": "^0.1.13" } }, + "node_modules/@antv/l7-scene/node_modules/reflect-metadata": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", + "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==" + }, "node_modules/@antv/l7-source": { - "version": "2.20.5", - "resolved": "https://registry.npmjs.org/@antv/l7-source/-/l7-source-2.20.5.tgz", - "integrity": "sha512-c05NQgq8H5JM8nAcCuD+nFnn1RZV/MMKUdWYuyiRGvmKqpObKVs50jY1NXUCpB3xqhksvnne4QFkm3mDFcKS8Q==", + "version": "2.20.9", + "resolved": "https://registry.npmjs.org/@antv/l7-source/-/l7-source-2.20.9.tgz", + "integrity": "sha512-efNP7fcqsTki9QLwnpbdX6fWfqEzEcW4W2zm1m3McedJg6cPTti1Xclk/DYylOM0pityKDFq7NL0QgqkqZ32jQ==", "dependencies": { "@antv/async-hook": "^2.2.9", - "@antv/l7-core": "2.20.5", - "@antv/l7-utils": "2.20.5", + "@antv/l7-core": "2.20.9", + "@antv/l7-utils": "2.20.9", "@babel/runtime": "^7.7.7", "@mapbox/geojson-rewind": "^0.5.2", "@mapbox/vector-tile": "^1.3.1", @@ -378,14 +379,14 @@ "geojson-vt": "^3.2.1", "inversify": "^5.0.1", "pbf": "^3.2.1", - "reflect-metadata": "^0.1.13", + "reflect-metadata": "^0.2.1", "supercluster": "^7.0.0" } }, "node_modules/@antv/l7-utils": { - "version": "2.20.5", - "resolved": "https://registry.npmjs.org/@antv/l7-utils/-/l7-utils-2.20.5.tgz", - "integrity": "sha512-7gTv8IapVJ9o8N2tyoAOqOEt2YOhK5wubXGLJp2/5z1aMURoo3JlnjA13TFgMkf4lD4ggOMKKjZLlo5Fvxb4fg==", + "version": "2.20.9", + "resolved": "https://registry.npmjs.org/@antv/l7-utils/-/l7-utils-2.20.9.tgz", + "integrity": "sha512-TFLHtAq4Mq+yIuMxfRESyGYE3xxVqw2N/doMbccnp0TnuhCdRd8TL8F9mUZwMdUUFF+eHcOBHNgkoDLPZa3FyA==", "dependencies": { "@babel/runtime": "^7.7.7", "@turf/bbox": "^6.5.0", @@ -400,9 +401,9 @@ } }, "node_modules/@antv/larkmap": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/@antv/larkmap/-/larkmap-1.4.10.tgz", - "integrity": "sha512-lvYAAVuAtbfrAs7YAPOd6vc2xABNnAshbagq39DddB0CSAYJEqGZ004/IwLREH8L3/j/rHrp6K5Mw+duwz2/bA==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/@antv/larkmap/-/larkmap-1.4.4.tgz", + "integrity": "sha512-UpLdCmX+2qiizWSnHegMHYnYQJ7ZJx5DGb4QVOhoHHMDj5v7jq8xQchZMMmSyIjmin/FLGLxrIuTXuMBlPQaAg==", "dependencies": { "@antv/event-emitter": "^0.1.3", "@antv/l7-composite-layers": "0.x", @@ -419,17 +420,36 @@ "react-dom": ">=16.9.0" } }, + "node_modules/@antv/larkmap/node_modules/@antv/l7-composite-layers": { + "version": "0.16.4", + "resolved": "https://registry.npmjs.org/@antv/l7-composite-layers/-/l7-composite-layers-0.16.4.tgz", + "integrity": "sha512-LgFLPfcNHXmQHUXxRlVGQevSRXCNHXjS7h6rrCcXOKJNNvGOn5bilqKHFHqxoareAXy8WTg+gKKcxUdObNcZUg==", + "dependencies": { + "@antv/event-emitter": "^0.1.2", + "@antv/scale": "^0.4.12", + "@antv/util": "^2.0.14", + "@turf/bbox": "^6.5.0", + "@turf/bbox-polygon": "^6.5.0", + "@turf/transform-scale": "^6.5.0", + "kdbush": "^3.0.0", + "lodash-es": "^4.17.21", + "reselect": "^4.1.8" + }, + "peerDependencies": { + "@antv/l7": "^2.11.5" + } + }, "node_modules/@antv/scale": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/@antv/scale/-/scale-0.4.14.tgz", - "integrity": "sha512-7JFQqmPLeBSFVOiBxEYR6I5JexKRFOEBo/y7R9OuTL9uPmMvzVFRk38lKg2tU1iU46f0LwR9w7NAEMcOrgjIZg==", + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/@antv/scale/-/scale-0.4.15.tgz", + "integrity": "sha512-b3b2U1L55fcJg0fB/BloVvcngPo/QxhosWgjn6JmYLVLezxDYMO+zdQou8hxpsLMUVhH15NqRDcM/1n4U6G04g==", "dependencies": { "@antv/util": "^2.0.13", "color-string": "^1.5.5", "fecha": "^4.2.1" } }, - "node_modules/@antv/scale/node_modules/@antv/util": { + "node_modules/@antv/util": { "version": "2.0.17", "resolved": "https://registry.npmjs.org/@antv/util/-/util-2.0.17.tgz", "integrity": "sha512-o6I9hi5CIUvLGDhth0RxNSFDRwXeywmt6ExR4+RmVAzIi48ps6HUy+svxOCayvrPBN37uE6TAc2KDofRo0nK9Q==", @@ -438,17 +458,6 @@ "tslib": "^2.0.3" } }, - "node_modules/@antv/util": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@antv/util/-/util-3.3.5.tgz", - "integrity": "sha512-bVv1loamL/MgUEN9dNt7VKAsghO4Wgb+kzr8B9TgkM5tHgKk++xiTwi3pejIdgU8DDkzcyaRsO+VTOXJt8jLng==", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "flru": "^1.0.2", - "gl-matrix": "^3.3.0", - "tslib": "^2.3.1" - } - }, "node_modules/@babel/code-frame": { "version": "7.23.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", @@ -1604,6 +1613,14 @@ "react-dom": ">=16.9.0" } }, + "node_modules/@remix-run/router": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.14.0.tgz", + "integrity": "sha512-WOHih+ClN7N8oHk9N4JUiMxQJmRVaOxcg8w7F/oHUXzJt920ekASLI/7cYX8XkntDWRhLZtsk6LbGrkgOAvi5A==", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.1.tgz", @@ -3394,6 +3411,12 @@ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, + "node_modules/@types/lodash": { + "version": "4.14.202", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", + "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", + "dev": true + }, "node_modules/@types/mapbox__point-geometry": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/@types/mapbox__point-geometry/-/mapbox__point-geometry-0.1.4.tgz", @@ -3409,6 +3432,15 @@ "@types/pbf": "*" } }, + "node_modules/@types/node": { + "version": "20.10.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", + "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/@types/pbf": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/pbf/-/pbf-3.0.5.tgz", @@ -3460,6 +3492,15 @@ "@types/geojson": "*" } }, + "node_modules/@types/turf": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@types/turf/-/turf-3.5.32.tgz", + "integrity": "sha512-2Rtv0EIG7Tx1CC2ASzCPw63ugCwrqJCFqNL/Gk9QYE5iIyd+0/S/TlPTgQ+qeQC8NCEn/TncUeZp+aM9cg68rg==", + "deprecated": "'turf' has been deprecated in favor of '@turf/turf', which provides its own types.", + "dependencies": { + "@types/geojson": "*" + } + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "6.15.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.15.0.tgz", @@ -5809,9 +5850,9 @@ "integrity": "sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==" }, "node_modules/mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", "engines": { "node": ">=10" } @@ -6152,6 +6193,21 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/protocol-buffers-schema": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", @@ -6825,10 +6881,40 @@ "node": ">=0.10.0" } }, + "node_modules/react-router": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.21.0.tgz", + "integrity": "sha512-hGZ0HXbwz3zw52pLZV3j3+ec+m/PQ9cTpBvqjFQmy2XVUWGn5MD+31oXHb6dVTxYzmAeaiUBYjkoNz66n3RGCg==", + "dependencies": { + "@remix-run/router": "1.14.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.21.0.tgz", + "integrity": "sha512-1dUdVj3cwc1npzJaf23gulB562ESNvxf7E4x8upNJycqyUm5BRRZ6dd3LrlzhtLaMrwOCO8R0zoiYxdaJx4LlQ==", + "dependencies": { + "@remix-run/router": "1.14.0", + "react-router": "6.21.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, "node_modules/reflect-metadata": { - "version": "0.1.14", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", - "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==" + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.1.tgz", + "integrity": "sha512-i5lLI6iw9AU3Uu4szRNPPEkomnkjRTaVt9hy/bn5g/oSzekBSMeLZblcjP74AW0vBabqERLLIrz+gR8QYR54Tw==" }, "node_modules/regenerator-runtime": { "version": "0.14.1", @@ -7113,12 +7199,12 @@ } }, "node_modules/sirv": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz", - "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", "dependencies": { - "@polka/url": "^1.0.0-next.20", - "mrmime": "^1.0.0", + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", "totalist": "^3.0.0" }, "engines": { @@ -7440,6 +7526,12 @@ "resolved": "https://registry.npmjs.org/typewise-core/-/typewise-core-1.2.0.tgz", "integrity": "sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg==" }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -7778,9 +7870,9 @@ "integrity": "sha512-4ddpsiHN9Pd4UIlWuKVK1C4IiZIdbwQvy9i7DUSI3xNJ89FPUFt8lxDYj8GzzfdllV0NkJTRxnG+FvLk0llidg==" }, "@antv/g-device-api": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/@antv/g-device-api/-/g-device-api-1.4.8.tgz", - "integrity": "sha512-V92kMQtBo8y7UzKPRaUwEBpU9m32POF55bcNCB6cqbVBCy5wjq/crfxJo3PD1Lmy+mxonUKBGQto7OCnrjIMbA==", + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/@antv/g-device-api/-/g-device-api-1.4.10.tgz", + "integrity": "sha512-csPzj91BPZinnjTvQ1CURkq9auuo0Wl5nD1xGfWZmpUnQQwZzEUQiBvLdU8LtCoS4nkcJ9GNvZ7d06IEYZfHhg==", "requires": { "@antv/util": "^3.3.4", "@webgpu/types": "^0.1.34", @@ -7789,6 +7881,17 @@ "tslib": "^2.5.3" }, "dependencies": { + "@antv/util": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@antv/util/-/util-3.3.5.tgz", + "integrity": "sha512-bVv1loamL/MgUEN9dNt7VKAsghO4Wgb+kzr8B9TgkM5tHgKk++xiTwi3pejIdgU8DDkzcyaRsO+VTOXJt8jLng==", + "requires": { + "fast-deep-equal": "^3.1.3", + "flru": "^1.0.2", + "gl-matrix": "^3.3.0", + "tslib": "^2.3.1" + } + }, "eventemitter3": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", @@ -7797,69 +7900,42 @@ } }, "@antv/l7": { - "version": "2.20.5", - "resolved": "https://registry.npmjs.org/@antv/l7/-/l7-2.20.5.tgz", - "integrity": "sha512-3r9lQQHhhE8GIFbiDhSZmptq4m0BCfE9kHIH/eTPoatuOowIuZGfZ57utUUU73zYRWLf6SUBS3JP+/mLYSWGjA==", - "requires": { - "@antv/l7-component": "2.20.5", - "@antv/l7-core": "2.20.5", - "@antv/l7-layers": "2.20.5", - "@antv/l7-maps": "2.20.5", - "@antv/l7-scene": "2.20.5", - "@antv/l7-source": "2.20.5", - "@antv/l7-utils": "2.20.5", + "version": "2.20.9", + "resolved": "https://registry.npmjs.org/@antv/l7/-/l7-2.20.9.tgz", + "integrity": "sha512-4WQaaz0/eZkYc/48gR4h8O3Nq9Le8b4ghdHpiAHdOPK3AvUKr/GyAQcjkLK6g31IVZ0oiWD0sEvzKYk0pJqr/A==", + "requires": { + "@antv/l7-component": "2.20.9", + "@antv/l7-core": "2.20.9", + "@antv/l7-layers": "2.20.9", + "@antv/l7-maps": "2.20.9", + "@antv/l7-scene": "2.20.9", + "@antv/l7-source": "2.20.9", + "@antv/l7-utils": "2.20.9", "@babel/runtime": "^7.7.7", "webpack-bundle-analyzer": "^4.9.1" } }, "@antv/l7-component": { - "version": "2.20.5", - "resolved": "https://registry.npmjs.org/@antv/l7-component/-/l7-component-2.20.5.tgz", - "integrity": "sha512-dXB8ROK5TrAB+HgjBQnG4oN6AgAcOVR0dTiW2ZnT2R7Xw7U+425rY6bz0ULpaBpUABQZGm+aYHsiGAVdDLQp6w==", + "version": "2.20.9", + "resolved": "https://registry.npmjs.org/@antv/l7-component/-/l7-component-2.20.9.tgz", + "integrity": "sha512-FssjP+F1VZvauRR9wlUBSxcBIYxcwvU1tEqZVIPzcQ/JayCjFaI4ea24u6kvN4qSIkl/RW+4ZnTaR66ztnHqHw==", "requires": { - "@antv/l7-core": "2.20.5", - "@antv/l7-utils": "2.20.5", + "@antv/l7-core": "2.20.9", + "@antv/l7-utils": "2.20.9", "@babel/runtime": "^7.7.7", "eventemitter3": "^4.0.0", "inversify": "^5.0.1", - "reflect-metadata": "^0.1.13", + "reflect-metadata": "^0.2.1", "supercluster": "^7.0.0" } }, - "@antv/l7-composite-layers": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/@antv/l7-composite-layers/-/l7-composite-layers-0.16.4.tgz", - "integrity": "sha512-LgFLPfcNHXmQHUXxRlVGQevSRXCNHXjS7h6rrCcXOKJNNvGOn5bilqKHFHqxoareAXy8WTg+gKKcxUdObNcZUg==", - "requires": { - "@antv/event-emitter": "^0.1.2", - "@antv/scale": "^0.4.12", - "@antv/util": "^2.0.14", - "@turf/bbox": "^6.5.0", - "@turf/bbox-polygon": "^6.5.0", - "@turf/transform-scale": "^6.5.0", - "kdbush": "^3.0.0", - "lodash-es": "^4.17.21", - "reselect": "^4.1.8" - }, - "dependencies": { - "@antv/util": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/@antv/util/-/util-2.0.17.tgz", - "integrity": "sha512-o6I9hi5CIUvLGDhth0RxNSFDRwXeywmt6ExR4+RmVAzIi48ps6HUy+svxOCayvrPBN37uE6TAc2KDofRo0nK9Q==", - "requires": { - "csstype": "^3.0.8", - "tslib": "^2.0.3" - } - } - } - }, "@antv/l7-core": { - "version": "2.20.5", - "resolved": "https://registry.npmjs.org/@antv/l7-core/-/l7-core-2.20.5.tgz", - "integrity": "sha512-szeERmOqW+GV6yY0QNd6A8f/s6IFI38WlnXRHOMMdtLu13zt/LRYaNOoZMWW0wAKa/icgTjy/fzqkuC83Sfrjg==", + "version": "2.20.9", + "resolved": "https://registry.npmjs.org/@antv/l7-core/-/l7-core-2.20.9.tgz", + "integrity": "sha512-PtwEvdqyw0asNTBCGNrUVs8TVb9Pbs+9XH47xG2SECSVUktpeIJEhbnnUHBl+hDqnqZK5+DlyZz8RslwOnsrQA==", "requires": { "@antv/async-hook": "^2.2.9", - "@antv/l7-utils": "2.20.5", + "@antv/l7-utils": "2.20.9", "@babel/runtime": "^7.7.7", "@mapbox/tiny-sdf": "^1.2.5", "@turf/helpers": "^6.1.4", @@ -7870,7 +7946,7 @@ "hammerjs": "^2.0.8", "inversify": "^5.0.1", "inversify-inject-decorators": "^3.1.0", - "reflect-metadata": "^0.1.13", + "reflect-metadata": "^0.2.1", "viewport-mercator-project": "^6.2.1" } }, @@ -7900,15 +7976,15 @@ } }, "@antv/l7-layers": { - "version": "2.20.5", - "resolved": "https://registry.npmjs.org/@antv/l7-layers/-/l7-layers-2.20.5.tgz", - "integrity": "sha512-kz0fFDOylSK4msWrocVsffpuot5T0XElxvXomcnSLq9jRH5x0GHxKzrIOlQ6iUusaU3w5ZxJ4H6Nhu5DNvzs8g==", + "version": "2.20.9", + "resolved": "https://registry.npmjs.org/@antv/l7-layers/-/l7-layers-2.20.9.tgz", + "integrity": "sha512-3yDE/iu3a/T8AgcsGEey2LnOUyffBEh5S+aoKBF+NLsxRrWwAkOxrlB0Yt4phdniYeD3ZBZsrA67wi1QZY5lfA==", "requires": { "@antv/async-hook": "^2.2.9", - "@antv/l7-core": "2.20.5", - "@antv/l7-maps": "2.20.5", - "@antv/l7-source": "2.20.5", - "@antv/l7-utils": "2.20.5", + "@antv/l7-core": "2.20.9", + "@antv/l7-maps": "2.20.9", + "@antv/l7-source": "2.20.9", + "@antv/l7-utils": "2.20.9", "@babel/runtime": "^7.7.7", "@mapbox/martini": "^0.2.0", "@turf/clone": "^6.5.0", @@ -7928,14 +8004,21 @@ "inversify": "^5.0.1", "polyline-miter-util": "^1.0.1", "reflect-metadata": "^0.1.13" + }, + "dependencies": { + "reflect-metadata": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", + "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==" + } } }, "@antv/l7-map": { - "version": "2.20.5", - "resolved": "https://registry.npmjs.org/@antv/l7-map/-/l7-map-2.20.5.tgz", - "integrity": "sha512-9KoGIadepSBqzmZRbcbrSCtffCmFwUPfGliQqBSYNn/ZWcqyBKCJCyvQqu2P6q/HcWF/deg8G33+Nmnpra93Vg==", + "version": "2.20.9", + "resolved": "https://registry.npmjs.org/@antv/l7-map/-/l7-map-2.20.9.tgz", + "integrity": "sha512-Nnd4TL2U2BsRlsN4TD3LsLKhbEAY6w4tr2MmyRQ5cPPGJo552CmUnLVD0W0XKQaFi5z8ThfMIja4XgcRxfE/0w==", "requires": { - "@antv/l7-utils": "2.20.5", + "@antv/l7-utils": "2.20.9", "@babel/runtime": "^7.7.7", "@mapbox/point-geometry": "^0.1.0", "@mapbox/unitbezier": "^0.0.0", @@ -7945,63 +8028,70 @@ } }, "@antv/l7-maps": { - "version": "2.20.5", - "resolved": "https://registry.npmjs.org/@antv/l7-maps/-/l7-maps-2.20.5.tgz", - "integrity": "sha512-Lv2PtADM2RP+IBFoWm81yrwfZE4Hvuj15rbeSBXISd+9vZdVaxYceFxClvEtDJq4x1bj0+cjQLCtMr4pltDb1g==", + "version": "2.20.9", + "resolved": "https://registry.npmjs.org/@antv/l7-maps/-/l7-maps-2.20.9.tgz", + "integrity": "sha512-kPKALocvUH1OM79MTap/dhnybpnvORVY8kyOZffkTEEPpmo2xhWhaowxj8/mhmgvnCurAiQRR9O9U4eCc4hpXQ==", "requires": { "@amap/amap-jsapi-loader": "^1.0.1", - "@antv/l7-core": "2.20.5", - "@antv/l7-map": "2.20.5", - "@antv/l7-utils": "2.20.5", + "@antv/l7-core": "2.20.9", + "@antv/l7-map": "2.20.9", + "@antv/l7-utils": "2.20.9", "@babel/runtime": "^7.7.7", "gl-matrix": "^3.1.0", "inversify": "^5.0.1", "mapbox-gl": "^1.2.1", "maplibre-gl": "^3.5.2", - "reflect-metadata": "^0.1.13", + "reflect-metadata": "^0.2.1", "viewport-mercator-project": "^6.2.1" } }, "@antv/l7-renderer": { - "version": "2.20.5", - "resolved": "https://registry.npmjs.org/@antv/l7-renderer/-/l7-renderer-2.20.5.tgz", - "integrity": "sha512-0WONfggP9zsPVwts6oNSv3gpDdQbx2hDhjrjbI7wRgbCM7Ib4Q7RMbHQ5lgyq43H5GYeduZqehNbV4zcPLiw9A==", + "version": "2.20.9", + "resolved": "https://registry.npmjs.org/@antv/l7-renderer/-/l7-renderer-2.20.9.tgz", + "integrity": "sha512-KXPIfom0xcXquP0mvEWyp9axjugazITVj4MOBCWfBAR/Bh06eTw0m3syNgIY7Etb4aWY9zf24kVvnxAwy4lMhg==", "requires": { - "@antv/g-device-api": "^1.3.6", - "@antv/l7-core": "2.20.5", - "@antv/l7-utils": "2.20.5", + "@antv/g-device-api": "^1.4.5", + "@antv/l7-core": "2.20.9", + "@antv/l7-utils": "2.20.9", "@babel/runtime": "^7.7.7", "inversify": "^5.0.1", - "reflect-metadata": "^0.1.13", + "reflect-metadata": "^0.2.1", "regl": "1.6.1" } }, "@antv/l7-scene": { - "version": "2.20.5", - "resolved": "https://registry.npmjs.org/@antv/l7-scene/-/l7-scene-2.20.5.tgz", - "integrity": "sha512-lgxgu94rrEfaxDxwDCayTjhPKnEoW2yMzpocXR++oROrryvxq4GKr5JawNe86MxTKJGrpzZTQH/oTrICBSxeHw==", - "requires": { - "@antv/l7-component": "2.20.5", - "@antv/l7-core": "2.20.5", - "@antv/l7-layers": "2.20.5", - "@antv/l7-maps": "2.20.5", - "@antv/l7-renderer": "2.20.5", - "@antv/l7-utils": "2.20.5", + "version": "2.20.9", + "resolved": "https://registry.npmjs.org/@antv/l7-scene/-/l7-scene-2.20.9.tgz", + "integrity": "sha512-n0E6xYY5CrJVczZZG1QNVzHQNVX0fQAg/TO2MkkRl0KhJx19bRYuKwdho10n65xWZ/NNExA64gjCXxKH3/AqeA==", + "requires": { + "@antv/l7-component": "2.20.9", + "@antv/l7-core": "2.20.9", + "@antv/l7-layers": "2.20.9", + "@antv/l7-maps": "2.20.9", + "@antv/l7-renderer": "2.20.9", + "@antv/l7-utils": "2.20.9", "@babel/runtime": "^7.7.7", "eventemitter3": "^4.0.7", "inversify": "^5.0.1", "mapbox-gl": "^1.2.1", "reflect-metadata": "^0.1.13" + }, + "dependencies": { + "reflect-metadata": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", + "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==" + } } }, "@antv/l7-source": { - "version": "2.20.5", - "resolved": "https://registry.npmjs.org/@antv/l7-source/-/l7-source-2.20.5.tgz", - "integrity": "sha512-c05NQgq8H5JM8nAcCuD+nFnn1RZV/MMKUdWYuyiRGvmKqpObKVs50jY1NXUCpB3xqhksvnne4QFkm3mDFcKS8Q==", + "version": "2.20.9", + "resolved": "https://registry.npmjs.org/@antv/l7-source/-/l7-source-2.20.9.tgz", + "integrity": "sha512-efNP7fcqsTki9QLwnpbdX6fWfqEzEcW4W2zm1m3McedJg6cPTti1Xclk/DYylOM0pityKDFq7NL0QgqkqZ32jQ==", "requires": { "@antv/async-hook": "^2.2.9", - "@antv/l7-core": "2.20.5", - "@antv/l7-utils": "2.20.5", + "@antv/l7-core": "2.20.9", + "@antv/l7-utils": "2.20.9", "@babel/runtime": "^7.7.7", "@mapbox/geojson-rewind": "^0.5.2", "@mapbox/vector-tile": "^1.3.1", @@ -8014,14 +8104,14 @@ "geojson-vt": "^3.2.1", "inversify": "^5.0.1", "pbf": "^3.2.1", - "reflect-metadata": "^0.1.13", + "reflect-metadata": "^0.2.1", "supercluster": "^7.0.0" } }, "@antv/l7-utils": { - "version": "2.20.5", - "resolved": "https://registry.npmjs.org/@antv/l7-utils/-/l7-utils-2.20.5.tgz", - "integrity": "sha512-7gTv8IapVJ9o8N2tyoAOqOEt2YOhK5wubXGLJp2/5z1aMURoo3JlnjA13TFgMkf4lD4ggOMKKjZLlo5Fvxb4fg==", + "version": "2.20.9", + "resolved": "https://registry.npmjs.org/@antv/l7-utils/-/l7-utils-2.20.9.tgz", + "integrity": "sha512-TFLHtAq4Mq+yIuMxfRESyGYE3xxVqw2N/doMbccnp0TnuhCdRd8TL8F9mUZwMdUUFF+eHcOBHNgkoDLPZa3FyA==", "requires": { "@babel/runtime": "^7.7.7", "@turf/bbox": "^6.5.0", @@ -8036,9 +8126,9 @@ } }, "@antv/larkmap": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/@antv/larkmap/-/larkmap-1.4.10.tgz", - "integrity": "sha512-lvYAAVuAtbfrAs7YAPOd6vc2xABNnAshbagq39DddB0CSAYJEqGZ004/IwLREH8L3/j/rHrp6K5Mw+duwz2/bA==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/@antv/larkmap/-/larkmap-1.4.4.tgz", + "integrity": "sha512-UpLdCmX+2qiizWSnHegMHYnYQJ7ZJx5DGb4QVOhoHHMDj5v7jq8xQchZMMmSyIjmin/FLGLxrIuTXuMBlPQaAg==", "requires": { "@antv/event-emitter": "^0.1.3", "@antv/l7-composite-layers": "0.x", @@ -8048,38 +8138,43 @@ "color": "^4.2.3", "lodash-es": "^4.17.21", "rc-select": "^14.1.13" + }, + "dependencies": { + "@antv/l7-composite-layers": { + "version": "0.16.4", + "resolved": "https://registry.npmjs.org/@antv/l7-composite-layers/-/l7-composite-layers-0.16.4.tgz", + "integrity": "sha512-LgFLPfcNHXmQHUXxRlVGQevSRXCNHXjS7h6rrCcXOKJNNvGOn5bilqKHFHqxoareAXy8WTg+gKKcxUdObNcZUg==", + "requires": { + "@antv/event-emitter": "^0.1.2", + "@antv/scale": "^0.4.12", + "@antv/util": "^2.0.14", + "@turf/bbox": "^6.5.0", + "@turf/bbox-polygon": "^6.5.0", + "@turf/transform-scale": "^6.5.0", + "kdbush": "^3.0.0", + "lodash-es": "^4.17.21", + "reselect": "^4.1.8" + } + } } }, "@antv/scale": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/@antv/scale/-/scale-0.4.14.tgz", - "integrity": "sha512-7JFQqmPLeBSFVOiBxEYR6I5JexKRFOEBo/y7R9OuTL9uPmMvzVFRk38lKg2tU1iU46f0LwR9w7NAEMcOrgjIZg==", + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/@antv/scale/-/scale-0.4.15.tgz", + "integrity": "sha512-b3b2U1L55fcJg0fB/BloVvcngPo/QxhosWgjn6JmYLVLezxDYMO+zdQou8hxpsLMUVhH15NqRDcM/1n4U6G04g==", "requires": { "@antv/util": "^2.0.13", "color-string": "^1.5.5", "fecha": "^4.2.1" - }, - "dependencies": { - "@antv/util": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/@antv/util/-/util-2.0.17.tgz", - "integrity": "sha512-o6I9hi5CIUvLGDhth0RxNSFDRwXeywmt6ExR4+RmVAzIi48ps6HUy+svxOCayvrPBN37uE6TAc2KDofRo0nK9Q==", - "requires": { - "csstype": "^3.0.8", - "tslib": "^2.0.3" - } - } } }, "@antv/util": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@antv/util/-/util-3.3.5.tgz", - "integrity": "sha512-bVv1loamL/MgUEN9dNt7VKAsghO4Wgb+kzr8B9TgkM5tHgKk++xiTwi3pejIdgU8DDkzcyaRsO+VTOXJt8jLng==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@antv/util/-/util-2.0.17.tgz", + "integrity": "sha512-o6I9hi5CIUvLGDhth0RxNSFDRwXeywmt6ExR4+RmVAzIi48ps6HUy+svxOCayvrPBN37uE6TAc2KDofRo0nK9Q==", "requires": { - "fast-deep-equal": "^3.1.3", - "flru": "^1.0.2", - "gl-matrix": "^3.3.0", - "tslib": "^2.3.1" + "csstype": "^3.0.8", + "tslib": "^2.0.3" } }, "@babel/code-frame": { @@ -8824,6 +8919,11 @@ "rc-util": "^5.38.0" } }, + "@remix-run/router": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.14.0.tgz", + "integrity": "sha512-WOHih+ClN7N8oHk9N4JUiMxQJmRVaOxcg8w7F/oHUXzJt920ekASLI/7cYX8XkntDWRhLZtsk6LbGrkgOAvi5A==" + }, "@rollup/rollup-android-arm-eabi": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.1.tgz", @@ -10215,6 +10315,12 @@ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, + "@types/lodash": { + "version": "4.14.202", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", + "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", + "dev": true + }, "@types/mapbox__point-geometry": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/@types/mapbox__point-geometry/-/mapbox__point-geometry-0.1.4.tgz", @@ -10230,6 +10336,15 @@ "@types/pbf": "*" } }, + "@types/node": { + "version": "20.10.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", + "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==", + "dev": true, + "requires": { + "undici-types": "~5.26.4" + } + }, "@types/pbf": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/pbf/-/pbf-3.0.5.tgz", @@ -10281,6 +10396,14 @@ "@types/geojson": "*" } }, + "@types/turf": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@types/turf/-/turf-3.5.32.tgz", + "integrity": "sha512-2Rtv0EIG7Tx1CC2ASzCPw63ugCwrqJCFqNL/Gk9QYE5iIyd+0/S/TlPTgQ+qeQC8NCEn/TncUeZp+aM9cg68rg==", + "requires": { + "@types/geojson": "*" + } + }, "@typescript-eslint/eslint-plugin": { "version": "6.15.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.15.0.tgz", @@ -12050,9 +12173,9 @@ "integrity": "sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==" }, "mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==" }, "ms": { "version": "2.1.2", @@ -12293,6 +12416,12 @@ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, + "prettier": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", + "dev": true + }, "protocol-buffers-schema": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", @@ -12753,10 +12882,27 @@ "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", "dev": true }, + "react-router": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.21.0.tgz", + "integrity": "sha512-hGZ0HXbwz3zw52pLZV3j3+ec+m/PQ9cTpBvqjFQmy2XVUWGn5MD+31oXHb6dVTxYzmAeaiUBYjkoNz66n3RGCg==", + "requires": { + "@remix-run/router": "1.14.0" + } + }, + "react-router-dom": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.21.0.tgz", + "integrity": "sha512-1dUdVj3cwc1npzJaf23gulB562ESNvxf7E4x8upNJycqyUm5BRRZ6dd3LrlzhtLaMrwOCO8R0zoiYxdaJx4LlQ==", + "requires": { + "@remix-run/router": "1.14.0", + "react-router": "6.21.0" + } + }, "reflect-metadata": { - "version": "0.1.14", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", - "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==" + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.1.tgz", + "integrity": "sha512-i5lLI6iw9AU3Uu4szRNPPEkomnkjRTaVt9hy/bn5g/oSzekBSMeLZblcjP74AW0vBabqERLLIrz+gR8QYR54Tw==" }, "regenerator-runtime": { "version": "0.14.1", @@ -12973,12 +13119,12 @@ } }, "sirv": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz", - "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", "requires": { - "@polka/url": "^1.0.0-next.20", - "mrmime": "^1.0.0", + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", "totalist": "^3.0.0" } }, @@ -13219,6 +13365,12 @@ "resolved": "https://registry.npmjs.org/typewise-core/-/typewise-core-1.2.0.tgz", "integrity": "sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg==" }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", diff --git a/package.json b/package.json index 9e6f3b7..b3dda60 100644 --- a/package.json +++ b/package.json @@ -10,13 +10,20 @@ "preview": "vite preview" }, "dependencies": { - "@antv/l7": "^2.20.5", - "@antv/larkmap": "^1.4.10", + "@antv/l7": "^2.11.0", + "@antv/l7-draw": "^3.1.0", + "@antv/larkmap": "^1.4.4", + "@turf/turf": "^6.5.0", + "@types/turf": "^3.5.32", "antd": "^5.12.2", + "lodash": "^4.17.21", "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "react-router-dom": "^6.21.0" }, "devDependencies": { + "@types/lodash": "^4.14.202", + "@types/node": "^20.10.5", "@types/react": "^18.2.43", "@types/react-dom": "^18.2.17", "@typescript-eslint/eslint-plugin": "^6.14.0", @@ -26,6 +33,7 @@ "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.5", "less": "^4.2.0", + "prettier": "^3.1.1", "typescript": "^5.2.2", "vite": "^5.0.8" } diff --git a/src/App.css b/src/App.css deleted file mode 100644 index 5b8bf03..0000000 --- a/src/App.css +++ /dev/null @@ -1,39 +0,0 @@ -#root { - text-align: center; -} - -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; - transition: filter 300ms; -} -.logo:hover { - filter: drop-shadow(0 0 2em #646cffaa); -} -.logo.react:hover { - filter: drop-shadow(0 0 2em #61dafbaa); -} - -@keyframes logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} - -@media (prefers-reduced-motion: no-preference) { - a:nth-of-type(2) .logo { - animation: logo-spin infinite 20s linear; - } -} - -.card { - padding: 2em; -} - -.read-the-docs { - color: #888; -} diff --git a/src/App.tsx b/src/App.tsx deleted file mode 100644 index 638d74f..0000000 --- a/src/App.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import { useEffect, useState } from 'react' -import { LarkMap, PointLayer, PointLayerProps } from "@antv/larkmap" -import './App.css' - -const layerOptions: Omit = { - autoFit: true, - shape: 'circle', - size: { - field: 'temperature', - value: ({ temperature }) => temperature, - }, - color: { - field: 'temperature', - value: ['#0f9960', '#33a02c', '#377eb8'], - }, - state: { - active: true, - }, - style: { - opacity: 0.8, - }, -}; - -function App() { - const [source, setSource] = useState({ - data: [], - parser: { type: 'json', x: 'lng', y: 'lat' }, - }); - - useEffect(() => { - fetch('https://gw.alipayobjects.com/os/antfincdn/Lx96%24Pnwhw/city-weather.json') - .then((response) => response.json()) - .then((data) => { - setSource((prevState) => ({ ...prevState, data })); - }); - }, []); - - return ( - - - - ) -} - -export default App diff --git a/src/components/data-assets/index.module.less b/src/components/data-assets/index.module.less new file mode 100644 index 0000000..fc6985a --- /dev/null +++ b/src/components/data-assets/index.module.less @@ -0,0 +1,5 @@ +.container { + width: 100vw; + height: calc(100vh - 64px); + color: #000; +} diff --git a/src/components/data-assets/index.tsx b/src/components/data-assets/index.tsx new file mode 100644 index 0000000..253ccbb --- /dev/null +++ b/src/components/data-assets/index.tsx @@ -0,0 +1,5 @@ +import styles from "./index.module.less"; + +export const DataAssets = () => { + return
数据检索
; +}; diff --git a/src/components/data-retrieval/data-panel/index.module.less b/src/components/data-retrieval/data-panel/index.module.less new file mode 100644 index 0000000..a1be66d --- /dev/null +++ b/src/components/data-retrieval/data-panel/index.module.less @@ -0,0 +1,27 @@ +.dataPanel { + height: calc(100vh - 64px); + width: 380px; + color: #000; + padding: 10px; + border-right: 1px solid #e4e1e1; + overflow-y: scroll; + + :global { + .ant-tree .ant-tree-node-content-wrapper { + display: flex; + align-items: center; + } + + .ant-tree-iconEle { + width: 40px !important; + } + } +} + +.dataPanel { + overflow: auto; +} + +.dataPanel::-webkit-scrollbar { + width: 0.5em; +} diff --git a/src/components/data-retrieval/data-panel/index.tsx b/src/components/data-retrieval/data-panel/index.tsx new file mode 100644 index 0000000..af187ec --- /dev/null +++ b/src/components/data-retrieval/data-panel/index.tsx @@ -0,0 +1,32 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { Button, Tree } from "antd"; +import styles from "./index.module.less"; +import { DataNode } from "rc-tree/lib/interface"; + +const treeData: DataNode[] = []; + +export const DataPanel = () => { + const onSelect = (keys: any, info: any) => { + console.log("key", keys, info); + }; + + return ( +
+
+
数据选择:
+ +
+
+
下载数据:
+ +
+
+ ); +}; diff --git a/src/components/data-retrieval/index.module.less b/src/components/data-retrieval/index.module.less new file mode 100644 index 0000000..8512556 --- /dev/null +++ b/src/components/data-retrieval/index.module.less @@ -0,0 +1,11 @@ +.dataRetrieval { + display: flex; + align-items: center; + background-color: #fff; + + .larkMapContainer { + width: calc(100vw - 380px); + height: calc(100vh - 64px); + color: #000; + } +} diff --git a/src/components/data-retrieval/index.tsx b/src/components/data-retrieval/index.tsx new file mode 100644 index 0000000..9ed6d8e --- /dev/null +++ b/src/components/data-retrieval/index.tsx @@ -0,0 +1,33 @@ +import { IMapConfig } from "@antv/l7"; +import { + LarkMap, + MapThemeControl, + ScaleControl, + ZoomControl, +} from "@antv/larkmap"; +import styles from "./index.module.less"; +import { MapLayer } from "./map-layer"; +import { DataPanel } from "./data-panel"; +import { LocationSelect } from "./location-select"; + +const mapOptions: Partial = { + zoom: 9, + center: [120.3234, 30.1224], + style: "normal", + token: "15cd8a57710d40c9b7c0e3cc120f1200", +}; + +export const DataRetrieval = () => { + return ( +
+ + + + + + + + +
+ ); +}; diff --git a/src/components/data-retrieval/location-select/constants.ts b/src/components/data-retrieval/location-select/constants.ts new file mode 100644 index 0000000..92d5447 --- /dev/null +++ b/src/components/data-retrieval/location-select/constants.ts @@ -0,0 +1,105 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { getSingleColorStyle } from "@antv/l7-draw"; +import { + ChoroplethLayerProps, + LineLayerProps, + PointLayerProps, +} from "@antv/larkmap"; +import { message } from "antd"; +import { getEnv } from "../../../utils"; + +export const enum CoordType { + Point = "Point", + LineString = "LineString", + Polygon = "Polygon", + MultiPolygon = "MultiPolygon", + MultiLineString = "MultiLineString", +} + +export const CITY_LIST = + "https://mdn.alipayobjects.com/afts/file/A*1t_pTZauqCIAAAAAAAAAAAAADrd2AQ/city.json"; + +export const ICON = + "https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*CHCXT7F_3YkAAAAAAAAAAAAADmJ7AQ/original"; + +export const layerOptions: Omit = { + autoFit: true, + fillColor: "#377eb8", + opacity: 0.3, + strokeColor: "blue", + lineWidth: 1, + state: { + active: { strokeColor: "green", lineWidth: 1.5, lineOpacity: 0.8 }, + select: { strokeColor: "red", lineWidth: 1.5, lineOpacity: 0.8 }, + }, + zIndex: 2, + label: { + field: "省", + visible: true, + style: { fill: "#fff", fontSize: 12, stroke: "#000", strokeWidth: 2 }, + }, +}; + +export const pointOptions: Omit = { + autoFit: true, + shape: "img", + size: 12, + zIndex: 3, +}; + +export const lineOptions: Omit = { + autoFit: true, + shape: "line" as const, + size: 1.5, + color: "#377eb8", + style: { + opacity: 1, + lineType: "solid" as const, + }, + zIndex: 4, +}; + +export const queryRegionData = (code: string) => { + const newCode = code.length === 9 ? `${code}000` : code; + return new Promise((resolve, reject) => { + const header = { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ code: newCode }), + }; + fetch(getEnv("/getGsonDB"), header) + .then((response) => response.json()) + .then((data) => { + if (data.status === "success") { + fetch(getEnv(`${data.filepath}`)) + .then((res) => res.json()) + .then((res) => resolve(res)); + } else { + reject(); + message.error(data.message); + } + }) + .catch(() => { + message.info("暂无数据"); + }); + }); +}; + +export const optionSelect = [ + { label: "行政区划", value: "admin" }, + { label: "本地上传", value: "upload" }, + { label: "绘制", value: "draw" }, +]; + +export const getDrawStyle = (color: string, LayerZIndex: number) => { + const style: any = getSingleColorStyle(color); + Object.keys(style).forEach((key) => { + style[key].options = { + ...style[key].options, + zIndex: LayerZIndex, + }; + }); + return style; +}; diff --git a/src/components/data-retrieval/location-select/draw.tsx b/src/components/data-retrieval/location-select/draw.tsx new file mode 100644 index 0000000..3567ed7 --- /dev/null +++ b/src/components/data-retrieval/location-select/draw.tsx @@ -0,0 +1,58 @@ +import { useEffect, useRef } from "react"; +import { ControlEvent, DrawControl } from "@antv/l7-draw"; +import { useScene } from "@antv/larkmap"; +import { FeatureCollection } from "geojson"; +import * as turf from "@turf/turf"; +import { getDrawStyle } from "./constants"; +import { getEnv } from "../../../utils"; + +export const DrawControlLand = () => { + const scene = useScene(); + const drawRef = useRef(); + + const parserDrawData = ( + polygonList: Record, + ) => { + const newList = []; + for (const key in polygonList) { + if (Object.prototype.hasOwnProperty.call(polygonList, key)) { + const list = polygonList[key]; + if (list.length !== 0) { + newList.push(...list); + } + } + } + const featureCollection = turf.featureCollection(newList); + const header = { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(featureCollection), + }; + if (newList.length !== 0) { + fetch(getEnv("/savegeojson"), header) + .then((res) => res.json()) + .then((res) => console.log(res)); + } + }; + + useEffect(() => { + if (drawRef.current && !scene) return; + drawRef.current = new DrawControl(scene, { + commonDrawOptions: { + style: getDrawStyle("yellow", 7), + }, + }); + // 将 Control 添加至地图中 + scene.addControl(drawRef.current); + + // 监听绘制数据改变 + drawRef.current.on(ControlEvent.DataChange, parserDrawData); + + return () => { + scene.removeControl(drawRef.current as DrawControl); + drawRef.current = undefined; + }; + }, [scene, drawRef]); + + return null; +}; diff --git a/src/components/data-retrieval/location-select/index.module.less b/src/components/data-retrieval/location-select/index.module.less new file mode 100644 index 0000000..bf7cb61 --- /dev/null +++ b/src/components/data-retrieval/location-select/index.module.less @@ -0,0 +1,25 @@ +.region { +} + +:global { + .l7-draw-control__btn { + border-right: none; + border-radius: 4px; + } + + button:focus { + outline: none !important; + } + + .l7-draw-icon { + fill: #333 !important; + } + + .l7-draw-control__btn--active { + border: 1px solid #1677ff; + + .l7-draw-icon { + fill: currentColor !important; + } + } +} diff --git a/src/components/data-retrieval/location-select/index.tsx b/src/components/data-retrieval/location-select/index.tsx new file mode 100644 index 0000000..7416352 --- /dev/null +++ b/src/components/data-retrieval/location-select/index.tsx @@ -0,0 +1,158 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { + ChoroplethLayer, + CustomControl, + LineLayer, + PointLayer, + useScene, +} from "@antv/larkmap"; +import { Select, Cascader, Upload, message } from "antd"; +import { SingleValueType } from "rc-cascader/lib/Cascader"; +import { useEffect, useMemo, useState } from "react"; +import { + CITY_LIST, + CoordType, + ICON, + layerOptions, + lineOptions, + optionSelect, + pointOptions, + queryRegionData, +} from "./constants"; +import { InboxOutlined } from "@ant-design/icons"; +import * as turf from "@turf/turf"; +import { DrawControlLand } from "./draw"; +import styles from "./index.module.less"; +import { getEnv } from "../../../utils"; + +const { Dragger } = Upload; + +export const LocationSelect = () => { + const scene = useScene(); + const [coordType, setCoordType] = useState(); + const [select, setSelect] = useState("admin"); + const [regionData, setRegionData] = useState(); + const [options, setOptions] = useState([]); + + useEffect(() => { + fetch(CITY_LIST) + .then((res) => res.json()) + .then((result) => { + setOptions(result); + }); + }, []); + + const onChange = (value: string) => { + setSelect(value); + }; + + const onCityChange = async (value: SingleValueType) => { + const code = value[value.length - 1] as string; + const featureData: any = await queryRegionData(code); + const firstFeature = featureData.features[0]; + setCoordType((turf as any).getType(firstFeature)); + setRegionData(featureData); + }; + + // 自定义上传逻辑 + const customRequest = async (options: any) => { + const formData = new FormData(); + formData.append("file", options.file); + const response = await fetch(getEnv("/uploadvector"), { + method: "POST", + body: formData, + }); + const result = await response.json(); + if (response.ok) { + fetch(getEnv(`/${result.fileUrl}`)) + .then((res) => res.json()) + .then((res) => { + const firstFeature = res.features[0]; + setCoordType((turf as any).getType(firstFeature)); + setRegionData(res); + }); + } else { + message.error("Upload failed:", result.message); + } + }; + + // 区域选择控件 + const CascaderControl = () => { + if (options.length === 0) return null; + return ( + + ); + }; + + // 上传控件 + const UploadControl = () => { + return ( + +

+ +

+

+ 请上传矢量文件(支持上传shp、geojson和kml格式) +

+
+ ); + }; + + const controlRender = useMemo(() => { + if (select === "admin") return ; + if (select === "upload") return ; + // 绘制控件 https://l7draw.antv.vision/ + return ; + }, [select, options]); + + // 对上传的数据类型进行处理,不同的形状用不同的图层 + const layerRender = useMemo(() => { + if (!regionData && !coordType) return null; + + if (coordType === "MultiPolygon" || coordType === "Polygon") { + return ( + + ); + } + if (coordType === "Point") { + scene?.addImage("img", ICON); + return ; + } + if (coordType === "LineString" || coordType === "MultiLineString") { + return ; + } + }, [regionData, coordType, scene]); + + return ( +
+ +