From a25815dd2e2d7026e724a6da24abb13e07907841 Mon Sep 17 00:00:00 2001 From: Alex Zhu Date: Fri, 24 Apr 2026 23:24:43 +0800 Subject: [PATCH] feat: replace L7 with D3 hex-tile map visualization (#11709) Co-authored-by: Claude Opus 4.6 --- package.json | 10 +- pnpm-lock.yaml | 828 +----------------- .../monitor/components/Map/index.tsx | 515 ++++++++--- src/pages/dashboard/monitor/index.tsx | 21 +- src/pages/dashboard/monitor/service.ts | 17 - src/pages/dashboard/monitor/style.style.ts | 11 +- 6 files changed, 456 insertions(+), 946 deletions(-) diff --git a/package.json b/package.json index 9221f5b1..46adc021 100644 --- a/package.json +++ b/package.json @@ -43,16 +43,16 @@ "@ant-design/x": "^2.5.0", "@ant-design/x-markdown": "^2.5.0", "@ant-design/x-sdk": "^2.5.0", - "@antv/l7": "^2.22.7", - "@antv/l7-react": "^2.4.3", "@rc-component/util": "^1.9.0", "@tanstack/react-query": "^5.97.0", "antd": "^6.3.6", "antd-style": "^4.1.0", "clsx": "^2.1.1", + "d3": "^7.9.0", "dayjs": "^1.11.19", "react": "^19.2.4", - "react-dom": "^19.2.4" + "react-dom": "^19.2.4", + "topojson-client": "^3.1.0" }, "devDependencies": { "@biomejs/biome": "^2.4.12", @@ -67,12 +67,16 @@ "@types/react": "^19.2.10", "@types/react-dom": "^19.2.3", "@types/react-helmet": "^6.1.11", + "@types/topojson-client": "^3.1.5", + "@types/d3": "^7.4.3", + "@types/topojson-specification": "^1.0.5", "@umijs/lint": "^4.6.45", "@umijs/max": "^4.6.45", "@umijs/max-plugin-openapi": "^2.0.3", "@umijs/request-record": "^1.1.3", "cross-env": "^10.1.0", "express": "^5.2.1", + "geojson": "^0.5.0", "gh-pages": "^6.1.1", "husky": "^9.1.7", "jest": "^30.0.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 89b56106..73a98580 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,12 +26,6 @@ importers: '@ant-design/x-sdk': specifier: ^2.5.0 version: 2.5.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@antv/l7': - specifier: ^2.22.7 - version: 2.25.4 - '@antv/l7-react': - specifier: ^2.4.3 - version: 2.4.3(@antv/l7@2.25.4)(mapbox-gl@1.13.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': specifier: ^1.9.0 version: 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5) @@ -47,6 +41,9 @@ importers: clsx: specifier: ^2.1.1 version: 2.1.1 + d3: + specifier: ^7.9.0 + version: 7.9.0 dayjs: specifier: ^1.11.19 version: 1.11.20 @@ -56,6 +53,9 @@ importers: react-dom: specifier: ^19.2.4 version: 19.2.5(react@19.2.5) + topojson-client: + specifier: ^3.1.0 + version: 3.1.0 devDependencies: '@biomejs/biome': specifier: ^2.4.12 @@ -75,6 +75,9 @@ importers: '@testing-library/react': specifier: ^16.3.0 version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@types/d3': + specifier: ^7.4.3 + version: 7.4.3 '@types/express': specifier: ^5.0.6 version: 5.0.6 @@ -93,6 +96,12 @@ importers: '@types/react-helmet': specifier: ^6.1.11 version: 6.1.11 + '@types/topojson-client': + specifier: ^3.1.5 + version: 3.1.5 + '@types/topojson-specification': + specifier: ^1.0.5 + version: 1.0.5 '@umijs/lint': specifier: ^4.6.45 version: 4.6.45(eslint@8.35.0)(jest@30.3.0(@types/node@25.6.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@25.6.0)(typescript@6.0.3)))(stylelint@14.8.2)(typescript@6.0.3) @@ -111,6 +120,9 @@ importers: express: specifier: ^5.2.1 version: 5.2.1 + geojson: + specifier: ^0.5.0 + version: 0.5.0 gh-pages: specifier: ^6.1.1 version: 6.3.0 @@ -153,9 +165,6 @@ packages: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} - '@amap/amap-jsapi-loader@1.0.1': - resolution: {integrity: sha512-nPyLKt7Ow/ThHLkSvn2etQlUzqxmTVgK7bIgwdBRTg2HK5668oN7xVxkaiRe3YZEzGzfV2XgH5Jmu2T73ljejw==} - '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -359,9 +368,6 @@ packages: '@antfu/utils@0.7.10': resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} - '@antv/async-hook@2.2.9': - resolution: {integrity: sha512-4BUp2ZUaTi2fYL67Ltkf6eV912rYJeSBokGhd5fhhnpUkMA1LEI1mg97Pqmx3yC50VEQ+LKXZxj9ePZs80ECfw==} - '@antv/component@2.1.11': resolution: {integrity: sha512-dTdz8VAd3rpjOaGEZTluz82mtzrP4XCtNlNQyrxY7VNRNcjtvpTLDn57bUL2lRu1T+iklKvgbE2llMriWkq9vQ==} @@ -377,9 +383,6 @@ packages: '@antv/g-canvas@2.2.0': resolution: {integrity: sha512-h7zVBBo2aO64DuGKvq9sG+yTU3sCUb9DALCVm7nz8qGPs8hhLuFOkKPEzUDNfNYZGJUGzY8UDtJ3QRGRFcvEQg==} - '@antv/g-device-api@1.6.13': - resolution: {integrity: sha512-lTvlSHYDZyWJnAR1W8DOQLwUo32VpRopbS/BPQqStcOV6FqaC+u5YjT50KbJ+oBWcorpzfknhICRwEA3Xm8t9Q==} - '@antv/g-lite@2.7.0': resolution: {integrity: sha512-uSzgHYa5bwR5L2Au7/5tsOhFmXKZKLPBH90+Q9bP9teVs5VT4kOAi0isPSpDI8uhdDC2/VrfTWu5K9HhWI6FWw==} @@ -398,44 +401,6 @@ packages: '@antv/g@6.3.1': resolution: {integrity: sha512-WYEKqy86LHB2PzTmrZXrIsIe+3Epeds2f68zceQ+BJtRoGki7Sy4IhlC8LrUMztgfT1t3d/0L745NWZwITroKA==} - '@antv/l7-component@2.25.4': - resolution: {integrity: sha512-6TYI0LyJsGdIkwtIUSRwlXZaoeqdrYXOo3MU12Bt2aMOIbTTLSZLKJVk8biUV7BzrsRIbty/t+PtG1aVaYnmlQ==} - - '@antv/l7-core@2.25.4': - resolution: {integrity: sha512-m8yKAmwotaCJPk8VfEoGdNWyiLhhkaSfEK8hmBKG7xc06LHGxTvwwMcA0qrBjLoqKhnM3kx5/zJt2q8i8nVSeA==} - - '@antv/l7-layers@2.25.4': - resolution: {integrity: sha512-iZQ2J6SYRuVMFukGPfurs4H/eEskqyAtEJ1jONv3GDGWHr5IiKAREY9k1gYY2h43Jqe2FNMm8Wf+5KCPyPTShA==} - - '@antv/l7-map@2.25.4': - resolution: {integrity: sha512-HWr1Xs3UUn9ro77CtgVE/7zc3b2aAsm1nrqwCpGO9qxGZJkJapzyeQacezMIuiokborRRKQ7IHl/s70LiCOMOA==} - - '@antv/l7-maps@2.25.4': - resolution: {integrity: sha512-Teja1NJKIfRqicBj0drpk7XVmRB6jgmcluWd34vSenFP2wszxB1P1oLUBQo0+yHCc/brvUFaFD8loCBq8pjQXQ==} - - '@antv/l7-react@2.4.3': - resolution: {integrity: sha512-TwKDhvR5Pv82/7sB00I1B5GXefxZ2P9UvnR28f/w7+kmsZXShlGv8NoBeb20DM9jRCf5MQ78fRkqXM3W2tWlVg==} - peerDependencies: - '@antv/l7': ^2.11.0 - mapbox-gl: ^1.2.1 - react: ^16.8.6 || ^17.0.2 - react-dom: ^16.8.6 || ^17.0.2 - - '@antv/l7-renderer@2.25.4': - resolution: {integrity: sha512-FO/lXHDCp6PFU4lVSuOmJ33rJEpO8hfztU3O5uXNBIZFWi+i940cpwWtqRSz/8XiQIfuQ58LuWAuXPMvini9+Q==} - - '@antv/l7-scene@2.25.4': - resolution: {integrity: sha512-y6QzC+oLYhFFZYjf9No1ZG6T4ZJFBQNwANMHixMcJqeEt+YeyNQLyEfHGONYAuJorC16+YADump57V8LruC6JA==} - - '@antv/l7-source@2.25.4': - resolution: {integrity: sha512-oY3gwWoPgku5AXOTDDir32xGGjSNfCMkXfNb4xIJ8zRbCkl9fEUeEnZii1GCM8R58rv0FIpHv4KXEvaGMwlNWg==} - - '@antv/l7-utils@2.25.4': - resolution: {integrity: sha512-uUVKVJU6s93BFlS+GPpqdpG0QKElcWt9vtbKMOp76vuvFX9d4cjuSJYBm2AKglz/jhm6cvNsZwqCDkbeNrIDtw==} - - '@antv/l7@2.25.4': - resolution: {integrity: sha512-jkQ3/pQtlRxXUkCNH223s5AXE55j+dkt2Ou1iAAxwamXj9liKX+JwZ33NK9PXujoyt1KSd8EqJq8hV6dVfgRcw==} - '@antv/scale@0.4.16': resolution: {integrity: sha512-5wg/zB5kXHxpTV5OYwJD3ja6R8yTiqIOkjOhmpEJiowkzRlbEC/BOyMvNUq5fqFIHnMCE9woO7+c3zxEQCKPjw==} @@ -1968,51 +1933,6 @@ packages: peerDependencies: react: '>=16.3.0' - '@mapbox/geojson-rewind@0.5.2': - resolution: {integrity: sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==} - hasBin: true - - '@mapbox/geojson-types@1.0.2': - resolution: {integrity: sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw==} - - '@mapbox/jsonlint-lines-primitives@2.0.2': - resolution: {integrity: sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==} - engines: {node: '>= 0.6'} - - '@mapbox/mapbox-gl-supported@1.5.0': - resolution: {integrity: sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg==} - peerDependencies: - mapbox-gl: '>=0.32.1 <2.0.0' - - '@mapbox/martini@0.2.0': - resolution: {integrity: sha512-7hFhtkb0KTLEls+TRw/rWayq5EeHtTaErgm/NskVoXmtgAQu/9D299aeyj6mzAR/6XUnYRp2lU+4IcrYRFjVsQ==} - - '@mapbox/point-geometry@0.1.0': - resolution: {integrity: sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==} - - '@mapbox/tiny-sdf@1.2.5': - resolution: {integrity: sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw==} - - '@mapbox/tiny-sdf@2.1.0': - resolution: {integrity: sha512-uFJhNh36BR4OCuWIEiWaEix9CA2WzT6CAIcqVjWYpnx8+QDtS+oC4QehRrx5cX4mgWs37MmKnwUejeHxVymzNg==} - - '@mapbox/unitbezier@0.0.0': - resolution: {integrity: sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==} - - '@mapbox/unitbezier@0.0.1': - resolution: {integrity: sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==} - - '@mapbox/vector-tile@1.3.1': - resolution: {integrity: sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==} - - '@mapbox/whoots-js@3.1.0': - resolution: {integrity: sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==} - engines: {node: '>=6.0.0'} - - '@maplibre/maplibre-gl-style-spec@19.3.3': - resolution: {integrity: sha512-cOZZOVhDSulgK0meTsTkmNXb1ahVvmTmWmfx9gRBwc6hq98wS9JP35ESIoNq3xqEan+UN+gn8187Z6E4NKhLsw==} - hasBin: true - '@mermaid-js/parser@1.1.0': resolution: {integrity: sha512-gxK9ZX2+Fex5zu8LhRQoMeMPEHbc73UKZ0FQ54YrQtUxE1VVhMwzeNtKRPAu5aXks4FasbMe4xB4bWrmq6Jlxw==} @@ -2736,30 +2656,6 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - '@turf/bbox-polygon@6.5.0': - resolution: {integrity: sha512-+/r0NyL1lOG3zKZmmf6L8ommU07HliP4dgYToMoTxqzsWzyLjaj/OzgQ8rBmv703WJX+aS6yCmLuIhYqyufyuw==} - - '@turf/bbox@6.5.0': - resolution: {integrity: sha512-RBbLaao5hXTYyyg577iuMtDB8ehxMlUqHEJiMs8jT1GHkFhr6sYre3lmLsPeYEi/ZKj5TP5tt7fkzNdJ4GIVyw==} - - '@turf/clone@6.5.0': - resolution: {integrity: sha512-mzVtTFj/QycXOn6ig+annKrM6ZlimreKYz6f/GSERytOpgzodbQyOgkfwru100O1KQhhjSudKK4DsQ0oyi9cTw==} - - '@turf/helpers@6.5.0': - resolution: {integrity: sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==} - - '@turf/invariant@6.5.0': - resolution: {integrity: sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==} - - '@turf/meta@6.5.0': - resolution: {integrity: sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA==} - - '@turf/polygon-to-line@6.5.0': - resolution: {integrity: sha512-5p4n/ij97EIttAq+ewSnKt0ruvuM+LIDzuczSzuHTpq4oS7Oq8yqg5TQ4nzMVuK41r/tALCk7nAoBuw3Su4Gcw==} - - '@turf/union@6.5.0': - resolution: {integrity: sha512-igYWCwP/f0RFHIlC2c0SKDuM/ObBaqSljI3IdV/x71805QbIvY/BYGcJdyNcgEA6cylIGl/0VSlIbpJHZ9ldhw==} - '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} @@ -2880,9 +2776,6 @@ packages: '@types/eslint-scope@3.7.7': resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} - '@types/eslint@8.56.12': - resolution: {integrity: sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==} - '@types/eslint@9.6.1': resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} @@ -2946,9 +2839,6 @@ packages: '@types/jest@30.0.0': resolution: {integrity: sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==} - '@types/js-cookie@2.2.7': - resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==} - '@types/jsdom@21.1.7': resolution: {integrity: sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==} @@ -2958,18 +2848,6 @@ packages: '@types/keyv@3.1.4': resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} - '@types/lodash@4.17.24': - resolution: {integrity: sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==} - - '@types/mapbox-gl@1.13.10': - resolution: {integrity: sha512-0oUy5d5nT3L480MRviAnaBUEXuWCG/7M4ZQo0n8eJ/LLMgJ0nMbjv7M+qoPl4TAj6yVVWKTvkukXvW9QHH1GVw==} - - '@types/mapbox__point-geometry@0.1.4': - resolution: {integrity: sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA==} - - '@types/mapbox__vector-tile@1.3.4': - resolution: {integrity: sha512-bpd8dRn9pr6xKvuEBQup8pwQfD4VUyqO/2deGjfpe6AwC8YRlyEipvefyRJUSiCJTZuCb8Pl1ciVV5ekqJ96Bg==} - '@types/minimist@1.2.5': resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} @@ -2982,9 +2860,6 @@ packages: '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - '@types/pbf@3.0.5': - resolution: {integrity: sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA==} - '@types/prismjs@1.26.6': resolution: {integrity: sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw==} @@ -3035,8 +2910,11 @@ packages: '@types/stylis@4.2.7': resolution: {integrity: sha512-VgDNokpBoKF+wrdvhAAfS55OMQpL6QRglwTwNC3kIgBrzZxA4WsFj+2eLfEA/uMUDzBcEhYmjSbwQakn/i3ajA==} - '@types/supercluster@7.1.3': - resolution: {integrity: sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA==} + '@types/topojson-client@3.1.5': + resolution: {integrity: sha512-C79rySTyPxnQNNguTZNI1Ct4D7IXgvyAs3p9HPecnl6mNrJ5+UhvGNYcZfpROYV2lMHI48kJPxwR+F9C6c7nmw==} + + '@types/topojson-specification@1.0.5': + resolution: {integrity: sha512-C7KvcQh+C2nr6Y2Ub4YfgvWvWCgP2nOQMtfhlnwsRL4pYmmwzBS7HclGiS87eQfDOU/DLQpX6GEscviaz4yLIQ==} '@types/tough-cookie@4.0.5': resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} @@ -3575,9 +3453,6 @@ packages: '@webassemblyjs/wast-printer@1.14.1': resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} - '@webgpu/types@0.1.69': - resolution: {integrity: sha512-RPmm6kgRbI8e98zSD3RVACvnuktIja5+yLgDAkTmxLr90BEwdTXRQWNLF3ETTTyH/8mKhznZuN5AveXYFEsMGQ==} - '@xtuc/ieee754@1.2.0': resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} @@ -3626,12 +3501,6 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} - ahooks@2.10.14: - resolution: {integrity: sha512-axWa7VoAgu7bxA56dDl0CXW4rvaQmDBiov/d3tAy0x1YNYywYMKokL8TdLgJ5zO/oXGiWmG7BxlGOQGkqE/zkQ==} - engines: {node: '>=8.0.0'} - peerDependencies: - react: ^16.8.6 || ^17.0 - ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: @@ -3760,10 +3629,6 @@ packages: aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - arr-union@3.1.0: - resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} - engines: {node: '>=0.10.0'} - array-buffer-byte-length@1.0.2: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} @@ -3817,10 +3682,6 @@ packages: assert@1.5.1: resolution: {integrity: sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==} - assign-symbols@1.0.0: - resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} - engines: {node: '>=0.10.0'} - astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} @@ -4069,12 +3930,6 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} - bytewise-core@1.2.3: - resolution: {integrity: sha512-nZD//kc78OOxeYtRlVk8/zXqTB4gf/nlguL1ggWA8FuchMyOxcyHR4QPQZMUmA7czC+YnaBrPUCubqAWe50DaA==} - - bytewise@1.1.0: - resolution: {integrity: sha512-rHuuseJ9iQ0na6UDhnrRVDh8YnWVlU6xM3VH6q/+yHDeUH2zIhUzP+2/h3LIrhLDBtTqzWpE3p3tP/boefskKQ==} - cacheable-request@6.1.0: resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==} engines: {node: '>=8'} @@ -4564,9 +4419,6 @@ packages: resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} engines: {node: '>= 6'} - csscolorparser@1.0.3: - resolution: {integrity: sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==} - cssdb@6.6.3: resolution: {integrity: sha512-7GDvDSmE+20+WcSMhP17Q1EVWUrLlbxxpMDqG731n8P99JhnQZHR9YvtjPvEHfjFUjvQJvdpKCjlKOX+xe4UVA==} @@ -5112,9 +4964,6 @@ packages: react: 15.x || ^16.0.0-0 react-dom: 15.x || ^16.0.0-0 - earcut@2.2.4: - resolution: {integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==} - eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -5388,9 +5237,6 @@ packages: event-emitter@0.3.5: resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} - eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - eventemitter3@5.0.4: resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} @@ -5452,14 +5298,6 @@ packages: ext@1.7.0: resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} - extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} - - extend-shallow@3.0.2: - resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} - engines: {node: '>=0.10.0'} - extend2@1.0.0: resolution: {integrity: sha512-/7zWrWJGblJZ4OnLaIDoO3GYv28ksNwxlBZ80YPHLWt5P6xvALW8dLfeoQ9f9PHtuaWnUXTa7bRnjDzLp9C6Yg==} @@ -5510,9 +5348,6 @@ packages: resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} engines: {node: ^12.20 || >= 14.13} - fflate@0.8.2: - resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} - figures@2.0.0: resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==} engines: {node: '>=4'} @@ -5683,8 +5518,9 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} - geojson-vt@3.2.1: - resolution: {integrity: sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==} + geojson@0.5.0: + resolution: {integrity: sha512-/Bx5lEn+qRF4TfQ5aLu6NH+UKtvIv7Lhc487y/c8BdludrCTpiWf9wyI0RTyqg49MFefIAvFDuEi5Dfd/zgNxQ==} + engines: {node: '>= 0.10'} get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} @@ -5740,10 +5576,6 @@ packages: get-tsconfig@4.7.5: resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} - get-value@2.0.6: - resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} - engines: {node: '>=0.10.0'} - gh-pages@6.3.0: resolution: {integrity: sha512-Ot5lU6jK0Eb+sszG8pciXdjMXdBJ5wODvgjR+imihTqsUWF2K6dJ9HST55lgqcs8wWcw6o6wAsUzfcYRhJPXbA==} engines: {node: '>=10'} @@ -5844,16 +5676,9 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - grid-index@1.1.0: - resolution: {integrity: sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==} - hachure-fill@0.5.2: resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} - hammerjs@2.0.8: - resolution: {integrity: sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==} - engines: {node: '>=0.8.0'} - handle-thing@2.0.1: resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} @@ -6163,10 +5988,6 @@ packages: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} - intersection-observer@0.7.0: - resolution: {integrity: sha512-Id0Fij0HsB/vKWGeBe9PxeY45ttRiBmhFyyt/geBdDHBYNctMRTE3dC1U3ujzz3lap+hVXlEcVaB56kZP/eEUg==} - deprecated: The Intersection Observer polyfill is no longer needed and can safely be removed. Intersection Observer has been Baseline since 2019. - intl-format-cache@4.3.1: resolution: {integrity: sha512-OEUYNA7D06agqPOYhbTkl0T8HA3QKSuwWh1HiClEnpd9vw7N+3XsQt5iZ0GUEchp5CW1fQk/tary+NsbF3yQ1Q==} @@ -6272,14 +6093,6 @@ packages: resolution: {integrity: sha512-hErktGR9jmoYXNWlbrwGjc8eHh09mbY6TWSTTFtnMcKaCuSMN8z+Ni5ma/8mkbVpe4CbB7V6kN1MkCg9bCx5bA==} engines: {node: '>= 0.4'} - is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} - - is-extendable@1.0.1: - resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} - engines: {node: '>=0.10.0'} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -6682,9 +6495,6 @@ packages: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true - js-cookie@2.2.1: - resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} - js-levenshtein@1.1.6: resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} engines: {node: '>=0.10.0'} @@ -6743,9 +6553,6 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - json-stringify-pretty-compact@3.0.0: - resolution: {integrity: sha512-Rc2suX5meI0S3bfdZuA7JMFBGkJ875ApfVyq2WHELjBiiG22My/l7/8zPpH/CfFVQHuVLd8NLR0nv6vi0BYYKA==} - json2mq@0.2.0: resolution: {integrity: sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==} @@ -6769,12 +6576,6 @@ packages: resolution: {integrity: sha512-pQpZbdBu7wCTmQUh7ufPmLr0pFoObnGUoL/yhtwJDgmmQpbkg/0HSVti25Fu4rmd1oCR6NGWe9vqTWuWv3GcNA==} hasBin: true - kdbush@3.0.0: - resolution: {integrity: sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==} - - kdbush@4.0.2: - resolution: {integrity: sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==} - keyv@3.1.0: resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} @@ -7001,9 +6802,6 @@ packages: resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} engines: {node: '>=4'} - load-styles@2.0.0: - resolution: {integrity: sha512-bKtTRlB+V8jij88ZoX73whwAbme5VQfmNPiK9KWDSyYevZgy3uwivIPBeM9w5+nyhA2BFFyWMSqPNola9MSn+A==} - loader-runner@4.3.1: resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} engines: {node: '>=6.11.5'} @@ -7045,10 +6843,6 @@ packages: lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. - lodash.kebabcase@4.1.1: resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} @@ -7155,14 +6949,6 @@ packages: resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} engines: {node: '>=8'} - mapbox-gl@1.13.3: - resolution: {integrity: sha512-p8lJFEiqmEQlyv+DQxFAOG/XPWN0Wp7j/Psq93Zywz7qt9CcUKFYDBOoOEKzqe6gudHVJY8/Bhqw6VDpX2lSBg==} - engines: {node: '>=6.4.0'} - - maplibre-gl@3.6.2: - resolution: {integrity: sha512-krg2KFIdOpLPngONDhP6ixCoWl5kbdMINP0moMSJFVX7wX1Clm2M9hlNKXS8vBGlVWwR5R3ZfI6IPrYz7c+aCQ==} - engines: {node: '>=16.14.0', npm: '>=8.1.0'} - marked-terminal@3.2.0: resolution: {integrity: sha512-Yr1yVS0BbDG55vx7be1D0mdv+jGs9AW563o/Tt/7FTsId2J0yqhrTeXAqq/Q0DyyXltIn6CSxzesQuFqXgafjQ==} peerDependencies: @@ -7363,9 +7149,6 @@ packages: engines: {node: '>= 0.10.0'} deprecated: Multer 1.x is affected by CVE-2022-24434. This is fixed in v1.4.4-lts.1 which drops support for versions of Node.js before 6. Please upgrade to at least Node.js 6 and version 1.4.4-lts.1 of Multer. If you need support for older versions of Node.js, we are open to accepting patches that would fix the CVE on the main 1.x release line, whilst maintaining compatibility with Node.js 0.10. - murmurhash-js@1.0.0: - resolution: {integrity: sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==} - nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -7792,10 +7575,6 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pbf@3.3.0: - resolution: {integrity: sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==} - hasBin: true - pbkdf2@3.1.5: resolution: {integrity: sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==} engines: {node: '>= 0.10'} @@ -7858,9 +7637,6 @@ packages: resolution: {integrity: sha512-fjAPuiws93rm7mPUu21RdBnkeZNrbfCFCwfAhPWY+rR3zG0ubpe5cEReHOw5fIbfmsxEV/g2kSxGTATY3Bpnwg==} engines: {node: '>=4'} - pmtiles@2.11.0: - resolution: {integrity: sha512-dU9SzzaqmCGpdEuTnIba6bDHT6j09ZJFIXxwGpvkiEnce3ZnBB1VKt6+EOmJGueriweaZLAMTUmKVElU2CBe0g==} - point-in-polygon@1.1.0: resolution: {integrity: sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==} @@ -7870,9 +7646,6 @@ packages: points-on-path@0.2.1: resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} - polygon-clipping@0.15.7: - resolution: {integrity: sha512-nhfdr83ECBg6xtqOAJab1tbksbBAOMUltN60bU+llHVOL0e5Onm1WpAXXWXVB39L8AJFssoIhEVuy/S90MmotA==} - possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} @@ -8141,12 +7914,6 @@ packages: resolution: {integrity: sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==} engines: {node: ^10 || ^12 || >=14} - potpack@1.0.2: - resolution: {integrity: sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==} - - potpack@2.1.0: - resolution: {integrity: sha512-pcaShQc1Shq0y+E7GqJqvZj8DTthWV1KeHGdi0Z6IAin2Oi3JnLCOfwnCo84qc+HAp52wT9nK9H7FAJp5a44GQ==} - prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -8225,9 +7992,6 @@ packages: property-information@7.1.0: resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} - protocol-buffers-schema@3.6.1: - resolution: {integrity: sha512-VG2K63Igkiv9p76tk1lilczEK1cT+kCjKtkdhw1dQZV3k3IXJbd3o6Ho8b9zJZaHSnT2hKe4I+ObmX9w6m5SmQ==} - proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -8293,9 +8057,6 @@ packages: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} - quickselect@2.0.0: - resolution: {integrity: sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==} - randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} @@ -8790,9 +8551,6 @@ packages: resolution: {integrity: sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==} hasBin: true - regl@1.6.1: - resolution: {integrity: sha512-7Z9rmpEqmLNwC9kCYCyfyu47eWZaQWeNpwZfwz99QueXN8B/Ow40DB0N+OeUeM/yu9pZAB01+JgJ+XghGveVoA==} - relateurl@0.2.7: resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} engines: {node: '>= 0.10'} @@ -8842,9 +8600,6 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve-protobuf-schema@2.1.0: - resolution: {integrity: sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==} - resolve-url-loader@5.0.0: resolution: {integrity: sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==} engines: {node: '>=12'} @@ -9022,10 +8777,6 @@ packages: resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} engines: {node: '>= 10.13.0'} - screenfull@5.2.0: - resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} - engines: {node: '>=0.10.0'} - scroll-into-view-if-needed@2.2.31: resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==} @@ -9088,10 +8839,6 @@ packages: resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} engines: {node: '>= 0.4'} - set-value@2.0.1: - resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} - engines: {node: '>=0.10.0'} - setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} @@ -9206,21 +8953,9 @@ packages: sonic-boom@2.8.0: resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} - sort-asc@0.2.0: - resolution: {integrity: sha512-umMGhjPeHAI6YjABoSTrFp2zaBtXBej1a0yKkuMUyjjqu6FJsTF+JYwCswWDg+zJfk/5npWUUbd33HH/WLzpaA==} - engines: {node: '>=0.10.0'} - - sort-desc@0.2.0: - resolution: {integrity: sha512-NqZqyvL4VPW+RAxxXnB8gvE1kyikh8+pR+T+CXLksVRN9eiQqkQlPwqWYU0mF9Jm7UnctShlxLyAt1CaBOTL1w==} - engines: {node: '>=0.10.0'} - sort-object-keys@1.1.3: resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} - sort-object@3.0.3: - resolution: {integrity: sha512-nK7WOY8jik6zaG9CRwZTaD5O7ETWDLZYMM12pqY8htll+7dYeqGfEUPcUBHOpSJg2vJOrvFIY2Dl5cX2ih1hAQ==} - engines: {node: '>=0.10.0'} - sort-package-json@2.4.1: resolution: {integrity: sha512-Nd3rgLBJcZ4iw7tpuOhwBupG6SvUDU0Fy1cZGAMorA2JmDUb+29Dg5phJK9gapa2Ak9d15w/RuMl/viwX+nKwQ==} hasBin: true @@ -9273,18 +9008,10 @@ packages: resolution: {integrity: sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==} hasBin: true - splaytree@3.2.3: - resolution: {integrity: sha512-7OXrNWzy6CK+r7Ch9OLPBDTKfB6XlWHjX4P0RU5B3IgFuWPeYN0XtRtlexGRjgbQxpfaUve6jTAwBGWuGntz/w==} - engines: {node: '>=18.20 || >=20'} - split-on-first@1.1.0: resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} engines: {node: '>=6'} - split-string@3.1.0: - resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} - engines: {node: '>=0.10.0'} - split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} @@ -9497,12 +9224,6 @@ packages: stylis@4.3.6: resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} - supercluster@7.1.5: - resolution: {integrity: sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg==} - - supercluster@8.0.1: - resolution: {integrity: sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==} - superjson@1.13.3: resolution: {integrity: sha512-mJiVjfd2vokfDxsQPOwJ/PtanO87LhpYY88ubI5dUB1Ab58Txbyje3+jpm+/83R/fevaq/107NNhtYBLuoTrFg==} engines: {node: '>=10'} @@ -9652,9 +9373,6 @@ packages: resolution: {integrity: sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==} engines: {node: '>=18'} - tinyqueue@2.0.3: - resolution: {integrity: sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==} - titleize@3.0.0: resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} engines: {node: '>=12'} @@ -9695,6 +9413,10 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + topojson-client@3.1.0: + resolution: {integrity: sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==} + hasBin: true + tough-cookie@5.1.2: resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} engines: {node: '>=16'} @@ -9822,12 +9544,6 @@ packages: engines: {node: '>=14.17'} hasBin: true - typewise-core@1.2.0: - resolution: {integrity: sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg==} - - typewise@1.0.3: - resolution: {integrity: sha512-aXofE06xGhaQSPzt8hlTY+/YWQhm9P0jYUp1f2XtmW/3Bk0qzXcyFWAtPoo2uTGQj1ZwbDuSyuxicq+aDo8lCQ==} - ufo@1.6.3: resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} @@ -9875,10 +9591,6 @@ packages: resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} engines: {node: '>=4'} - union-value@1.0.1: - resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} - engines: {node: '>=0.10.0'} - unique-string@1.0.0: resolution: {integrity: sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==} engines: {node: '>=4'} @@ -10007,10 +9719,6 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - viewport-mercator-project@6.2.3: - resolution: {integrity: sha512-QQb0/qCLlP4DdfbHHSWVYXpghB2wkLIiiZQnoelOB59mXKQSyZVxjreq1S+gaBJFpcGkWEcyVtre0+2y2DTl/Q==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - vite@4.5.2: resolution: {integrity: sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==} engines: {node: ^14.18.0 || >=16.0.0} @@ -10062,9 +9770,6 @@ packages: vscode-uri@3.1.0: resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} - vt-pbf@3.1.3: - resolution: {integrity: sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==} - w3c-xmlserializer@5.0.0: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} @@ -10283,8 +9988,6 @@ snapshots: '@alloc/quick-lru@5.2.0': {} - '@amap/amap-jsapi-loader@1.0.1': {} - '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.13 @@ -10678,10 +10381,6 @@ snapshots: '@antfu/utils@0.7.10': {} - '@antv/async-hook@2.2.9': - dependencies: - async: 3.2.6 - '@antv/component@2.1.11': dependencies: '@antv/g': 6.3.1 @@ -10708,14 +10407,6 @@ snapshots: gl-matrix: 3.4.4 tslib: 2.8.1 - '@antv/g-device-api@1.6.13': - dependencies: - '@antv/util': 3.3.11 - '@webgpu/types': 0.1.69 - eventemitter3: 5.0.4 - gl-matrix: 3.4.4 - tslib: 2.8.1 - '@antv/g-lite@2.7.0': dependencies: '@antv/g-math': 3.1.0 @@ -10769,138 +10460,6 @@ snapshots: gl-matrix: 3.4.4 html2canvas: 1.4.1 - '@antv/l7-component@2.25.4': - dependencies: - '@antv/l7-core': 2.25.4 - '@antv/l7-layers': 2.25.4 - '@antv/l7-utils': 2.25.4 - '@babel/runtime': 7.29.2 - eventemitter3: 4.0.7 - supercluster: 7.1.5 - - '@antv/l7-core@2.25.4': - dependencies: - '@antv/async-hook': 2.2.9 - '@antv/l7-utils': 2.25.4 - '@babel/runtime': 7.29.2 - '@mapbox/tiny-sdf': 1.2.5 - '@turf/helpers': 6.5.0 - eventemitter3: 4.0.7 - gl-matrix: 3.4.4 - hammerjs: 2.0.8 - viewport-mercator-project: 6.2.3 - - '@antv/l7-layers@2.25.4': - dependencies: - '@antv/async-hook': 2.2.9 - '@antv/l7-core': 2.25.4 - '@antv/l7-maps': 2.25.4 - '@antv/l7-source': 2.25.4 - '@antv/l7-utils': 2.25.4 - '@babel/runtime': 7.29.2 - '@mapbox/martini': 0.2.0 - '@turf/clone': 6.5.0 - '@turf/helpers': 6.5.0 - '@turf/meta': 6.5.0 - '@turf/polygon-to-line': 6.5.0 - '@turf/union': 6.5.0 - earcut: 2.2.4 - eventemitter3: 4.0.7 - gl-matrix: 3.4.4 - - '@antv/l7-map@2.25.4': - dependencies: - '@antv/l7-utils': 2.25.4 - '@babel/runtime': 7.29.2 - '@mapbox/point-geometry': 0.1.0 - '@mapbox/unitbezier': 0.0.1 - eventemitter3: 4.0.7 - gl-matrix: 3.4.4 - - '@antv/l7-maps@2.25.4': - dependencies: - '@amap/amap-jsapi-loader': 1.0.1 - '@antv/l7-core': 2.25.4 - '@antv/l7-map': 2.25.4 - '@antv/l7-utils': 2.25.4 - '@babel/runtime': 7.29.2 - eventemitter3: 4.0.7 - gl-matrix: 3.4.4 - mapbox-gl: 1.13.3 - maplibre-gl: 3.6.2 - pmtiles: 2.11.0 - viewport-mercator-project: 6.2.3 - - '@antv/l7-react@2.4.3(@antv/l7@2.25.4)(mapbox-gl@1.13.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': - dependencies: - '@antv/l7': 2.25.4 - '@babel/runtime': 7.29.2 - '@types/eslint': 8.56.12 - '@types/lodash': 4.17.24 - '@types/mapbox-gl': 1.13.10 - ahooks: 2.10.14(react@19.2.5) - load-styles: 2.0.0 - lodash: 4.18.1 - mapbox-gl: 1.13.3 - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) - - '@antv/l7-renderer@2.25.4': - dependencies: - '@antv/g-device-api': 1.6.13 - '@antv/l7-core': 2.25.4 - '@antv/l7-utils': 2.25.4 - '@babel/runtime': 7.29.2 - regl: 1.6.1 - - '@antv/l7-scene@2.25.4': - dependencies: - '@antv/l7-component': 2.25.4 - '@antv/l7-core': 2.25.4 - '@antv/l7-layers': 2.25.4 - '@antv/l7-maps': 2.25.4 - '@antv/l7-renderer': 2.25.4 - '@antv/l7-utils': 2.25.4 - '@babel/runtime': 7.29.2 - eventemitter3: 4.0.7 - - '@antv/l7-source@2.25.4': - dependencies: - '@antv/async-hook': 2.2.9 - '@antv/l7-core': 2.25.4 - '@antv/l7-utils': 2.25.4 - '@babel/runtime': 7.29.2 - '@mapbox/geojson-rewind': 0.5.2 - '@mapbox/vector-tile': 1.3.1 - '@turf/helpers': 6.5.0 - '@turf/invariant': 6.5.0 - '@turf/meta': 6.5.0 - eventemitter3: 4.0.7 - geojson-vt: 3.2.1 - pbf: 3.3.0 - supercluster: 7.1.5 - - '@antv/l7-utils@2.25.4': - dependencies: - '@babel/runtime': 7.29.2 - '@turf/bbox': 6.5.0 - '@turf/bbox-polygon': 6.5.0 - '@turf/helpers': 6.5.0 - earcut: 2.2.4 - eventemitter3: 4.0.7 - gl-matrix: 3.4.4 - - '@antv/l7@2.25.4': - dependencies: - '@antv/l7-component': 2.25.4 - '@antv/l7-core': 2.25.4 - '@antv/l7-layers': 2.25.4 - '@antv/l7-maps': 2.25.4 - '@antv/l7-scene': 2.25.4 - '@antv/l7-source': 2.25.4 - '@antv/l7-utils': 2.25.4 - '@babel/runtime': 7.29.2 - '@antv/scale@0.4.16': dependencies: '@antv/util': 3.3.11 @@ -12839,46 +12398,6 @@ snapshots: react: 19.2.5 react-is: 16.13.1 - '@mapbox/geojson-rewind@0.5.2': - dependencies: - get-stream: 6.0.1 - minimist: 1.2.8 - - '@mapbox/geojson-types@1.0.2': {} - - '@mapbox/jsonlint-lines-primitives@2.0.2': {} - - '@mapbox/mapbox-gl-supported@1.5.0(mapbox-gl@1.13.3)': - dependencies: - mapbox-gl: 1.13.3 - - '@mapbox/martini@0.2.0': {} - - '@mapbox/point-geometry@0.1.0': {} - - '@mapbox/tiny-sdf@1.2.5': {} - - '@mapbox/tiny-sdf@2.1.0': {} - - '@mapbox/unitbezier@0.0.0': {} - - '@mapbox/unitbezier@0.0.1': {} - - '@mapbox/vector-tile@1.3.1': - dependencies: - '@mapbox/point-geometry': 0.1.0 - - '@mapbox/whoots-js@3.1.0': {} - - '@maplibre/maplibre-gl-style-spec@19.3.3': - dependencies: - '@mapbox/jsonlint-lines-primitives': 2.0.2 - '@mapbox/unitbezier': 0.0.1 - json-stringify-pretty-compact: 3.0.0 - minimist: 1.2.8 - rw: 1.3.3 - sort-object: 3.0.3 - '@mermaid-js/parser@1.1.0': dependencies: langium: 4.2.2 @@ -13626,40 +13145,6 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@turf/bbox-polygon@6.5.0': - dependencies: - '@turf/helpers': 6.5.0 - - '@turf/bbox@6.5.0': - dependencies: - '@turf/helpers': 6.5.0 - '@turf/meta': 6.5.0 - - '@turf/clone@6.5.0': - dependencies: - '@turf/helpers': 6.5.0 - - '@turf/helpers@6.5.0': {} - - '@turf/invariant@6.5.0': - dependencies: - '@turf/helpers': 6.5.0 - - '@turf/meta@6.5.0': - dependencies: - '@turf/helpers': 6.5.0 - - '@turf/polygon-to-line@6.5.0': - dependencies: - '@turf/helpers': 6.5.0 - '@turf/invariant': 6.5.0 - - '@turf/union@6.5.0': - dependencies: - '@turf/helpers': 6.5.0 - '@turf/invariant': 6.5.0 - polygon-clipping: 0.15.7 - '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 @@ -13819,11 +13304,6 @@ snapshots: '@types/eslint': 9.6.1 '@types/estree': 1.0.8 - '@types/eslint@8.56.12': - dependencies: - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - '@types/eslint@9.6.1': dependencies: '@types/estree': 1.0.8 @@ -13895,8 +13375,6 @@ snapshots: expect: 30.3.0 pretty-format: 30.3.0 - '@types/js-cookie@2.2.7': {} - '@types/jsdom@21.1.7': dependencies: '@types/node': 25.6.0 @@ -13909,20 +13387,6 @@ snapshots: dependencies: '@types/node': 25.6.0 - '@types/lodash@4.17.24': {} - - '@types/mapbox-gl@1.13.10': - dependencies: - '@types/geojson': 7946.0.16 - - '@types/mapbox__point-geometry@0.1.4': {} - - '@types/mapbox__vector-tile@1.3.4': - dependencies: - '@types/geojson': 7946.0.16 - '@types/mapbox__point-geometry': 0.1.4 - '@types/pbf': 3.0.5 - '@types/minimist@1.2.5': {} '@types/node@25.6.0': @@ -13933,8 +13397,6 @@ snapshots: '@types/parse-json@4.0.2': {} - '@types/pbf@3.0.5': {} - '@types/prismjs@1.26.6': {} '@types/qs@6.15.0': {} @@ -13992,7 +13454,12 @@ snapshots: '@types/stylis@4.2.7': {} - '@types/supercluster@7.1.3': + '@types/topojson-client@3.1.5': + dependencies: + '@types/geojson': 7946.0.16 + '@types/topojson-specification': 1.0.5 + + '@types/topojson-specification@1.0.5': dependencies: '@types/geojson': 7946.0.16 @@ -14921,8 +14388,6 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - '@webgpu/types@0.1.69': {} - '@xtuc/ieee754@1.2.0': {} '@xtuc/long@4.2.2': {} @@ -14964,20 +14429,6 @@ snapshots: agent-base@7.1.4: {} - ahooks@2.10.14(react@19.2.5): - dependencies: - '@ahooksjs/use-request': 2.8.15(react@19.2.5) - '@types/js-cookie': 2.2.7 - dayjs: 1.11.20 - intersection-observer: 0.7.0 - js-cookie: 2.2.1 - lodash.debounce: 4.0.8 - lodash.isequal: 4.5.0 - lodash.throttle: 4.1.1 - react: 19.2.5 - resize-observer-polyfill: 1.5.1 - screenfull: 5.2.0 - ajv-formats@2.1.1(ajv@8.18.0): optionalDependencies: ajv: 8.18.0 @@ -15194,8 +14645,6 @@ snapshots: dependencies: dequal: 2.0.3 - arr-union@3.1.0: {} - array-buffer-byte-length@1.0.2: dependencies: call-bound: 1.0.4 @@ -15272,8 +14721,6 @@ snapshots: object.assign: 4.1.7 util: 0.10.4 - assign-symbols@1.0.0: {} - astral-regex@2.0.0: {} async-function@1.0.0: {} @@ -15672,15 +15119,6 @@ snapshots: bytes@3.1.2: {} - bytewise-core@1.2.3: - dependencies: - typewise-core: 1.2.0 - - bytewise@1.1.0: - dependencies: - bytewise-core: 1.2.3 - typewise: 1.0.3 - cacheable-request@6.1.0: dependencies: clone-response: 1.0.3 @@ -16214,8 +15652,6 @@ snapshots: css-what@6.2.2: {} - csscolorparser@1.0.3: {} - cssdb@6.6.3: {} cssesc@3.0.0: {} @@ -16770,8 +16206,6 @@ snapshots: react-router-redux: 5.0.0-alpha.9(react@19.2.5) redux: 3.7.2 - earcut@2.2.4: {} - eastasianwidth@0.2.0: {} ee-first@1.1.1: {} @@ -17191,8 +16625,6 @@ snapshots: d: 1.0.2 es5-ext: 0.10.64 - eventemitter3@4.0.7: {} - eventemitter3@5.0.4: {} events-okam@3.3.0: {} @@ -17379,15 +16811,6 @@ snapshots: dependencies: type: 2.7.3 - extend-shallow@2.0.1: - dependencies: - is-extendable: 0.1.1 - - extend-shallow@3.0.2: - dependencies: - assign-symbols: 1.0.0 - is-extendable: 1.0.1 - extend2@1.0.0: {} fast-deep-equal@3.1.3: {} @@ -17439,8 +16862,6 @@ snapshots: node-domexception: 1.0.0 web-streams-polyfill: 3.3.3 - fflate@0.8.2: {} - figures@2.0.0: dependencies: escape-string-regexp: 1.0.5 @@ -17633,7 +17054,7 @@ snapshots: gensync@1.0.0-beta.2: {} - geojson-vt@3.2.1: {} + geojson@0.5.0: {} get-caller-file@2.0.5: {} @@ -17689,8 +17110,6 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 - get-value@2.0.6: {} - gh-pages@6.3.0: dependencies: async: 3.2.6 @@ -17832,12 +17251,8 @@ snapshots: graphemer@1.4.0: {} - grid-index@1.1.0: {} - hachure-fill@0.5.2: {} - hammerjs@2.0.8: {} - handle-thing@2.0.1: {} hard-rejection@2.1.0: {} @@ -18151,8 +17566,6 @@ snapshots: internmap@2.0.3: {} - intersection-observer@0.7.0: {} - intl-format-cache@4.3.1: {} intl-messageformat-parser@3.6.4: @@ -18275,12 +17688,6 @@ snapshots: which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - is-extendable@0.1.1: {} - - is-extendable@1.0.1: - dependencies: - is-plain-object: 2.0.4 - is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: @@ -18870,8 +18277,6 @@ snapshots: jiti@2.6.1: {} - js-cookie@2.2.1: {} - js-levenshtein@1.1.6: {} js-sdsl@4.4.2: {} @@ -18932,8 +18337,6 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} - json-stringify-pretty-compact@3.0.0: {} - json2mq@0.2.0: dependencies: string-convert: 0.2.1 @@ -18961,10 +18364,6 @@ snapshots: dependencies: commander: 8.3.0 - kdbush@3.0.0: {} - - kdbush@4.0.2: {} - keyv@3.1.0: dependencies: json-buffer: 3.0.0 @@ -19171,8 +18570,6 @@ snapshots: pify: 3.0.0 strip-bom: 3.0.0 - load-styles@2.0.0: {} - loader-runner@4.3.1: {} loader-utils@2.0.4: @@ -19209,8 +18606,6 @@ snapshots: lodash.debounce@4.0.8: {} - lodash.isequal@4.5.0: {} - lodash.kebabcase@4.1.1: {} lodash.merge@4.6.2: {} @@ -19310,59 +18705,6 @@ snapshots: map-obj@4.3.0: {} - mapbox-gl@1.13.3: - dependencies: - '@mapbox/geojson-rewind': 0.5.2 - '@mapbox/geojson-types': 1.0.2 - '@mapbox/jsonlint-lines-primitives': 2.0.2 - '@mapbox/mapbox-gl-supported': 1.5.0(mapbox-gl@1.13.3) - '@mapbox/point-geometry': 0.1.0 - '@mapbox/tiny-sdf': 1.2.5 - '@mapbox/unitbezier': 0.0.0 - '@mapbox/vector-tile': 1.3.1 - '@mapbox/whoots-js': 3.1.0 - csscolorparser: 1.0.3 - earcut: 2.2.4 - geojson-vt: 3.2.1 - gl-matrix: 3.4.4 - grid-index: 1.1.0 - murmurhash-js: 1.0.0 - pbf: 3.3.0 - potpack: 1.0.2 - quickselect: 2.0.0 - rw: 1.3.3 - supercluster: 7.1.5 - tinyqueue: 2.0.3 - vt-pbf: 3.1.3 - - maplibre-gl@3.6.2: - dependencies: - '@mapbox/geojson-rewind': 0.5.2 - '@mapbox/jsonlint-lines-primitives': 2.0.2 - '@mapbox/point-geometry': 0.1.0 - '@mapbox/tiny-sdf': 2.1.0 - '@mapbox/unitbezier': 0.0.1 - '@mapbox/vector-tile': 1.3.1 - '@mapbox/whoots-js': 3.1.0 - '@maplibre/maplibre-gl-style-spec': 19.3.3 - '@types/geojson': 7946.0.16 - '@types/mapbox__point-geometry': 0.1.4 - '@types/mapbox__vector-tile': 1.3.4 - '@types/pbf': 3.0.5 - '@types/supercluster': 7.1.3 - earcut: 2.2.4 - geojson-vt: 3.2.1 - gl-matrix: 3.4.4 - global-prefix: 3.0.0 - kdbush: 4.0.2 - murmurhash-js: 1.0.0 - pbf: 3.3.0 - potpack: 2.1.0 - quickselect: 2.0.0 - supercluster: 8.0.1 - tinyqueue: 2.0.3 - vt-pbf: 3.1.3 - marked-terminal@3.2.0(marked@0.6.2): dependencies: ansi-escapes: 3.2.0 @@ -19571,8 +18913,6 @@ snapshots: type-is: 1.6.18 xtend: 4.0.2 - murmurhash-js@1.0.0: {} - nanoid@3.3.11: {} napi-postinstall@0.3.4: {} @@ -20051,11 +19391,6 @@ snapshots: pathe@2.0.3: {} - pbf@3.3.0: - dependencies: - ieee754: 1.2.1 - resolve-protobuf-schema: 2.1.0 - pbkdf2@3.1.5: dependencies: create-hash: 1.2.0 @@ -20127,10 +19462,6 @@ snapshots: dependencies: find-up: 2.1.0 - pmtiles@2.11.0: - dependencies: - fflate: 0.8.2 - point-in-polygon@1.1.0: {} points-on-curve@0.2.0: {} @@ -20140,11 +19471,6 @@ snapshots: path-data-parser: 0.1.0 points-on-curve: 0.2.0 - polygon-clipping@0.15.7: - dependencies: - robust-predicates: 3.0.3 - splaytree: 3.2.3 - possible-typed-array-names@1.1.0: {} postcss-attribute-case-insensitive@5.0.2(postcss@8.5.10): @@ -20401,10 +19727,6 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - potpack@1.0.2: {} - - potpack@2.1.0: {} - prelude-ls@1.2.1: {} prepend-http@2.0.0: {} @@ -20467,8 +19789,6 @@ snapshots: property-information@7.1.0: {} - protocol-buffers-schema@3.6.1: {} - proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -20535,8 +19855,6 @@ snapshots: quick-lru@4.0.1: {} - quickselect@2.0.0: {} - randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 @@ -21239,8 +20557,6 @@ snapshots: dependencies: jsesc: 3.1.0 - regl@1.6.1: {} - relateurl@0.2.7: {} remove-accents@0.5.0: {} @@ -21277,10 +20593,6 @@ snapshots: resolve-pkg-maps@1.0.0: {} - resolve-protobuf-schema@2.1.0: - dependencies: - protocol-buffers-schema: 3.6.1 - resolve-url-loader@5.0.0: dependencies: adjust-sourcemap-loader: 4.0.0 @@ -21452,8 +20764,6 @@ snapshots: ajv-formats: 2.1.1(ajv@8.18.0) ajv-keywords: 5.1.0(ajv@8.18.0) - screenfull@5.2.0: {} - scroll-into-view-if-needed@2.2.31: dependencies: compute-scroll-into-view: 1.0.20 @@ -21575,13 +20885,6 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.1 - set-value@2.0.1: - dependencies: - extend-shallow: 2.0.1 - is-extendable: 0.1.1 - is-plain-object: 2.0.4 - split-string: 3.1.0 - setimmediate@1.0.5: {} setprototypeof@1.1.1: {} @@ -21706,21 +21009,8 @@ snapshots: dependencies: atomic-sleep: 1.0.0 - sort-asc@0.2.0: {} - - sort-desc@0.2.0: {} - sort-object-keys@1.1.3: {} - sort-object@3.0.3: - dependencies: - bytewise: 1.1.0 - get-value: 2.0.6 - is-extendable: 0.1.1 - sort-asc: 0.2.0 - sort-desc: 0.2.0 - union-value: 1.0.1 - sort-package-json@2.4.1: dependencies: detect-indent: 7.0.2 @@ -21787,14 +21077,8 @@ snapshots: specificity@0.4.1: {} - splaytree@3.2.3: {} - split-on-first@1.1.0: {} - split-string@3.1.0: - dependencies: - extend-shallow: 3.0.2 - split2@4.2.0: {} sprintf-js@1.0.3: {} @@ -22060,14 +21344,6 @@ snapshots: stylis@4.3.6: {} - supercluster@7.1.5: - dependencies: - kdbush: 3.0.0 - - supercluster@8.0.1: - dependencies: - kdbush: 4.0.2 - superjson@1.13.3: dependencies: copy-anything: 3.0.5 @@ -22219,8 +21495,6 @@ snapshots: tinyexec@1.1.1: {} - tinyqueue@2.0.3: {} - titleize@3.0.0: {} tldts-core@6.1.86: {} @@ -22251,6 +21525,10 @@ snapshots: toidentifier@1.0.1: {} + topojson-client@3.1.0: + dependencies: + commander: 2.20.3 + tough-cookie@5.1.2: dependencies: tldts: 6.1.86 @@ -22376,12 +21654,6 @@ snapshots: typescript@6.0.3: {} - typewise-core@1.2.0: {} - - typewise@1.0.3: - dependencies: - typewise-core: 1.2.0 - ufo@1.6.3: {} umi-core@1.9.10(@babel/core@7.29.0): @@ -22520,13 +21792,6 @@ snapshots: unicode-property-aliases-ecmascript@2.2.0: {} - union-value@1.0.1: - dependencies: - arr-union: 3.1.0 - get-value: 2.0.6 - is-extendable: 0.1.1 - set-value: 2.0.1 - unique-string@1.0.0: dependencies: crypto-random-string: 1.0.0 @@ -22673,11 +21938,6 @@ snapshots: vary@1.1.2: {} - viewport-mercator-project@6.2.3: - dependencies: - '@babel/runtime': 7.29.2 - gl-matrix: 3.4.4 - vite@4.5.2(@types/node@25.6.0)(less@4.1.3)(lightningcss@1.32.0)(sass@1.54.0)(terser@5.46.1): dependencies: esbuild: 0.18.20 @@ -22710,12 +21970,6 @@ snapshots: vscode-uri@3.1.0: {} - vt-pbf@3.1.3: - dependencies: - '@mapbox/point-geometry': 0.1.0 - '@mapbox/vector-tile': 1.3.1 - pbf: 3.3.0 - w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0 diff --git a/src/pages/dashboard/monitor/components/Map/index.tsx b/src/pages/dashboard/monitor/components/Map/index.tsx index 7bc49431..a97512cb 100644 --- a/src/pages/dashboard/monitor/components/Map/index.tsx +++ b/src/pages/dashboard/monitor/components/Map/index.tsx @@ -1,144 +1,395 @@ -import { PageLoading } from '@ant-design/pro-components'; -import { HeatmapLayer, MapboxScene, PointLayer } from '@antv/l7-react'; import { useQuery } from '@tanstack/react-query'; -import { queryMapGeo, queryMapGrid } from '../../service'; - -const colors = [ - '#eff3ff', - '#c6dbef', - '#9ecae1', - '#6baed6', - '#4292c6', - '#2171b5', - '#084594', +import { Button, Skeleton } from 'antd'; +import * as d3 from 'd3'; +import type { Feature, FeatureCollection, Geometry } from 'geojson'; +import { useEffect, useMemo, useRef } from 'react'; +import { feature } from 'topojson-client'; + +const DATA_COLORS = [ + '#ede9fe', + '#ddd6fe', + '#c4b5fd', + '#a78bfa', + '#8b5cf6', + '#7c3aed', + '#6d28d9', ]; +interface GeoFeature { + type: 'Feature'; + geometry: { + type: 'Point'; + coordinates: [number, number]; + } | null; + properties: { + cum_conf: number; + Short_Name_ZH: string; + ADM0_NAME: string; + }; +} + +interface GeoData { + type: 'FeatureCollection'; + features: GeoFeature[]; +} + +const WORLD_MAP_URL = + 'https://cdn.jsdelivr.net/npm/world-atlas@2/countries-110m.json'; + +const colorScale = d3.scaleQuantize(DATA_COLORS).domain([0, 1]); + +function hexPath(cx: number, cy: number, r: number): string { + const pts: string[] = []; + for (let i = 0; i < 6; i++) { + const a = (Math.PI / 3) * i - Math.PI / 6; + pts.push(`${cx + r * Math.cos(a)},${cy + r * Math.sin(a)}`); + } + return `M${pts.join('L')}Z`; +} + +function getColor(value: number, maxVal: number): string { + return colorScale(maxVal <= 0 ? 0 : value / maxVal); +} + +function getRadius(value: number, maxVal: number): number { + if (maxVal <= 0) return 5; + const normalized = Math.sqrt(value / maxVal); + return Math.max(5, normalized * 28); +} + +function getCoords(d: GeoFeature): [number, number] | null { + return d.geometry?.coordinates ?? null; +} + +function projectedPoint( + d: GeoFeature, + projection: d3.GeoProjection, +): [number, number] { + const coords = getCoords(d); + if (!coords) return [0, 0]; + const p = projection(coords); + return p ? [p[0], p[1]] : [0, 0]; +} + +// Build a land bitmap via offscreen canvas for O(1) per-hex lookup +function buildLandBitmap( + width: number, + height: number, + countries: FeatureCollection, + pathGenerator: d3.GeoPath, // eslint-disable-line @typescript-eslint/no-explicit-any +): Uint8Array { + const canvas = document.createElement('canvas'); + canvas.width = width; + canvas.height = height; + const ctx = canvas.getContext('2d')!; + ctx.clearRect(0, 0, width, height); + ctx.fillStyle = '#000'; + for (const f of countries.features) { + const path = pathGenerator(f as Feature); + if (path) { + ctx.beginPath(); + // Use Path2D to parse the SVG path + const p2d = new Path2D(path); + ctx.fill(p2d); + } + } + const data = ctx.getImageData(0, 0, width, height).data; + const bitmap = new Uint8Array(width * height); + for (let i = 0; i < bitmap.length; i++) { + bitmap[i] = data[i * 4 + 3] > 0 ? 1 : 0; + } + return bitmap; +} + export default function MonitorMap() { - const { isLoading, data } = useQuery<{ - geoData: Record[]; - grid: Record[]; - }>({ + const svgRef = useRef(null); + const tooltipRef = useRef(null); + + const { + isLoading: geoLoading, + isError: geoError, + refetch: refetchGeo, + data: geoData, + } = useQuery({ queryKey: ['map-data'], queryFn: async () => { - const [geoData, gridData] = await Promise.all([ - queryMapGeo(), - queryMapGrid(), - ]); - return { geoData, grid: gridData }; + const res = await fetch( + 'https://gw.alipayobjects.com/os/bmw-prod/c5dba875-b6ea-4e88-b778-66a862906c93.json', + ); + if (!res.ok) throw new Error('Fetch geoData failed'); + return res.json(); }, }); - return isLoading ? ( - - ) : ( - - {data?.grid && ( - - )} - {data?.geoData && [ - , - { - return v > 2000; - }, - }} - size={{ - values: 12, - }} - style={{ - opacity: 1, - strokeOpacity: 1, - strokeWidth: 0, + const { + isLoading: worldLoading, + isError: worldError, + refetch: refetchWorld, + data: worldData, + } = useQuery({ + queryKey: ['world-map'], + queryFn: async () => { + const res = await fetch(WORLD_MAP_URL); + if (!res.ok) throw new Error('Fetch world map failed'); + return res.json(); + }, + }); + + const { validFeatures, maxVal, highlightFeatures } = useMemo(() => { + if (!geoData?.features) { + return { validFeatures: [], maxVal: 0, highlightFeatures: [] }; + } + const valid = geoData.features.filter( + (f) => f.geometry && f.properties.cum_conf != null, + ); + const max = valid.reduce((m, f) => Math.max(m, f.properties.cum_conf), 1); + const highlight = valid.filter((f) => f.properties.cum_conf > 2000); + return { validFeatures: valid, maxVal: max, highlightFeatures: highlight }; + }, [geoData]); + + useEffect(() => { + if (worldLoading || !worldData || !svgRef.current) return; + + let cancelled = false; + const svg = d3.select(svgRef.current); + + function drawMap() { + if (cancelled || !svgRef.current) return; + svg.selectAll('*').interrupt(); + svg.selectAll('*').remove(); + + const width = svgRef.current.clientWidth || 800; + const height = svgRef.current.clientHeight || 380; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const topology = worldData as any; + const countries = feature( + topology, + topology.objects.countries, + ) as unknown as FeatureCollection; + + // Fit projection to container with small padding + const projection = d3 + .geoNaturalEarth1() + .fitSize( + [width - 20, height - 10], + countries as unknown as GeoJSON.FeatureCollection, + ); + const pathGenerator = d3.geoPath().projection(projection); + + // ── Background ── + svg + .append('rect') + .attr('width', width) + .attr('height', height) + .attr('fill', '#fff'); + + const g = svg.append('g'); + + // ── Hex grid via land bitmap ── + const landBitmap = buildLandBitmap( + width, + height, + countries, + pathGenerator, + ); + const hexR = 10; + const hexW = Math.sqrt(3) * hexR; + const hexH = 2 * hexR; + const landHexes: { cx: number; cy: number }[] = []; + + for (let row = -1; row * (hexH * 0.75) < height + hexH; row++) { + for (let col = -1; col * hexW < width + hexW; col++) { + const cx = col * hexW + (row % 2 !== 0 ? hexW / 2 : 0); + const cy = row * hexH * 0.75; + const px = Math.round(cx); + const py = Math.round(cy); + if ( + px >= 0 && + px < width && + py >= 0 && + py < height && + landBitmap[py * width + px] + ) { + landHexes.push({ cx, cy }); + } + } + } + + // Draw land hexes + g.selectAll('path.land-hex') + .data(landHexes) + .enter() + .append('path') + .attr('class', 'land-hex') + .attr('d', (d) => hexPath(d.cx, d.cy, hexR - 0.25)) + .attr('fill', '#e8ecf1') + .attr('stroke', '#cdd5de') + .attr('stroke-width', 0.3); + + // ── Data points as circles ── + if (validFeatures.length > 0) { + function startPulse(el: SVGCircleElement) { + if (cancelled) return; + const d = d3.select(el).datum() as GeoFeature; + const r = getRadius(d.properties.cum_conf, maxVal); + d3.select(el) + .transition() + .duration(2000) + .ease(d3.easeSinInOut) + .attr('fill-opacity', 0.25) + .attr('r', r * 0.85) + .transition() + .duration(2000) + .ease(d3.easeSinInOut) + .attr('fill-opacity', 0.55) + .attr('r', r) + .on('end', function () { + startPulse(this); + }); + } + + g.selectAll('circle.data-point') + .data(validFeatures) + .enter() + .append('circle') + .attr('class', 'data-point') + .attr('cx', (d) => projectedPoint(d, projection)[0]) + .attr('cy', (d) => projectedPoint(d, projection)[1]) + .attr('r', (d) => getRadius(d.properties.cum_conf, maxVal)) + .attr('fill', (d) => getColor(d.properties.cum_conf, maxVal)) + .attr('fill-opacity', 0.4) + .style('cursor', 'pointer') + .each(function () { + startPulse(this); + }) + .on('mouseenter', function (_event, d) { + d3.select(this).transition().duration(0).attr('fill-opacity', 0.85); + if (tooltipRef.current) { + const name = d.properties.Short_Name_ZH || d.properties.ADM0_NAME; + tooltipRef.current.textContent = ''; + const strong = document.createElement('strong'); + strong.textContent = name; + const br = document.createElement('br'); + const text = document.createTextNode( + `交易量: ${d.properties.cum_conf.toLocaleString()}`, + ); + tooltipRef.current.appendChild(strong); + tooltipRef.current.appendChild(br); + tooltipRef.current.appendChild(text); + tooltipRef.current.style.opacity = '1'; + } + }) + .on('mousemove', (event) => { + if (tooltipRef.current) { + const [x, y] = d3.pointer(event, svgRef.current); + tooltipRef.current.style.left = `${x + 12}px`; + tooltipRef.current.style.top = `${y - 12}px`; + } + }) + .on('mouseleave', function (_event, d) { + const r = getRadius(d.properties.cum_conf, maxVal); + d3.select(this) + .transition() + .duration(0) + .attr('fill-opacity', 0.4) + .attr('r', r); + startPulse(this); + }); + + // Highlight circles + g.selectAll('circle.highlight-point') + .data(highlightFeatures) + .enter() + .append('circle') + .attr('class', 'highlight-point') + .attr('cx', (d) => projectedPoint(d, projection)[0]) + .attr('cy', (d) => projectedPoint(d, projection)[1]) + .attr('r', (d) => getRadius(d.properties.cum_conf, maxVal) + 2) + .attr('fill', DATA_COLORS[3]) + .attr('fill-opacity', 0.3) + .style('pointer-events', 'none'); + } + } + + drawMap(); + + let resizeTimeout: ReturnType; + const handleResize: ResizeObserverCallback = () => { + clearTimeout(resizeTimeout); + resizeTimeout = setTimeout(() => { + if (!cancelled) drawMap(); + }, 200); + }; + const resizeObserver = new ResizeObserver(handleResize); + resizeObserver.observe(svgRef.current); + + return () => { + cancelled = true; + clearTimeout(resizeTimeout); + resizeObserver.disconnect(); + svg.selectAll('*').interrupt(); + }; + }, [worldData, worldLoading, validFeatures, maxVal, highlightFeatures]); + + if (geoLoading || worldLoading) { + return ; + } + + if (geoError || worldError) { + return ( +
+ 地图数据加载失败 + +
+ ); + } + + return ( +
+ +
+
); } diff --git a/src/pages/dashboard/monitor/index.tsx b/src/pages/dashboard/monitor/index.tsx index 27997d86..5848e9d9 100644 --- a/src/pages/dashboard/monitor/index.tsx +++ b/src/pages/dashboard/monitor/index.tsx @@ -1,7 +1,7 @@ import { Gauge, Liquid, WordCloud } from '@ant-design/plots'; import { GridContent } from '@ant-design/pro-components'; import { useQuery } from '@tanstack/react-query'; -import { Card, Col, Progress, Row, Spin, Statistic } from 'antd'; +import { Card, Col, Progress, Row, Skeleton, Statistic } from 'antd'; import { type FC, lazy, Suspense } from 'react'; import { formatNumber } from '@/utils/format'; import ActiveChart from './components/ActiveChart'; @@ -36,9 +36,17 @@ const Monitor: FC = () => { xs={24} style={{ marginBottom: 24, + display: 'flex', }} > - + {
- }> + + } + >
diff --git a/src/pages/dashboard/monitor/service.ts b/src/pages/dashboard/monitor/service.ts index 46897e16..2f4f5bce 100644 --- a/src/pages/dashboard/monitor/service.ts +++ b/src/pages/dashboard/monitor/service.ts @@ -4,20 +4,3 @@ import type { TagType } from './data'; export async function queryTags(): Promise<{ data: { list: TagType[] } }> { return request('/api/tags'); } - -const GEO_DATA_URL = - 'https://gw.alipayobjects.com/os/bmw-prod/c5dba875-b6ea-4e88-b778-66a862906c93.json'; -const GRID_DATA_URL = - 'https://gw.alipayobjects.com/os/bmw-prod/8990e8b4-c58e-419b-afb9-8ea3daff2dd1.json'; - -export async function queryMapGeo(): Promise[]> { - const res = await fetch(GEO_DATA_URL); - if (!res.ok) throw new Error('Fetch geoData failed'); - return res.json(); -} - -export async function queryMapGrid(): Promise[]> { - const res = await fetch(GRID_DATA_URL); - if (!res.ok) throw new Error('Fetch gridData failed'); - return res.json(); -} diff --git a/src/pages/dashboard/monitor/style.style.ts b/src/pages/dashboard/monitor/style.style.ts index e36e78ca..84053401 100644 --- a/src/pages/dashboard/monitor/style.style.ts +++ b/src/pages/dashboard/monitor/style.style.ts @@ -3,11 +3,14 @@ import { createStyles } from 'antd-style'; const useStyles = createStyles(({ token }) => { return { mapChart: { - height: '452px', - paddingTop: '24px', - img: { display: 'inline-block', maxWidth: '100%', maxHeight: '437px' }, + flex: 1, + minHeight: 420, + marginTop: 16, + position: 'relative', + img: { display: 'inline-block', maxWidth: '100%' }, [`@media screen and (max-width: ${token.screenLG}px)`]: { - height: 'auto', + height: 300, + minHeight: 300, }, }, };