diff --git a/index.html b/index.html index e4b78ea..b813c98 100644 --- a/index.html +++ b/index.html @@ -1,10 +1,14 @@ - + - + - Vite + React + TS + 遥感产品数据云
diff --git a/package-lock.json b/package-lock.json index 124be42..dbd94d1 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", + "dayjs": "^1.11.10", + "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/react": "^18.2.43", "@types/react-dom": "^18.2.17", "@typescript-eslint/eslint-plugin": "^6.14.0", @@ -139,9 +146,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 +157,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 +220,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 +254,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 +284,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 +304,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 +353,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 +378,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 +400,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 +419,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 +457,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 +1612,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 +3410,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", @@ -3460,6 +3482,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 +5840,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" } @@ -6825,10 +6856,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 +7174,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": { @@ -7778,9 +7839,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 +7850,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 +7869,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 +7915,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 +7945,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 +7973,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 +7997,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 +8073,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 +8095,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 +8107,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 +8888,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 +10284,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", @@ -10281,6 +10356,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 +12133,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", @@ -12753,10 +12836,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 +13073,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" } }, diff --git a/package.json b/package.json index 9e6f3b7..a8c3b94 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", + "dayjs": "^1.11.10", + "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/react": "^18.2.43", "@types/react-dom": "^18.2.17", "@typescript-eslint/eslint-plugin": "^6.14.0", 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..c82906b --- /dev/null +++ b/src/components/data-assets/index.module.less @@ -0,0 +1,5 @@ +.container { + width: 100vw; + height: calc(100vh - 64px); + color: #000; +} \ No newline at end of file diff --git a/src/components/data-assets/index.tsx b/src/components/data-assets/index.tsx new file mode 100644 index 0000000..ac29ea0 --- /dev/null +++ b/src/components/data-assets/index.tsx @@ -0,0 +1,8 @@ +import styles from "./index.module.less" + +export const DataAssets = () => { + + return ( +
数据检索
+ ) +} \ No newline at end of file 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..e5a450e --- /dev/null +++ b/src/components/data-retrieval/data-panel/index.module.less @@ -0,0 +1,32 @@ +.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 .ant-tree-node-content-wrapper.ant-tree-node-selected { + background-color: #1677ff; + color: #fff; + + .anticon { + color: #fff; + } + } + } +} + +.dataPanel { + overflow: auto; +} + +.dataPanel::-webkit-scrollbar { + width: 0.5em; +} \ No newline at end of file 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..a8cfb33 --- /dev/null +++ b/src/components/data-retrieval/data-panel/index.tsx @@ -0,0 +1,150 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { Button, Radio, RadioChangeEvent, Spin, Tree, message } from "antd" +import styles from "./index.module.less" +import { mockTree } from "./mock-tree" +import { useState } from "react" +import { getEnv, setFetchHeader } from "../../../utils" +import { TileData } from "../../../typing" +import dayjs from "dayjs" + +type DataPanelProps = { + setSelectDataTile: (value: TileData | undefined) => void; + cityInfo: { path: string, code: string } | undefined +} + +const bytesPerDataType: Record = { + 'byte': 1, + 'int16': 2, + 'uint16': 2, + 'int32': 4, + 'uint32': 4, + 'float32': 4, + 'float64': 8, + 'cint16': 4, + 'cint32': 8, + 'cfloat32': 8, + 'cfloat64': 16 +}; + +const PUBLIC_PATH = "/www/wwwroot/landcover100/public" + +export const DataPanel = (props: DataPanelProps) => { + const { setSelectDataTile, cityInfo } = props + const [value, setValue] = useState("") + const [loading, setLoading] = useState(false) + + const onSelect = (keys: any) => { + if (keys.length === 0) { + setSelectDataTile(undefined) + return + } + const [key] = keys + fetch( + getEnv('/getResourceTree'), + setFetchHeader({ id: key }) + ) + .then((res) => res.json()) + .then((res) => { + setSelectDataTile(res) + }).catch((err) => { + message.error(err) + setSelectDataTile(undefined) + }) + } + + const onRadioChange = (e: RadioChangeEvent) => { + const newValue = e.target.value + setValue(newValue) + } + + const onDownLoadData = async () => { + if (!value) { + message.info("请选择数据源") + return + } + if (!cityInfo?.path) { + message.info("请选择下载区域") + return + } + const vectorDataFilePath = `${PUBLIC_PATH}${cityInfo.path}` + const newValue = value.includes("#") ? value.replace("#", '') : value + setLoading(true) + const [alculateArea, getResourceTree] = await Promise.all([ + fetch(getEnv('/calculate_area'), setFetchHeader({ vectorDataFilePath })).then((res) => res.json()), + fetch(getEnv('/getResourceTree'), setFetchHeader({ id: newValue })).then((res) => res.json()) + ]) + const { dataType, resolution, zip_level, resPath } = getResourceTree || {} + + const totalPixels = (+alculateArea.area) * (1000 / +resolution) ** 2; + const fileSizeBytes = totalPixels * bytesPerDataType[dataType]; + const maxSize = fileSizeBytes / (+zip_level * 1024 ** 2); + if (maxSize > 100) { + message.info("预计文件超过100M,本网站是非盈利网站,超出网站的服务范围,请缩小面积") + return + } + const fileExt = cityInfo.path.split('/').pop(); + const rasterFilename = fileExt!.split('.').shift() + "_" + newValue; + const newTime = `${rasterFilename}_${dayjs().format("YYYYMMDDHHmmss")}` + const outputRasterPath = `${PUBLIC_PATH}/${newTime}.tif` + + const params = { + vectorDataFilePath, + outputRasterPath, + inputRasterPath: resPath + }; + const result = await fetch(getEnv("/clip_raster"), setFetchHeader(params)) + const { outputPath } = await result.json() + if (outputPath) { + const last = outputPath.split('/').pop() + const link = document.createElement('a'); + link.href = `https://www.landcover100.com/download_raster?filePath=${last}`; + link.download = ".tif"; + link.target = '_blank'; + link.click(); + } + setLoading(false) + } + + + const titleRender = (nodeData: any) => { + const hasChildren = nodeData.children + return ( +
{ + hasChildren + ? nodeData.title + : + +
{ + setValue("") + }}>{nodeData.title}
+
+
} +
+ ) + } + + return ( +
+ +
+
数据选择:
+ +
+
+
+
下载数据:
+ +
+
+ ) +} diff --git a/src/components/data-retrieval/data-panel/mock-tree.tsx b/src/components/data-retrieval/data-panel/mock-tree.tsx new file mode 100644 index 0000000..1c5009f --- /dev/null +++ b/src/components/data-retrieval/data-panel/mock-tree.tsx @@ -0,0 +1,367 @@ +import { QuestionCircleOutlined } from "@ant-design/icons" +import { DataNode } from "rc-tree/lib/interface"; + +const newIcon = (url: string) => { + return ( +
+ +
+ ) +} +export const mockTree: DataNode[] = [ + { + title: "土地覆盖数据", + key: 'TDFG', + children: [ + { + title: '低分辨率土地覆盖数据', + key: 'DTDFG', + children: [ + { + title: 'MODIS土地覆盖', + key: 'MODIS_Landcover', + selectable: true, + icon: newIcon("https://zhuanlan.zhihu.com/p/619527268"), + children: [ + { title: "2001年", key: 'modis2001', }, + { title: "2002年", key: 'modis2002' }, + { title: '2003年', key: 'modis2003' }, + { title: '2004年', key: 'modis2004' }, + { title: '2005年', key: 'modis2005' }, + { title: '2006年', key: 'modis2006' }, + { title: '2007年', key: 'modis2007' }, + { title: '2008年', key: 'modis2008' }, + { title: '2009年', key: 'modis2009' }, + { title: '2010年', key: 'modis2010' }, + { title: '2011年', key: 'modis2011' }, + { title: '2012年', key: 'modis2012' }, + { title: '2013年', key: 'modis2013' }, + { title: '2014年', key: 'modis2014' }, + { title: '2015年', key: 'modis2015' }, + { title: '2016年', key: 'modis2016' }, + { title: '2017年', key: 'modis2017' }, + { title: '2018年', key: 'modis2018' }, + { title: '2019年', key: 'modis2019' }, + { title: '2020年', key: 'modis2020' }, + ] + }, + { + title: "ESA_CCI_300米土地覆盖", + key: 'ESA_CCI', + selectable: true, + icon: newIcon("https://www.esa-landcover-cci.org/"), + children: [ + { title: '1992年', key: 'ESA_CCI_1992' }, + { title: '1993年', key: 'ESA_CCI_1993' }, + { title: '1994年', key: 'ESA_CCI_1994' }, + { title: '1995年', key: 'ESA_CCI_1995' }, + { title: '1996年', key: 'ESA_CCI_1996' }, + { title: '1997年', key: 'ESA_CCI_1997' }, + { title: '1998年', key: 'ESA_CCI_1998' }, + { title: '1999年', key: 'ESA_CCI_1999' }, + { title: '2000年', key: 'ESA_CCI_2000' }, + { title: '2001年', key: 'ESA_CCI_2001' }, + { title: '2002年', key: 'ESA_CCI_2002' }, + { title: '2003年', key: 'ESA_CCI_2003' }, + { title: '2004年', key: 'ESA_CCI_2004' }, + { title: '2005年', key: 'ESA_CCI_2005' }, + { title: '2006年', key: 'ESA_CCI_2006' }, + { title: '2007年', key: 'ESA_CCI_2007' }, + { title: '2008年', key: 'ESA_CCI_2008' }, + { title: '2009年', key: 'ESA_CCI_2009' }, + { title: '2010年', key: 'ESA_CCI_2010' }, + { title: '2011年', key: 'ESA_CCI_2011' }, + { title: '2012年', key: 'ESA_CCI_2012' }, + { title: '2013年', key: 'ESA_CCI_2013' }, + { title: '2014年', key: 'ESA_CCI_2014' }, + { title: '2015年', key: 'ESA_CCI_2015' }, + { title: '2016年', key: 'ESA_CCI_2016' }, + { title: '2017年', key: 'ESA_CCI_2017' }, + { title: '2018年', key: 'ESA_CCI_2018' }, + { title: '2019年', key: 'ESA_CCI_2019' }, + { title: '2020年', key: 'ESA_CCI_2020' }, + ] + }, + { + title: 'GEZE_9km土地覆盖', + key: 'GAZE_2010_tosee', + icon: newIcon("https://gaez.fao.org/"), + selectable: true, + children: [ + { title: 'GAZE_v4_2010年', key: 'GAZE_2010' }, + ] + }, + { + title: 'GLCNMO土地覆盖', + key: 'GLCNMO_tosee', + selectable: true, + icon: newIcon("https://globalmaps.github.io/glcnmo.html/"), + children: [ + { title: 'GLCNMO_V3_2013年', key: 'GLCNMO' }, + ] + }, + ], + }, + { + title: '中分辨率土地覆盖数据', + key: 'ZTDFG', + children: [ + { + title: 'AGLC_30米土地覆盖_30m', + key: 'AGLC', + selectable: true, + icon: newIcon("http://www.jors.cn/jrs/ch/reader/view_abstract.aspx?file_no=202109002&flag=1"), + children: [ + { title: '2000年', key: 'AGLC_2000' }, + { title: '2001年', key: 'AGLC_2001' }, + { title: '2002年', key: 'AGLC_2002' }, + { title: '2003年', key: 'AGLC_2003' }, + { title: '2004年', key: 'AGLC_2004' }, + { title: '2005年', key: 'AGLC_2005' }, + { title: '2006年', key: 'AGLC_2006' }, + { title: '2007年', key: 'AGLC_2007' }, + { title: '2008年', key: 'AGLC_2008' }, + { title: '2009年', key: 'AGLC_2009' }, + { title: '2010年', key: 'AGLC_2010' }, + { title: '2011年', key: 'AGLC_2011' }, + { title: '2012年', key: 'AGLC_2012' }, + { title: '2013年', key: 'AGLC_2013' }, + { title: '2014年', key: 'AGLC_2014' }, + ] + }, + { + title: 'GLC30_30米土地覆盖', + key: 'GLC30', + selectable: true, + icon: newIcon("https://csidotinfo.wordpress.com/2014/11/04/globeland30-glc30/"), + children: [ + { title: '2000年', key: 'GLC30_2000' }, + { title: '2010年', key: 'GLC30_2010' }, + { title: '2020年', key: 'GLC30_2020' }, + ] + }, + { + title: 'CLCD_30米土地覆盖', + key: 'CLCD', + selectable: true, + icon: newIcon("https://essd.copernicus.org/articles/13/3907/2021/"), + children: [ + { title: '2000年', key: 'CLCD_2000' }, + { title: '2001年', key: 'CLCD_2001' }, + { title: '2002年', key: 'CLCD_2002' }, + { title: '2003年', key: 'CLCD_2003' }, + { title: '2004年', key: 'CLCD_2004' }, + { title: '2005年', key: 'CLCD_2005' }, + { title: '2006年', key: 'CLCD_2006' }, + { title: '2007年', key: 'CLCD_2007' }, + { title: '2008年', key: 'CLCD_2008' }, + { title: '2009年', key: 'CLCD_2009' }, + { title: '2010年', key: 'CLCD_2010' }, + { title: '2011年', key: 'CLCD_2011' }, + { title: '2012年', key: 'CLCD_2012' }, + { title: '2013年', key: 'CLCD_2013' }, + { title: '2014年', key: 'CLCD_2014' }, + { title: '2015年', key: 'CLCD_2015' }, + { title: '2016年', key: 'CLCD_2016' }, + { title: '2017年', key: 'CLCD_2017' }, + { title: '2018年', key: 'CLCD_2018' }, + { title: '2019年', key: 'CLCD_2019' }, + { title: '2020年', key: 'CLCD_2020' }, + { title: '2021年', key: 'CLCD_2021' }, + { title: '2022年', key: 'CLCD_2022' }, + ] + }, + { + title: 'GLC_FCS_30米土地覆盖', + key: 'GLC_FCS', + selectable: true, + icon: newIcon("https://essd.copernicus.org/preprints/essd-2020-182/essd-2020-182-manuscript-version5.pdf"), + children: [ + { title: '1985年', key: 'GLC_FCS_1985' }, + { title: '1990年', key: 'GLC_FCS_1990' }, + { title: '1995年', key: 'GLC_FCS_1995' }, + { title: '2000年', key: 'GLC_FCS_2000' }, + { title: '2005年', key: 'GLC_FCS_2005' }, + { title: '2010年', key: 'GLC_FCS_2010' }, + { title: '2015年', key: 'GLC_FCS_2015' }, + { title: '2020年', key: 'GLC_FCS_2020' }, + ] + }, + { + title: 'GLCLUC_30米土地覆盖', + key: 'GLCLUC', + selectable: true, + icon: newIcon("https://glad.umd.edu/dataset/GLCLUC2020"), + children: [ + { title: '2000年', key: 'GLCLUC_2000' }, + { title: '2010年', key: 'GLCLUC_2010' }, + { title: '2015年', key: 'GLCLUC_2015' }, + { title: '2020年', key: 'GLCLUC_2020' }, + ] + }, + ], + }, + { + title: '高分辨率土地覆盖数据', + key: 'GTDFG', + children: [ + { + title: 'ESA_WorldCover_10m', + key: 'ESA', + selectable: true, + icon: newIcon("https://esa-worldcover.org/en"), + children: [ + { title: '2020年', key: 'ESA_2020' }, + { title: '2021年', key: 'ESA_2021' }, + ] + }, + { + title: 'FROM_LC_10m', + key: 'FROM_LC', + selectable: true, + icon: newIcon("https://data-starcloud.pcl.ac.cn/zh/resource/1"), + children: [ + { title: '2017年', key: 'FROM_LC2017' }, + ] + }, + ], + }, + ], + }, + { + title: "DEM高程数据", + key: 'DEM', + children: [ + { + title: '低分辨率DEM数据', + key: 'DDEM', + children: [ + { + title: '250米DEM', + key: 'DEM250', + selectable: true, + children: [ + { title: '250米DEM', key: 'DEM250#' }, + ] + }, + { + title: '1000米DEM', + key: 'DEM1000', + selectable: true, + children: [ + { title: 'DEM1000', key: 'DEM1000#' }, + ] + }, + ], + }, + { + title: '中分辨率DEM数据', + key: 'ZDEM', + children: [ + { + title: 'DEM_TANX', + key: 'DEMTANX', + selectable: true, + icon: newIcon("https://mp.weixin.qq.com/s/CFBYssYt7VIyrQTZRU2Mlw"), + children: [ + { title: 'DEMTANX', key: 'DEMTANX#' }, + ] + }, + { + title: '哥白尼DEM', + key: 'Copernicus_DEM', + selectable: true, + icon: newIcon("https://mp.weixin.qq.com/s/mShNKPcfbCh-SclSw52dXA"), + children: [ + { title: '哥白尼DEM', key: 'Copernicus_DEM#' }, + ] + }, + { + title: 'SRTM_V3_DEM', + key: 'SRTM_V3_DEM', + selectable: true, + icon: newIcon("https://www.earthdata.nasa.gov/news/nasa-shuttle-radar-topography-mission-srtm-version-3-0-global-1-arc-second-data-released-over-asia-and-australia"), + children: [ + { title: 'SRTM_V3_DEM', key: 'SRTM_V3_DEM#' }, + ] + }, + { + title: 'ASTER_DEM_30m', + key: 'ASTER_DEM', + selectable: true, + icon: newIcon("https://cmr.earthdata.nasa.gov/search/concepts/C1711961296-LPCLOUD.html"), + children: [ + { title: 'ASTER_DEM_30m', key: 'ASTER_DEM#' }, + ] + }, + { + title: 'AW3D30_V4', + key: 'AW3D30_V4', + selectable: true, + icon: newIcon("https://www.eorc.jaxa.jp/ALOS/en/dataset/aw3d30/data/aw3d30v4.0_product_e_1.0.pdf"), + children: [ + { title: 'AW3D30_V4', key: 'AW3D30_V4#' }, + ] + }, + { + title: 'NASA_DEM_30m', + key: 'NASA_DEM_30m', + selectable: true, + icon: newIcon("https://www.earthdata.nasa.gov/esds/competitive-programs/measures/nasadem"), + children: [ + { title: 'NASA_DEM_30m', key: 'NASA_DEM_30m#' }, + ] + } + ], + }, + { + title: '高分辨率DEM数据', + key: 'GDEM', + children: [ + { + title: 'ALOS_DEM_12.5m', + key: 'DEM_ALOS_12m', + selectable: true, + icon: newIcon("https://search.asf.alaska.edu/#/"), + children: [ + { title: '上海市', key: 'DEM_ALOS_12m_SH' }, + { title: '云南省', key: 'DEM_ALOS_12m_YN' }, + { title: '内蒙古', key: 'DEM_ALOS_12m_NMG' }, + { title: '北京', key: 'DEM_ALOS_12m_BJ' }, + { title: '台湾省', key: 'DEM_ALOS_12m_TW' }, + { title: '吉林省', key: 'DEM_ALOS_12m_JL' }, + { title: '四川省', key: 'DEM_ALOS_12m_SC' }, + { title: '天津市', key: 'DEM_ALOS_12m_TJ' }, + { title: '宁夏', key: 'DEM_ALOS_12m_NX' }, + { title: '安徽', key: 'DEM_ALOS_12m_AH' }, + { title: '山东', key: 'DEM_ALOS_12m_SD' }, + { title: '山西省', key: 'DEM_ALOS_12m_SX' }, + { title: '广东', key: 'DEM_ALOS_12m_GD' }, + { title: '广西', key: 'DEM_ALOS_12m_GX' }, + { title: '新疆', key: 'DEM_ALOS_12m_XJ' }, + { title: '江苏', key: 'DEM_ALOS_12m_JS' }, + { title: '江西', key: 'DEM_ALOS_12m_JX' }, + { title: '河北', key: 'DEM_ALOS_12m_HEB' }, + { title: '河南', key: 'DEM_ALOS_12m_HN' }, + { title: '浙江', key: 'DEM_ALOS_12m_ZJ' }, + { title: '海南', key: 'DEM_ALOS_12m_HAN' }, + { title: '湖北', key: 'DEM_ALOS_12m_HB' }, + { title: '湖南', key: 'DEM_ALOS_12m_HUN' }, + { title: '澳门', key: 'DEM_ALOS_12m_AM' }, + { title: '甘肃', key: 'DEM_ALOS_12m_GS' }, + { title: '福建', key: 'DEM_ALOS_12m_HJ' }, + { title: '西藏', key: 'DEM_ALOS_12m_XZ' }, + { title: '贵州', key: 'DEM_ALOS_12m_GZ' }, + { title: '辽宁', key: 'DEM_ALOS_12m_LN' }, + { title: '重庆', key: 'DEM_ALOS_12m_CQ' }, + { title: '陕西', key: 'DEM_ALOS_12m_SXS' }, + { title: '青海', key: 'DEM_ALOS_12m_QH' }, + { title: '香港', key: 'DEM_ALOS_12m_XG' }, + { title: '黑龙江', key: 'DEM_ALOS_12m_HLJ' }, + ] + }, + ], + }, + ], + }, +] diff --git a/src/components/data-retrieval/index.module.less b/src/components/data-retrieval/index.module.less new file mode 100644 index 0000000..bdf94d8 --- /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; + } +} \ No newline at end of file diff --git a/src/components/data-retrieval/index.tsx b/src/components/data-retrieval/index.tsx new file mode 100644 index 0000000..3151127 --- /dev/null +++ b/src/components/data-retrieval/index.tsx @@ -0,0 +1,39 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +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" +import { RasterLayerRender } from "./layer/rasterLayer" +import { useState } from "react" + +const mapOptions: Partial = { + zoom: 9, + center: [120.3234, 30.1224], + style: "normal", + token: '15cd8a57710d40c9b7c0e3cc120f1200', +} + + +export const DataRetrieval = () => { + const [selectTileData, setSelectDataTile] = useState() + const [cityInfo, setCityInfo] = useState<{ path: string, code: string }>() + return ( +
+ + + + + + + + + +
+ + ) +} \ No newline at end of file diff --git a/src/components/data-retrieval/layer/rasterLayer.tsx b/src/components/data-retrieval/layer/rasterLayer.tsx new file mode 100644 index 0000000..54bac06 --- /dev/null +++ b/src/components/data-retrieval/layer/rasterLayer.tsx @@ -0,0 +1,66 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/ban-types */ +import { RasterLayer, useScene } from "@antv/larkmap" +import { TileData } from "../../../typing" +import { useEffect, useMemo } from "react" +import React from "react" +import { removeRasterLayer } from "../../../utils" + +type RasterLayerRenderProps = { + tileData: TileData +} + +export const RasterLayerRender = React.memo((props: RasterLayerRenderProps) => { + const { tileData } = props + const scene = useScene() + const newUrl = useMemo(() => { + if (!tileData) return null + const params = new URL(decodeURIComponent(tileData.wmts)) + const search = params.searchParams + const search1 = new URLSearchParams() + let tileXyz = "" + search.forEach((value, key) => { + if (key === "TileMatrix" || key === "TileCol" || key === "TileRow") { + tileXyz += `&${key}=${value}` + } else { + search1.set(key, value) + } + }); + return { + tilePath: `/tile/${params.pathname}?${decodeURIComponent(search1.toString())}`, + params: tileXyz + } + }, [tileData]) + + useEffect(() => { + if (!newUrl && scene) { + removeRasterLayer(scene, "tileData") + } + }, [scene, newUrl]) + + const getCustomData = ({ x, y, z }: Record, cb: Function) => { + if (newUrl) { + const xyzConn = `${newUrl.tilePath}&TileCol=${x}&TileRow=${y}&TileMatrix=${z}` + fetch(xyzConn).then((res) => res.arrayBuffer()).then(res => cb(null, res)) + } + } + + + return newUrl && + + +}, () => false) + 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..4781d4b --- /dev/null +++ b/src/components/data-retrieval/location-select/constants.ts @@ -0,0 +1,95 @@ +/* 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: "#1677ff", + opacity: 0.3, + strokeColor: '#000', + lineWidth: 2, + 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: "#1677ff", + 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({ path: data.filepath, 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; +}; \ No newline at end of file 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..19c5ba2 --- /dev/null +++ b/src/components/data-retrieval/location-select/draw.tsx @@ -0,0 +1,57 @@ +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("#1677ff", 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 +} \ No newline at end of file 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..44cfe33 --- /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; + } + } +} \ No newline at end of file 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..ce019d1 --- /dev/null +++ b/src/components/data-retrieval/location-select/index.tsx @@ -0,0 +1,146 @@ +/* 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; + +type LocationProps = { + setCityInfo: (value: any) => void +} +export const LocationSelect = (props: LocationProps) => { + 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) => { + setRegionData(undefined) + setSelect(value) + } + + const onCityChange = async (value: SingleValueType) => { + const code = value[value.length - 1] as string + const result: Record = await queryRegionData(code) + const firstFeature = (result?.res as any).features[0] + setCoordType((turf as any).getType(firstFeature)) + setRegionData((result?.res as any)) + props.setCityInfo({ path: result?.path, code }) + } + + // 自定义上传逻辑 + const customRequest = async (options: any) => { + const formData = new FormData() + formData.append('file', options.file) + const fileExt = options.file.name.split('.')[1] + const newUrl = ["kml", 'geojson', 'gson'].includes(fileExt) ? "/uploadvector" : '/uploadSHPvector' + + const response = await fetch(getEnv(newUrl), { + 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 + } + + }, [JSON.stringify(regionData), coordType, scene]) + + return ( +
+ +