From a7fef183de370430399374b33b467728d85fc0e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=88=E5=85=86=E5=A2=9E?= <你的邮箱@example.com> Date: Fri, 17 Jul 2026 18:03:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=80=BE=E6=96=9C=E6=91=84=E5=BD=B1=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=EF=BC=8C=E6=B7=BB=E5=8A=A0=E5=BA=95=E5=9B=BE=E5=9C=B0?= =?UTF-8?q?=E5=BD=A2=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/package.json | 1 + frontend/pnpm-lock.yaml | 1649 +++++++++++++++++ frontend/src/components/gis/map.cesium.ts | 135 +- frontend/src/components/gis/map.class.ts | 18 + frontend/src/components/gis/map.d.ts | 41 +- frontend/src/components/gis/map.ol.ts | 6 + frontend/src/components/gis/osgbUtils.ts | 747 ++++++++ .../mapController/OSBGController.vue | 30 +- .../src/components/mapController/index.vue | 39 +- frontend/src/components/mapFilter/index.vue | 2 +- frontend/src/utils/request.ts | 2 +- 11 files changed, 2618 insertions(+), 52 deletions(-) create mode 100644 frontend/src/components/gis/osgbUtils.ts diff --git a/frontend/package.json b/frontend/package.json index 1595d9c5..72fb6471 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -12,6 +12,7 @@ "dependencies": { "@ant-design/icons-vue": "^7.0.1", "@element-plus/icons-vue": "^2.0.10", + "@turf/turf": "^7.3.5", "@types/js-cookie": "^3.0.2", "@univerjs-pro/exchange-client": "0.15.0", "@univerjs/core": "0.14.0", diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 148fce14..42ba5b75 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -14,6 +14,9 @@ importers: '@element-plus/icons-vue': specifier: ^2.0.10 version: 2.3.2(vue@3.5.33(typescript@6.0.3)) + '@turf/turf': + specifier: ^7.3.5 + version: 7.3.5 '@types/js-cookie': specifier: ^3.0.2 version: 3.0.6 @@ -1198,9 +1201,360 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@turf/along@7.3.5': + resolution: {integrity: sha512-Ee4AHV9j2Bnlm/5nm4ChY7nkwpaaMffSez9nsJ9HcMbzG+GgTkt0F5pn9d02U7YvuWqckM5lfr3kBI+w2uTz+g==} + + '@turf/angle@7.3.5': + resolution: {integrity: sha512-+c3UZfkL1nNacfpLkj89rRreIlKM5UALeeWpcw7hCEK4MycXCBmITkyLLXOzoQaRBc/7ua4PV0Ov13Y6Ck9PzQ==} + + '@turf/area@7.3.5': + resolution: {integrity: sha512-sSn80wPT7XfBIDN3vurCPxhk9W4U8ozS/XImSqeLN8qveTICOxzZkhsGDMp0CuncaN+plWut4a2TdNM7mzZB6Q==} + + '@turf/bbox-clip@7.3.5': + resolution: {integrity: sha512-FuADTCBfRwdzJb2gFawDGnD1jKlUOfsWcu5Uv8iyEgu9JLuLAIYtI/l9xVF76BAoAvSkLgMfUvrPQ4SXCSUrVA==} + + '@turf/bbox-polygon@7.3.5': + resolution: {integrity: sha512-Cs9Laej8zfSY51kORM9UcbY4Uf/7X3OIZr/LydbrmmARFSpYH/FZsEQjAGi1S1Q0aYbibVqjEUReHN3ZVsV5eA==} + + '@turf/bbox@7.3.5': + resolution: {integrity: sha512-oG1ya/HtBjAIg4TimbWx+nOYPbY0bCvt82Bq8tm6sBw3qqtbOyRSfDz79Sq90TnH7DXJprJ1qnVGKNtZ6jemfw==} + + '@turf/bearing@7.3.5': + resolution: {integrity: sha512-/qabIt/IuPsGlE6RukJ0zOirc6afNxoK7fK1WBNVnHuJjeOpSkW+7q1QW5XQGXBMv3odcD0ZgRR+MBiAHduYSA==} + + '@turf/bezier-spline@7.3.5': + resolution: {integrity: sha512-54qnreNRvV9BeTGz2YXJyma+m8HMusuXWw3AkG0bIJGtqJMHqFKC/rWOcYxVj1VM2ScoTgglFxvq7GtSna+KMw==} + + '@turf/boolean-clockwise@7.3.5': + resolution: {integrity: sha512-VpDIpTKBjH4oPbzx1ns18TWcosi+qCRtgU1HIJHLj4NWyLNr7TX86DvomCvZRPfsFxkYYgkFlqHBG1a29dcyqQ==} + + '@turf/boolean-concave@7.3.5': + resolution: {integrity: sha512-CHrmnEww43CAwEPszrKtLjM13hWDmsFZe0eCocxOtXLMspj+LCheB0bjMfcoBYfoTsvOPXxnoLTK9n4xuWBRSA==} + + '@turf/boolean-contains@7.3.5': + resolution: {integrity: sha512-P4JUAHgvJkD+8ybQ6d1OHp9TBsGsjJxF5lWeXJgp0k4+Hd/D0CVy4/mhLkZdNa6QdljVdwNcfU0CTqy1WsSQig==} + + '@turf/boolean-crosses@7.3.5': + resolution: {integrity: sha512-o4Gmb2gbPl4j7810ZrT9GZsGigY+HRwcOI9pkkKH6BJ4ewSlQCPzP4JFruZp0+mIXS6NnPv7+Lw3J8LN3kYw1g==} + + '@turf/boolean-disjoint@7.3.5': + resolution: {integrity: sha512-Pz1GGUC6iL6xGVqhyo+fYg35kl4j/HONMEoC1voN3DcBOCcVlzq+ljvMpvE+oQiR7Q38xLhIxZneLCqMp5YrQA==} + + '@turf/boolean-equal@7.3.5': + resolution: {integrity: sha512-xjSFi/BpxBY5tDDuSbixIRVq2AnDGcdLL8XOHzZtJWZjSa6tAi6afxSiMbQTGIhYfwwcB/sJcIUUffBaIQ2BiA==} + + '@turf/boolean-intersects@7.3.5': + resolution: {integrity: sha512-Z6GPYjozrmTuzWQD0x7o8RPm+4HC7hz9q23hdB3U1+Qahesv8Mtc+wo82tO4CG6/NRnJ9u79DlEhmR1DxUU4iQ==} + + '@turf/boolean-overlap@7.3.5': + resolution: {integrity: sha512-DUeiPVqFSTjW79erPbo780pRcKCRad59NcscVsTYkZD/92peF/4rQvHbvAUpUDPZaQCxe+mvfeDHfUFmfVKCGA==} + + '@turf/boolean-parallel@7.3.5': + resolution: {integrity: sha512-+shvGYFUx1vPQRPNeKiJcHtLAf9fl3mzAl9tBx2z+dU0IZDKz76/MAaDYSrMya/BYilFZ0E4RCEVq1X3s+AfkA==} + + '@turf/boolean-point-in-polygon@7.3.5': + resolution: {integrity: sha512-ba7+B0wzaS9GtERZOoXUZ6oW8IcIJHNQZf3c+tiD9ESjcsPO1Q/4qIJGTKl92nBLhhracHJxMWBM/U6hAVkaRg==} + + '@turf/boolean-point-on-line@7.3.5': + resolution: {integrity: sha512-TuWfrAT63W43BDzgYc94UzQ5/PjF1aTnh4AIzmQwez1YnimShYcOTwo8OIHzDaB6gbbvFsfxYMuOA5JOp942Kg==} + + '@turf/boolean-touches@7.3.5': + resolution: {integrity: sha512-GwD0gmbV1p+EFHojBjaa1cwGMybayOZUDLj562RlAAoexC8ownrW7W6oMAlM2VCxk4gq6CLx3hss9pONuQcKjQ==} + + '@turf/boolean-valid@7.3.5': + resolution: {integrity: sha512-ZezJCgFJS0JRJfj6fVSI1idcifTaWFW70NYRCUur9926DHLvSkfbtEF5i63yPQt2Zxx00FTUJPcHRzdgOiwECA==} + + '@turf/boolean-within@7.3.5': + resolution: {integrity: sha512-FsZhkAoi9KU2F0D5dyOQ38A7y9Bk8XTmUfLKAJa12xHN0QtXZEYH86YdVlrI1XgfFB9gmUddJPFX+bJATy6rxw==} + + '@turf/buffer@7.3.5': + resolution: {integrity: sha512-TGls3nYtWzviKHT00XVBfHKa7Z2oIZKqiHN7R0xErGwMSAR7YhxVROhxq/iyIsWZjl1SlPwweZZIxWILQuxpZA==} + + '@turf/center-mean@7.3.5': + resolution: {integrity: sha512-8IpS7zUZg0fuUpN9ViqT4gR6YMjSR1R1kHysaDxhP1zMrTJ84U5lGG+VQC7HpHqybOnuwkXZrV970h9Ni78n6g==} + + '@turf/center-median@7.3.5': + resolution: {integrity: sha512-e+NeDKyZzIzSTA0qd9cwIuguCnDQSc6TLd1MjkHKTd37PCaPSc40TMEIBX1x+kJRwOxzmUgpubfHUG9zfjdtyA==} + + '@turf/center-of-mass@7.3.5': + resolution: {integrity: sha512-eEzx4YKxUP55Apdjt7XXuQ906KKx4uSQWLxJw5OHE0rKOSN/qYTSdu0s7nQBAmGgAqeSC2538vuN7wEqMfYMvQ==} + + '@turf/center@7.3.5': + resolution: {integrity: sha512-eub5/Kfdmn89ZqwCONHI7astmTDEtN5M6+JfOkgoSyhKKFhUJYNxUyH1F/vCtIP7j1K369Vs4L9TYiuGapvIKQ==} + + '@turf/centroid@7.3.5': + resolution: {integrity: sha512-hkWaqwGFdOn6Tf0EWfn2yn1XZ1FWE1h2C5ZWstDMu/FxYO5DB+YjlmOFPl4K6SmSOEgdV07eK2vDCyPeTHqKGA==} + + '@turf/circle@7.3.5': + resolution: {integrity: sha512-Tse7GJrx0rxaQ5BdY6pHZ9HFPrZwRMry2yaqq94UsUyonhy1m7U2icB3Zp4M8o4XjHIGTCq9i2BYcGJram51Sw==} + + '@turf/clean-coords@7.3.5': + resolution: {integrity: sha512-e0ZTqVWiQaCI/b8EFb+HAS8lCDomWafAKxQuIv0IYks0GwOlVTDWTwsY2RX2685j2Y+QssqOsyHsPZCtAjc3YQ==} + + '@turf/clone@7.3.5': + resolution: {integrity: sha512-qfIaHj3410QEcTpiCRnTzhq8YrUp2gWrUIPLBAEFykopNxJkq1du1VrRzvuAo36ap2UV7KppkS6wGNypbcxswQ==} + + '@turf/clusters-dbscan@7.3.5': + resolution: {integrity: sha512-xdc0ccv2fyiUSWrJYJFE6RTluf8oVCB0/aCOdUD/ZvtG3eyqGIXMRMzAR1PujQHjBWtI+ndD4Eq+DqiGukGK+g==} + + '@turf/clusters-kmeans@7.3.5': + resolution: {integrity: sha512-MnKymdmL7vy4TR5CLkcNkNgsJP8ZBEiWkqnRYBJLq/hFoppTvXxKvkRzftWtLfkIWb5oQ2XMvBh8BgALN22d5A==} + + '@turf/clusters@7.3.5': + resolution: {integrity: sha512-ZYQSCxElarAaG4azNieZ0ylX1sietkHIVAZv6H5JfSz/EXbAekQIom/isoynfDl/jVyNonDT7UrDZdCIjKQ2Gg==} + + '@turf/collect@7.3.5': + resolution: {integrity: sha512-ddcBDdnM2Rwjfedxsbjvb7Zhoqo6uCTcnaHvu3ej/g+Z9iJ/K2wkRWhEUVAg/wppso5io6qEPmmPpNlefePt+w==} + + '@turf/combine@7.3.5': + resolution: {integrity: sha512-olQH6WmLl3XAalbpiz7RSRr4/mogan38gvgDlo37ypW1ckeBUi+2TX5HgJUZq4wxa2gMlny72QYkqY9zW4Jw+A==} + + '@turf/concave@7.3.5': + resolution: {integrity: sha512-T496U4K5mXsJXTKjnf7eW+4SYoDP0bXWhpcfpWuCAaDJy8n1Q8Dbslj7wqrWd2lqIhulVRF+3zWAh0bJS34L5g==} + + '@turf/convex@7.3.5': + resolution: {integrity: sha512-d/pq86he+/GB/2ObuBHapeT15QFsCPhhGab3uE4YjogLMbD8qtu0sRGF+cvvPRDNuCLycOBL/xgFLnf9SteYlA==} + + '@turf/destination@7.3.5': + resolution: {integrity: sha512-x6ylChhOlIbucRSw7wF6z2gSEqqQl+dE0nSH5AL/ojZkqqGYahiw+2P4A8ZMuDM6rzH+FIqRYDes0o4nSArZCw==} + + '@turf/difference@7.3.5': + resolution: {integrity: sha512-iDyWYCvgS3vgB8W1ai2cvfJaTq9bOt1QghiVkCNIyccF97CgtYJzenREVVUlp8qU9lJlbQ/ameyKvXPA1uOAlA==} + + '@turf/directional-mean@7.3.5': + resolution: {integrity: sha512-Fm3rVgX7xiCL8Ed68dZpUl5NEAgEpaUdkAaZLvhedfUmKcuXcfBwX8RebHwNWctxcvKVOhoAMSlogpV33JnKdQ==} + + '@turf/dissolve@7.3.5': + resolution: {integrity: sha512-6kZTc8rbGuBqxWW8iK1sJZC8r7vr5uWdv7nsMJ0eX8/g0mTKNgSGXo14hYqp2GN4bE7JzpAgpFeSX8Xu1psxlQ==} + + '@turf/distance-weight@7.3.5': + resolution: {integrity: sha512-GpV2h5ZkbWMdUFe5BWm9lfeLFMnYR8CRj6HiguZBLesarSub6I0UNO1u8UhkRGi26YLGnFlBh7c4KyaakNx1Gg==} + + '@turf/distance@7.3.5': + resolution: {integrity: sha512-uQAC63zg/l91KUxzfhqio7Ii3+UXTrPOVJScIdRj6EO6+9XHI4kC+AdyIS4cPAv14sZfJLIBxzMnzcGrss+kEA==} + + '@turf/ellipse@7.3.5': + resolution: {integrity: sha512-C478LrdvUkjwIVGN6PoYsFp27PuT+W2IH4ZOVt9sd4359hRPFhJ2m+f8jSPfS6rdamdvc/O+h7vNmOIBRP/TeA==} + + '@turf/envelope@7.3.5': + resolution: {integrity: sha512-0Sc2AVx0JZ3MaQ0k6+khplU3wO7bwc1qAQ6Fd+Q4RhIVPY2JKstBdq5ftU1T/BHNf8KK+9y4qbSV2u8hnw/PqA==} + + '@turf/explode@7.3.5': + resolution: {integrity: sha512-Qdd7ehX5AF0DdpJl+JJyxws7jEmsZBRV35wTm+Lyhapuc3yLHU7tN5EqJ+2lVV7RkUgBXEFQV+34pmPLPGQn+w==} + + '@turf/flatten@7.3.5': + resolution: {integrity: sha512-4dDAyoY8wf4UCIJ2lH3JbypmEeqyuRFExHEPu6eJeaOybdpOV9kn3LqB0lsWArizFjJWQNS+0qpv08jD85jSPg==} + + '@turf/flip@7.3.5': + resolution: {integrity: sha512-qDSBFqo5+8yE5gfBCsQZxgj0bGRx6abQg6TgYvg1wvYYHtUJL/0VS+QdDTmxZiYm8N46uNAv9pKvun9MGK+elA==} + + '@turf/geojson-rbush@7.3.5': + resolution: {integrity: sha512-30/hQqc+ErnlcavvDdxGfgm8VtsJDEzSYpf3mPqYxOyI976l49T6+1jCQD5xKswml6o8zZAaTSe6ZcSKF+SCNw==} + + '@turf/great-circle@7.3.5': + resolution: {integrity: sha512-VAio6hwPJIheSzrvsMkLDMHkCfHyOi4H4r1Y2ynb2oMiGiqZjkQ7jIFlRYBcTyO2RnwEOgwM/d3kwRImAwMVBA==} + + '@turf/helpers@7.3.5': + resolution: {integrity: sha512-E/NMGV5MwbjjP7AJXBtsanC3yY8N2MQ87IGdIgkB2ji5AtBpwnH4L3gEqpYN4RlCJJWbLbzO91BbKv2waUd0eg==} + + '@turf/hex-grid@7.3.5': + resolution: {integrity: sha512-sPtYXqbNvUxt8h4NzspcoFAVotd/75LgrLxxI84LGIVPCN+fsK1uWwr4a6MAlzfSbWbOYOq7OSWMSSXzHoQzJg==} + + '@turf/interpolate@7.3.5': + resolution: {integrity: sha512-rl5LwK85etpvbSW1VEXp/I85kzgiGviXInrvvhQxzEF9xGKvs1ed/6dc1uy1LsczSr4wUnbdGATzZTF9lFYjIw==} + + '@turf/intersect@7.3.5': + resolution: {integrity: sha512-v11Do9ySbsE08ffiwboQeFKvYByyxzvAz0ls837A9T3rSC+8vKMmK815S+C5v8CBMLNhuBCSgqnOIV3zonNICQ==} + + '@turf/invariant@7.3.5': + resolution: {integrity: sha512-ZVIvsBvjr8lO7WxC5zYNjRsjSDvyGvWkJMjuWaJjTU8x+1tmfNnw3gDX/TI2Sit83gcRYLYkNo23lB/udqx/Hg==} + + '@turf/isobands@7.3.5': + resolution: {integrity: sha512-WX6vpPkM8O8SY7hsijOtj4owVXP24nU33Q0eMhWdZ+YiDmAHgEOQcDhPJLvp0mIbyYj81mU73hdnilf3q9tk/A==} + + '@turf/isolines@7.3.5': + resolution: {integrity: sha512-n5QUX1/Z/PuPVpTUrKhYcKF95L5+nKF8hWznYtG/GsiMXfRqMeAEjTCqgKIgF8T65H4LrvcpLyq8VPQSi7aISw==} + + '@turf/jsts@2.7.2': + resolution: {integrity: sha512-zAezGlwWHPyU0zxwcX2wQY3RkRpwuoBmhhNE9HY9kWhFDkCxZ3aWK5URKwa/SWKJbj9aztO+8vtdiBA28KVJFg==} + + '@turf/kinks@7.3.5': + resolution: {integrity: sha512-dPW8d4vs1v8WMobjyq/TVqajjPwkMsl94IF58yp1UYlmJDQrW4iNRUmI9fFzww+fl7epCKNwY+jZhXf1DRi93w==} + + '@turf/length@7.3.5': + resolution: {integrity: sha512-Bi+vEP54wt1ly3BRcCOP0nd2kGTYEhGk6haQxTpkrqr3XtmqDh8c3NowSgseN2cegIZRjwCOEC8eSsZ0JemJdA==} + + '@turf/line-arc@7.3.5': + resolution: {integrity: sha512-XrPicIoN7XCtiJ7e7ELje7GjMZrBw/nuJnz0mQoCwwHwmX8Oz9oRfb6uaiS8NeR4WBzUVdkmVR/ro0kW4lypog==} + + '@turf/line-chunk@7.3.5': + resolution: {integrity: sha512-z5/EBv79oyNXMYFpFIsA9gw/7TAKoJ9a/Ijo/jBeO47Fr1mV3JLtE3aB2i/nqLTYZWMU7K3Lnzwqt2Rn5Gri/Q==} + + '@turf/line-intersect@7.3.5': + resolution: {integrity: sha512-2Cl4oPsjaDdfIwz/5IRDdG2fNdfp3W6atICm81vnzl/GwURoVP+CLjXJ64QWWzpzIbgX2XprJQTmamByDt5MDw==} + + '@turf/line-offset@7.3.5': + resolution: {integrity: sha512-7tNI+4xKFOTQj720aJI7vuRMyTC+4hAqd7N8AnnZ0EpzH+sBfyrt8rNI/Vf3+d/iY0c9ZNbhU9Qhyb0ckJUdsA==} + + '@turf/line-overlap@7.3.5': + resolution: {integrity: sha512-7lZMWYHuzM6EMlL5pIIi/Nh7GLsM7ilW8/jVyHP1yGfQ0c0YAUoJd/Xy3J2+9v8OkYiZW/t2LdwVoTmCEJLWxg==} + + '@turf/line-segment@7.3.5': + resolution: {integrity: sha512-TM1aCu7utM6fllAEHO8PNqBJZ/uoFJVNp2A0YI7FyWN928hPbacsvNtLeVz/Kq1ZbeqQ1ZIKRxo9FdVjaj8hGg==} + + '@turf/line-slice-along@7.3.5': + resolution: {integrity: sha512-zLOU9mGFXJdbPvA3/zXpDsBmXY2paA7eD6/p0iYiP9OASYO0GDcarwY5K/E0uuEdLrMf8G8YA2cJDcEl9gRgFw==} + + '@turf/line-slice@7.3.5': + resolution: {integrity: sha512-BGw5N4UvjH691J/z1P2S+hWBgCcvbl2/HXaqGvKTijXw5i1vzsZ9m07wLl/qH+i38OJDRMJ/+FkNZnrKpsoXLw==} + + '@turf/line-split@7.3.5': + resolution: {integrity: sha512-GEuy+LdbbaqtYjHk/i1G8sK51wfCdPqTO8uH0dJZ6WlcIcZQfRcKKI4ksFm7NkVyfmw8gXWbpMJD8lO380GFBQ==} + + '@turf/line-to-polygon@7.3.5': + resolution: {integrity: sha512-PNWDN1B0nJRlgA4DAXeYEf53OZSWwsu/rtDB4wxe/1NwfM9zlDVElQ/mtgDPtZpwC2aDKV5+B0vTXfKR/MMIfg==} + + '@turf/mask@7.3.5': + resolution: {integrity: sha512-zs9bBtdANOsSkG7xiLFYforeI2nszXu0QwPv3vkaX747oEVdcyd0nSW81aQRmSWw/fvhXja++8duIVXOIYr4ng==} + + '@turf/meta@7.3.5': + resolution: {integrity: sha512-r+ohqxoyqeigFB0oFrQx/YEHIkOKqcKpCjvZkvZs7Tkv+IFco5MezAd2zd4rzK+0DfFgDP3KpJc7HqrYjvEjhg==} + + '@turf/midpoint@7.3.5': + resolution: {integrity: sha512-y92O2YDDBkZp7jAUuUPgof/HiXHjJSkKjEtQRjWXZcjTlzHd/Fqg6/twarY2wNkENK2EuaaiV9MDy74FeRG2Ow==} + + '@turf/moran-index@7.3.5': + resolution: {integrity: sha512-l/FgZkgPzwAsdj7rtKYWv2rxeTy+Tv8NMk6qSEwKqB4eHqn1TYHcTASWRcZIyipH4LtOJJOl77n7FmKcaDBtSg==} + + '@turf/nearest-neighbor-analysis@7.3.5': + resolution: {integrity: sha512-6vnSqt7OH8zTPdvUxCYnnN86Ci8VS5G3q2G1UrAcrnjTH7DbJ4KvIkRQlv4y6hj53G+bm9cA6TjeJuyP2jAOcg==} + + '@turf/nearest-point-on-line@7.3.5': + resolution: {integrity: sha512-MZn6OkEFZpjS6BNUANfqiHMIbQSivu7TNji3a+OAIrnPJ71vp8cbz0N2aVEa5M7I8ipvxoxAPIV3eqg3h280Vg==} + + '@turf/nearest-point-to-line@7.3.5': + resolution: {integrity: sha512-O27A9dFAqDYBRPhhoLP82Da7Q6rd0fXRR/jwQcBiycjTGdsXJmzxywuR08aDvWiARbJAmohEzdYzk4f9/eWXhA==} + + '@turf/nearest-point@7.3.5': + resolution: {integrity: sha512-qcsbj9fo5CYhGeIDaJORoqiZyjNGu2+Te31MVaFoTTxqqkXypxp9e6HJGvUi2zPd1Zk3oAWXhvm1a+UXw2G56w==} + + '@turf/planepoint@7.3.5': + resolution: {integrity: sha512-+hjECX1hDbol8psuG6iYSwcZHQ+RPJqFIBh3pXKc/pa0cdjZyB/L6q1d8ahnFrQBEpuoO3XVvo2hHN49VOEPjw==} + + '@turf/point-grid@7.3.5': + resolution: {integrity: sha512-aEPnqj/4C9ejNz4uCJKgk6Flux6SxnqxjQHAYPIP5C7ooAB1xRAT1NMnCzxUjjUq1SMtgdZ6skoNfvKNK4Rzrw==} + + '@turf/point-on-feature@7.3.5': + resolution: {integrity: sha512-Y7W+JZJCmm9Qq93NHpk4dVhzAtAk2Uyau2Uk1ttCJ2Jsnuu4dwSjOurpmgDmMUe7yPmzihAUYhMFDumpAja8ZA==} + + '@turf/point-to-line-distance@7.3.5': + resolution: {integrity: sha512-mR1NAIX+JfpYAJQ9u3gpIV37QzYvBOefDP+/16uBCAOM8Fp12goT8l7WdenT0dvB4wPibbqM2+2kyEl5u9XJog==} + + '@turf/point-to-polygon-distance@7.3.5': + resolution: {integrity: sha512-SQPhAlfiuCkIIFos/OPCxtt8iR3BlZqGKzKXLYqt6z8iaICaf2SjMyn4Zsr1oFO+Gy2K1rqandR+kuLTIo8Eqg==} + + '@turf/points-within-polygon@7.3.5': + resolution: {integrity: sha512-TRyVY5Xlx6j72sNIyBaHZNgTbILs2iUDevX5lnCFTiThkzp25BIBBQ77tv2VPilYH+v7+9/0T/pLO37SaVhsQw==} + + '@turf/polygon-smooth@7.3.5': + resolution: {integrity: sha512-dc/dlYFqVBcel6d5HM5tBANh1HfWbJ89lSVLR7YhRX+Y/UABTvbtJCWwxBBiFxFBeRmW7B45nv3jytHUYxQUOA==} + + '@turf/polygon-tangents@7.3.5': + resolution: {integrity: sha512-3/TtCQlXc2Lrgzb+LjwqbtILWan7lRD6P9Nn3edm2xGAZw5WY17+yZfpeySJPfcZhOWten9dXkOwDvSZF5uyWQ==} + + '@turf/polygon-to-line@7.3.5': + resolution: {integrity: sha512-Mat5tvJcW3grpXCNFcMvjHL3d8hO4eoIgF3qYpXj25BHx/S7SJUOgyCV5x3arC0rCfM/cB71VmNDm9k57ec7bw==} + + '@turf/polygonize@7.3.5': + resolution: {integrity: sha512-pD3Zv/392sLlZVKRGUrJ4CKLN/Im+TO6wMCOfm/uiq4F9pEL5R+HPvXTcwEyxbhEPKYn3cylGKt21Wq0OfNQDQ==} + + '@turf/projection@7.3.5': + resolution: {integrity: sha512-G4bejYKT0vCQZryMhEoS9aLmP7ThDg6nb3zi3wPzELiTrGNOd2YgkWVheQDGCk4hcqEIWZc9fI2alaRSSkkLVw==} + + '@turf/quadrat-analysis@7.3.5': + resolution: {integrity: sha512-e5Am3cJuiP43f89Xv7n9cv3Z4P0I17zBvQPvhj6UowpRbiYoD4TKHfOr2PWHLYUkXjQ+vKY5CwiWvCYbfj3BIg==} + + '@turf/random@7.3.5': + resolution: {integrity: sha512-Fid43jfmQpvrpr/wrUaW9hr66ukPqfZPuwzEt3gfCx6mAVpFWbCPx2yRuVlLNiRkMgmKTphFfh6267UCPOSnCg==} + + '@turf/rectangle-grid@7.3.5': + resolution: {integrity: sha512-SVtXOJIz7FYaRUinxb0HfE/GNSJU6eU9tlKQaERDo/vG7wjPoTCDvnH8p4BdE5GRdXZMjvBUhtNdMj+M3rGRjQ==} + + '@turf/rewind@7.3.5': + resolution: {integrity: sha512-4AZdDh55JeCoKWLS5AC6MuXqAvoqSpj2WigtowtA3JIJ/1J4SclRrV6BGq/Xemwm5yKtRePHazBVUmG5uU75og==} + + '@turf/rhumb-bearing@7.3.5': + resolution: {integrity: sha512-pYjBAuQTND0+6Y+v+zlQ7Y68SGjP4iG8qJ5QKjFRbB/yeorTY3m9yiXIN4lSyno3TPzEgBeNULuo26H6ygDyng==} + + '@turf/rhumb-destination@7.3.5': + resolution: {integrity: sha512-znICdPBtZq5EKh/Qu0TkiMyNhqiYfM2VUlFOWa7iegCWe1E+X7q/f6rlZ5TcmYVyLZ95XZ6eciDNmgVmpHVWaw==} + + '@turf/rhumb-distance@7.3.5': + resolution: {integrity: sha512-dBFxmKrjRaAdwc4SCmGyAS2BDPCH35IBNl++Ypd1RB8JR2D3khl3zrTvxrlJ5qoN1WDvyPbvDYCrt2UnTX+8Nw==} + + '@turf/sample@7.3.5': + resolution: {integrity: sha512-ayl/QlDAkqIDJjbzcBeAsMzFmIDanQP4xXdNKZmnYg83FhvH/Sgu7mMNNhrYwCVMWrmOicviDHu3xKuJ6jVnMA==} + + '@turf/sector@7.3.5': + resolution: {integrity: sha512-9mtBorGPZfbZI2MoI0nkN5ogmbCz/NLpHdEM0UwwWiOW430iPhwZ649DXH32lDGerfzREX10vpamX8v1P9YVrw==} + + '@turf/shortest-path@7.3.5': + resolution: {integrity: sha512-RmrfdDVTuBsHDNr88tGMRmIdJNFTdna3nQWRF8yFsgKR9LhZ4MWqebL24eQFn2hkyclL7O6lyPpOEJJtQxvcDw==} + + '@turf/simplify@7.3.5': + resolution: {integrity: sha512-9wzxlRA+0yNALeqyXNHFgj+8ebsg2aKdMrWRiSMS+ZqbiknZ/mCARiDYqM2Qz8TgTqdrNt53ze4o1vS6WeJrJw==} + + '@turf/square-grid@7.3.5': + resolution: {integrity: sha512-mcwefBumsO3nwRG4nPfmXsq7YqHOsa71Z3h4JwWQn/XOrhV/8l1/QX3IAIx1qUWC2RqRMOImt3et5mlc+g2SxQ==} + + '@turf/square@7.3.5': + resolution: {integrity: sha512-zUh9cxlZ4bPkSK2XynY26JSLDVy8oUss94mXACqSGrGjv308q3Voj4dzvfeh0E/Q3PQ3D8GJRZECXdCB/PU78Q==} + + '@turf/standard-deviational-ellipse@7.3.5': + resolution: {integrity: sha512-CIJaQ61bjmxxqi5CpRLWAwxnbeHcG6e7esK2IX2DXBIE/7p/F7Sk9F2GOAL6vt1o29GnmzU2APHZvTX/YKcLbw==} + + '@turf/tag@7.3.5': + resolution: {integrity: sha512-jwLOP7ZFfOcMPbK+0puT0SMOs0urSKYSYax7G4LDtZ9oPFAicVJtr2K0OB/rgmdoTK4VfUwb2nVZUdYAVnXtAw==} + + '@turf/tesselate@7.3.5': + resolution: {integrity: sha512-MI+pSkehJyZmbl2L5/43B9DlD6MEDcr63pW/LDSXYRDoRUXtSGY/NAAibIQ0gMAr8VxsimGCZKSuGMNUZdsuRQ==} + + '@turf/tin@7.3.5': + resolution: {integrity: sha512-70747SmLQttt+ywq+NmMqmkHdXsinO57SjHNFKX6G6qHuvxUu48vN7Kf3zjkqGAp2kQnu38OOqB4QPus6RdUqw==} + + '@turf/transform-rotate@7.3.5': + resolution: {integrity: sha512-WXkteI0DihwCukZesVXVVYpsoyftYoiBtq1b+u1Dz4HyATK25zfEeWChlgRtApbiePF6uqG7bSQS+K8vjC4c0A==} + + '@turf/transform-scale@7.3.5': + resolution: {integrity: sha512-eAmey/LtJVT6WlCMULsnd+sCAOwCezG6lVP67qN5HARZ8ft+b7yBiU4FC+IGXbVsrdRcCRLSzoQc6K0fROoo2Q==} + + '@turf/transform-translate@7.3.5': + resolution: {integrity: sha512-OMQLOFLIjqeDNARaa2kdh1AgvWKFgq41/I6k3CAaj1UcB4javpVFMlcjRJY+pL2oZtMRZRcUZxhO+zSNl6p83Q==} + + '@turf/triangle-grid@7.3.5': + resolution: {integrity: sha512-oiwtTm+yqZwuODOSEyLSQSFaZFyjC6kgftUFFW6kLGQtm+Fw1GjxwS7QjiY55GRWxgfgbg2l1iNZNgfsCiPQWA==} + + '@turf/truncate@7.3.5': + resolution: {integrity: sha512-Qx2iv3KIqKuDAUduMfaJ5fFegEWBeRve5zePalRevS16bMUqEX+jnKPK9fWGyUuPqT61qP1Kybz0PTWPbUbljQ==} + + '@turf/turf@7.3.5': + resolution: {integrity: sha512-l5Z1ZFEizN9p5GxX3mzUGf+i4t7AP3YpWcNdf9+kIzJcQD3eYuGBabj2hLrfrluqFJ+uxsuo4RgPtortQ9Dwpg==} + + '@turf/union@7.3.5': + resolution: {integrity: sha512-/FSKhl+LX4+M7L/Trmiln0CDPWS8vCneGnQktt1o5XbCY/zIpH1JdxHEBFXhFZg4beAyXCz0uuxRyW9N/DH+KA==} + + '@turf/unkink-polygon@7.3.5': + resolution: {integrity: sha512-7MwKCm7sPHVF4xBO/3s08/DtA/09UEBXaLNnm8/RUq3abS5zZ9PnakLsd36J18IHDscM6RmH7IZPLSwYh4TLcQ==} + + '@turf/voronoi@7.3.5': + resolution: {integrity: sha512-v51D9H+er/K5lP+rBs7jIBEXTFhl0FQOZn4mfhb7brN5sGGDmnfEFOaxIYOiJN4Qco1GtFD2Tq0NgZ8+dmJmEA==} + '@tweenjs/tween.js@25.0.0': resolution: {integrity: sha512-XKLA6syeBUaPzx4j3qwMqzzq+V4uo72BnlbOjmuljLrRqdsd3qnzvZZoxvMHZ23ndsRS4aufU6JOZYpCbU6T1A==} + '@types/d3-voronoi@1.1.12': + resolution: {integrity: sha512-DauBl25PKZZ0WVJr42a6CNvI6efsdzofl9sajqZr2Gf5Gu733WkDdUGiPkUHXiUvYGzNNlFQde2wdZdfQPG+yw==} + '@types/dom-to-image@2.6.7': resolution: {integrity: sha512-me5VbCv+fcXozblWwG13krNBvuEOm6kA5xoa4RrjDJCNFOZSWR3/QLtOXimBHk1Fisq69Gx3JtOoXtg1N1tijg==} @@ -1210,6 +1564,9 @@ packages: '@types/event-emitter@0.3.5': resolution: {integrity: sha512-zx2/Gg0Eg7gwEiOIIh5w9TrhKKTeQh7CPCOPNc0el4pLSwzebA8SmnHwZs2dWlLONvyulykSwGSQxQHLhjGLvQ==} + '@types/geojson@7946.0.16': + resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + '@types/hoist-non-react-statics@3.3.7': resolution: {integrity: sha512-PQTyIulDkIDro8P+IHbKCsw7U2xxBYflVzW/FgWdCAePD9xGSidgA76/GeJ6lBKoblyhf9pBY763gbrN+1dI8g==} peerDependencies: @@ -1221,6 +1578,9 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/kdbush@3.0.5': + resolution: {integrity: sha512-tdJz7jaWFu4nR+8b2B+CdPZ6811ighYylWsu2hpsivapzW058yP0KdfZuNY89IiRe5jbKvBGXN3LQdN2KPXVdQ==} + '@types/lodash-es@4.17.12': resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} @@ -2240,6 +2600,10 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + arc@0.2.0: + resolution: {integrity: sha512-8NFOo126uYKQJyXNSLY/jSklgfLQL+XWAcPXGo876JwEQ8nSOPXWNI3TV2jLZMN8QEw8uksJ1ZwS4npjBca8MA==} + engines: {node: '>=0.4.0'} + archiver-utils@2.1.0: resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} engines: {node: '>= 6'} @@ -2378,6 +2742,9 @@ packages: big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + bignumber.js@9.3.1: + resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} + binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -2581,6 +2948,9 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + concaveman@1.2.1: + resolution: {integrity: sha512-PwZYKaM/ckQSa8peP5JpVr7IMJ4Nn/MHIaWUjP4be+KoZ7Botgs8seAZGpmaOM+UZXawcdYRao/px9ycrCihHw==} + conventional-changelog-angular@5.0.13: resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} engines: {node: '>=10'} @@ -2669,6 +3039,15 @@ packages: csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + d3-array@1.2.4: + resolution: {integrity: sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==} + + d3-geo@1.7.1: + resolution: {integrity: sha512-O4AempWAr+P5qbk2bC2FuN/sDW4z+dN2wDf9QV3bxQt4M5HfOEeXLgJ/UKQW0+o1Dj8BE+L5kiDbdWUMjsmQpw==} + + d3-voronoi@1.1.2: + resolution: {integrity: sha512-RhGS1u2vavcO7ay7ZNAPo4xeDh/VYeGof3x5ZLJBQgYhLegxr3s5IykvWmJ94FTU6mcbtp4sloqZ54mP6R4Utw==} + d@1.0.2: resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} engines: {node: '>=0.12'} @@ -2847,6 +3226,9 @@ packages: duplexer2@0.1.4: resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} + earcut@2.2.4: + resolution: {integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==} + earcut@3.0.2: resolution: {integrity: sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==} @@ -3228,6 +3610,12 @@ packages: resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} engines: {node: '>= 0.4'} + geojson-equality-ts@1.0.2: + resolution: {integrity: sha512-h3Ryq+0mCSN/7yLs0eDgrZhvc9af23o/QuC4aTiuuzP/MRCtd6mf5rLsLRY44jX0RPUfM8c4GqERQmlUxPGPoQ==} + + geojson-polygon-self-intersections@1.2.2: + resolution: {integrity: sha512-6XRNF4CsRHYmR9z5YuIk5f/aOototnDf0dgMqYGcS7y1l57ttt6MAIAxl3rXyas6lq1HEbTuLMh4PgvO+OV42w==} + geotiff@3.0.5: resolution: {integrity: sha512-OWcL9S9+yDZ6iAlXMt32T1iwUApJM8UiD47xbm6ZP1h33d10fqkPs14EG/ttT5EnefpZSx3G15iDFC5FxUNUwA==} engines: {node: '>=10.19'} @@ -3711,6 +4099,10 @@ packages: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} + jsts@2.7.1: + resolution: {integrity: sha512-x2wSZHEBK20CY+Wy+BPE7MrFQHW6sIsdaGUMEqmGAio+3gFzQaBYPwLRonUfQf9Ak8pBieqj9tUofX1+WtAEIg==} + engines: {node: '>= 12'} + jszip@3.10.1: resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} @@ -4274,6 +4666,15 @@ packages: resolution: {integrity: sha512-afRERtHn54AlwaF2/+LFszyAANTCggGilmcmILUzEjvs3XgFZT+xE6+QWQcAGmu4xajy+Xtj7acLOPdx5/eXWQ==} hasBin: true + point-in-polygon-hao@1.2.4: + resolution: {integrity: sha512-x2pcvXeqhRHlNRdhLs/tgFapAbSSe86wa/eqmj1G6pWftbEs5aVRJhRGM6FYSUERKu0PjekJzMq0gsI2XyiclQ==} + + point-in-polygon@1.1.0: + resolution: {integrity: sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==} + + polyclip-ts@0.16.8: + resolution: {integrity: sha512-JPtKbDRuPEuAjuTdhR62Gph7Is2BS1Szx69CFOO3g71lpJDFo78k4tFyi+qFOMVPePEzdSKkpGU3NBXPHHjvKQ==} + posix-character-classes@0.1.1: resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} engines: {node: '>=0.10.0'} @@ -4432,6 +4833,12 @@ packages: resolution: {integrity: sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==} engines: {node: '>=12'} + quickselect@1.1.1: + resolution: {integrity: sha512-qN0Gqdw4c4KGPsBOQafj6yj/PA6c/L63f6CaZ/DCF/xF4Esu3jVmKLUDYxghFx8Kb/O7y9tI7x2RjTSXwdK1iQ==} + + quickselect@2.0.0: + resolution: {integrity: sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==} + quickselect@3.0.0: resolution: {integrity: sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==} @@ -4442,6 +4849,12 @@ packages: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} + rbush@2.0.2: + resolution: {integrity: sha512-XBOuALcTm+O/H8G90b6pzu6nX6v2zCKiFG4BJho8a+bY6AER6t8uQUZdi5bomQc0AprCWhEGa7ncAbbRap0bRA==} + + rbush@3.0.1: + resolution: {integrity: sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==} + rbush@4.0.1: resolution: {integrity: sha512-IP0UpfeWQujYC8Jg162rMNc01Rf0gWMMAb2Uxus/Q0qOFw4lCcq6ZnQEZwUoJqWyUGJ9th7JjwI4yIWo+uvoAQ==} @@ -4694,6 +5107,12 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + robust-predicates@2.0.4: + resolution: {integrity: sha512-l4NwboJM74Ilm4VKfbAtFeGq7aEjWL+5kVFcmgFA2MrdnQWx9iE/tUGvxY5HyMI7o/WpSIUFLbC5fbeaHgSCYg==} + + robust-predicates@3.0.3: + resolution: {integrity: sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==} + rollup-plugin-external-globals@0.6.1: resolution: {integrity: sha512-mlp3KNa5sE4Sp9UUR2rjBrxjG79OyZAh/QC18RHIjM+iYkbBwNXSo8DHRMZWtzJTrH8GxQ+SJvCTN3i14uMXIA==} peerDependencies: @@ -4834,6 +5253,9 @@ packages: signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + skmeans@0.9.7: + resolution: {integrity: sha512-hNj1/oZ7ygsfmPZ7ZfN5MUBRoGg1gtpnImuJBgLO0ljQ67DtJuiQaiYdS4lUA6s0KCwnPhGivtC/WRwIZLkHyg==} + slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -4910,6 +5332,9 @@ packages: spdx-license-ids@3.0.23: resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} + splaytree-ts@1.0.2: + resolution: {integrity: sha512-0kGecIZNIReCSiznK3uheYB8sbstLjCZLiwcQwbmLhgHJj2gz6OnSPkVzJQCMnmEz1BQ4gPK59ylhBoEWOhGNA==} + split-string@3.1.0: resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} engines: {node: '>=0.10.0'} @@ -5018,6 +5443,9 @@ packages: engines: {node: '>=10.13.0'} hasBin: true + sweepline-intersections@1.5.0: + resolution: {integrity: sha512-AoVmx72QHpKtItPu72TzFL+kcYjd67BPLDoR0LarIk+xyaRg+pDTMFXndIEvZf9xEKnJv6JdhgRMnocoG0D3AQ==} + tailwind-merge@2.6.0: resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} @@ -5067,6 +5495,9 @@ packages: resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} engines: {node: '>=12.0.0'} + tinyqueue@2.0.3: + resolution: {integrity: sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==} + tmp@0.2.7: resolution: {integrity: sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==} engines: {node: '>=14.14'} @@ -5095,6 +5526,10 @@ packages: resolution: {integrity: sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==} hasBin: true + topojson-server@3.0.1: + resolution: {integrity: sha512-/VS9j/ffKr2XAOjlZ9CgyyeLmgJ9dMwq6Y0YEON8O7p/tGGk+dCWnrE03zEdu7i4L7YsFZLEPZPzCvcB7lEEXw==} + hasBin: true + traverse@0.3.9: resolution: {integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==} @@ -6451,14 +6886,1154 @@ snapshots: '@tsconfig/node16@1.0.4': {} + '@turf/along@7.3.5': + dependencies: + '@turf/bearing': 7.3.5 + '@turf/destination': 7.3.5 + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/angle@7.3.5': + dependencies: + '@turf/bearing': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/rhumb-bearing': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/area@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/bbox-clip@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/bbox-polygon@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/bbox@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/bearing@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/bezier-spline@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/boolean-clockwise@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/boolean-concave@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/boolean-contains@7.3.5': + dependencies: + '@turf/bbox': 7.3.5 + '@turf/boolean-point-in-polygon': 7.3.5 + '@turf/boolean-point-on-line': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/line-split': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/boolean-crosses@7.3.5': + dependencies: + '@turf/boolean-equal': 7.3.5 + '@turf/boolean-point-in-polygon': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/line-intersect': 7.3.5 + '@turf/polygon-to-line': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/boolean-disjoint@7.3.5': + dependencies: + '@turf/boolean-point-in-polygon': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/line-intersect': 7.3.5 + '@turf/meta': 7.3.5 + '@turf/polygon-to-line': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/boolean-equal@7.3.5': + dependencies: + '@turf/clean-coords': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + geojson-equality-ts: 1.0.2 + tslib: 2.8.1 + + '@turf/boolean-intersects@7.3.5': + dependencies: + '@turf/boolean-disjoint': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/boolean-overlap@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/line-intersect': 7.3.5 + '@turf/line-overlap': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + geojson-equality-ts: 1.0.2 + tslib: 2.8.1 + + '@turf/boolean-parallel@7.3.5': + dependencies: + '@turf/clean-coords': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/line-segment': 7.3.5 + '@turf/rhumb-bearing': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/boolean-point-in-polygon@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + point-in-polygon-hao: 1.2.4 + tslib: 2.8.1 + + '@turf/boolean-point-on-line@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/boolean-touches@7.3.5': + dependencies: + '@turf/boolean-point-in-polygon': 7.3.5 + '@turf/boolean-point-on-line': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/boolean-valid@7.3.5': + dependencies: + '@turf/bbox': 7.3.5 + '@turf/boolean-crosses': 7.3.5 + '@turf/boolean-disjoint': 7.3.5 + '@turf/boolean-overlap': 7.3.5 + '@turf/boolean-point-in-polygon': 7.3.5 + '@turf/boolean-point-on-line': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/line-intersect': 7.3.5 + '@types/geojson': 7946.0.16 + geojson-polygon-self-intersections: 1.2.2 + tslib: 2.8.1 + + '@turf/boolean-within@7.3.5': + dependencies: + '@turf/bbox': 7.3.5 + '@turf/boolean-point-in-polygon': 7.3.5 + '@turf/boolean-point-on-line': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/line-split': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/buffer@7.3.5': + dependencies: + '@turf/bbox': 7.3.5 + '@turf/center': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/jsts': 2.7.2 + '@turf/meta': 7.3.5 + '@turf/projection': 7.3.5 + '@types/geojson': 7946.0.16 + d3-geo: 1.7.1 + + '@turf/center-mean@7.3.5': + dependencies: + '@turf/bbox': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/center-median@7.3.5': + dependencies: + '@turf/center-mean': 7.3.5 + '@turf/centroid': 7.3.5 + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/center-of-mass@7.3.5': + dependencies: + '@turf/centroid': 7.3.5 + '@turf/convex': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/center@7.3.5': + dependencies: + '@turf/bbox': 7.3.5 + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/centroid@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/circle@7.3.5': + dependencies: + '@turf/destination': 7.3.5 + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/clean-coords@7.3.5': + dependencies: + '@turf/boolean-point-on-line': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/clone@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/clusters-dbscan@7.3.5': + dependencies: + '@turf/clone': 7.3.5 + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + rbush: 3.0.1 + tslib: 2.8.1 + + '@turf/clusters-kmeans@7.3.5': + dependencies: + '@turf/clone': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + skmeans: 0.9.7 + tslib: 2.8.1 + + '@turf/clusters@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/collect@7.3.5': + dependencies: + '@turf/bbox': 7.3.5 + '@turf/boolean-point-in-polygon': 7.3.5 + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + rbush: 3.0.1 + tslib: 2.8.1 + + '@turf/combine@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/concave@7.3.5': + dependencies: + '@turf/clone': 7.3.5 + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@turf/tin': 7.3.5 + '@types/geojson': 7946.0.16 + topojson-client: 3.1.0 + topojson-server: 3.0.1 + tslib: 2.8.1 + + '@turf/convex@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + concaveman: 1.2.1 + tslib: 2.8.1 + + '@turf/destination@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/difference@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + polyclip-ts: 0.16.8 + tslib: 2.8.1 + + '@turf/directional-mean@7.3.5': + dependencies: + '@turf/bearing': 7.3.5 + '@turf/centroid': 7.3.5 + '@turf/destination': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/length': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/dissolve@7.3.5': + dependencies: + '@turf/flatten': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + polyclip-ts: 0.16.8 + tslib: 2.8.1 + + '@turf/distance-weight@7.3.5': + dependencies: + '@turf/centroid': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/distance@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/ellipse@7.3.5': + dependencies: + '@turf/destination': 7.3.5 + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/transform-rotate': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/envelope@7.3.5': + dependencies: + '@turf/bbox': 7.3.5 + '@turf/bbox-polygon': 7.3.5 + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/explode@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/flatten@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/flip@7.3.5': + dependencies: + '@turf/clone': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/geojson-rbush@7.3.5': + dependencies: + '@turf/bbox': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + rbush: 3.0.1 + tslib: 2.8.1 + + '@turf/great-circle@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + arc: 0.2.0 + tslib: 2.8.1 + + '@turf/helpers@7.3.5': + dependencies: + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/hex-grid@7.3.5': + dependencies: + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/intersect': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/interpolate@7.3.5': + dependencies: + '@turf/bbox': 7.3.5 + '@turf/centroid': 7.3.5 + '@turf/clone': 7.3.5 + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/hex-grid': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@turf/point-grid': 7.3.5 + '@turf/square-grid': 7.3.5 + '@turf/triangle-grid': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/intersect@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + polyclip-ts: 0.16.8 + tslib: 2.8.1 + + '@turf/invariant@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/isobands@7.3.5': + dependencies: + '@turf/area': 7.3.5 + '@turf/bbox': 7.3.5 + '@turf/boolean-point-in-polygon': 7.3.5 + '@turf/explode': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/isolines@7.3.5': + dependencies: + '@turf/bbox': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/jsts@2.7.2': + dependencies: + jsts: 2.7.1 + + '@turf/kinks@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/length@7.3.5': + dependencies: + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/line-arc@7.3.5': + dependencies: + '@turf/circle': 7.3.5 + '@turf/destination': 7.3.5 + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/line-chunk@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/length': 7.3.5 + '@turf/line-slice-along': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/line-intersect@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + sweepline-intersections: 1.5.0 + tslib: 2.8.1 + + '@turf/line-offset@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/line-overlap@7.3.5': + dependencies: + '@turf/boolean-point-on-line': 7.3.5 + '@turf/geojson-rbush': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/line-segment': 7.3.5 + '@turf/meta': 7.3.5 + '@turf/nearest-point-on-line': 7.3.5 + '@types/geojson': 7946.0.16 + fast-deep-equal: 3.1.3 + tslib: 2.8.1 + + '@turf/line-segment@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/line-slice-along@7.3.5': + dependencies: + '@turf/bearing': 7.3.5 + '@turf/destination': 7.3.5 + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/line-slice@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/nearest-point-on-line': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/line-split@7.3.5': + dependencies: + '@turf/bbox': 7.3.5 + '@turf/geojson-rbush': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/line-intersect': 7.3.5 + '@turf/line-segment': 7.3.5 + '@turf/meta': 7.3.5 + '@turf/nearest-point-on-line': 7.3.5 + '@turf/truncate': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/line-to-polygon@7.3.5': + dependencies: + '@turf/bbox': 7.3.5 + '@turf/clone': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/mask@7.3.5': + dependencies: + '@turf/clone': 7.3.5 + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + polyclip-ts: 0.16.8 + tslib: 2.8.1 + + '@turf/meta@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/midpoint@7.3.5': + dependencies: + '@turf/bearing': 7.3.5 + '@turf/destination': 7.3.5 + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/moran-index@7.3.5': + dependencies: + '@turf/distance-weight': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/nearest-neighbor-analysis@7.3.5': + dependencies: + '@turf/area': 7.3.5 + '@turf/bbox': 7.3.5 + '@turf/bbox-polygon': 7.3.5 + '@turf/centroid': 7.3.5 + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@turf/nearest-point': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/nearest-point-on-line@7.3.5': + dependencies: + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/nearest-point-to-line@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@turf/point-to-line-distance': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/nearest-point@7.3.5': + dependencies: + '@turf/clone': 7.3.5 + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/planepoint@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/point-grid@7.3.5': + dependencies: + '@turf/boolean-within': 7.3.5 + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/point-on-feature@7.3.5': + dependencies: + '@turf/boolean-point-in-polygon': 7.3.5 + '@turf/center': 7.3.5 + '@turf/explode': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/nearest-point': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/point-to-line-distance@7.3.5': + dependencies: + '@turf/bearing': 7.3.5 + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@turf/nearest-point-on-line': 7.3.5 + '@turf/projection': 7.3.5 + '@turf/rhumb-bearing': 7.3.5 + '@turf/rhumb-distance': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/point-to-polygon-distance@7.3.5': + dependencies: + '@turf/boolean-point-in-polygon': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@turf/point-to-line-distance': 7.3.5 + '@turf/polygon-to-line': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/points-within-polygon@7.3.5': + dependencies: + '@turf/boolean-point-in-polygon': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/polygon-smooth@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/polygon-tangents@7.3.5': + dependencies: + '@turf/bbox': 7.3.5 + '@turf/boolean-within': 7.3.5 + '@turf/explode': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/nearest-point': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/polygon-to-line@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/polygonize@7.3.5': + dependencies: + '@turf/boolean-point-in-polygon': 7.3.5 + '@turf/envelope': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/projection@7.3.5': + dependencies: + '@turf/clone': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/quadrat-analysis@7.3.5': + dependencies: + '@turf/area': 7.3.5 + '@turf/bbox': 7.3.5 + '@turf/bbox-polygon': 7.3.5 + '@turf/centroid': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/point-grid': 7.3.5 + '@turf/random': 7.3.5 + '@turf/square-grid': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/random@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/rectangle-grid@7.3.5': + dependencies: + '@turf/boolean-intersects': 7.3.5 + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/rewind@7.3.5': + dependencies: + '@turf/boolean-clockwise': 7.3.5 + '@turf/clone': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/rhumb-bearing@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/rhumb-destination@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/rhumb-distance@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/sample@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/sector@7.3.5': + dependencies: + '@turf/circle': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/line-arc': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/shortest-path@7.3.5': + dependencies: + '@turf/bbox': 7.3.5 + '@turf/bbox-polygon': 7.3.5 + '@turf/boolean-point-in-polygon': 7.3.5 + '@turf/clean-coords': 7.3.5 + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@turf/transform-scale': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/simplify@7.3.5': + dependencies: + '@turf/clean-coords': 7.3.5 + '@turf/clone': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/square-grid@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/rectangle-grid': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/square@7.3.5': + dependencies: + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/standard-deviational-ellipse@7.3.5': + dependencies: + '@turf/center-mean': 7.3.5 + '@turf/ellipse': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@turf/points-within-polygon': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/tag@7.3.5': + dependencies: + '@turf/boolean-point-in-polygon': 7.3.5 + '@turf/clone': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/tesselate@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + earcut: 2.2.4 + tslib: 2.8.1 + + '@turf/tin@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/transform-rotate@7.3.5': + dependencies: + '@turf/centroid': 7.3.5 + '@turf/clone': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@turf/rhumb-bearing': 7.3.5 + '@turf/rhumb-destination': 7.3.5 + '@turf/rhumb-distance': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/transform-scale@7.3.5': + dependencies: + '@turf/bbox': 7.3.5 + '@turf/center': 7.3.5 + '@turf/centroid': 7.3.5 + '@turf/clone': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@turf/rhumb-bearing': 7.3.5 + '@turf/rhumb-destination': 7.3.5 + '@turf/rhumb-distance': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/transform-translate@7.3.5': + dependencies: + '@turf/clone': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@turf/rhumb-destination': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/triangle-grid@7.3.5': + dependencies: + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/intersect': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/truncate@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/turf@7.3.5': + dependencies: + '@turf/along': 7.3.5 + '@turf/angle': 7.3.5 + '@turf/area': 7.3.5 + '@turf/bbox': 7.3.5 + '@turf/bbox-clip': 7.3.5 + '@turf/bbox-polygon': 7.3.5 + '@turf/bearing': 7.3.5 + '@turf/bezier-spline': 7.3.5 + '@turf/boolean-clockwise': 7.3.5 + '@turf/boolean-concave': 7.3.5 + '@turf/boolean-contains': 7.3.5 + '@turf/boolean-crosses': 7.3.5 + '@turf/boolean-disjoint': 7.3.5 + '@turf/boolean-equal': 7.3.5 + '@turf/boolean-intersects': 7.3.5 + '@turf/boolean-overlap': 7.3.5 + '@turf/boolean-parallel': 7.3.5 + '@turf/boolean-point-in-polygon': 7.3.5 + '@turf/boolean-point-on-line': 7.3.5 + '@turf/boolean-touches': 7.3.5 + '@turf/boolean-valid': 7.3.5 + '@turf/boolean-within': 7.3.5 + '@turf/buffer': 7.3.5 + '@turf/center': 7.3.5 + '@turf/center-mean': 7.3.5 + '@turf/center-median': 7.3.5 + '@turf/center-of-mass': 7.3.5 + '@turf/centroid': 7.3.5 + '@turf/circle': 7.3.5 + '@turf/clean-coords': 7.3.5 + '@turf/clone': 7.3.5 + '@turf/clusters': 7.3.5 + '@turf/clusters-dbscan': 7.3.5 + '@turf/clusters-kmeans': 7.3.5 + '@turf/collect': 7.3.5 + '@turf/combine': 7.3.5 + '@turf/concave': 7.3.5 + '@turf/convex': 7.3.5 + '@turf/destination': 7.3.5 + '@turf/difference': 7.3.5 + '@turf/directional-mean': 7.3.5 + '@turf/dissolve': 7.3.5 + '@turf/distance': 7.3.5 + '@turf/distance-weight': 7.3.5 + '@turf/ellipse': 7.3.5 + '@turf/envelope': 7.3.5 + '@turf/explode': 7.3.5 + '@turf/flatten': 7.3.5 + '@turf/flip': 7.3.5 + '@turf/geojson-rbush': 7.3.5 + '@turf/great-circle': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/hex-grid': 7.3.5 + '@turf/interpolate': 7.3.5 + '@turf/intersect': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/isobands': 7.3.5 + '@turf/isolines': 7.3.5 + '@turf/kinks': 7.3.5 + '@turf/length': 7.3.5 + '@turf/line-arc': 7.3.5 + '@turf/line-chunk': 7.3.5 + '@turf/line-intersect': 7.3.5 + '@turf/line-offset': 7.3.5 + '@turf/line-overlap': 7.3.5 + '@turf/line-segment': 7.3.5 + '@turf/line-slice': 7.3.5 + '@turf/line-slice-along': 7.3.5 + '@turf/line-split': 7.3.5 + '@turf/line-to-polygon': 7.3.5 + '@turf/mask': 7.3.5 + '@turf/meta': 7.3.5 + '@turf/midpoint': 7.3.5 + '@turf/moran-index': 7.3.5 + '@turf/nearest-neighbor-analysis': 7.3.5 + '@turf/nearest-point': 7.3.5 + '@turf/nearest-point-on-line': 7.3.5 + '@turf/nearest-point-to-line': 7.3.5 + '@turf/planepoint': 7.3.5 + '@turf/point-grid': 7.3.5 + '@turf/point-on-feature': 7.3.5 + '@turf/point-to-line-distance': 7.3.5 + '@turf/point-to-polygon-distance': 7.3.5 + '@turf/points-within-polygon': 7.3.5 + '@turf/polygon-smooth': 7.3.5 + '@turf/polygon-tangents': 7.3.5 + '@turf/polygon-to-line': 7.3.5 + '@turf/polygonize': 7.3.5 + '@turf/projection': 7.3.5 + '@turf/quadrat-analysis': 7.3.5 + '@turf/random': 7.3.5 + '@turf/rectangle-grid': 7.3.5 + '@turf/rewind': 7.3.5 + '@turf/rhumb-bearing': 7.3.5 + '@turf/rhumb-destination': 7.3.5 + '@turf/rhumb-distance': 7.3.5 + '@turf/sample': 7.3.5 + '@turf/sector': 7.3.5 + '@turf/shortest-path': 7.3.5 + '@turf/simplify': 7.3.5 + '@turf/square': 7.3.5 + '@turf/square-grid': 7.3.5 + '@turf/standard-deviational-ellipse': 7.3.5 + '@turf/tag': 7.3.5 + '@turf/tesselate': 7.3.5 + '@turf/tin': 7.3.5 + '@turf/transform-rotate': 7.3.5 + '@turf/transform-scale': 7.3.5 + '@turf/transform-translate': 7.3.5 + '@turf/triangle-grid': 7.3.5 + '@turf/truncate': 7.3.5 + '@turf/union': 7.3.5 + '@turf/unkink-polygon': 7.3.5 + '@turf/voronoi': 7.3.5 + '@types/geojson': 7946.0.16 + '@types/kdbush': 3.0.5 + tslib: 2.8.1 + + '@turf/union@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + polyclip-ts: 0.16.8 + tslib: 2.8.1 + + '@turf/unkink-polygon@7.3.5': + dependencies: + '@turf/area': 7.3.5 + '@turf/boolean-point-in-polygon': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + rbush: 3.0.1 + tslib: 2.8.1 + + '@turf/voronoi@7.3.5': + dependencies: + '@turf/clone': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/d3-voronoi': 1.1.12 + '@types/geojson': 7946.0.16 + d3-voronoi: 1.1.2 + tslib: 2.8.1 + '@tweenjs/tween.js@25.0.0': {} + '@types/d3-voronoi@1.1.12': {} + '@types/dom-to-image@2.6.7': {} '@types/estree@1.0.9': {} '@types/event-emitter@0.3.5': {} + '@types/geojson@7946.0.16': {} + '@types/hoist-non-react-statics@3.3.7(@types/react@19.2.17)': dependencies: '@types/react': 19.2.17 @@ -6468,6 +8043,8 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/kdbush@3.0.5': {} + '@types/lodash-es@4.17.12': dependencies: '@types/lodash': 4.17.24 @@ -8600,6 +10177,8 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.2 + arc@0.2.0: {} + archiver-utils@2.1.0: dependencies: glob: 7.2.3 @@ -8760,6 +10339,8 @@ snapshots: big.js@5.2.2: {} + bignumber.js@9.3.1: {} + binary-extensions@2.3.0: {} binary@0.3.0: @@ -8994,6 +10575,13 @@ snapshots: concat-map@0.0.1: {} + concaveman@1.2.1: + dependencies: + point-in-polygon: 1.1.0 + rbush: 3.0.1 + robust-predicates: 2.0.4 + tinyqueue: 2.0.3 + conventional-changelog-angular@5.0.13: dependencies: compare-func: 2.0.0 @@ -9089,6 +10677,14 @@ snapshots: csstype@3.2.3: {} + d3-array@1.2.4: {} + + d3-geo@1.7.1: + dependencies: + d3-array: 1.2.4 + + d3-voronoi@1.1.2: {} + d@1.0.2: dependencies: es5-ext: 0.10.64 @@ -9260,6 +10856,8 @@ snapshots: dependencies: readable-stream: 2.3.8 + earcut@2.2.4: {} + earcut@3.0.2: {} echarts-wordcloud@2.1.0(echarts@5.6.0): @@ -9781,6 +11379,14 @@ snapshots: generator-function@2.0.1: {} + geojson-equality-ts@1.0.2: + dependencies: + '@types/geojson': 7946.0.16 + + geojson-polygon-self-intersections@1.2.2: + dependencies: + rbush: 2.0.2 + geotiff@3.0.5: dependencies: '@petamoriken/float16': 3.9.3 @@ -10243,6 +11849,8 @@ snapshots: jsonparse@1.3.1: {} + jsts@2.7.1: {} + jszip@3.10.1: dependencies: lie: 3.3.0 @@ -10774,6 +12382,17 @@ snapshots: dependencies: '@babel/runtime': 7.29.2 + point-in-polygon-hao@1.2.4: + dependencies: + robust-predicates: 3.0.3 + + point-in-polygon@1.1.0: {} + + polyclip-ts@0.16.8: + dependencies: + bignumber.js: 9.3.1 + splaytree-ts: 1.0.2 + posix-character-classes@0.1.1: {} possible-typed-array-names@1.1.0: {} @@ -10898,12 +12517,24 @@ snapshots: quick-lru@6.1.2: {} + quickselect@1.1.1: {} + + quickselect@2.0.0: {} + quickselect@3.0.0: {} raf-schd@4.0.3: {} range-parser@1.2.1: {} + rbush@2.0.2: + dependencies: + quickselect: 1.1.1 + + rbush@3.0.1: + dependencies: + quickselect: 2.0.0 + rbush@4.0.1: dependencies: quickselect: 3.0.0 @@ -11197,6 +12828,10 @@ snapshots: dependencies: glob: 7.2.3 + robust-predicates@2.0.4: {} + + robust-predicates@3.0.3: {} + rollup-plugin-external-globals@0.6.1(rollup@3.30.0): dependencies: '@rollup/pluginutils': 4.2.1 @@ -11382,6 +13017,8 @@ snapshots: signal-exit@3.0.7: {} + skmeans@0.9.7: {} + slash@3.0.0: {} slate-history@0.66.0(slate@0.72.8): @@ -11461,6 +13098,8 @@ snapshots: spdx-license-ids@3.0.23: {} + splaytree-ts@1.0.2: {} + split-string@3.1.0: dependencies: extend-shallow: 3.0.2 @@ -11596,6 +13235,10 @@ snapshots: sax: 1.6.0 stable: 0.1.8 + sweepline-intersections@1.5.0: + dependencies: + tinyqueue: 2.0.3 + tailwind-merge@2.6.0: {} tailwindcss@3.4.19: @@ -11665,6 +13308,8 @@ snapshots: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 + tinyqueue@2.0.3: {} + tmp@0.2.7: {} to-object-path@0.3.0: @@ -11693,6 +13338,10 @@ snapshots: dependencies: commander: 2.20.3 + topojson-server@3.0.1: + dependencies: + commander: 2.20.3 + traverse@0.3.9: {} traverse@0.6.11: diff --git a/frontend/src/components/gis/map.cesium.ts b/frontend/src/components/gis/map.cesium.ts index afcf34a7..73ae8be7 100644 --- a/frontend/src/components/gis/map.cesium.ts +++ b/frontend/src/components/gis/map.cesium.ts @@ -9,9 +9,18 @@ import { } from '@/utils/popupHtmlGenerator'; import { useModelStore } from '@/store/modules/model'; import { getNearbyPointDensityDisplayRules } from '@/modules/map/domain/nearby-point-rules'; +import { + LoadOSGB, + removeQxsy, + osgbChangeClick, + osgbLocation, + type OSGBItem +} from './osgbUtils'; export class MapCesium implements MapInterface { private viewer: Cesium.Viewer | null = null; + private _ready = false; + private _pendingOSGBItems: OSGBItem[] = []; private clickEventHandler: Cesium.ScreenSpaceEventHandler | null = null; private popupElement: HTMLElement | null = null; private hoveredEntityId: string | null = null; @@ -100,6 +109,7 @@ export class MapCesium implements MapInterface { this.containerId = container.id; this.containerElement = container; this.showLoadingOverlay(container); + const token = 'bearer fa8aa37c-1e52-4631-a699-625b4147ace8'; this.viewer = new Cesium.Viewer(container, { animation: false, @@ -114,35 +124,33 @@ export class MapCesium implements MapInterface { infoBox: false, selectionIndicator: false, shouldAnimate: true, - requestRenderMode: true, + requestRenderMode: false, targetFrameRate: 30, - terrainProvider: new Cesium.EllipsoidTerrainProvider() + terrainProvider: new Cesium.EllipsoidTerrainProvider() // 默认不使用地形 }); - this.viewer.cesiumWidget.creditContainer.style.display = 'none'; const layers = this.viewer.imageryLayers; layers.removeAll(); - const arcgisUrl = - 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/'; - - // const provider = await Cesium.ArcGisMapServerImageryProvider.fromUrl( - // arcgisUrl, - // { - // enablePickFeatures: false, - // maximumLevel: 19 - // } - // ); const provider = new Cesium.UrlTemplateImageryProvider({ url: 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', maximumLevel: 19, credit: 'Esri, DigitalGlobe, GeoEye, i-cubed, USDA FSA, USGS, AEX, Getmapping, Aerogrid, IGN, IGP, swisstopo, and the GIS User Community' }); + const customTerrain = await Cesium.CesiumTerrainProvider.fromUrl( + import.meta.env.VITE_APP_MAP_URL + '/Terrain?token=' + token, // 指向包含 layer.json 的目录 + { + requestVertexNormals: true + } + ); + + // 应用地形到Viewer + this.viewer.terrainProvider = customTerrain; this.imageryBaseLayer = layers.addImageryProvider(provider); this.imageryBaseLayer.show = true; - this.viewer.scene.globe.depthTestAgainstTerrain = false; + this.viewer.scene.globe.depthTestAgainstTerrain = true; this.viewer.scene.globe.show = true; this.viewer.scene.fog.enabled = false; this.viewer.scene.fxaa = false; @@ -153,7 +161,14 @@ export class MapCesium implements MapInterface { this.setupClickHandler(); this.setupCameraPopupReset(); + this._ready = true; console.log('[Cesium] init complete, viewer ready'); + + // 初始化完成后等 5 秒再加载倾斜摄影,确保渲染管线稳定 + setTimeout(() => { + this.flushPendingOSGB(); + }, 5000); + return this.viewer; } catch (error) { this.hideLoadingOverlay(); @@ -525,10 +540,40 @@ export class MapCesium implements MapInterface { this.popupElement.innerHTML = ''; } + /** 判断 3D 位置是否被地形遮挡(基于射线与 terrain 求交) */ + private isPositionBehindTerrain(position: Cesium.Cartesian3): boolean { + if (!this.viewer) return true; + const scene = this.viewer.scene; + + const windowCoord = Cesium.SceneTransforms.worldToWindowCoordinates( + scene, + position + ); + if (!windowCoord) return true; // 在地球背面 + + const ray = scene.camera.getPickRay(windowCoord); + if (!ray) return false; + + const terrainPos = scene.globe.pick(ray, scene); + if (!terrainPos) return false; // 该方向无地形 + + const cameraPos = scene.camera.positionWC; + const terrainDist = Cesium.Cartesian3.distance(cameraPos, terrainPos); + const entityDist = Cesium.Cartesian3.distance(cameraPos, position); + // 地形交点明显更近 → 实体被遮挡 + return terrainDist + 10 < entityDist; + } + /** 根据实体世界坐标把 popup 定位到屏幕坐标 */ private updatePopupPosition(position: Cesium.Cartesian3): void { if (!this.viewer || !this.popupElement) return; + // 被地形遮挡时隐藏 popup + if (this.isPositionBehindTerrain(position)) { + this.hidePopup(); + return; + } + const canvasPosition = Cesium.SceneTransforms.worldToWindowCoordinates( this.viewer.scene, position @@ -640,6 +685,9 @@ export class MapCesium implements MapInterface { ) return; + // 被地形遮挡的不展示 popup + if (this.isPositionBehindTerrain(position)) return; + const rawData: Record = { ...((entity as any)._rawData || {}) }; @@ -1058,6 +1106,8 @@ export class MapCesium implements MapInterface { // 取消飞行超时和加载动画 this.clearFlightFallbackTimer(); this.hideLoadingOverlay(); + this._ready = false; + this._pendingOSGBItems = []; // 批量 popup 和 hover popup this.isBatchPopupMode = false; @@ -1565,7 +1615,7 @@ export class MapCesium implements MapInterface { verticalOrigin: Cesium.VerticalOrigin.CENTER, horizontalOrigin: Cesium.HorizontalOrigin.CENTER, scaleByDistance: new Cesium.NearFarScalar(1.0e3, 1.5, 2.0e7, 0.8), - disableDepthTestDistance: Number.POSITIVE_INFINITY + heightReference: Cesium.HeightReference.CLAMP_TO_GROUND } as any, label: { text: labelText || undefined, @@ -1578,7 +1628,7 @@ export class MapCesium implements MapInterface { pixelOffset: dynamicLabelOffset as any, horizontalOrigin: Cesium.HorizontalOrigin.CENTER, scaleByDistance: new Cesium.NearFarScalar(1.0e3, 1.2, 2.0e7, 0.8), - disableDepthTestDistance: Number.POSITIVE_INFINITY + heightReference: Cesium.HeightReference.CLAMP_TO_GROUND } as any, properties: { ...item, @@ -2703,4 +2753,57 @@ export class MapCesium implements MapInterface { left.top - padding > right.bottom ); } + + // ==================== 倾斜摄影(OSGB) ==================== + + /** + * 加载倾斜摄影 3D Tileset 模型 + * 如果 viewer 尚未就绪,暂存到队列中,等 5 秒后批量加载 + */ + addQxsyLayer(item: OSGBItem): void { + if (!this.viewer || !this._ready) { + // 未就绪:放入等待队列 + if (!this._pendingOSGBItems.includes(item)) { + this._pendingOSGBItems.push(item); + } + return; + } + LoadOSGB(this.viewer, item); + } + + /** + * 批量加载所有等待中的倾斜摄影 + */ + private flushPendingOSGB(): void { + if (!this.viewer || this.viewer.isDestroyed()) return; + const items = this._pendingOSGBItems.splice(0); + console.log(`[Cesium] 开始加载 ${items.length} 个待加载的倾斜摄影模型`); + items.forEach(item => LoadOSGB(this.viewer!, item)); + } + + /** + * 移除倾斜摄影模型 + */ + removeQxsyLayer(item: OSGBItem): void { + if (!this.viewer) return; + // 从待加载队列中移除,防止已被移除的模型在 flushPendingOSGB 时又被加载 + this._pendingOSGBItems = this._pendingOSGBItems.filter(i => i !== item); + removeQxsy(this.viewer, item); + } + + /** + * 倾斜摄影显隐切换 + */ + qxsyChangeClick(item: OSGBItem, checked: boolean): void { + if (!this.viewer) return; + osgbChangeClick(this.viewer, item, checked); + } + + /** + * 飞行定位到倾斜摄影模型 + */ + qxsyToPosition(item: OSGBItem): void { + if (!this.viewer) return; + osgbLocation(this.viewer, item); + } } diff --git a/frontend/src/components/gis/map.class.ts b/frontend/src/components/gis/map.class.ts index 5758848c..ea1e450d 100644 --- a/frontend/src/components/gis/map.class.ts +++ b/frontend/src/components/gis/map.class.ts @@ -276,4 +276,22 @@ export class MapClass implements MapClassInterface { getCurrentZoom(): number | undefined { return this.service.getCurrentZoom(); } + + // ==================== 倾斜摄影 ==================== + + addQxsyLayer(item: any): void { + this.service.addQxsyLayer?.(item); + } + + removeQxsyLayer(item: any): void { + this.service.removeQxsyLayer?.(item); + } + + qxsyChangeClick(item: any, checked: boolean): void { + this.service.qxsyChangeClick?.(item, checked); + } + + qxsyToPosition(item: any): void { + this.service.qxsyToPosition?.(item); + } } diff --git a/frontend/src/components/gis/map.d.ts b/frontend/src/components/gis/map.d.ts index 24cb929b..9d04a2dd 100644 --- a/frontend/src/components/gis/map.d.ts +++ b/frontend/src/components/gis/map.d.ts @@ -130,35 +130,26 @@ export interface MapInterface { * 2D 直接返回原生 zoom,3D 由相机高度换算后返回 */ getCurrentZoom(): number | undefined; - // /** - // * 加载倾斜摄影数据 - // * @param HH3DUrlArray - // */ - // addQxsyLayer(HH3DUrlArray: siteItem): void - // /** - // * 移除倾斜摄影数据 - // * @param HH3DUrlArray - // */ - // removeQxsyLayer(HH3DUrlArray: siteItem): void + /** + * 加载倾斜摄影数据 + */ + addQxsyLayer(item: any): void; - // /** - // * 倾斜摄影定位 - // * @param HH3DUrlArray - // */ - // qxsyToPosition(HH3DUrlArray: siteItem): void + /** + * 移除倾斜摄影数据 + */ + removeQxsyLayer(item: any): void; - // /** - // * 倾斜摄影裁剪 - // * @param HH3DUrlArray - // */ - // qxsyClipBoundary(HH3DUrlArray: siteItem): void + /** + * 倾斜摄影显隐切换 + */ + qxsyChangeClick(item: any, checked: boolean): void; - // /** - // * 移除倾斜摄影裁剪 - // * @param HH3DUrlArray - // */ - // removeQxsyClipBoundary(HH3DUrlArray: siteItem): void + /** + * 倾斜摄影定位 + */ + qxsyToPosition(item: any): void; /** * 基地面板控制 diff --git a/frontend/src/components/gis/map.ol.ts b/frontend/src/components/gis/map.ol.ts index 209f6ff0..61b66db6 100644 --- a/frontend/src/components/gis/map.ol.ts +++ b/frontend/src/components/gis/map.ol.ts @@ -2607,4 +2607,10 @@ export class MapOl implements MapInterface { this.geoJsonData = null; this.geoJsonData1 = null; } + + // 倾斜摄影方法仅3D支持,2D为空实现 + addQxsyLayer(_item: any): void {} + removeQxsyLayer(_item: any): void {} + qxsyChangeClick(_item: any, _checked: boolean): void {} + qxsyToPosition(_item: any): void {} } diff --git a/frontend/src/components/gis/osgbUtils.ts b/frontend/src/components/gis/osgbUtils.ts new file mode 100644 index 00000000..5f4abea8 --- /dev/null +++ b/frontend/src/components/gis/osgbUtils.ts @@ -0,0 +1,747 @@ +/** + * 倾斜摄影(OSGB)工具函数 + * 适配自旧项目 osgbTool.ts,核心逻辑保持一致 + * + * 使用字段: url, boundary, location, height, accuracy + */ +import * as turf from '@turf/turf'; +import * as Cesium from 'cesium'; +import { getToken } from '@/utils/auth'; + +// ==================== 类型定义 ==================== + +export interface OSGBLocation { + destination: number[]; // [x, y, z] 或 [lng, lat, height] + orientation: { + heading: number; + pitch: number; + roll: number; + }; + center: number[]; +} + +export interface OSGBItem { + /** 3D Tileset 服务地址 */ + url: string; + /** GeoJSON Polygon 边界(用于裁切) */ + boundary?: any; + /** 定位信息 */ + location?: OSGBLocation | string; + /** 模型高度偏移 */ + height?: number; + /** 屏幕空间误差 (默认 16) */ + accuracy?: number; + /** 内部状态 - 不要手动设置 */ + osgbtitles?: any; + cartesian3?: any; + clippingPlanes?: any; + eventListener?: any; + _loading?: boolean; + _loadId?: number; + /** 用户手动关闭开关标志:为 true 时不自动加载/显示,只做显隐切换 */ + _switchOff?: boolean; +} + +// ==================== 内部状态(每个 OSGB 实例独立) ==================== + +interface OSGBInstanceState { + destination: Cesium.Cartesian3 | null; + orientation: any; + timelookat: any; + time: number; + num: number; + witetime: number; + timeout: any; +} + +const instanceStates = new WeakMap(); + +function getState(obj: OSGBItem): OSGBInstanceState { + let state = instanceStates.get(obj); + if (!state) { + state = { + destination: null, + orientation: null, + timelookat: null, + time: 0, + num: 0, + witetime: 0, + timeout: undefined + }; + instanceStates.set(obj, state); + } + return state; +} + +function clearState(obj: OSGBItem) { + const state = instanceStates.get(obj); + if (state) { + clearTimeout(state.timeout); + clearInterval(state.timelookat); + } + instanceStates.delete(obj); +} + +// ==================== 3D Tileset 场景管理 ==================== + +/** + * 将 tileset 添加到场景 + */ +const addOSGB = (viewer: Cesium.Viewer, tileset: Cesium.Cesium3DTileset) => { + if (!viewer || viewer.isDestroyed()) return; + viewer.scene.primitives.add(tileset); +}; + +/** + * 从场景移除 tileset(PrimitiveCollection.remove 默认 destroy=true,会销毁 tileset) + */ +const removeOSGB = (viewer: Cesium.Viewer, tileset: Cesium.Cesium3DTileset) => { + if (!viewer || viewer.isDestroyed()) return; + viewer.scene.primitives.remove(tileset); +}; + +// ==================== 裁切相关 ==================== + +/** + * 规范化 GeoJSON 输入,提取纯 Geometry + * 兼容 Feature / FeatureCollection / Geometry + */ +const normalizeGeometry = (geo: any): any => { + if (!geo) return null; + // 已经是 Geometry 类型(有 type 且 coordinates) + if (geo.type && geo.coordinates) return geo; + // Feature → 提取 geometry + if (geo.type === 'Feature' && geo.geometry) return geo.geometry; + // FeatureCollection → 取第一个 feature 的 geometry + if (geo.type === 'FeatureCollection' && geo.features?.length) { + return normalizeGeometry(geo.features[0]); + } + return null; +}; + +const get_verts_core = (poly: any): Cesium.Cartesian3[] => { + const verts_carte3: Cesium.Cartesian3[] = []; + if (!poly) return verts_carte3; + + try { + // 规范化输入:兼容 Feature / FeatureCollection / Geometry + const geom = normalizeGeometry(poly); + if (!geom) return verts_carte3; + + let verts = turf.coordAll(geom); + const clockwiseRing = turf.booleanClockwise(turf.lineString(verts)); + if (clockwiseRing) { + verts = verts.reverse(); + } + for (let i = 0; i < verts.length - 1; i++) { + const vert = verts[i]; + verts_carte3.push(Cesium.Cartesian3.fromDegrees(vert[0], vert[1])); + } + } catch (e) { + console.warn('get_verts_core 解析 boundary 失败:', e); + } + return verts_carte3; +}; + +const get_clipping_planes = ( + points: Cesium.Cartesian3[] +): Cesium.ClippingPlane[] => { + const pointsLength = points.length; + const clippingPlanes: Cesium.ClippingPlane[] = []; + + for (let i = 0; i < pointsLength; ++i) { + const nextIndex = (i + 1) % pointsLength; + let midpoint = Cesium.Cartesian3.add( + points[i], + points[nextIndex], + new Cesium.Cartesian3() + ); + midpoint = Cesium.Cartesian3.multiplyByScalar(midpoint, 0.5, midpoint); + + const up = Cesium.Cartesian3.normalize(midpoint, new Cesium.Cartesian3()); + let right = Cesium.Cartesian3.subtract( + points[nextIndex], + midpoint, + new Cesium.Cartesian3() + ); + right = Cesium.Cartesian3.normalize(right, right); + + let normal = Cesium.Cartesian3.cross(right, up, new Cesium.Cartesian3()); + normal = Cesium.Cartesian3.normalize(normal, normal); + + const originCenteredPlane = new Cesium.Plane(normal, 0.0); + const distance = Cesium.Plane.getPointDistance( + originCenteredPlane, + midpoint + ); + + clippingPlanes.push(new Cesium.ClippingPlane(normal, distance)); + } + + return clippingPlanes; +}; + +const clipping_terrain = ( + viewer: Cesium.Viewer, + clippingPlanes: Cesium.ClippingPlane[] +) => { + const globe = viewer.scene.globe; + globe.clippingPlanes = new Cesium.ClippingPlaneCollection({ + planes: clippingPlanes, + edgeWidth: 0, + edgeColor: Cesium.Color.GREEN, + enabled: true + }); + globe.backFaceCulling = true; + globe.showSkirts = true; +}; + +const clipping_3dtiles = ( + clippingPlanes: Cesium.ClippingPlane[], + tileset: Cesium.Cesium3DTileset +) => { + // Cesium 1.141: root.transform 是内部属性,安全访问 + const rootTransform = (tileset as any)?.root?.transform; + if (!rootTransform) return; + const invtrans = Cesium.Matrix4.inverse(rootTransform, new Cesium.Matrix4()); + for (let i = 0; i < clippingPlanes.length; i++) { + clippingPlanes[i] = Cesium.Plane.transform(clippingPlanes[i], invtrans); + } + tileset.clippingPlanes = new Cesium.ClippingPlaneCollection({ + planes: clippingPlanes, + unionClippingRegions: true, + edgeWidth: 0, + edgeColor: Cesium.Color.RED, + enabled: false + }); +}; + +const Clip3DTile = (boundary: any, tileset: Cesium.Cesium3DTileset) => { + try { + const geom = normalizeGeometry(boundary); + if (!geom) return; + const buffered = turf.buffer(geom, 10, { units: 'meters' }); + const verts_core = get_verts_core(buffered).reverse(); + if (!verts_core.length) return; + const planes = get_clipping_planes(verts_core); + clipping_3dtiles(planes, tileset); + } catch (e) { + console.warn('Clip3DTile 裁切失败:', e); + } +}; + +const ClipTerrain = (viewer: Cesium.Viewer, osgbObj: OSGBItem) => { + // Cesium 1.141: 安全访问 clippingPlanes 内部属性 _planes + const existingPlanes = (viewer.scene.globe.clippingPlanes as any)?._planes; + if ( + !osgbObj.clippingPlanes || + (existingPlanes && + !compareClippingPlanes(osgbObj.clippingPlanes, existingPlanes)) + ) { + const verts_core = get_verts_core(osgbObj.boundary); + if (!verts_core.length) return; + const planes = get_clipping_planes(verts_core); + clipping_terrain(viewer, planes); + osgbObj.clippingPlanes = planes; + } +}; + +const removeClip = (viewer: Cesium.Viewer, osgbObj: OSGBItem) => { + if (osgbObj.clippingPlanes) { + removeClippingPlanes(viewer); + osgbObj.clippingPlanes = undefined; + } +}; + +const removeClippingPlanes = (viewer: Cesium.Viewer) => { + if (!Cesium.defined(viewer) || viewer.isDestroyed()) { + return; + } + if (Cesium.defined(viewer.scene.globe.clippingPlanes)) { + viewer.scene.globe.clippingPlanes.removeAll(); + } +}; + +const compareClippingPlanes = (planes1: any, planes2: any): boolean => { + let result = true; + if (planes1.length === planes2?.length) { + for (let index = 0; index < planes1.length; index++) { + if (planes1[index]._distance !== planes2[index]._distance) { + result = false; + break; + } + } + } else { + result = false; + } + return result; +}; + +const getMinDistanceOfOSGB = (viewer: Cesium.Viewer): number => { + let result = Infinity; + const length = viewer.scene.primitives.length; + for (let i = 0; i < length; i++) { + const p = viewer.scene.primitives.get(i); + // Cesium 1.141: _url 和 _distanceToCamera 是内部属性,安全访问 + // eslint-disable-next-line @typescript-eslint/no-explicit-any + if ((p as any)?._url) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const d = (p as any)?.root?._distanceToCamera; + if (d != null && d < result) result = d; + } + } + return result; +}; + +// ==================== 动态显隐 ==================== + +const dynamicSetVisible = (viewer: Cesium.Viewer, osgbObj: OSGBItem) => { + if (!Cesium.defined(viewer) || viewer.isDestroyed()) return; + if (!Cesium.defined(osgbObj?.cartesian3)) return; + + let cameraPosition: Cesium.Cartesian3 | undefined; + if (viewer.trackedEntity) { + cameraPosition = viewer.trackedEntity.position?.getValue( + viewer.clock.currentTime + ); + } + if (!cameraPosition) { + cameraPosition = viewer.camera.position.clone(); + } + + const distance = Cesium.Cartesian3.distance( + osgbObj.cartesian3, + cameraPosition + ); + + if (distance < 12000) { + // 用户手动关闭了开关 → 不自动加载 + if (osgbObj._switchOff) return; + + // 匹配旧代码逻辑:osgbObj.osgbtitles 同步设置为 nonClassificationTileset 防重入 + // 新代码用 _loading + _loadId 实现同样的效果(因为 fromUrl 是异步的) + if (!osgbObj.osgbtitles && !osgbObj._loading) { + osgbObj._loading = true; + osgbObj._loadId = (osgbObj._loadId || 0) + 1; + const loadId = osgbObj._loadId; + + const url = osgbObj.url.includes('?') + ? osgbObj.url + `&token=${getToken()}` + : osgbObj.url + `?token=${getToken()}`; + Cesium.Cesium3DTileset.fromUrl(url, { + maximumScreenSpaceError: Number(osgbObj?.accuracy) || 16, + show: true, + maximumMemoryUsage: 128 + }) + .then((tileset: Cesium.Cesium3DTileset) => { + // 竞态保护:版本号变了(removeQxsy 被调用或新一轮加载开始)→ 销毁退出 + if ( + osgbObj._loadId !== loadId || + !Cesium.defined(viewer) || + viewer.isDestroyed() + ) { + tileset.destroy(); + return; + } + osgbObj._loading = false; + if (!Cesium.defined(tileset)) return; + tileset.maximumScreenSpaceError = 32; + + // height 向上偏移:模型几何自带高程,height 只是微调(如 44m) + if (osgbObj.height != 0) { + const bs = Cesium.Cartographic.fromCartesian( + tileset.boundingSphere.center + ); + const surface = Cesium.Cartesian3.fromRadians( + bs.longitude, + bs.latitude, + 0.0 + ); + const offset = Cesium.Cartesian3.fromRadians( + bs.longitude, + bs.latitude, + osgbObj.height + ); + const translation = Cesium.Cartesian3.subtract( + offset, + surface, + new Cesium.Cartesian3() + ); + tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation); + } + + addOSGB(viewer, tileset); + osgbObj.osgbtitles = tileset; + }) + .catch((e: Error) => { + osgbObj._loading = false; + console.log('dynamicSetVisible 加载倾斜摄影报错', e); + }); + } + } else if (distance > 13000) { + // 匹配旧代码逻辑:镜头拉远 → 销毁 tileset 释放内存 + if (osgbObj.osgbtitles) { + removeOSGB(viewer, osgbObj.osgbtitles); + osgbObj.osgbtitles = undefined; + } + // 不重置 _switchOff,开关状态由用户手动控制,不受距离影响 + } +}; + +// ==================== 地形动态裁切 ==================== + +const dynamicClipTerrain = (viewer: Cesium.Viewer, osgbObj: OSGBItem) => { + if (!osgbObj?.osgbtitles) { + removeClip(viewer, osgbObj); + return; + } + + // Cesium 1.141: root 和 _distanceToCamera 是内部属性,安全访问 + const root = (osgbObj.osgbtitles as any)?.root; + if (!Cesium.defined(root)) { + removeClip(viewer, osgbObj); + if (osgbObj.osgbtitles?.clippingPlanes?.enabled) { + osgbObj.osgbtitles.clippingPlanes.enabled = false; + } + return; + } + + if (!osgbObj?.osgbtitles?.show) { + removeClip(viewer, osgbObj); + if (osgbObj.osgbtitles?.clippingPlanes?.enabled) { + osgbObj.osgbtitles.clippingPlanes.enabled = false; + } + return; + } + + const distance = root._distanceToCamera; + const tilesLoaded = osgbObj.osgbtitles.tilesLoaded; + if (osgbObj.boundary && tilesLoaded) { + if (distance != null && getMinDistanceOfOSGB(viewer) === distance) { + ClipTerrain(viewer, osgbObj); + if ( + osgbObj.osgbtitles?.clippingPlanes && + !osgbObj.osgbtitles.clippingPlanes.enabled + ) { + osgbObj.osgbtitles.clippingPlanes.enabled = true; + } + } else { + removeClip(viewer, osgbObj); + if (osgbObj.osgbtitles?.clippingPlanes?.enabled) { + osgbObj.osgbtitles.clippingPlanes.enabled = false; + } + } + } +}; + +// ==================== 公开 API ==================== + +/** + * 加载倾斜摄影 3D Tileset 模型 + * + * Cesium 1.141 中必须使用 Cesium3DTileset.fromUrl() 静态方法, + * new Cesium3DTileset({url}) 不会触发网络请求。 + */ +export const LoadOSGB = (viewer: Cesium.Viewer, osgbObj: OSGBItem) => { + if (!osgbObj.url) return; + + // 已加载则跳过 + if (osgbObj.osgbtitles && !osgbObj.osgbtitles.isDestroyed?.()) return; + + // 正在加载中也跳过(防止重复调用 fromUrl) + if (osgbObj._loading) return; + osgbObj._loading = true; + + // 自增版本号:每次 LoadOSGB 都 +1,.then() 里靠版本号判断是否已失效 + osgbObj._loadId = (osgbObj._loadId || 0) + 1; + const loadId = osgbObj._loadId; + + const url = osgbObj.url.includes('?') + ? osgbObj.url + `&token=${getToken()}` + : osgbObj.url + `?token=${getToken()}`; + + Cesium.Cesium3DTileset.fromUrl(url, { + maximumScreenSpaceError: Number(osgbObj?.accuracy) || 16, + show: true, + maximumMemoryUsage: 128 + }) + .then((tileset: Cesium.Cesium3DTileset) => { + // 竞态保护:版本号变了 → 销毁退出 + if ( + osgbObj._loadId !== loadId || + !Cesium.defined(viewer) || + viewer.isDestroyed() + ) { + tileset.destroy(); + return; + } + if (!Cesium.defined(tileset)) return; + + osgbObj._loading = false; + tileset.maximumScreenSpaceError = 32; + + // height 向上偏移:模型几何自带高程,height 只是微调(如 44m) + if (osgbObj.height != 0) { + const bs = Cesium.Cartographic.fromCartesian( + tileset.boundingSphere.center + ); + const surface = Cesium.Cartesian3.fromRadians( + bs.longitude, + bs.latitude, + 0.0 + ); + const offset = Cesium.Cartesian3.fromRadians( + bs.longitude, + bs.latitude, + osgbObj.height + ); + const translation = Cesium.Cartesian3.subtract( + offset, + surface, + new Cesium.Cartesian3() + ); + tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation); + } + + // 加入场景(匹配旧代码 readyPromise 中 addOSGB) + addOSGB(viewer, tileset); + osgbObj.osgbtitles = tileset; + + // 始终设置 cartesian3,保证 dynamicSetVisible 能计算距离 + osgbObj.cartesian3 = tileset.boundingSphere.center.clone(); + + // boundary 裁切(匹配旧代码 readyPromise 中处理) + if (osgbObj.boundary) { + if (typeof osgbObj.boundary === 'string') { + osgbObj.boundary = JSON.parse(osgbObj.boundary); + } + Clip3DTile(osgbObj.boundary, tileset); + } + + // 注册 postRender 动态显隐(300ms 节流,匹配旧代码 throttle) + let lastTime = 0; + osgbObj.eventListener = viewer.scene.postRender.addEventListener(() => { + if (!Cesium.defined(viewer) || viewer.isDestroyed()) return; + const now = performance.now(); + if (now - lastTime < 300) return; + lastTime = now; + + if (!getState(osgbObj).timelookat) { + dynamicSetVisible(viewer, osgbObj); + } + dynamicClipTerrain(viewer, osgbObj); + }); + }) + .catch((e: Error) => { + osgbObj._loading = false; + console.log('加载倾斜摄影报错', e); + }); +}; + +/** + * 卸载倾斜摄影模型(完全移除) + * 仅在切换 2D 等场景调用,平时开关节用 osgbChangeClick 做显隐 + * 匹配旧代码 removeqxsy(osgbTool.ts:233-244):不清理 cartesian3 + */ +export const removeQxsy = (viewer: Cesium.Viewer, osgbObj: OSGBItem) => { + // 递增版本号:使所有进行中的 fromUrl().then() 失效 + osgbObj._loadId = (osgbObj._loadId || 0) + 1; + removeClippingPlanes(viewer); + osgbObj.clippingPlanes = undefined; + osgbObj._loading = false; + osgbObj._switchOff = undefined; + + if (typeof osgbObj.eventListener === 'function') { + osgbObj.eventListener(); + osgbObj.eventListener = undefined; + } + + if (osgbObj.osgbtitles) { + removeOSGB(viewer, osgbObj.osgbtitles); + osgbObj.osgbtitles = undefined; + } + // 注意:不清理 cartesian3,匹配旧代码行为 +}; + +/** + * 倾斜摄影显隐切换 + * - 开关状态全局记录,不受距离影响 + * - 12km 以内:执行实际的显隐/加载操作 + * - 12km 以外:仅记录状态,不做 tileset 操作(tileset 不存在或已销毁) + * - 仅切换 2D 时才通过 removeQxsy 真正销毁 + */ +export const osgbChangeClick = ( + viewer: Cesium.Viewer, + osgbObj: OSGBItem, + checked: boolean +) => { + // 先记录开关状态(无论距离远近) + osgbObj._switchOff = !checked; + + // 12km 以外:只记状态不操作 tileset(此时 tileset 可能不存在或已销毁) + if (osgbObj.cartesian3) { + const cameraPosition = viewer.camera.position.clone(); + const distance = Cesium.Cartesian3.distance( + osgbObj.cartesian3, + cameraPosition + ); + if (distance >= 12000) return; + } + + if (checked) { + // 开关 ON:已有未销毁的 tileset → 直接显示;否则加载 + if (osgbObj.osgbtitles && !osgbObj.osgbtitles.isDestroyed?.()) { + osgbObj.osgbtitles.show = true; + } else { + LoadOSGB(viewer, osgbObj); + } + } else { + // 开关 OFF:隐藏 tileset,移除 terrain 裁切 + if (osgbObj.osgbtitles && !osgbObj.osgbtitles.isDestroyed?.()) { + osgbObj.osgbtitles.show = false; + } + removeClip(viewer, osgbObj); + } +}; + +/** + * 解析 location 字段为结构化定位信息 + */ +const parseLocation = (location: any): OSGBLocation | null => { + if (!location) return null; + + // 如果已经是对象,直接用 + if (typeof location === 'object' && location.destination) { + return location as OSGBLocation; + } + + // 如果是字符串,尝试解析 + if (typeof location === 'string') { + try { + const jsonString = location.replace(/\n/g, ''); + const startIndex = jsonString.indexOf('{'); + const endIndex = jsonString.lastIndexOf('}'); + if (startIndex === -1 || endIndex === -1) return null; + const extractedData = jsonString.substring(startIndex, endIndex + 1); + const parsed = eval('(' + extractedData + ')'); + return { + destination: parsed.destination, + orientation: parsed.orientation, + center: parsed.center + }; + } catch { + return null; + } + } + + return null; +}; + +/** + * 飞行定位到倾斜摄影模型 + * 包含 flyTo + 到达后旋转动画 + */ +export const osgbLocation = (viewer: Cesium.Viewer, osgbObj: OSGBItem) => { + const state = getState(osgbObj); + + clearTimeout(state.timeout); + state.num = 0; + state.time = 0; + state.witetime = 0; + + viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY); + + let center = Cesium.Cartesian3.fromDegrees( + 100.271729604817, + 35.3107902811941, + 2800 + ); + let heading = Cesium.Math.toRadians(0.0); + const pitch = Cesium.Math.toRadians(-30.0); + const range = 2000.0; + + const locationInfor = parseLocation(osgbObj.location); + + if (!locationInfor) { + console.warn('该模型定位坐标未配置!'); + return; + } + + // 判断是经纬度还是笛卡尔坐标 + const destCoords = locationInfor.destination; + if (destCoords[0] <= 180 && destCoords[0] >= -180) { + state.destination = Cesium.Cartesian3.fromDegrees( + destCoords[0], + destCoords[1], + destCoords[2] + ); + } else { + state.destination = new Cesium.Cartesian3( + destCoords[0], + destCoords[1], + destCoords[2] + ); + } + + state.orientation = locationInfor.orientation; + center = Cesium.Cartesian3.fromDegrees( + locationInfor.center[0], + locationInfor.center[1], + locationInfor.center[2] + ); + + if (!state.destination || !state.orientation) return; + + viewer.camera.cancelFlight(); + viewer.camera.flyTo({ + destination: state.destination, + orientation: state.orientation, + complete: () => { + state.timeout = setTimeout(() => { + rotate(); + }, 2000); + } + }); + + const rotate = () => { + clearInterval(state.timelookat); + state.timelookat = setInterval(() => { + if (!Cesium.defined(viewer) || viewer.isDestroyed()) { + return; + } + state.witetime += 0.7; + if (state.witetime > 180 && state.witetime < 360) { + state.time += 0.7; + heading = Cesium.Math.toRadians(state.time); + viewer.camera.lookAt( + center, + new Cesium.HeadingPitchRange(heading, pitch, range) + ); + } else if (state.witetime > 360) { + viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY); + clearInterval(state.timelookat); + state.timelookat = null; + viewer.camera.flyTo({ + destination: state.destination!, + orientation: state.orientation, + duration: 2 + }); + return; + } + }, 10); + }; + + // 点击 body 两次退出旋转 + const body = document.getElementsByTagName('body')[0]; + body.onclick = function () { + if (viewer && !viewer.isDestroyed() && viewer.camera) { + state.num = state.num + 1; + if (state.num > 1) { + viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY); + clearInterval(state.timelookat); + clearTimeout(state.timeout); + state.timelookat = null; + } + } + }; +}; diff --git a/frontend/src/components/mapController/OSBGController.vue b/frontend/src/components/mapController/OSBGController.vue index 49d3548c..f4bb47b3 100644 --- a/frontend/src/components/mapController/OSBGController.vue +++ b/frontend/src/components/mapController/OSBGController.vue @@ -32,13 +32,16 @@ class="leaf-item" >
- {{ item.stnm }} - + {{ + item.stnm + }} + + +
@@ -79,6 +82,9 @@ const props = defineProps<{ const emit = defineEmits<{ (e: 'update:visible', v: boolean): void; + (e: 'loadModel', item: any): void; + (e: 'unloadModel', item: any): void; + (e: 'flyToSite', item: any): void; }>(); const tooltipVisible = ref(false); @@ -125,6 +131,16 @@ const onOpenChange = (visible: boolean) => { // a-switch 切换 const handleSwitchChange = (item: any, checked: boolean) => { item.checked = checked; + if (checked) { + emit('loadModel', item); + } else { + emit('unloadModel', item); + } +}; + +// 点击站名定位 +const handleLeafClick = (item: any) => { + emit('flyToSite', item); }; // 点击外部关闭tooltip diff --git a/frontend/src/components/mapController/index.vue b/frontend/src/components/mapController/index.vue index 4e2720fa..28f2fd3d 100644 --- a/frontend/src/components/mapController/index.vue +++ b/frontend/src/components/mapController/index.vue @@ -18,6 +18,9 @@ :countdown="countdown" :inTransition="is3DTransition && child.key === 'OSBGController'" @update:visible="(v: boolean) => handleComponentVisibleToggle(child.key, v)" + @loadModel="handleLoadModel" + @unloadModel="handleUnloadModel" + @flyToSite="handleFlyToSite" /> { const id = String(item.baseId ?? ''); const group = baseMap.get(id); if (group) { - group.children.push({ ...item, checked: true }); + // 直接 push 原始对象(不用展开),确保与 addQxsyLayer 中的 item 是同一引用 + // OSGB 状态(osgbtitles, cartesian3, eventListener 等)都挂在这个对象上 + item.checked = true; + group.children.push(item); } } return Array.from(baseMap.entries()) @@ -146,11 +152,33 @@ const fetchTiltPhotoTree = async () => { }); const list = res.data.data; tiltPhotoTree.value = buildTiltPhotoTree(list); + + // 全部加载倾斜摄影模型(dynamicSetVisible 按 12km 距离自动控制显隐) + list.forEach((item: any) => { + map.value.addQxsyLayer?.(item); + }); } catch (err) { console.error('获取倾斜摄影数据失败:', err); } }; +// 倾斜摄影模型相关事件处理 +const handleLoadModel = (item: any) => { + // 开关打开:加载/显示模型 + map.value.qxsyChangeClick?.(item, true); +}; + +const handleUnloadModel = (item: any) => { + // 开关关闭:卸载/隐藏模型 + map.value.qxsyChangeClick?.(item, false); +}; + +const handleFlyToSite = (item: any) => { + // 先加载模型(如果还没加载),再飞行定位 + map.value.addQxsyLayer?.(item); + map.value.qxsyToPosition?.(item); +}; + // 3D过渡动画状态 // layerController / OSBGController / threedRoam 三者互斥,最多一个被选中 const activeKey = ref(null); @@ -375,11 +403,18 @@ const handleControllerClick = (item: any) => { fetchTiltPhotoTree(); start3DTransition(); } else { - // 3D→2D:打开抽屉,清理过渡 + // 3D→2D:打开抽屉,清理过渡,卸载所有倾斜摄影模型 uiStore.drawerOpen = true; uiStore.isRoaming = false; cleanup3DTransition(); activeKey.value = null; + // 卸载所有倾斜摄影 + tiltPhotoTree.value.forEach((group: any) => { + group.children?.forEach((item: any) => { + map.value.removeQxsyLayer?.(item); + }); + }); + tiltPhotoTree.value = []; } props.onClick('dim', uiStore.mapType); } diff --git a/frontend/src/components/mapFilter/index.vue b/frontend/src/components/mapFilter/index.vue index c28de47d..9e495377 100644 --- a/frontend/src/components/mapFilter/index.vue +++ b/frontend/src/components/mapFilter/index.vue @@ -647,7 +647,7 @@ const focusSelectedAnchorPoint = () => { mapOrchestrator.focusPoint( selectedValue, - 14, + uiStore.mapType === '3D' ? 9 : 14, isFishSurveyMode.value ? anchorPointOptions.value : undefined ); }; diff --git a/frontend/src/utils/request.ts b/frontend/src/utils/request.ts index 7cf48b05..c8e1b177 100644 --- a/frontend/src/utils/request.ts +++ b/frontend/src/utils/request.ts @@ -58,7 +58,7 @@ service.interceptors.response.use( message.error(response.data.msg || '请求失败'); setTimeout(() => { localStorage.clear(); - window.location.href = '/'; + window.location.href = '/login'; }, 1000); return; } else if (response.data.code == 1) {