traffic-diagram 1.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/.trae/documents/Update README.md for Traffic Lane Component.md +37 -0
  2. package/.trae/documents/npm Publish Plan.md +27 -0
  3. package/.trae/documents/plan_20251222_071731.md +64 -0
  4. package/.trae/documents/plan_20251222_074833.md +23 -0
  5. package/.trae/documents/plan_20251222_081357.md +23 -0
  6. package/README.md +311 -0
  7. package/dist/demo.html +10 -0
  8. package/dist/static/css/chunk-src.895fe3a6.css +1 -0
  9. package/dist/static/img/demo.160f90e8.png +0 -0
  10. package/dist/static/img/demo.18a57edc.gif +0 -0
  11. package/dist/static/img/demo.c7910627.gif +0 -0
  12. package/dist/traffic-diagram.common.chunk-lodash.js +17212 -0
  13. package/dist/traffic-diagram.common.chunk-src.js +2015 -0
  14. package/dist/traffic-diagram.common.js +33788 -0
  15. package/dist/traffic-diagram.umd.chunk-lodash.js +17212 -0
  16. package/dist/traffic-diagram.umd.chunk-src.js +2015 -0
  17. package/dist/traffic-diagram.umd.js +33798 -0
  18. package/dist/traffic-diagram.umd.min.chunk-lodash.js +9 -0
  19. package/dist/traffic-diagram.umd.min.chunk-src.js +1 -0
  20. package/dist/traffic-diagram.umd.min.js +12 -0
  21. package/package.json +46 -0
  22. package/src/App.vue +269 -0
  23. package/src/assets/images/green-wave/demo.gif +0 -0
  24. package/src/assets/images/traffic-lane/demo.gif +0 -0
  25. package/src/assets/images/traffic-lane/demo.png +0 -0
  26. package/src/assets/images/traffic-lane/directon.png +0 -0
  27. package/src/assets/images/traffic-lane/left-ui.png +0 -0
  28. package/src/assets/images/traffic-lane/left.png +0 -0
  29. package/src/assets/images/traffic-lane/leftRight-ui.png +0 -0
  30. package/src/assets/images/traffic-lane/leftRight.png +0 -0
  31. package/src/assets/images/traffic-lane/otherPic-ui.png +0 -0
  32. package/src/assets/images/traffic-lane/otherPic.png +0 -0
  33. package/src/assets/images/traffic-lane/right-ui.png +0 -0
  34. package/src/assets/images/traffic-lane/right.png +0 -0
  35. package/src/assets/images/traffic-lane/straight-ui.png +0 -0
  36. package/src/assets/images/traffic-lane/straight.png +0 -0
  37. package/src/assets/images/traffic-lane/straightLeft-ui.png +0 -0
  38. package/src/assets/images/traffic-lane/straightLeft.png +0 -0
  39. package/src/assets/images/traffic-lane/straightLeftRight-ui.png +0 -0
  40. package/src/assets/images/traffic-lane/straightLeftRight.png +0 -0
  41. package/src/assets/images/traffic-lane/straightRight-ui.png +0 -0
  42. package/src/assets/images/traffic-lane/straightRight.png +0 -0
  43. package/src/assets/images/traffic-lane/turnAround-ui.png +0 -0
  44. package/src/assets/images/traffic-lane/turnAround.png +0 -0
  45. package/src/components/green-wave/index.vue +671 -0
  46. package/src/components/traffic-lane/index.vue +1020 -0
  47. package/src/index.js +32 -0
  48. package/src/libs/bus.js +24 -0
  49. package/src/libs/pics-load-tool.js +23 -0
  50. package/src/main.js +14 -0
  51. package/vue.config.js +279 -0
@@ -0,0 +1,2015 @@
1
+ ((typeof self !== 'undefined' ? self : this)["webpackJsonptraffic_diagram"] = (typeof self !== 'undefined' ? self : this)["webpackJsonptraffic_diagram"] || []).push([[1],{
2
+
3
+ /***/ "17cf":
4
+ /***/ (function(module, exports, __webpack_require__) {
5
+
6
+ module.exports = __webpack_require__.p + "static/img/demo.18a57edc.gif";
7
+
8
+ /***/ }),
9
+
10
+ /***/ "1ed1":
11
+ /***/ (function(module, exports, __webpack_require__) {
12
+
13
+ // extracted by mini-css-extract-plugin
14
+
15
+ /***/ }),
16
+
17
+ /***/ "2621":
18
+ /***/ (function(module, exports) {
19
+
20
+ module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAT9JREFUWEftlUEuBEEUhr//EOIKQoTEBisOwFKQWIvMAnEOEzYjVhIL9hzArNgSpxCH+KWle8x09HRVYWyqFr3ofu/9X//1XpX4wbJ9UqRLOk0to9RE2zvATZm/K+k2pVYSgO0V4LEmuCrpKRYiGsD2NPAKTNXE3oF5SW8xECkAz8BCg8iLpMU/A7B9B2y0CNxL2gyFCHbA9hlwGFj4XNJRSGwwQL2YbQ+960taDxGsx2SA7MC3Dti+lLQ/rqlim9D2A7AlqTiwBmsEwPYscA0sSRq7PYkAcyVEvyIYiNjeK8Wrb4OgBifWhscwcASrnI6k3udNWjwiD5lArdawnqROBdAFjltTfjfgC6B0YRtIutMTuEa3oCpgewa4ApYn3oTDf2H7QtLBxMcwxsrYMWyqnY/i7EB2IDuQHfh3Bz4Azh/GIdToBDMAAAAASUVORK5CYII="
21
+
22
+ /***/ }),
23
+
24
+ /***/ "2e1d":
25
+ /***/ (function(module, exports) {
26
+
27
+ module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAA4BJREFUSEuVll9oFHcQx7/f3bvr3eWS3KnppaGkDeiLQu2L2soq/QO2tCJ90MRoW6FS6lsfRFIFS19aBBGfg9W21ohRQWhpMYYaaMBW6JN/IijSslq8XMz9Sc6cudzu6O7enfd3c87j/mbmMzO/+c0s4SbHsj2KKL2E+Y4AKwl2WOoCmSIwIVAumzTP4vPAv43csO7BYLZbVeTQUye9AFTXIEhDIOcMgwP4IqBX69YAfCfm+k1wECKtro5rDzMKuCe3OzBUflQB8Byf20tFDkPw7DutivAaIKsXBRIiJvfldwePFHVLjnwnMzsgPFXh3NH6NjcfPOzzZ/+ByPJmIKB8nPs0dNrSdQA/Zbt9av4mhaFKB/xt/m5wC76h6f05s5rgFUKCi0GEkskZnlXYFdBtgH9o9gyAvnJDIW7Pe0Jr0ct08bv/1MwukD8uBiicDz/e2bqd/pOpHvrUO7XdQh1iXs/2t222DFqGkq+bqud7AK89LZu3CYghOWMFW87NDIjgUH0D0ed621+xszw7oynAeEnPvvyyZqjjgMB+tpxPj4DYVBcg0B9tLQISmqqqJYBAOUjINkCsjBrJKEMXUvcIvFxPQwg981HYzqDl9GRU/IE1FPOxrWvkbjxqN2dDWf8PFGyraw/cZ+uv6QWKeBqEoM9scQBu0vZLahjOq68QIfNs/z21ABdA+sNICRC+kAznX/B0WV68mYX/kxOR2fCa1NcCHASg1ARBzjN8MXEPDUoEQE+9v8QGBC9NdflM9RaANtuRmF+SygcCvOeS3X1GLk2PAA0uGdCTm5bagMhoQoNIWRcx75K5EwMwyqV/JAYAs0GbQp9+d1kBENcURXkGWOxiHMIBto/Eejw+7x1Casay1UXTbxUAY3FNRfMAAY28oq6wR8WyP6fOsGpUFFLUH27ssDPoGItrUNl0BgIMP9zYsd0GRMYT3V7mbwKoHnZ6XCsAxuMaWfaSXUvEzIKoq5IbljjDzpLolakdoFSNa9En10edDMbjmqI2AbB2giGfxLWovXgqFk7n35N7QZQWjgBpEkedcrGbIp+5B27Pp32xN6K1C6do2HU11m+SgwSea2UKkaFgz4O1TuRFqbv0O/968Co9/K7w/N2XPmAIcB55+Sr25kv/VWdY/6+ieC9XYz2qij4Qb4NcCZEX7SMyDpEJCMYMA8OT6zob/rY8AZd9TmuVGM/hAAAAAElFTkSuQmCC"
28
+
29
+ /***/ }),
30
+
31
+ /***/ "5369":
32
+ /***/ (function(module, exports) {
33
+
34
+ module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAA1pJREFUSEuVlk9oXFUUxr/vvpmxk5npm6RNEw0EA9ZFFaGbqkULVShSBBUxTdJSwSqty1JCWjeupAURiiA6SIvWpjZTCwWlEoMUFNRuuhDrpgulxnTS/JtJppkmmfc+mRczzr/3Mt7V455zz++cc8895xFB69Nsj1G0l3CfE7CNYHtJXdAUyZsSr7kspPFW8g8/M2woSBW6LaNTBHoBWIFOkI6gS47DIRyO3q7VrQNEzi72u2AKUiLQcL0wb8Ajy4eiw5WiKkDozOIxGr0PoWFkIrIQQ4TiDeGE5HKweKjlgzV52VDkXH4A4nk/4yCKrqu9BoyBuAzA+EFAHVg+GL9Qkq8CPi90R6ziTYqNPfM0+fbSgdgnpc/IF/NDhDnll0JR+WUn9Bhej972ABuGFy4C2Od/gKeXBuJHK+WRC/fOGLlvBNzTyP39iT5uOJftYcS6FVAtDogrENxCX6IXqYmWqJ34DEAYwEvlLNSTHC07WxlLzx8XcLKZilns3UikZ+0WhLLN6BM4wdhXuVEQexocUK139161PUDMsmoBdbr/2htj/Ep2nEJXJUA0v0o6a6DTlfsLryTZmp61i2FTDRAGRQwQ2F5lBxhn4uvcCqXQfwKdn2fhMCYmVuyuR6qqKvdicg4Q7W9yyUpDub/tPB6FlcjnPqJQvniRRdpXsyuoBJAf52AfxV4uNZPnsk76r6idiH8IF2+W98glJr+dGQdZlSIAN0SljPhuJWTuhbautqszG13DP6vheg/gQQBP1Dg1ztbvZkaB5i55bs8mto7N2pCq74AUpLr2ImCMm76fPo4my3Tm+c0ewBi3qTKF8A7t0UxPKBK+RSi4LQOY3r0KsELrAwQ6RWNt9cLa/MPURQa0irW8Tu1q9wChB5x1IxAwMr2rvc8DtP442x02zm/rzYC7z2zxAOFoMRhALqy41uNzz7atNrvS6vgp0w+aYd92DWBy5yogEgsAsDRRuX9yZ/uXXhOuLKvOXyaPgfAdOCAuSQgTeLnhG/GMYzDzVEf9wFk78ND1TL9Lpgj8r5EpIk/hyJ0dHf4jcw3S+fOdhxHiSQKvrTv0AUfCZTgayjz9YM0DrElRbdgd1zM9loV9IHaD3AZpi6cj3QX5O4RrjoORySc7fX9b/gEvpkFrljgF/wAAAABJRU5ErkJggg=="
35
+
36
+ /***/ }),
37
+
38
+ /***/ "5453":
39
+ /***/ (function(module, exports) {
40
+
41
+ module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAA1RJREFUSEullttrXFUUxr/vnMk008k0l3aSqBjNQxGqoL54ow0kQlEoikiTxooXihhfLaHVf6CCl0chiLdiNIkGb8WaliaQOVT7pIIWpA9qDXSSyWWSmWSSyZzz2XOOGSaTzJyI+2nYa+3vt9da+6w1RLX1XrrdUKSbcLoEHCAYd90FpQhcFYxxh7kRvNTwRyUZbmsYyLWZht64KdINwKx6CdIW9Llt8xRejlwv990CCH+w0uuAA5BiVYW3GrMG2Jc/ERksNW0ChN5fOUlDb0LYPrIgIiE57C+c2P32hmtRKHw2+wzET8rE1wHUBOhu9qGroGfzz9V96p7zAR/n2sJm4TeKdRtiAn4R+K4BDVQDOFAfwVcI3Fs8S2XzduhuPB+57gFqBzNDAHqKDuL3a2vRbvyNZdyBsLsfqc3Fbcd+ATBgGvwotxpJef5/IY/bEd21a3mE1GMllxlePR47xtqz6XaGzWvF1yI4DBlPrhyNngtKeal999DyEcn5GoTx776tvL2f0ZGl0wLObBIjC4LTb5jmBGznVRGOY/PD1Z7YpBfxaKbDkF6kvHDecWy782Z63yp/0gReY/SLxTEQhyvc9icA9/s2ji8/vedR91d0dOkSoC5/Gz9DuK/C+Yus+yo9ReG24HTQyjxVf8j1i325mAB0MOiMgCnGvl1cpxQKdpaVeaLRB3yzkCAYDCALrP8uvY6dAARr6YgP2HNuIUEiEAByjQ3n56ZABqdIsNKPN3mAhvPzCewE4Kao8cLcGFCxyKWZsxYO7/UAjRfmEkBwBAIucu+l2dMof6bbFESUNd8V9wBN46kEFVwDCK+zfizZHgrXXCNUvS1D1mynD9g3kUogoMgC7YJh7vdaxb7J1BBLWsX2L0pWqqPZA8QnZ3YAwPBsR/yYB2hMzLfVGPavATPAmjnoA5otF1ClBmRm3THvWTjU5Dc7d7VcTvaCxmCVWZAV8bv38Qp3ASh23k0Ru+1aPD79SPwz/0MvWa0/Tp8E8b8GDoT+5EMtWwfOBufWK8lehxwg8J9Gpogshb4bD7RUHpkbkNYfbtyJEM8QOBo49AFbwihsnUo+fMuf5Q+k6uxtuZJsN030gOgEeQBSsydAzkC6CmHCtjE8/WBrxb8t/wCthUJrjd12rgAAAABJRU5ErkJggg=="
42
+
43
+ /***/ }),
44
+
45
+ /***/ "64e8":
46
+ /***/ (function(module, exports) {
47
+
48
+ module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAhxJREFUWEfFlz+oj1EYxz/fLMJAYbhRMvg3KNlYSCxiuMMtG0ooBhQjBgMpFrndgQxK3U2mO1w2C8VgVbiyWFgNXz31qp/rd855z/m95alfv+F9nuf7eZ/zPOecV/xnU4u+7W3ALmBD9/sOfAK+AEuSfvbN2xvA9nrgBDANHCgIzAFzkt6WQHoB2D4NXAW2lxIuex4QZ3MxWQDb+zvh45XCo+4PJF1IxScBbN8Ark8gPBp6U1Lk+8dKFYi1PJOBeAdsBKYKoIuSDlUDRIDtF8DRkeBF4AkQSZc6n5iIi8C5BMgvYLWk+P/Lik1oe02IATuAW5JujxOxHZPxMlOJg5JeVQN0b7gFWCspSj7WbMeUjIXrAqYkfWsCKDWi7T3AU2Bnwnde0kxTD/QQXxW7H7Au47tP0uvBAWxvBj4XIGckzad8ik2YWfO9wJtJxCO2CcB2jN2HScUnAXgOHMsAZMs+GlddAduHgYUhxJsqYDt2u4cJgLgLRGP2tpYKXAHuJhRmJZ3vrd7ShIUtN3nqDT6GNW+Z861egqGE/+RpBrC9EtgKrIjdUNKPFrgmANtxxYrTb7Tj70i6VgtRDWD7FPAoIXRP0uUaiBaA98DujMgmSV/7QrQAuJB87M1nsDG0HSdgnIQpG3vzGRIgd/V6Jim+nnpb9RJEZtsngcfLVO5LutRbuXNsAuggjnSfarEPfJQUR3S1NQNUKyUCfgPzkqIhIsJLqwAAAABJRU5ErkJggg=="
49
+
50
+ /***/ }),
51
+
52
+ /***/ "6ddb":
53
+ /***/ (function(module, exports) {
54
+
55
+ module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAVtJREFUWEftlr0uBVEUhb/1Alq9SiRKnQgJiUSD5N5KwhOoJQo0PIAXoNC4hFBQKK7o6ahVGp3ekpPMyPxdc2cUEjmnO7P3XvvLyt4nI/746I/7EwGiA//TAduzxe2S1K/auEoHbE8DD5mCE0lrTVbW9i6wk6npSDorgRU/2B4FAu14EjuUtNmkeZprOwAEkHDegRlJL1mtkgO2L4DlJGmvYWND7m0J93BSiCtgRdJnqpsDsH0AbDVs2jR9X9J2CcD2OnDUVK1l/oak41D77YDtEeAcmG8pOmzZLdCV9JEDCBfbY8AlMJmo9YDnAcrZCQ9Dez8gbwLoJLFHYFXSa+UMJBBTwDUQtiGcnqRuUdx2OmAh1Jc0V5Fzmmn+BixJevpxCxKIReAmk1iCqAOwnW0epBYk3RUhWz/FdQDDDkQEiA5EB37jQO6nY9APR906tgaoEx42HgGiA9GBL9fygiG6SEn5AAAAAElFTkSuQmCC"
56
+
57
+ /***/ }),
58
+
59
+ /***/ "78da":
60
+ /***/ (function(module, exports) {
61
+
62
+ module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAA55JREFUSEudVV1om2UUfp73y7o2bZq/tqtBooN5o8UbBxPBDgrWwgLCKl3tpjIQxxRkqNUO7wSdKCpD6Bxjwspql26j4BZtu9mC7KrIrjZ3Ieo6f9M2+dI0W7sm33skaY1J+iXdei6/c97nec9znu+8RKU4kdiqpKaL0G0CPEqgCQREMEPyuggntaXDOFhzsxwMbRPHF4OGgSMU2QPAqHgJwBIybFk4jAM1t0pr1xBUfZV6QcM4DhHXOsDFaXJBUV5d3u88U5goInCcvPMWlXwCyQqxgWBWPb6d2e/87L/TeaCqgVQPhKc3DP4/ooCyb/mluq+zn1YITi0Gq5R1jcD9yVKmSQEWlrXRgpdrbuUIqgdTg4D0VBJFgBQFRzNKIgpMAnxcCd4EZHuZc+Glva5uVg8ktrLK+Hkdt5gW0Lrc7bpWBDYsRo2VGgSRdVtpWCKObawNJ98V4qPKt5dDi13uo86h2wEY1geABMRQJxY7XedwOlbv3LzpVwj8ayxK9LH23PwYiPZKBBb0w0ud3una8/PfAejI1Qo0M+mWVHfDDef55FlCnl+DIRhn3UjidwIPViJwpLXH7PLNu0YS2T/2obxhtA4lO32RupFEP4GDpRgC/EHXhUSaAkclAmNphaD+m8Q0gGC+VnQo+ZwvUn8h0Q+xISAzdH9rpmFLIMMAtwDYqW5LjsAdMadB3oDoaoA7RSSUDPki7ovxfpBrOgB5l57R2J8AAzbtHZtP/n3IUx84JiJTNHgHGk8kpj29nqA5AmKXBkLJDl/EPRq3lQhZibzjsVEAz9pINGy2+3P2847FewE0me3ed0CK91L8IkR2QeuQ2dEY8Y7N2XcAjNM7MdurhB/bzoDqw1ib773CnO/yzB5SnQKwWWsJmc80Rvzfz/XDZsiA6qP3UjyoHPoXwn7QovBlrNX/Okjtn5h5A0p9ToFasaqE5toaIw0T2Q6KhyyAlVnOPJJbFQ0/zA4QeLGck4Q4Q/AmRPqKakReUUomLVHvE9hbmBNgaK61sWeF4MpsgMB1QjyV7HrPOXIhrY0W82nfyrLLRtOV6G4YPJtv/57RSgoJgXBf9KnGgnW9WtM8FX1NBF9smCQHjt5/ntzyaf5vL73oA1PR3SBPQu5PruwboEQO/LWjeagQ0/ZpbLg6G9hk6SOrb0TFNQLAAhFegj5sbg+s/+gXsgd+jAchd7tFoY2Cx0A2rdpzBuRPEExaFsLRHc2/lRvZvxxUd2W5o+D/AAAAAElFTkSuQmCC"
63
+
64
+ /***/ }),
65
+
66
+ /***/ "8aaa":
67
+ /***/ (function(module, exports) {
68
+
69
+ module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAPlJREFUWEftkDEuhEEARt+7gEKjcgFxAQoKCm5BQqOh4BQUNBqbcAsKCgouIC6g0ihc4JNNVrPZ3Zn/F43MlDPzfd/Lk1+cJAfDuHrZt8a+wSRrwOMov64+9enqBZBkHngDFkajH8CS+tkVoi/APbAxNvagbv45QJJz4HDK0IV61AWik4Eke8BVYWBfHdRCVAMkWQGeK4tX1Zeav1UASeaAV2CxphR4B5bVr9L/WoBbYKtUNvZ+p26XMkWAJKfAcaloyvuZejIrOxMgyQ5w3XP8J7ar3kzrKBqYFEySSfdq577OgeFwA2gGmoFmoBloBpqBZqAZ+FcGvgHC1IwhOqX0yQAAAABJRU5ErkJggg=="
70
+
71
+ /***/ }),
72
+
73
+ /***/ "948f":
74
+ /***/ (function(module, exports) {
75
+
76
+ module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAA6VJREFUaEPVmL1rFkEQxp/nD1BUBAtBU0TwAwSx8KtR0C5KGgMqihgQtVBEbGKhaayCSAiCiBFBghgLJVhYxUIwoFgpCFpEixSKhQbUbmTCXtj33N3bu917Jdu9997NPL/9mJ0ZYokPLnH9aA1ARA4DGAKwAsB9ktfamKxWAIz4RyXBw21AZAfwiC9YskNkBagQ3wpENoBI8dkhsgDUFJ8VIhmgofhsEEkAInIIwFNHeJwEoGHUHk8A9DveTTrYqQAvAewpiVLxtwBMl57vA3AFwP7S818AVpP83eSeSAV4A2C75XiS5ICI7PUAvAXwHMBOWyzJxjoaf6gCRGSrEboKwDjJQfPcCUDyhYj0AHgIYIeB+H9bqJhFEekl+cn67QWw3ukhOdtk23SsXqoB1/e+LaQrkNtf1BYSEU3E+ozzaZKXQ0KaApgtOQ5gDsBtks+qgCsBjPirliGNFutJfvMZTwD4DkDPUzEGSGpU844ggEN8YWgTyQ85AURkHYDPDptBCC9AQPwMyV0tbSG9P87WgXACiMhFADcchl4DOGpHnNyHWES0jijf4urGuRL/AIjICa2gHMI0gvST/FF1sJqeASvERkN0AIiIRpoph0B95lqREIsrlahit/8/F7MSiwCeWavjsJvvLm4nG+AjgN5uqkjxVeRPNsA7AFtSjHbx2zmSa9WfDXAMwIMuikhxdZOkRsrOvlDgHBQ5fh2nbR3iCZI62QvDFUZdmaS+u5DrxxC0GEbvkTxla/BdZL5wGgWRAhC4yDS5O1OewFAqcQTAhGPGFwsX32o0BRCRuwA6Ztj4GCV5weWvKpk7rWmt48MNoXSiCYAWRQA0lJfHSCh9j0mnLwEYsazOk1weOgtNANSeiPwEsMyyfZ2kNgK8oxLAGNZ6QBOsLwDOt5XMiUjhR90+jmkGRwHERB77naYrUNePM4zWNSIiKwGssQucGAAR2QhgluSfuj4rw2isQREZBXDS7NsZAMd1e4UARGQzAI022huaBzBYVTYmn4FAuCwngFrwHACwzdPY+gpAc30753pFcnfspEXfAzEGRaTcmdPPtPAZ9gCMORLGKZLaY200kg5xoG7WAuhgSdF7T7bbF9M+8dElAZgQqz0ju+1SZyYr2yZVxpIBEiCSxWcJo8UMBbaTaxKziM8KYFbC146xIbKJzw5gIHxtGf07q/hWAAyEq57ILr41AAOhld0ds3eGUm7b1m7iqhDXjf+zhNFuCPX5+AtWAppAsGluPQAAAABJRU5ErkJggg=="
77
+
78
+ /***/ }),
79
+
80
+ /***/ "9518":
81
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
82
+
83
+ "use strict";
84
+ /* harmony import */ var _node_modules_mini_css_extract_plugin_dist_loader_js_ref_9_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_9_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_9_oneOf_1_2_node_modules_sass_loader_dist_cjs_js_ref_9_oneOf_1_3_node_modules_cache_loader_dist_cjs_js_ref_1_0_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_9b8515cc_prod_lang_scss_scoped_true__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("e7e7");
85
+ /* harmony import */ var _node_modules_mini_css_extract_plugin_dist_loader_js_ref_9_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_9_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_9_oneOf_1_2_node_modules_sass_loader_dist_cjs_js_ref_9_oneOf_1_3_node_modules_cache_loader_dist_cjs_js_ref_1_0_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_9b8515cc_prod_lang_scss_scoped_true__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_mini_css_extract_plugin_dist_loader_js_ref_9_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_9_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_9_oneOf_1_2_node_modules_sass_loader_dist_cjs_js_ref_9_oneOf_1_3_node_modules_cache_loader_dist_cjs_js_ref_1_0_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_9b8515cc_prod_lang_scss_scoped_true__WEBPACK_IMPORTED_MODULE_0__);
86
+ /* unused harmony reexport * */
87
+
88
+
89
+ /***/ }),
90
+
91
+ /***/ "99fc":
92
+ /***/ (function(module, exports) {
93
+
94
+ module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAVtJREFUWEftlTEvBVEQhb9T8wPUOlHIS/RoRScRjYRoRaFQUFBIFAqVRoFoaYmORiIRyYvCL5DQC+3IJPsS1u67k312q532zsz59szcvSIYZrYOfEg6DZaE0hTJMrNZ4CrLHZf0EqmL5CQBzGwUeAaGsoZdSZ1I80hOBKALTOSaHUlaiwikcvoCmNklMF/SZFXSSUogdV4KYGZ7wHaiQUeSO1Q5CgHMbAk4D3R9kjQZyCtNiezALTCd63AnaWYQ4V5tC/DvDpjZLnAg6TMyojoAdoBlYEHSYwqiMgAwB4wBwzmRKcBd8FiRdNYPoipA6sN+nvs4NssKmgBw7etsJH/2oikAh9iQdJh3ogmAV2BR0n3RGAYFOAbeChr7TfC48Bsh6auOHfBr5gK/IvsPOMCWpP3UtlZ1oPQtyAAeJN2kxP28DoARSe8R8VoAosLta9g60DrQOtA60HPgG3HYvyHuUz0OAAAAAElFTkSuQmCC"
95
+
96
+ /***/ }),
97
+
98
+ /***/ "9b08":
99
+ /***/ (function(module, exports, __webpack_require__) {
100
+
101
+ module.exports = __webpack_require__.p + "static/img/demo.c7910627.gif";
102
+
103
+ /***/ }),
104
+
105
+ /***/ "a75a":
106
+ /***/ (function(module, exports) {
107
+
108
+ module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAy5JREFUSEullltIFGEUx///2XXTdF1XXdcKJCFfquduVFCBRBH0UJpZSUQUPiaSRUQRYRQRRC8iRUVWWmF016igwvK9evGhCKH1suuumpd1Z07NbqM7O+t66XsZ5pwz53fO953vnCFSrcbRYkWUMkLbLMBygh7dXCB9BL4JlLcatRYczvg+nRsmVTSMFtkUufDXSRkAW8ogSFUgD1SVx3Ek42eirQXguDFSoYENEHGmdGxVDivg0fChjKZ4lQlgvz5SQ0UuQZA8s5mIhIjG2sihhZcN00lHjtvDeyG8M2/nUx4FlH3hA1l3dVEMcGu0yGGLfKUwKz5IgZwN73eeMWSOO4N1FKV+pkSEMhxW7StQlfEzCkhvGroPoDzhw3Njlc7ThmzB3aFqgtcgMtvtax6rdO5h+u1gMR22rvhqEQ3nx/Y6TxnO0++F9pPKTQDKTNHH6VUJqyXMbBmsE2AqbUH9SHn2SZOjq10L4FxmjfwgxgGKbruwZTD6TKigE8x8GGoDURpVCC/83pV9Yg5RTppmPgpZAABeM+txsJuCJbqlRjn2e6f7ynwAztagBSBAN51PQxMUsUed6nUMHBnakdM4V0j2kyQAMkLXi+AEDEDMqypUqga3uSZvZPazQDXJq/GFENruNp2J6/mAdYvIcea89HeDjG5R3IpAYVmw1N1qyFxtgYsU1Brvwa25JkDOq0CyM+imu93fBvw7ZHMNjFOTnYGtea8McW67/6YAVfr7QGmeCeBu9yc7g9fMe9Nfh/gyneXm+7fkmwB5b/qtGQhO0tXmK7Y70roISd2WE8D9m8yA/HdmgIBqRLGVRKPIf993n9ZWkTKXvo0eUwae932mDARo7t/o2RM1cn8IFKUp6pe5zIDe9QUmQMHH3ikAOTSh2VYObMiNNTt9eTt8FaDSNNt23bPODPB2/ANQn6is7FnnuRe7WnGr8HNPDYj/GjgQ1PrWeK0Dx+As7vRVaGQDgTmNTCGGKTj6a5V3+pFpQAo//VoKO+sJ7J5x6Os3X/AIqhz3rV30I7EyUg4Pb6ev2GZDOYhNIJdDpCDWs9gLkW8QvFNVNPesLpz2t+UPhD0oayTUbjEAAAAASUVORK5CYII="
109
+
110
+ /***/ }),
111
+
112
+ /***/ "acb9":
113
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
114
+
115
+ "use strict";
116
+ /* harmony import */ var _node_modules_mini_css_extract_plugin_dist_loader_js_ref_9_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_9_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_9_oneOf_1_2_node_modules_sass_loader_dist_cjs_js_ref_9_oneOf_1_3_node_modules_cache_loader_dist_cjs_js_ref_1_0_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_52147a10_prod_scoped_true_lang_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("1ed1");
117
+ /* harmony import */ var _node_modules_mini_css_extract_plugin_dist_loader_js_ref_9_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_9_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_9_oneOf_1_2_node_modules_sass_loader_dist_cjs_js_ref_9_oneOf_1_3_node_modules_cache_loader_dist_cjs_js_ref_1_0_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_52147a10_prod_scoped_true_lang_scss__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_mini_css_extract_plugin_dist_loader_js_ref_9_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_9_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_9_oneOf_1_2_node_modules_sass_loader_dist_cjs_js_ref_9_oneOf_1_3_node_modules_cache_loader_dist_cjs_js_ref_1_0_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_52147a10_prod_scoped_true_lang_scss__WEBPACK_IMPORTED_MODULE_0__);
118
+ /* unused harmony reexport * */
119
+
120
+
121
+ /***/ }),
122
+
123
+ /***/ "b15d":
124
+ /***/ (function(module, exports) {
125
+
126
+ module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAA1hJREFUSEulVk1vE1cUPeeNYzCO80Vch1aKyAIhUdTdQEFQiaoKCxaoUoCEoFYIoWQPCNpVd1Sq+AEBtRKBJASKiqANSSO+xZfVZcsGVS0oEk7tEDtOHbDz5sI4TDzjOA6Gt3zv3nPux9G9jyh3Ts20KFG7CetzAdYRDNvmAokTeCRQ1y1a53Ew8M9iMCz50DPTbCj5/jXIbgBG2SBILZALWvMougJPi20XEPh/ynRYYA9EQmWBFz5OK7A7eyDQ537yEPh+zByikh8gKJ3ZUoyEiMUjswdWnHBM54H8vdN7ITz7zuAFRAFlX/ar6n77ao7g9Eyz35j9i8LqckEKMJD9O7gP39Gy7fyn021Uqh+QKrefUKaz2vcxvg48zRMs70ufA7BnqQrMKQgnX3aGuhxbf19ml6LVDxFfkf/gi85QO5f3JlvoNx4vqRaPt5yYaa857FwFBtJ7QJwF4CbRktVrGDw/dUyA4x5/ZZiZtuAf+bshWYbxEk3fzxdun8CFdDshZyAFEgLfMPhzagREq6eGImamrW6OoIITvJjaC6DXVY1RVl9KjlHwkRtHK5iZne9A8EuyleBlQpa96dcYQ1dSORY1iAIzVSFB6NeprbT0MMAVTrBCzrJ2KJlbqACaqR2FDGqHklGImG8cLUBOpXY0dDtANcOpDdTWKIAaT0XJl6y7OjEG0lMi0cpDUDc8GQXmCX5LPqn/El3M2WD1V59/IsQNAA0l2jXG+t8nRgBvky0YZqq1kEHD6ERUBCbIB5NW9gtsb/rfBgtdn1pbpXO3RBAppQUBRrnyWuIYimRKJWZiW3heRSuvJaIAnBK9va4E37J2JNbi81c9JsQ1lr0EjTcTUdgZVHAE1LPKWJMfFY234+foGhWiYCa2FDJovB2PssIMBBhMfBZuzxPU33neXKX0n84OsEAPQfhuPMqCipbOg0znLGP95NaGuWFnn8i9WAeo+uxxrQ2aiY2FDCL34m4VlSegvVHZOb45PGAbehZL04PxQyDea+FAcCT2aWThwnHC+vBhrMMiewhUtDKFmKag+9mGyOIr0yFpuv9sNXw8TmDXW4xxLYKL0HI0tmnVv8X1K7t7Iw9jLYYBe9ZvA7kOIh/kAcj/IPIIghtaY3B8Y9Oi35ZXd/FNayYX77gAAAAASUVORK5CYII="
127
+
128
+ /***/ }),
129
+
130
+ /***/ "b635":
131
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
132
+
133
+ "use strict";
134
+
135
+ // EXPORTS
136
+ __webpack_require__.d(__webpack_exports__, "c", function() { return /* reexport */ traffic_lane; });
137
+ __webpack_require__.d(__webpack_exports__, "b", function() { return /* reexport */ green_wave; });
138
+
139
+ // EXTERNAL MODULE: external {"commonjs":"vue","commonjs2":"vue","root":"Vue"}
140
+ var external_commonjs_vue_commonjs2_vue_root_Vue_ = __webpack_require__("8bbf");
141
+ var external_commonjs_vue_commonjs2_vue_root_Vue_default = /*#__PURE__*/__webpack_require__.n(external_commonjs_vue_commonjs2_vue_root_Vue_);
142
+
143
+ // CONCATENATED MODULE: ./src/libs/bus.js
144
+ /* harmony default export */ var bus = (Vue => {
145
+ const eventHub = new Vue();
146
+ Vue.prototype.bus = {
147
+ /**
148
+ * @param {any} event 第一个参数是事件对象,第二个参数是接收到消息信息,可以是任意类型
149
+ * @method $on 事件订阅, 监听当前实例上的自定义事件。https://cn.vuejs.org/v2/api/#vm-on
150
+ * @method $off 取消事件订阅,移除自定义事件监听器。 https://cn.vuejs.org/v2/api/#vm-off https://github.com/vuejs/vue/issues/3399
151
+ * @method $emit 事件广播, 触发当前实例上的事件。 https://cn.vuejs.org/v2/api/#vm-emit
152
+ * @method $once 事件订阅, 监听一个自定义事件,但是只触发一次,在第一次触发之后移除监听器。 https://cn.vuejs.org/v2/api/#vm-once
153
+ */
154
+ $on(...event) {
155
+ eventHub.$on(...event);
156
+ },
157
+ $off(...event) {
158
+ eventHub.$off(...event);
159
+ },
160
+ $once(...event) {
161
+ eventHub.$once(...event);
162
+ },
163
+ $emit(...event) {
164
+ eventHub.$emit(...event);
165
+ }
166
+ };
167
+ });
168
+ // CONCATENATED MODULE: ./src/libs/pics-load-tool.js
169
+ /**
170
+ * des: 将需要静态引用的图片放在img目录中,在需要的地方直接引用
171
+ * 注意:文件名只接受中英文和下划线,推荐英文加下划线组合方式
172
+ * export {文件名,文件名}
173
+ */
174
+
175
+ const picLists = __webpack_require__("6452").keys();
176
+ const picMap = list => {
177
+ const picName = {};
178
+ list.forEach(e => {
179
+ try {
180
+ const key = e.replace(/(.*\/)*([^.]+).*/gi, '$2');
181
+ picName[key] = __webpack_require__("216e")(`./images${e.slice(1)}`);
182
+ } catch (error) {
183
+ console.error(`Error loading image: ${e}`, error);
184
+ }
185
+ });
186
+ return picName;
187
+ };
188
+ const pics = picMap(picLists);
189
+ /* harmony default export */ var pics_load_tool = (pics);
190
+ // CONCATENATED MODULE: ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"f2351f80-vue-loader-template"}!./node_modules/cache-loader/dist/cjs.js??ref--13-0!./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib!./node_modules/vue-loader/lib/loaders/templateLoader.js??ref--6!./node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/traffic-lane/index.vue?vue&type=template&id=52147a10&scoped=true
191
+ var render = function render() {
192
+ var _vm = this,
193
+ _c = _vm._self._c;
194
+ return _c('div', {
195
+ attrs: {
196
+ "id": "canvasWrapper"
197
+ }
198
+ }, [_c('canvas', {
199
+ ref: "road",
200
+ staticClass: "crossing-box"
201
+ }), _c('transition', {
202
+ attrs: {
203
+ "enter-active-class": "animate__animated animate__bounceInLeft"
204
+ }
205
+ }, [_c('div', {
206
+ directives: [{
207
+ name: "show",
208
+ rawName: "v-show",
209
+ value: _vm.showLegend,
210
+ expression: "showLegend"
211
+ }],
212
+ ref: "legendBox",
213
+ staticClass: "legend-box"
214
+ }, _vm._l(this.laneDirections, function (item, index) {
215
+ return _c('div', {
216
+ key: index,
217
+ staticClass: "legend-item",
218
+ style: {
219
+ background: item.laneDirName === _vm.currentLaneDirName ? _vm.laneActiveColor : 'rgba(31, 200, 255, 10%)'
220
+ },
221
+ on: {
222
+ "click": function ($event) {
223
+ return _vm.chooseImg(item);
224
+ }
225
+ }
226
+ }, [_c('img', {
227
+ attrs: {
228
+ "src": item.img,
229
+ "alt": ""
230
+ }
231
+ }), _c('div', {
232
+ staticStyle: {
233
+ "color": "#fff"
234
+ }
235
+ }, [_vm._v(_vm._s(item.laneDirName))])]);
236
+ }), 0)])], 1);
237
+ };
238
+ var staticRenderFns = [];
239
+
240
+ // CONCATENATED MODULE: ./src/components/traffic-lane/index.vue?vue&type=template&id=52147a10&scoped=true
241
+
242
+ // EXTERNAL MODULE: ./node_modules/lodash/lodash.js
243
+ var lodash = __webpack_require__("2ef0");
244
+ var lodash_default = /*#__PURE__*/__webpack_require__.n(lodash);
245
+
246
+ // EXTERNAL MODULE: ./node_modules/fabric/dist/fabric.js
247
+ var fabric = __webpack_require__("7a94");
248
+
249
+ // EXTERNAL MODULE: ./src/assets/images/traffic-lane/left.png
250
+ var left = __webpack_require__("e63c");
251
+ var left_default = /*#__PURE__*/__webpack_require__.n(left);
252
+
253
+ // EXTERNAL MODULE: ./src/assets/images/traffic-lane/straight.png
254
+ var straight = __webpack_require__("8aaa");
255
+ var straight_default = /*#__PURE__*/__webpack_require__.n(straight);
256
+
257
+ // EXTERNAL MODULE: ./src/assets/images/traffic-lane/right.png
258
+ var right = __webpack_require__("e418");
259
+ var right_default = /*#__PURE__*/__webpack_require__.n(right);
260
+
261
+ // EXTERNAL MODULE: ./src/assets/images/traffic-lane/straightLeft.png
262
+ var straightLeft = __webpack_require__("b943");
263
+ var straightLeft_default = /*#__PURE__*/__webpack_require__.n(straightLeft);
264
+
265
+ // EXTERNAL MODULE: ./src/assets/images/traffic-lane/leftRight.png
266
+ var leftRight = __webpack_require__("6ddb");
267
+ var leftRight_default = /*#__PURE__*/__webpack_require__.n(leftRight);
268
+
269
+ // EXTERNAL MODULE: ./src/assets/images/traffic-lane/straightRight.png
270
+ var straightRight = __webpack_require__("99fc");
271
+ var straightRight_default = /*#__PURE__*/__webpack_require__.n(straightRight);
272
+
273
+ // EXTERNAL MODULE: ./src/assets/images/traffic-lane/straightLeftRight.png
274
+ var straightLeftRight = __webpack_require__("2621");
275
+ var straightLeftRight_default = /*#__PURE__*/__webpack_require__.n(straightLeftRight);
276
+
277
+ // EXTERNAL MODULE: ./src/assets/images/traffic-lane/turnAround.png
278
+ var turnAround = __webpack_require__("cdd5");
279
+ var turnAround_default = /*#__PURE__*/__webpack_require__.n(turnAround);
280
+
281
+ // EXTERNAL MODULE: ./src/assets/images/traffic-lane/otherPic.png
282
+ var otherPic = __webpack_require__("64e8");
283
+ var otherPic_default = /*#__PURE__*/__webpack_require__.n(otherPic);
284
+
285
+ // CONCATENATED MODULE: ./node_modules/cache-loader/dist/cjs.js??ref--13-0!./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/traffic-lane/index.vue?vue&type=script&lang=js
286
+
287
+
288
+ // 方向对应的图标
289
+
290
+
291
+
292
+
293
+
294
+
295
+
296
+
297
+
298
+ /* harmony default export */ var traffic_lanevue_type_script_lang_js = ({
299
+ name: 'traffic-lane',
300
+ props: {
301
+ /**
302
+ * 画布数据
303
+ * - Possible values:
304
+ * - Array
305
+ * 字段描述:
306
+ * - id: string - 车道ID
307
+ * - laneDirCode: string - 车道方向编码
308
+ * - laneDirName: string - 车道方向名称
309
+ * - inDirection: string - 车道入口方向
310
+ * - laneNo: number - 车道编号
311
+ * - congestionFactor: number - 拥堵值
312
+ */
313
+ laneDiagramData: {
314
+ type: Array,
315
+ default: () => []
316
+ },
317
+ /**
318
+ * 画布宽度
319
+ */
320
+ canvasHeight: {
321
+ type: Number,
322
+ default: 300
323
+ },
324
+ /**
325
+ * 配置项(只有进行车道-流向配置时可在canvas图上点击替换方向图标
326
+ * - Possible values:
327
+ * - LaneConfig
328
+ */
329
+ configType: {
330
+ type: String,
331
+ default: ''
332
+ },
333
+ /**
334
+ * 车道宽度
335
+ */
336
+ laneWidth: {
337
+ // 车道宽度
338
+ type: Number,
339
+ default: 22
340
+ },
341
+ /**
342
+ * 车道分隔线长度
343
+ */
344
+ laneDividerLength: {
345
+ type: Number,
346
+ default: 80
347
+ },
348
+ /**
349
+ * 车道-流向配置项
350
+ */
351
+ laneDirections: {
352
+ type: Array,
353
+ default: () => [{
354
+ img: left_default.a,
355
+ laneDirName: '左转'
356
+ }, {
357
+ img: straight_default.a,
358
+ laneDirName: '直行'
359
+ }, {
360
+ img: right_default.a,
361
+ laneDirName: '右转'
362
+ }, {
363
+ img: straightLeft_default.a,
364
+ laneDirName: '直左'
365
+ }, {
366
+ img: leftRight_default.a,
367
+ laneDirName: '左右'
368
+ }, {
369
+ img: straightRight_default.a,
370
+ laneDirName: '直右'
371
+ }, {
372
+ img: straightLeftRight_default.a,
373
+ laneDirName: '直左右'
374
+ }, {
375
+ img: turnAround_default.a,
376
+ laneDirName: '掉头'
377
+ }, {
378
+ img: otherPic_default.a,
379
+ laneDirName: '其他'
380
+ }]
381
+ },
382
+ /**
383
+ * 最大拥堵值
384
+ */
385
+ maxCongestionValue: {
386
+ type: Number,
387
+ default: 1
388
+ },
389
+ /**
390
+ * 是否可点击
391
+ */
392
+ clickEvent: {
393
+ // 是否添加点击事件
394
+ type: Boolean,
395
+ default: false
396
+ },
397
+ /**
398
+ * 是否显示拥堵指标值
399
+ */
400
+ congestionFactorVisible: {
401
+ // 是否在车道上显示指标值
402
+ type: Boolean,
403
+ default: false
404
+ },
405
+ /**
406
+ * 是否可多选车道
407
+ */
408
+ multiple: {
409
+ // 是否可多选车道
410
+ type: Boolean,
411
+ default: false
412
+ },
413
+ // 已被选择的车道
414
+ selectedLane: {
415
+ type: String,
416
+ default: ''
417
+ },
418
+ // 线段激活颜色
419
+ laneActiveColor: {
420
+ type: String,
421
+ default: '#27ffd5'
422
+ }
423
+ },
424
+ data() {
425
+ return {
426
+ data: [],
427
+ // laneWidth: 22, // 车道宽度
428
+ canvas: null,
429
+ laneDirCodeOption: [{
430
+ laneDirCode: '101',
431
+ img: 'left',
432
+ laneDirName: '左转'
433
+ }, {
434
+ laneDirCode: '102',
435
+ img: 'straight',
436
+ laneDirName: '直行'
437
+ }, {
438
+ laneDirCode: '103',
439
+ img: 'right',
440
+ laneDirName: '右转'
441
+ }, {
442
+ laneDirCode: '104',
443
+ img: 'straightLeft',
444
+ laneDirName: '直左'
445
+ }, {
446
+ laneDirCode: '109',
447
+ img: 'leftRight',
448
+ laneDirName: '左右'
449
+ }, {
450
+ laneDirCode: '105',
451
+ img: 'straightRight',
452
+ laneDirName: '直右'
453
+ }, {
454
+ laneDirCode: '106',
455
+ img: 'straightLeftRight',
456
+ laneDirName: '直左右'
457
+ }, {
458
+ laneDirCode: '107',
459
+ img: 'turnAround',
460
+ laneDirName: '掉头'
461
+ }, {
462
+ laneDirCode: '108',
463
+ img: 'otherPic',
464
+ laneDirName: '其他'
465
+ }],
466
+ currentLaneDirName: '',
467
+ currentGroup: null,
468
+ currentGroupBK: null,
469
+ showLegend: false,
470
+ canvasWidth: 300,
471
+ chooseGroup: [],
472
+ resizeHandler: null
473
+ };
474
+ },
475
+ components: {},
476
+ computed: {},
477
+ created() {
478
+ // 使用lodash的debounce函数添加防抖处理,限制resize事件触发频率
479
+ this.resizeHandler = lodash_default.a.debounce(() => {
480
+ if (this.canvas) {
481
+ this.canvas.dispose();
482
+ this.canvas = null;
483
+ this.$nextTick(() => {
484
+ this.init();
485
+ });
486
+ }
487
+ }, 200);
488
+
489
+ // 保存事件处理函数引用,以便后续移除
490
+ window.addEventListener('resize', this.resizeHandler);
491
+ },
492
+ mounted() {
493
+ this.init();
494
+ },
495
+ beforeDestroy() {
496
+ // 移除resize事件监听器,防止内存泄漏
497
+ window.removeEventListener('resize', this.resizeHandler);
498
+
499
+ // 取消防抖函数
500
+ this.resizeHandler.cancel();
501
+
502
+ // 销毁canvas实例
503
+ if (this.canvas) {
504
+ this.canvas.dispose();
505
+ this.canvas = null;
506
+ }
507
+ },
508
+ watch: {
509
+ laneDiagramData: {
510
+ handler(val) {
511
+ if (this.canvas) {
512
+ this.canvas.dispose();
513
+ this.canvas = null;
514
+ }
515
+ this.$nextTick(() => {
516
+ this.init();
517
+ });
518
+ },
519
+ deep: true
520
+ }
521
+ },
522
+ methods: {
523
+ init() {
524
+ const el = document.getElementById('canvasWrapper');
525
+ this.canvasWidth = el.offsetWidth;
526
+ this.canvas = new fabric["fabric"].Canvas(this.$refs.road, {
527
+ backgroundColor: 'rgba(17,94,7,0.4)',
528
+ selection: false,
529
+ width: this.canvasWidth,
530
+ height: this.canvasHeight
531
+ });
532
+
533
+ // 找到各方向进口车道数
534
+ const nLaneNum = this.laneDiagramData.filter(item => item.inDirection === '北').length;
535
+ const wLaneNum = this.laneDiagramData.filter(item => item.inDirection === '西').length;
536
+ const sLaneNum = this.laneDiagramData.filter(item => item.inDirection === '南').length;
537
+ const eLaneNum = this.laneDiagramData.filter(item => item.inDirection === '东').length;
538
+
539
+ // 路口底图点位,从北与西交叉点开始(标准十字路口)
540
+ const point1 = {
541
+ x: this.canvasWidth / 2 - this.laneWidth * nLaneNum,
542
+ y: this.canvasHeight / 2 - this.laneWidth * (eLaneNum ? eLaneNum : wLaneNum)
543
+ };
544
+ const point2 = {
545
+ x: 0,
546
+ y: this.canvasHeight / 2 - this.laneWidth * (eLaneNum ? eLaneNum : wLaneNum)
547
+ };
548
+ const point3 = {
549
+ x: 0,
550
+ y: this.canvasHeight / 2 + this.laneWidth * wLaneNum
551
+ };
552
+ const point4 = {
553
+ x: this.canvasWidth / 2 - this.laneWidth * (nLaneNum ? nLaneNum : sLaneNum),
554
+ y: this.canvasHeight / 2 + this.laneWidth * wLaneNum
555
+ };
556
+ const point5 = {
557
+ x: this.canvasWidth / 2 - this.laneWidth * (nLaneNum ? nLaneNum : sLaneNum),
558
+ y: this.canvasHeight
559
+ };
560
+ const point6 = {
561
+ x: this.canvasWidth / 2 + this.laneWidth * sLaneNum,
562
+ y: this.canvasHeight
563
+ };
564
+ const point7 = {
565
+ x: this.canvasWidth / 2 + this.laneWidth * sLaneNum,
566
+ y: this.canvasHeight / 2 + this.laneWidth * (wLaneNum ? wLaneNum : eLaneNum)
567
+ };
568
+ const point8 = {
569
+ x: this.canvasWidth,
570
+ y: this.canvasHeight / 2 + this.laneWidth * (wLaneNum ? wLaneNum : eLaneNum)
571
+ };
572
+ const point9 = {
573
+ x: this.canvasWidth,
574
+ y: this.canvasHeight / 2 - this.laneWidth * eLaneNum
575
+ };
576
+ const point10 = {
577
+ x: this.canvasWidth / 2 + this.laneWidth * (sLaneNum ? sLaneNum : nLaneNum),
578
+ y: this.canvasHeight / 2 - this.laneWidth * eLaneNum
579
+ };
580
+ const point11 = {
581
+ x: this.canvasWidth / 2 + this.laneWidth * (sLaneNum ? sLaneNum : nLaneNum),
582
+ y: 0
583
+ };
584
+ const point12 = {
585
+ x: this.canvasWidth / 2 - this.laneWidth * nLaneNum,
586
+ y: 0
587
+ };
588
+ // 画路口图连线
589
+ var raodBase = new fabric["fabric"].Polygon([point1, wLaneNum !== 0 ? point2 : {}, wLaneNum !== 0 ? point3 : {}, point4, sLaneNum !== 0 ? point5 : {}, sLaneNum !== 0 ? point6 : {}, point7, eLaneNum !== 0 ? point8 : {}, eLaneNum !== 0 ? point9 : {}, point10, nLaneNum !== 0 ? point11 : {}, nLaneNum !== 0 ? point12 : point1], {
590
+ fill: '#989898',
591
+ stroke: '#fff',
592
+ strokeWidth: 2,
593
+ selectable: false
594
+ });
595
+ this.canvas.add(raodBase);
596
+ raodBase.on('mousedown', () => {
597
+ // 点击路口灰色底图部分,关闭图例弹窗
598
+ this.showLegend = false;
599
+ });
600
+ // 绘制黄实线
601
+ const nYellowLine = {
602
+ x1: this.canvasWidth / 2,
603
+ y1: 0,
604
+ x2: this.canvasWidth / 2,
605
+ y2: this.canvasHeight / 2 - this.laneWidth * (eLaneNum ? eLaneNum : wLaneNum)
606
+ }; // 北方向
607
+ const wYellowLine = {
608
+ x1: 0,
609
+ y1: this.canvasHeight / 2,
610
+ x2: this.canvasWidth / 2 - this.laneWidth * (nLaneNum ? nLaneNum : sLaneNum),
611
+ y2: this.canvasHeight / 2
612
+ }; // 西方向
613
+ const sYellowLine = {
614
+ x1: this.canvasWidth / 2,
615
+ y1: this.canvasHeight,
616
+ x2: this.canvasWidth / 2,
617
+ y2: this.canvasHeight / 2 + this.laneWidth * (wLaneNum ? wLaneNum : eLaneNum)
618
+ }; // 南方向
619
+ const eYellowLine = {
620
+ x1: this.canvasWidth,
621
+ y1: this.canvasHeight / 2,
622
+ x2: this.canvasWidth / 2 + this.laneWidth * (sLaneNum ? sLaneNum : nLaneNum),
623
+ y2: this.canvasHeight / 2
624
+ }; // 东方向
625
+ const lines = [nLaneNum ? nYellowLine : {}, wLaneNum ? wYellowLine : {}, sLaneNum ? sYellowLine : {}, eLaneNum ? eYellowLine : {} // 东方向
626
+ ];
627
+ lines.forEach(line => {
628
+ const fabricLine = new fabric["fabric"].Line([line.x1, line.y1, line.x2, line.y2], {
629
+ stroke: '#e6c130',
630
+ // 线条颜色
631
+ strokeWidth: 2 // 线条宽度
632
+ });
633
+ this.canvas.add(fabricLine);
634
+ });
635
+
636
+ // 绘制车道线
637
+ const laneLineLength = this.laneDividerLength; // 车道线长度
638
+ // 绘制各方向车道组(北西南东)
639
+ if (nLaneNum > 0) {
640
+ const nData = this.laneDiagramData.filter(item => item.inDirection === '北');
641
+ for (let i = 0; i < nData.length; i++) {
642
+ const line = {
643
+ x1: this.canvasWidth / 2 - this.laneWidth * (i + 1),
644
+ y1: this.canvasHeight / 2 - this.laneWidth * (eLaneNum ? eLaneNum : wLaneNum),
645
+ x2: this.canvasWidth / 2 - this.laneWidth * (i + 1),
646
+ y2: this.canvasHeight / 2 - this.laneWidth * (eLaneNum ? eLaneNum : wLaneNum) - laneLineLength
647
+ };
648
+
649
+ // 添加图标
650
+ const temp = nData[i];
651
+ const value = Math.round(temp.congestionFactor * 10) / 10;
652
+ const laneDirItem = this.laneDirections.find(item => item.laneDirName === temp.laneDirName);
653
+ if (laneDirItem) {
654
+ fabric["fabric"].Image.fromURL(laneDirItem.img, img => {
655
+ img.scaleToWidth(this.laneWidth);
656
+ // 绘制车道白线
657
+ const fabricLine = new fabric["fabric"].Line([line.x1, line.y1, line.x2, line.y2], {
658
+ stroke: '#fff',
659
+ // 线条颜色
660
+ strokeWidth: 1 // 线条宽度
661
+ });
662
+ // 绘制车道矩形
663
+ var rect = new fabric["fabric"].Rect({
664
+ width: this.laneWidth,
665
+ height: this.canvasHeight / 2 - this.laneWidth * (eLaneNum ? eLaneNum : wLaneNum),
666
+ fill: this.calcBgColor(value),
667
+ left: this.canvasWidth / 2 - this.laneWidth * (i + 1),
668
+ top: 0
669
+ });
670
+ if (this.currentGroup && this.currentGroup.name === `N_L${temp.laneNo}`) {
671
+ rect.set('fill', this.laneActiveColor);
672
+ }
673
+ // 绘制文本
674
+ var text = new fabric["fabric"].Textbox(`${Number(temp.laneNo)}`, {
675
+ fontSize: 18,
676
+ left: this.canvasWidth / 2 - this.laneWidth * (i + 1),
677
+ top: (this.canvasHeight - this.laneWidth * (eLaneNum ? eLaneNum : wLaneNum) - this.laneWidth * wLaneNum) / 2 - 22,
678
+ textAlign: 'center',
679
+ width: this.laneWidth,
680
+ fill: '#fff',
681
+ angle: 180,
682
+ originX: 'right',
683
+ originY: 'bottom'
684
+ });
685
+ let text2 = new fabric["fabric"].Textbox(`${value ? value : '0'}`, {
686
+ fontSize: 12,
687
+ left: this.canvasWidth / 2 - this.laneWidth * (i + 1 - 0.25),
688
+ top: 5,
689
+ textAlign: 'left',
690
+ width: this.laneWidth,
691
+ fill: '#fff',
692
+ angle: 90,
693
+ originX: 'left',
694
+ originY: 'bottom'
695
+ });
696
+ let groupList = [];
697
+ if (this.congestionFactorVisible) {
698
+ groupList = [rect, text, text2, img, fabricLine];
699
+ } else {
700
+ groupList = [rect, text, img, fabricLine];
701
+ }
702
+ var group = new fabric["fabric"].Group(groupList, {
703
+ name: `N_L${temp.laneNo}`,
704
+ objectCaching: false,
705
+ selectable: false
706
+ });
707
+ this.canvas.add(group);
708
+ if (this.clickEvent) {
709
+ group.on('mousedown', e => {
710
+ if (this.configType === 'LaneConfig') {
711
+ this.showLegend = true;
712
+ }
713
+ this.mousedownFun(e);
714
+ });
715
+ group.on('mousemove', e => {
716
+ this.canvas.setCursor('pointer');
717
+ });
718
+ }
719
+ }, {
720
+ name: laneDirItem.laneDirName,
721
+ left: this.canvasWidth / 2 - this.laneWidth * (i + 1),
722
+ top: (this.canvasHeight - this.laneWidth * (eLaneNum ? eLaneNum : wLaneNum) - this.laneWidth * wLaneNum) / 2 - 50,
723
+ angle: 180,
724
+ originX: 'right',
725
+ originY: 'bottom'
726
+ });
727
+ } else {
728
+ console.error(`${temp.inDirection}向 - ${temp.laneDirName}车道,图标缺少!`);
729
+ }
730
+ }
731
+ }
732
+ if (wLaneNum > 0) {
733
+ const wData = this.laneDiagramData.filter(item => item.inDirection === '西');
734
+ for (let i = 0; i < wData.length; i++) {
735
+ const line = {
736
+ x1: this.canvasWidth / 2 - this.laneWidth * (nLaneNum ? nLaneNum : sLaneNum),
737
+ y1: this.canvasHeight / 2 + this.laneWidth * (i + 1),
738
+ x2: this.canvasWidth / 2 - this.laneWidth * (nLaneNum ? nLaneNum : sLaneNum) - laneLineLength,
739
+ y2: this.canvasHeight / 2 + this.laneWidth * (i + 1)
740
+ };
741
+
742
+ // 添加图标
743
+ const temp = wData[i];
744
+ const value = Math.round(temp.congestionFactor * 10) / 10;
745
+ const laneDirItem = this.laneDirections.find(item => item.laneDirName === temp.laneDirName);
746
+ if (laneDirItem) {
747
+ fabric["fabric"].Image.fromURL(laneDirItem.img, img => {
748
+ img.scaleToWidth(this.laneWidth);
749
+ // 绘制车道白线
750
+ const fabricLine = new fabric["fabric"].Line([line.x1, line.y1, line.x2, line.y2], {
751
+ stroke: '#fff',
752
+ // 线条颜色
753
+ strokeWidth: 1 // 线条宽度
754
+ });
755
+
756
+ // 绘制车道矩形
757
+ var rect = new fabric["fabric"].Rect({
758
+ // width: laneLineLength,
759
+ width: this.canvasWidth / 2 - this.laneWidth * (nLaneNum ? nLaneNum : sLaneNum),
760
+ height: this.laneWidth,
761
+ fill: this.calcBgColor(value),
762
+ left: 0,
763
+ top: this.canvasHeight / 2 + this.laneWidth * i
764
+ });
765
+ if (this.currentGroup && this.currentGroup.name === `W_L${temp.laneNo}`) {
766
+ rect.set('fill', this.laneActiveColor);
767
+ }
768
+ var text = new fabric["fabric"].Textbox(`${Number(temp.laneNo)}`, {
769
+ // 绘制文本
770
+ fontSize: 18,
771
+ left: this.canvasWidth / 2 - this.laneWidth * (nLaneNum ? nLaneNum : sLaneNum),
772
+ top: this.canvasHeight / 2 + this.laneWidth * i,
773
+ textAlign: 'center',
774
+ width: this.laneWidth,
775
+ fill: '#fff',
776
+ angle: 90,
777
+ originX: 'left',
778
+ originY: 'top'
779
+ });
780
+ let text2 = new fabric["fabric"].Textbox(`${value ? value : '0'}`, {
781
+ // 绘制文本
782
+ fontSize: 12,
783
+ left: 5,
784
+ top: this.canvasHeight / 2 + this.laneWidth * (i + 0.25),
785
+ textAlign: 'left',
786
+ width: this.laneWidth,
787
+ fill: '#fff',
788
+ originX: 'left',
789
+ originY: 'top'
790
+ });
791
+ let groupList = [];
792
+ if (this.congestionFactorVisible) {
793
+ groupList = [rect, text, text2, img, fabricLine];
794
+ } else {
795
+ groupList = [rect, text, img, fabricLine];
796
+ }
797
+ var group = new fabric["fabric"].Group(groupList, {
798
+ name: `W_L${temp.laneNo}`,
799
+ objectCaching: false,
800
+ selectable: false
801
+ });
802
+ this.canvas.add(group);
803
+ if (this.clickEvent) {
804
+ group.on('mousedown', e => {
805
+ if (this.configType === 'LaneConfig') {
806
+ this.showLegend = true;
807
+ }
808
+ this.mousedownFun(e);
809
+ });
810
+ group.on('mousemove', e => {
811
+ this.canvas.setCursor('pointer');
812
+ });
813
+ }
814
+ }, {
815
+ name: laneDirItem.laneDirName,
816
+ left: this.canvasWidth / 2 - this.laneWidth * (nLaneNum ? nLaneNum : sLaneNum) - 30,
817
+ top: this.canvasHeight / 2 + this.laneWidth * i,
818
+ angle: 90,
819
+ originX: 'left',
820
+ originY: 'top'
821
+ });
822
+ } else {
823
+ console.error(`${temp.inDirection}向 - ${temp.laneDirName}车道,图标缺少!`);
824
+ }
825
+ }
826
+ }
827
+ if (sLaneNum > 0) {
828
+ const sData = this.laneDiagramData.filter(item => item.inDirection === '南');
829
+ for (let i = 0; i < sData.length; i++) {
830
+ const line = {
831
+ x1: this.canvasWidth / 2 + this.laneWidth * (i + 1),
832
+ y1: this.canvasHeight / 2 + this.laneWidth * (wLaneNum ? wLaneNum : eLaneNum),
833
+ x2: this.canvasWidth / 2 + this.laneWidth * (i + 1),
834
+ y2: this.canvasHeight / 2 + this.laneWidth * (wLaneNum ? wLaneNum : eLaneNum) + laneLineLength
835
+ };
836
+
837
+ // 添加图标
838
+ const temp = sData[i];
839
+ const value = Math.round(temp.congestionFactor * 10) / 10;
840
+ const laneDirItem = this.laneDirections.find(item => item.laneDirName === temp.laneDirName);
841
+ if (laneDirItem) {
842
+ fabric["fabric"].Image.fromURL(laneDirItem.img, img => {
843
+ img.scaleToWidth(this.laneWidth);
844
+ // 绘制车道白线
845
+ const fabricLine = new fabric["fabric"].Line([line.x1, line.y1, line.x2, line.y2], {
846
+ stroke: '#fff',
847
+ // 线条颜色
848
+ strokeWidth: 1 // 线条宽度
849
+ });
850
+
851
+ // 绘制车道矩形
852
+ var rect = new fabric["fabric"].Rect({
853
+ width: this.laneWidth,
854
+ // height: laneLineLength,
855
+ height: this.canvasHeight / 2,
856
+ fill: this.calcBgColor(value),
857
+ left: this.canvasWidth / 2 + this.laneWidth * i,
858
+ top: this.canvasHeight / 2 + this.laneWidth * (wLaneNum ? wLaneNum : eLaneNum)
859
+ });
860
+ if (this.currentGroup && this.currentGroup.name === `S_L${temp.laneNo}`) {
861
+ rect.set('fill', this.laneActiveColor);
862
+ }
863
+ var text = new fabric["fabric"].Textbox(`${Number(temp.laneNo)}`, {
864
+ // 绘制文本
865
+ fontSize: 18,
866
+ left: this.canvasWidth / 2 + this.laneWidth * i,
867
+ top: this.canvasHeight / 2 + this.laneWidth * (wLaneNum ? wLaneNum : eLaneNum),
868
+ textAlign: 'center',
869
+ width: this.laneWidth,
870
+ fill: '#fff'
871
+ });
872
+ let text2 = new fabric["fabric"].Textbox(`${value ? value : '0'}`, {
873
+ // 绘制文本
874
+ fontSize: 12,
875
+ left: this.canvasWidth / 2 + this.laneWidth * (i + 0.25),
876
+ top: this.canvasHeight - 5,
877
+ textAlign: 'left',
878
+ width: this.laneWidth,
879
+ fill: '#fff',
880
+ angle: -90
881
+ });
882
+ let groupList = [];
883
+ if (this.congestionFactorVisible) {
884
+ groupList = [rect, text, text2, img, fabricLine];
885
+ } else {
886
+ groupList = [rect, text, img, fabricLine];
887
+ }
888
+ var group = new fabric["fabric"].Group(groupList, {
889
+ name: `S_L${temp.laneNo}`,
890
+ objectCaching: false,
891
+ selectable: false
892
+ });
893
+ this.canvas.add(group);
894
+ if (this.clickEvent) {
895
+ group.on('mousedown', e => {
896
+ if (this.configType === 'LaneConfig') {
897
+ this.showLegend = true;
898
+ }
899
+ this.mousedownFun(e);
900
+ });
901
+ group.on('mousemove', e => {
902
+ this.canvas.setCursor('pointer');
903
+ });
904
+ }
905
+ }, {
906
+ name: laneDirItem.laneDirName,
907
+ left: this.canvasWidth / 2 + this.laneWidth * i,
908
+ top: this.canvasHeight / 2 + this.laneWidth * (wLaneNum ? wLaneNum : eLaneNum) + 30
909
+ });
910
+ }
911
+ }
912
+ }
913
+ if (eLaneNum > 0) {
914
+ const eData = this.laneDiagramData.filter(item => item.inDirection === '东');
915
+ for (let i = 0; i < eData.length; i++) {
916
+ const line = {
917
+ x1: this.canvasWidth / 2 + this.laneWidth * (sLaneNum ? sLaneNum : nLaneNum),
918
+ y1: this.canvasHeight / 2 - this.laneWidth * (i + 1),
919
+ x2: this.canvasWidth / 2 + this.laneWidth * (sLaneNum ? sLaneNum : nLaneNum) + laneLineLength,
920
+ y2: this.canvasHeight / 2 - this.laneWidth * (i + 1)
921
+ };
922
+
923
+ // 添加图标
924
+ const temp = eData[i];
925
+ const value = Math.round(temp.congestionFactor * 10) / 10;
926
+ const laneDirItem = this.laneDirections.find(item => item.laneDirName === temp.laneDirName);
927
+ if (laneDirItem) {
928
+ fabric["fabric"].Image.fromURL(laneDirItem.img, img => {
929
+ img.scaleToWidth(this.laneWidth);
930
+ // 绘制车道白线
931
+ const fabricLine = new fabric["fabric"].Line([line.x1, line.y1, line.x2, line.y2], {
932
+ stroke: '#fff',
933
+ // 线条颜色
934
+ strokeWidth: 1 // 线条宽度
935
+ });
936
+ // 绘制车道矩形
937
+ var rect = new fabric["fabric"].Rect({
938
+ width: this.canvasWidth / 2,
939
+ height: this.laneWidth,
940
+ fill: this.calcBgColor(value),
941
+ left: this.canvasWidth / 2 + this.laneWidth * (sLaneNum ? sLaneNum : nLaneNum),
942
+ top: this.canvasHeight / 2 - this.laneWidth * (i + 1)
943
+ });
944
+ if (this.currentGroup && this.currentGroup.name === `E_L${temp.laneNo}`) {
945
+ rect.set('fill', this.laneActiveColor);
946
+ }
947
+ var text = new fabric["fabric"].Textbox(`${Number(temp.laneNo)}`, {
948
+ // 绘制文本
949
+ fontSize: 18,
950
+ left: this.canvasWidth / 2 + this.laneWidth * (sLaneNum ? sLaneNum : nLaneNum),
951
+ top: this.canvasHeight / 2 - this.laneWidth * (i + 1),
952
+ textAlign: 'center',
953
+ width: this.laneWidth,
954
+ fill: '#fff',
955
+ angle: -90,
956
+ originX: 'right',
957
+ originY: 'top'
958
+ });
959
+ let text2 = new fabric["fabric"].Textbox(`${value ? value : '0'}`, {
960
+ // 绘制文本
961
+ fontSize: 12,
962
+ left: this.canvasWidth - 5,
963
+ top: this.canvasHeight / 2 - this.laneWidth * (i + 1 - 0.25),
964
+ textAlign: 'center',
965
+ width: this.laneWidth,
966
+ fill: '#fff',
967
+ // angle: -90,
968
+ originX: 'right',
969
+ originY: 'top'
970
+ });
971
+ let groupList = [];
972
+ if (this.congestionFactorVisible) {
973
+ groupList = [rect, text, text2, img, fabricLine];
974
+ } else {
975
+ groupList = [rect, text, img, fabricLine];
976
+ }
977
+ var group = new fabric["fabric"].Group(groupList, {
978
+ name: `E_L${temp.laneNo}`,
979
+ objectCaching: false,
980
+ selectable: false
981
+ });
982
+ this.canvas.add(group);
983
+ if (this.clickEvent) {
984
+ group.on('mousedown', e => {
985
+ if (this.configType === 'LaneConfig') {
986
+ this.showLegend = true;
987
+ }
988
+ this.mousedownFun(e);
989
+ });
990
+ group.on('mousemove', e => {
991
+ this.canvas.setCursor('pointer');
992
+ });
993
+ }
994
+ }, {
995
+ name: laneDirItem.laneDirName,
996
+ left: this.canvasWidth / 2 + this.laneWidth * (sLaneNum ? sLaneNum : nLaneNum) + 30,
997
+ top: this.canvasHeight / 2 - this.laneWidth * (i + 1),
998
+ angle: -90,
999
+ originX: 'right',
1000
+ originY: 'top'
1001
+ });
1002
+ }
1003
+ }
1004
+ }
1005
+ // 北停止线
1006
+ const nStopLine = {
1007
+ x1: this.canvasWidth / 2 - this.laneWidth * nLaneNum,
1008
+ y1: this.canvasHeight / 2 - this.laneWidth * (eLaneNum ? eLaneNum : wLaneNum),
1009
+ x2: this.canvasWidth / 2,
1010
+ y2: this.canvasHeight / 2 - this.laneWidth * (eLaneNum ? eLaneNum : wLaneNum)
1011
+ };
1012
+ // 西停止线
1013
+ const wStopLine = {
1014
+ x1: this.canvasWidth / 2 - this.laneWidth * (nLaneNum ? nLaneNum : sLaneNum),
1015
+ y1: this.canvasHeight / 2,
1016
+ x2: this.canvasWidth / 2 - this.laneWidth * (nLaneNum ? nLaneNum : sLaneNum),
1017
+ y2: this.canvasHeight / 2 + this.laneWidth * wLaneNum
1018
+ };
1019
+
1020
+ // 南停止线
1021
+ const sStopLine = {
1022
+ x1: this.canvasWidth / 2,
1023
+ y1: this.canvasHeight / 2 + this.laneWidth * (wLaneNum ? wLaneNum : eLaneNum),
1024
+ x2: this.canvasWidth / 2 + this.laneWidth * sLaneNum,
1025
+ y2: this.canvasHeight / 2 + this.laneWidth * (wLaneNum ? wLaneNum : eLaneNum)
1026
+ };
1027
+
1028
+ // 东停止线
1029
+ const eStopLine = {
1030
+ x1: this.canvasWidth / 2 + this.laneWidth * (sLaneNum ? sLaneNum : nLaneNum),
1031
+ y1: this.canvasHeight / 2 - this.laneWidth * eLaneNum,
1032
+ x2: this.canvasWidth / 2 + this.laneWidth * (sLaneNum ? sLaneNum : nLaneNum),
1033
+ y2: this.canvasHeight / 2
1034
+ };
1035
+ let laneLines = [];
1036
+ laneLines.push(wStopLine);
1037
+ laneLines.push(nStopLine);
1038
+ laneLines.push(sStopLine);
1039
+ laneLines.push(eStopLine);
1040
+ laneLines.forEach(line => {
1041
+ this.addFabricLine(line, '#fff', 1);
1042
+ });
1043
+ },
1044
+ changeLane(laneDirCodes) {
1045
+ if (laneDirCodes) {
1046
+ if (this.canvas) {
1047
+ laneDirCodes.forEach(item => {
1048
+ // 根据车道编号获取canvas上指定group
1049
+ const currentGroup = this.canvas.getObjects().find(o => o.type === 'group' && o.name === item);
1050
+ // 获取当前group下车道对象
1051
+ if (currentGroup) {
1052
+ var rect = currentGroup.getObjects().find(o => {
1053
+ return o.type === 'rect';
1054
+ });
1055
+ rect.set('fill', this.laneActiveColor);
1056
+ }
1057
+ });
1058
+ this.canvas.getObjects().forEach(o => {
1059
+ if (o.type === 'group' && !laneDirCodes.includes(o.name)) {
1060
+ var rect = o.getObjects().find(o => {
1061
+ return o.type === 'rect';
1062
+ });
1063
+ rect.set('fill', 'transparent');
1064
+ }
1065
+ });
1066
+ this.canvas.renderAll();
1067
+ }
1068
+ }
1069
+ },
1070
+ // 更改车道流向(canvas对应更新)
1071
+ changeLaneDir({
1072
+ laneDirCode,
1073
+ laneDirName
1074
+ }) {
1075
+ // 根据车道编号获取canvas上指定group
1076
+ if (this.canvas) {
1077
+ const currentGroup = this.canvas.getObjects().find(o => o.type === 'group' && o.name === laneDirCode);
1078
+ // 获取当前group下车道对象
1079
+ var rect = currentGroup.getObjects().find(o => {
1080
+ return o.type === 'rect';
1081
+ });
1082
+ // 获取当前group下图标
1083
+ var image = currentGroup.getObjects().find(o => {
1084
+ return o.type === 'image';
1085
+ });
1086
+ const laneDirItem = this.laneDirections.find(item => item.laneDirName === laneDirName);
1087
+ const imgSrc = laneDirItem.img;
1088
+ image.setSrc(imgSrc, () => {
1089
+ rect.set('fill', this.laneActiveColor);
1090
+ this.canvas.renderAll();
1091
+ });
1092
+ this.canvas.getObjects().forEach(o => {
1093
+ if (o.type === 'group' && o.name !== laneDirCode) {
1094
+ var rect = o.getObjects().find(o => {
1095
+ return o.type === 'rect';
1096
+ });
1097
+ rect.set('fill', 'transparent');
1098
+ }
1099
+ });
1100
+ this.canvas.renderAll();
1101
+ }
1102
+ },
1103
+ addFabricLine(line, color, strokeWidth = 1) {
1104
+ // 绘制线
1105
+ const fabricLine = new fabric["fabric"].Line([line.x1, line.y1, line.x2, line.y2], {
1106
+ stroke: color,
1107
+ // 线条颜色
1108
+ strokeWidth: strokeWidth // 线条宽度
1109
+ });
1110
+ this.canvas.add(fabricLine);
1111
+ },
1112
+ mousedownFun(e) {
1113
+ // 鼠标点击事件
1114
+ // 根据车道编号获取canvas上指定group
1115
+ const currentGroup = this.canvas.getObjects().find(o => o.type === 'group' && o.name === e.target.name);
1116
+ // 获取当前group下车道对象
1117
+ var rect = currentGroup.getObjects().find(o => {
1118
+ return o.type === 'rect';
1119
+ });
1120
+ if (this.multiple) {
1121
+ // 车道可多选
1122
+ if (rect.choosen) {
1123
+ rect.set('fill', 'transparent');
1124
+ rect.set('choosen', false);
1125
+ let index = this.chooseGroup.findIndex(item => item === currentGroup.name);
1126
+ this.chooseGroup.splice(index, 1);
1127
+ } else {
1128
+ rect.set('choosen', true);
1129
+ rect.set('fill', this.laneActiveColor);
1130
+ this.chooseGroup.push(currentGroup.name);
1131
+ }
1132
+ this.$emit('chooseLane', this.chooseGroup);
1133
+ } else {
1134
+ rect.set('fill', this.laneActiveColor);
1135
+ this.currentGroup = currentGroup;
1136
+ this.currentGroupBK = lodash_default.a.cloneDeep(currentGroup);
1137
+ this.canvas.getObjects().forEach(o => {
1138
+ if (o.type === 'group' && o.name !== e.target.name) {
1139
+ var rect = o.getObjects().find(o => {
1140
+ return o.type === 'rect';
1141
+ });
1142
+ rect.set('fill', 'transparent');
1143
+ }
1144
+ });
1145
+ this.$nextTick(() => {
1146
+ const ele = this.$refs.legendBox;
1147
+ ele.style.top = e.target.top + 'px';
1148
+ ele.style.left = e.target.left + 80 + 'px';
1149
+ this.currentLaneDirName = e.target.getObjects().filter(item => item.type === 'image')[0].name;
1150
+ // 选择右侧表格一行数据
1151
+ this.$emit('selectLane', {
1152
+ laneDirCode: this.currentGroup.name
1153
+ });
1154
+ });
1155
+ }
1156
+ this.canvas.renderAll();
1157
+ },
1158
+ chooseImg(item) {
1159
+ // 选择图片
1160
+ this.currentLaneDirName = item.laneDirName;
1161
+ // 获取当前group下图标
1162
+ var image = this.currentGroup.getObjects().find(o => {
1163
+ return o.type === 'image';
1164
+ });
1165
+ const imgSrc = item.img;
1166
+ image.setSrc(imgSrc, () => {
1167
+ this.currentGroup = lodash_default.a.cloneDeep(this.currentGroupBK);
1168
+ });
1169
+ this.$emit('changeLaneDir', {
1170
+ laneDirCode: this.currentGroup.name,
1171
+ laneDirName: item.laneDirName
1172
+ });
1173
+ },
1174
+ calcBgColor(value) {
1175
+ if (value || value == 0) {
1176
+ const colorList = [{
1177
+ r: 0,
1178
+ g: 104,
1179
+ b: 55
1180
+ }, {
1181
+ r: 26,
1182
+ g: 152,
1183
+ b: 80
1184
+ }, {
1185
+ r: 102,
1186
+ g: 189,
1187
+ b: 99
1188
+ }, {
1189
+ r: 166,
1190
+ g: 217,
1191
+ b: 106
1192
+ }, {
1193
+ r: 217,
1194
+ g: 239,
1195
+ b: 139
1196
+ }, {
1197
+ r: 255,
1198
+ g: 255,
1199
+ b: 191
1200
+ }, {
1201
+ r: 254,
1202
+ g: 224,
1203
+ b: 139
1204
+ }, {
1205
+ r: 253,
1206
+ g: 174,
1207
+ b: 97
1208
+ }, {
1209
+ r: 244,
1210
+ g: 109,
1211
+ b: 67
1212
+ }, {
1213
+ r: 215,
1214
+ g: 48,
1215
+ b: 39
1216
+ }, {
1217
+ r: 165,
1218
+ g: 0,
1219
+ b: 38
1220
+ }];
1221
+ let startColor = '';
1222
+ let endColor = '';
1223
+ const percentage = value / this.maxCongestionValue; // 获取百分比
1224
+ if (percentage >= 0 && percentage <= 0.1) {
1225
+ startColor = colorList[0];
1226
+ endColor = colorList[1];
1227
+ } else if (percentage > 0.1 && percentage <= 0.2) {
1228
+ startColor = colorList[1];
1229
+ endColor = colorList[2];
1230
+ } else if (percentage > 0.2 && percentage <= 0.3) {
1231
+ startColor = colorList[2];
1232
+ endColor = colorList[3];
1233
+ } else if (percentage > 0.3 && percentage <= 0.4) {
1234
+ startColor = colorList[3];
1235
+ endColor = colorList[4];
1236
+ } else if (percentage > 0.4 && percentage <= 0.5) {
1237
+ startColor = colorList[4];
1238
+ endColor = colorList[5];
1239
+ } else if (percentage > 0.5 && percentage <= 0.6) {
1240
+ startColor = colorList[5];
1241
+ endColor = colorList[6];
1242
+ } else if (percentage > 0.6 && percentage <= 0.7) {
1243
+ startColor = colorList[6];
1244
+ endColor = colorList[7];
1245
+ } else if (percentage > 0.7 && percentage <= 0.8) {
1246
+ startColor = colorList[7];
1247
+ endColor = colorList[8];
1248
+ } else if (percentage > 0.8 && percentage <= 0.9) {
1249
+ startColor = colorList[8];
1250
+ endColor = colorList[9];
1251
+ } else if (percentage > 0.9 && percentage <= 1) {
1252
+ startColor = colorList[9];
1253
+ endColor = colorList[10];
1254
+ } else if (percentage > 1) {
1255
+ startColor = colorList[10];
1256
+ endColor = colorList[10];
1257
+ }
1258
+ // 插值计算 RGB 值
1259
+ const r = Math.floor(startColor.r + (endColor.r - startColor.r) * percentage);
1260
+ const g = Math.floor(startColor.g + (endColor.g - startColor.g) * percentage);
1261
+ const b = Math.floor(startColor.b + (endColor.b - startColor.b) * percentage);
1262
+ return `rgb(${r}, ${g}, ${b})`;
1263
+ } else {
1264
+ return 'transparent';
1265
+ }
1266
+ }
1267
+ }
1268
+ });
1269
+ // CONCATENATED MODULE: ./src/components/traffic-lane/index.vue?vue&type=script&lang=js
1270
+ /* harmony default export */ var components_traffic_lanevue_type_script_lang_js = (traffic_lanevue_type_script_lang_js);
1271
+ // EXTERNAL MODULE: ./src/components/traffic-lane/index.vue?vue&type=style&index=0&id=52147a10&prod&scoped=true&lang=scss
1272
+ var traffic_lanevue_type_style_index_0_id_52147a10_prod_scoped_true_lang_scss = __webpack_require__("acb9");
1273
+
1274
+ // EXTERNAL MODULE: ./node_modules/vue-loader/lib/runtime/componentNormalizer.js
1275
+ var componentNormalizer = __webpack_require__("2877");
1276
+
1277
+ // CONCATENATED MODULE: ./src/components/traffic-lane/index.vue
1278
+
1279
+
1280
+
1281
+
1282
+
1283
+
1284
+ /* normalize component */
1285
+
1286
+ var component = Object(componentNormalizer["a" /* default */])(
1287
+ components_traffic_lanevue_type_script_lang_js,
1288
+ render,
1289
+ staticRenderFns,
1290
+ false,
1291
+ null,
1292
+ "52147a10",
1293
+ null
1294
+
1295
+ )
1296
+
1297
+ /* harmony default export */ var traffic_lane = (component.exports);
1298
+ // CONCATENATED MODULE: ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"f2351f80-vue-loader-template"}!./node_modules/cache-loader/dist/cjs.js??ref--13-0!./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib!./node_modules/vue-loader/lib/loaders/templateLoader.js??ref--6!./node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/green-wave/index.vue?vue&type=template&id=9b8515cc&scoped=true
1299
+ var green_wavevue_type_template_id_9b8515cc_scoped_true_render = function render() {
1300
+ var _vm = this,
1301
+ _c = _vm._self._c;
1302
+ return _c('div', {
1303
+ staticClass: "canvas-wrapper"
1304
+ }, [_c('canvas', {
1305
+ ref: "canvas_l",
1306
+ style: {
1307
+ width: _vm.yAxisWidth + 'px'
1308
+ }
1309
+ }), _c('canvas', {
1310
+ ref: "canvas",
1311
+ staticStyle: {
1312
+ "flex": "1"
1313
+ }
1314
+ })]);
1315
+ };
1316
+ var green_wavevue_type_template_id_9b8515cc_scoped_true_staticRenderFns = [];
1317
+
1318
+ // CONCATENATED MODULE: ./src/components/green-wave/index.vue?vue&type=template&id=9b8515cc&scoped=true
1319
+
1320
+ // CONCATENATED MODULE: ./node_modules/cache-loader/dist/cjs.js??ref--13-0!./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/green-wave/index.vue?vue&type=script&lang=js
1321
+
1322
+
1323
+ /* harmony default export */ var green_wavevue_type_script_lang_js = ({
1324
+ name: 'green-wave',
1325
+ props: {
1326
+ /**
1327
+ * 绿波路口数据
1328
+ * - Possible values:
1329
+ * - Array
1330
+ * 字段描述:
1331
+ * - crossId: string - 路口ID
1332
+ * - crossRoadName: string - 路口名称
1333
+ * - crossDistance: number - 路口距离
1334
+ * - orderNumber: number - 排序编号
1335
+ * - forwardGreen: number - 路口正向车道绿灯时长(A路口 -> B路口)
1336
+ * - reverseGreen: number - 路口反向车道绿灯时长(B路口 -> A路口)
1337
+ * - forwardSpeed: number - 路口正向车道速度(A路口 -> B路口)
1338
+ * - reverseSpeed: number - 路口反向车道速度(B路口 -> A路口)
1339
+ * - forwardPhaseDiff: number - 路口正向车道相位差时长(A路口 -> B路口)
1340
+ * - reversePhaseDiff: number - 路口反向车道相位差时长(B路口 -> A路口)
1341
+ * - greenFlag: boolean - 绿波标志
1342
+ * - phaseDiffFlag: boolean - 相位标志
1343
+ */
1344
+ crossData: {
1345
+ type: Array,
1346
+ default: () => []
1347
+ },
1348
+ /**
1349
+ * 画布高度
1350
+ */
1351
+ canvasHeight: {
1352
+ type: Number,
1353
+ default: 500
1354
+ },
1355
+ /**
1356
+ * 是否正向(从上到下, 从左到右为正方向)
1357
+ */
1358
+ forwardDirection: {
1359
+ type: Boolean,
1360
+ default: true
1361
+ },
1362
+ /**
1363
+ * 绿波周期间隔(单位:秒)
1364
+ */
1365
+ interval: {
1366
+ type: Number,
1367
+ default: 70
1368
+ },
1369
+ /**
1370
+ * 正向绿波颜色
1371
+ */
1372
+ forwardColor: {
1373
+ type: String,
1374
+ default: '#058213'
1375
+ },
1376
+ /**
1377
+ * 反向绿波颜色
1378
+ */
1379
+ backwardColor: {
1380
+ type: String,
1381
+ default: '#0eed28'
1382
+ },
1383
+ /**
1384
+ * 拖拽线宽
1385
+ */
1386
+ dragStrokeWidth: {
1387
+ type: Number,
1388
+ default: 5
1389
+ },
1390
+ /**
1391
+ * 单绿波宽度
1392
+ * 值越小宽度越小,值越大宽度越大
1393
+ */
1394
+ singleWaveWidth: {
1395
+ type: Number,
1396
+ default: 2
1397
+ },
1398
+ /**
1399
+ * X轴底部间距
1400
+ */
1401
+ xAxisBottom: {
1402
+ type: Number,
1403
+ default: 30
1404
+ },
1405
+ /**
1406
+ * Y轴顶部间距
1407
+ */
1408
+ yAxisTop: {
1409
+ type: Number,
1410
+ default: 30
1411
+ },
1412
+ /**
1413
+ * Y轴文本刻度宽度
1414
+ */
1415
+ yAxisWidth: {
1416
+ type: Number,
1417
+ default: 200
1418
+ },
1419
+ /**
1420
+ * 绿波循环次数
1421
+ * - Possible values:
1422
+ * - Number
1423
+ * - 0 - 默认值,自动计算
1424
+ * - 1 - 循环一次
1425
+ */
1426
+ loopTime: {
1427
+ type: Number,
1428
+ default: 0
1429
+ }
1430
+ },
1431
+ data() {
1432
+ return {
1433
+ groups_forward: [],
1434
+ groups_back: [],
1435
+ // 初始值,默认按照容器宽度
1436
+ canvasWidth: 500,
1437
+ canvas: null,
1438
+ canvas_l: null,
1439
+ initialPositions: {},
1440
+ calculateLoopTime: 0,
1441
+ resizeHandler: null
1442
+ };
1443
+ },
1444
+ computed: {
1445
+ mulWatchData() {
1446
+ return {
1447
+ interval: this.interval,
1448
+ crossData: this.crossData,
1449
+ forwardDirection: this.forwardDirection
1450
+ };
1451
+ }
1452
+ },
1453
+ watch: {
1454
+ mulWatchData: {
1455
+ handler(val) {
1456
+ this.drawRoad();
1457
+ },
1458
+ deep: true
1459
+ }
1460
+ },
1461
+ mounted() {
1462
+ this.init();
1463
+ },
1464
+ created() {
1465
+ this.resizeHandler = lodash_default.a.debounce(() => {
1466
+ if (this.canvas) {
1467
+ this.canvas.dispose();
1468
+ this.canvas_l.dispose();
1469
+ this.canvas = null;
1470
+ this.canvas_l = null;
1471
+ this.init();
1472
+ }
1473
+ }, 200);
1474
+ window.addEventListener('resize', this.resizeHandler);
1475
+ },
1476
+ beforeDestroy() {
1477
+ window.removeEventListener('resize', this.resizeHandler);
1478
+ this.resizeHandler.cancel();
1479
+ if (this.canvas) {
1480
+ this.canvas.dispose();
1481
+ this.canvas_l.dispose();
1482
+ }
1483
+ },
1484
+ methods: {
1485
+ /**
1486
+ * 初始化
1487
+ */
1488
+ init() {
1489
+ // Get container width dynamically
1490
+ const containerWidth = this.$el.offsetWidth - this.yAxisWidth;
1491
+
1492
+ // Initialize main canvas
1493
+ if (this.canvas) {
1494
+ this.canvas.dispose();
1495
+ }
1496
+ this.canvas = new fabric["fabric"].Canvas(this.$refs.canvas, {
1497
+ backgroundColor: '#fff',
1498
+ selection: false,
1499
+ width: containerWidth,
1500
+ height: this.canvasHeight
1501
+ });
1502
+
1503
+ // Initialize y-axis canvas
1504
+ if (this.canvas_l) {
1505
+ this.canvas_l.dispose();
1506
+ }
1507
+ this.canvas_l = new fabric["fabric"].Canvas(this.$refs.canvas_l, {
1508
+ backgroundColor: '#fff',
1509
+ selection: false,
1510
+ width: this.yAxisWidth,
1511
+ height: this.canvasHeight
1512
+ });
1513
+ this.drawRoad();
1514
+ },
1515
+ // 绘制路口
1516
+ drawBaseElement() {
1517
+ // 横纵坐标,周期线
1518
+ this.canvas.add(new fabric["fabric"].Line([0, this.canvas.height - this.xAxisBottom, this.canvas.width, this.canvas.height - this.xAxisBottom], {
1519
+ stroke: '#333',
1520
+ strokeWidth: 1
1521
+ }));
1522
+ // 纵轴线
1523
+ this.canvas.add(new fabric["fabric"].Line([0, this.canvas.height - this.xAxisBottom, 0, this.yAxisTop], {
1524
+ stroke: '#333',
1525
+ strokeWidth: 1
1526
+ }));
1527
+ // // 画周期
1528
+ const contentWidth = this.canvas.width;
1529
+ this.calculateLoopTime = this.loopTime || Math.ceil(contentWidth / this.interval / this.singleWaveWidth);
1530
+ for (let i = 1; i < this.calculateLoopTime; i++) {
1531
+ this.canvas.add(new fabric["fabric"].Line([this.interval * this.singleWaveWidth * i, this.canvas.height - this.xAxisBottom, this.interval * this.singleWaveWidth * i, this.yAxisTop], {
1532
+ stroke: 'lightgrey',
1533
+ strokeWidth: 1,
1534
+ strokeDashArray: [5, 2]
1535
+ }));
1536
+ this.canvas.add(new fabric["fabric"].Textbox(`${this.interval * i}s`, {
1537
+ fontSize: 14,
1538
+ left: this.interval * this.singleWaveWidth * i,
1539
+ top: this.canvas.height - this.xAxisBottom + 5,
1540
+ textAlign: 'center',
1541
+ backgroundColor: '#fff',
1542
+ originX: 'center',
1543
+ originY: 'top'
1544
+ }));
1545
+ }
1546
+ },
1547
+ // 获取时距拖拽方向
1548
+ getGroupDirection({
1549
+ crossId,
1550
+ left
1551
+ }) {
1552
+ const initialPos = this.initialPositions[crossId];
1553
+ let direction = 'none';
1554
+ if (initialPos) {
1555
+ direction = left > initialPos ? 'forward' : 'backward';
1556
+ }
1557
+ return direction;
1558
+ },
1559
+ drawRoad() {
1560
+ // this.canvas_l && this.canvas_l.clear();
1561
+ // this.canvas && this.canvas.clear();
1562
+ this.groups_forward = [];
1563
+ this.groups_back = [];
1564
+ this.drawBaseElement();
1565
+ this.canvas_l.add(new fabric["fabric"].Line([this.yAxisWidth / 2, this.canvas.height - this.xAxisBottom, this.yAxisWidth / 2, this.yAxisTop], {
1566
+ stroke: 'lightgrey',
1567
+ strokeWidth: 1,
1568
+ strokeDashArray: [5, 2]
1569
+ }));
1570
+ const totalDistance = this.crossData.reduce((pre, cur) => pre + cur.crossDistance, 0);
1571
+ let yDis = 0;
1572
+ const contentHeight = this.canvas.height - this.yAxisTop - this.xAxisBottom;
1573
+ this.crossData.forEach((item, index) => {
1574
+ yDis += item.crossDistance;
1575
+ let top = 0;
1576
+ if (this.forwardDirection) {
1577
+ top = (totalDistance - yDis) / totalDistance * contentHeight + this.yAxisTop;
1578
+ } else {
1579
+ top = yDis / totalDistance * contentHeight + this.yAxisTop;
1580
+ }
1581
+ this.canvas_l.add(new fabric["fabric"].Textbox(`【${item.crossRoadName}】`, {
1582
+ fontSize: 14,
1583
+ left: 0,
1584
+ top: top,
1585
+ textAlign: 'center',
1586
+ width: this.yAxisWidth - 1,
1587
+ backgroundColor: '#fff',
1588
+ originY: 'bottom'
1589
+ }));
1590
+ if (index !== 0) {
1591
+ let text_top = 0;
1592
+ if (this.forwardDirection) {
1593
+ text_top = (totalDistance - yDis + item.crossDistance / 2) / totalDistance * contentHeight + this.yAxisTop;
1594
+ } else {
1595
+ text_top = (yDis - item.crossDistance / 2) / totalDistance * contentHeight + this.yAxisTop;
1596
+ }
1597
+ var text2 = new fabric["fabric"].Textbox(`${item.crossDistance},${item.forwardSpeed}km/h`, {
1598
+ fontSize: 14,
1599
+ left: 0,
1600
+ top: text_top,
1601
+ textAlign: 'center',
1602
+ width: this.yAxisWidth - 1,
1603
+ backgroundColor: '#fff',
1604
+ originY: 'bottom'
1605
+ });
1606
+ this.canvas_l.add(text2);
1607
+ }
1608
+
1609
+ // 绘制绿灯
1610
+ let list = [];
1611
+ let list_back = [];
1612
+ for (let i = -1; i < this.calculateLoopTime; i++) {
1613
+ const cross = new fabric["fabric"].Line([(item.forwardPhaseDiff + this.interval * i) * this.singleWaveWidth, top, (item.forwardPhaseDiff + item.forwardGreen + this.interval * i) * this.singleWaveWidth, top], {
1614
+ stroke: this.forwardColor,
1615
+ strokeWidth: this.dragStrokeWidth,
1616
+ originY: 'bottom'
1617
+ });
1618
+ const cross_back = new fabric["fabric"].Line([(item.reversePhaseDiff + this.interval * i) * this.singleWaveWidth, top - this.dragStrokeWidth, (item.reversePhaseDiff + item.reverseGreen + this.interval * i) * this.singleWaveWidth, top - this.dragStrokeWidth], {
1619
+ stroke: this.backwardColor,
1620
+ strokeWidth: this.dragStrokeWidth,
1621
+ originY: 'bottom'
1622
+ });
1623
+ list.push(cross);
1624
+ list_back.push(cross_back);
1625
+ }
1626
+ const group = new fabric["fabric"].Group(list, {
1627
+ ...item,
1628
+ roadType: 0,
1629
+ // 正向
1630
+ hoverCursor: 'ew-resize',
1631
+ moveCursor: 'ew-resize',
1632
+ lockRotation: true,
1633
+ lockMovementY: true,
1634
+ hasControls: false,
1635
+ hasBorders: false
1636
+ });
1637
+ const group_back = new fabric["fabric"].Group(list_back, {
1638
+ ...item,
1639
+ roadType: 1,
1640
+ // 反向
1641
+ hoverCursor: 'ew-resize',
1642
+ moveCursor: 'ew-resize',
1643
+ lockRotation: true,
1644
+ lockMovementY: true,
1645
+ hasControls: false,
1646
+ hasBorders: false
1647
+ });
1648
+
1649
+ // 初始位置
1650
+ this.initialPositions[group.crossId] = group.left;
1651
+ this.initialPositions[group_back.crossId] = group_back.left;
1652
+ this.groups_forward.push(group);
1653
+ this.groups_back.push(group_back);
1654
+ this.canvas.add(group, group_back);
1655
+ let startDistance = 0;
1656
+ let endDistance = 0;
1657
+ let crossId = '';
1658
+ group.on('moving', e => {
1659
+ if (e.transform.target.left <= -1 * this.interval * this.singleWaveWidth) {
1660
+ e.transform.target.left = -1 * this.interval * this.singleWaveWidth;
1661
+ } else if (e.transform.target.left >= 0) {
1662
+ e.transform.target.left = 0;
1663
+ }
1664
+ const target = e.transform.target;
1665
+ const index = this.groups_forward.findIndex(ele => ele.crossId === target.crossId);
1666
+ if (index !== this.groups_forward.length - 1) {
1667
+ this.drawForward(target, this.groups_forward[index + 1]);
1668
+ }
1669
+ if (index !== 0) {
1670
+ this.drawForward(this.groups_forward[index - 1], target);
1671
+ }
1672
+
1673
+ // 查找反向绿波组
1674
+ this.groups_back[index].left = e.transform.target.left;
1675
+ this.groups_back[index].setCoords();
1676
+ if (index !== 0) {
1677
+ this.drawBackward(this.groups_back[index], this.groups_back[index - 1]);
1678
+ }
1679
+ if (index !== this.groups_back.length - 1) {
1680
+ this.drawBackward(this.groups_back[index + 1], this.groups_back[index]);
1681
+ }
1682
+ this.$emit('computeData', {
1683
+ groups_forward: this.groups_forward,
1684
+ groups_back: this.groups_back,
1685
+ rate: this.singleWaveWidth,
1686
+ current_group: group
1687
+ });
1688
+ });
1689
+ group.on('mouseup', e => {
1690
+ this.$emit('updateCrossParams', {
1691
+ rate: this.singleWaveWidth,
1692
+ current_group: group,
1693
+ direction: this.getGroupDirection(e.transform.target)
1694
+ });
1695
+ });
1696
+ group_back.on('moving', e => {
1697
+ if (e.transform.target.left <= -1 * this.interval * this.singleWaveWidth) {
1698
+ e.transform.target.left = -1 * this.interval * this.singleWaveWidth;
1699
+ } else if (e.transform.target.left >= 0) {
1700
+ e.transform.target.left = 0;
1701
+ }
1702
+ const target = e.transform.target;
1703
+ const index = this.groups_back.findIndex(ele => ele.crossId === target.crossId);
1704
+ if (index !== 0) {
1705
+ this.drawBackward(target, this.groups_back[index - 1]);
1706
+ }
1707
+ if (index !== this.groups_back.length - 1) {
1708
+ this.drawBackward(this.groups_back[index + 1], target);
1709
+ }
1710
+ // 查找正向绿波组
1711
+ this.groups_forward[index].left = e.transform.target.left;
1712
+ this.groups_forward[index].setCoords();
1713
+ if (index !== this.groups_forward.length - 1) {
1714
+ this.drawForward(this.groups_forward[index], this.groups_back[index + 1]);
1715
+ }
1716
+ if (index !== 0) {
1717
+ this.drawForward(this.groups_forward[index - 1], this.groups_back[index]);
1718
+ }
1719
+ this.$emit('computeData', {
1720
+ groups_forward: this.groups_forward,
1721
+ groups_back: this.groups_back,
1722
+ rate: this.singleWaveWidth,
1723
+ current_group: group_back
1724
+ });
1725
+ });
1726
+ group_back.on('mouseup', e => {
1727
+ this.$emit('updateCrossParams', {
1728
+ rate: this.singleWaveWidth,
1729
+ current_group: group_back,
1730
+ direction: this.getGroupDirection(e.transform.target)
1731
+ });
1732
+ });
1733
+ });
1734
+
1735
+ // 初始化正向绿波
1736
+ for (let i = 0; i < this.groups_forward.length - 1; i++) {
1737
+ this.drawForward(this.groups_forward[i], this.groups_forward[i + 1]);
1738
+ }
1739
+ // 初始化反向绿波
1740
+ for (let i = this.groups_back.length - 1; i > 0; i--) {
1741
+ this.drawBackward(this.groups_back[i], this.groups_back[i - 1]);
1742
+ }
1743
+ this.$emit('computeData', {
1744
+ groups_forward: this.groups_forward,
1745
+ groups_back: this.groups_back,
1746
+ rate: this.singleWaveWidth
1747
+ });
1748
+ },
1749
+ drawForward(startGroup, endGroup) {
1750
+ // 计算到下个路口所需的时间
1751
+ const time = endGroup.crossDistance / 1000 / startGroup.forwardSpeed * 3600;
1752
+ let y1 = startGroup.aCoords.bl.y;
1753
+ let y2 = endGroup.aCoords.bl.y;
1754
+ startGroup.forEachObject((item, index) => {
1755
+ let x1, x2, x3, x4; // 左下开始顺时针
1756
+ const need_t = time * this.singleWaveWidth;
1757
+ const pk = 'polygon' + index;
1758
+ endGroup.forEachObject((ng, gidx) => {
1759
+ const start_x0 = item.aCoords.tl.x + startGroup.left + startGroup.width / 2; // 开始点
1760
+ const end_x0 = ng.aCoords.tl.x + endGroup.left + endGroup.width / 2;
1761
+ if (start_x0 + need_t > end_x0 && start_x0 + need_t < end_x0 + ng.width && start_x0 + item.width + need_t > end_x0 + ng.width) {
1762
+ x1 = start_x0;
1763
+ x2 = start_x0 + time * this.singleWaveWidth;
1764
+ x3 = end_x0 + ng.width;
1765
+ x4 = x1 + x3 - x2;
1766
+ } else if (start_x0 + need_t > end_x0 && start_x0 + need_t < end_x0 + ng.width && start_x0 + item.width + need_t > end_x0 && start_x0 + item.width + need_t < end_x0 + ng.width) {
1767
+ x1 = start_x0;
1768
+ x2 = start_x0 + need_t;
1769
+ x3 = start_x0 + item.width + need_t;
1770
+ x4 = start_x0 + item.width;
1771
+ } else if (start_x0 + need_t < end_x0 && start_x0 + item.width + need_t > end_x0 && start_x0 + item.width + need_t < end_x0 + ng.width) {
1772
+ x1 = end_x0 - time * this.singleWaveWidth;
1773
+ x2 = end_x0;
1774
+ x3 = x2 + start_x0 + item.width - x1;
1775
+ x4 = start_x0 + item.width;
1776
+ } else if (end_x0 - need_t > start_x0 && end_x0 - need_t < start_x0 + item.width && end_x0 + ng.width - need_t > start_x0 && end_x0 + ng.width - need_t < start_x0 + item.width) {
1777
+ x1 = end_x0 - need_t;
1778
+ x2 = end_x0;
1779
+ x3 = end_x0 + ng.width;
1780
+ x4 = x3 - need_t;
1781
+ } else if (end_x0 - need_t > start_x0 && end_x0 - need_t < start_x0 + item.width && end_x0 + ng.width - need_t > start_x0 + item.width) {
1782
+ x1 = end_x0 - need_t;
1783
+ x2 = end_x0;
1784
+ x4 = start_x0 + item.width;
1785
+ x3 = x4 + need_t;
1786
+ } else if (end_x0 - need_t < start_x0 && end_x0 + ng.width - need_t > start_x0 && end_x0 + ng.width - need_t < start_x0 + item.width) {
1787
+ x1 = start_x0;
1788
+ x2 = x1 - need_t;
1789
+ x3 = end_x0 + ng.width;
1790
+ x4 = x3 - need_t;
1791
+ }
1792
+ });
1793
+ if (item[pk]) {
1794
+ this.canvas.remove(item[pk]);
1795
+ item[pk] = null;
1796
+ }
1797
+ if (x1 !== x3 && x2 !== x4) {
1798
+ item[pk] = this.drawPolygon([{
1799
+ x: x1,
1800
+ y: y1
1801
+ }, {
1802
+ x: x2,
1803
+ y: y2
1804
+ }, {
1805
+ x: x3,
1806
+ y: y2
1807
+ }, {
1808
+ x: x4,
1809
+ y: y1
1810
+ }], this.forwardColor);
1811
+ this.canvas.add(item[pk]);
1812
+ }
1813
+ });
1814
+ },
1815
+ // 反向绿波图
1816
+ drawBackward(startGroup, endGroup) {
1817
+ // 计算到下个路口所需的时间
1818
+ const time = startGroup.crossDistance / 1000 / startGroup.reverseSpeed * 3600;
1819
+ let y1 = startGroup.aCoords.bl.y;
1820
+ let y2 = endGroup.aCoords.bl.y;
1821
+ startGroup.forEachObject((item, index) => {
1822
+ let x1, x2, x3, x4; // 左上开始顺时针
1823
+ const need_t = time * this.singleWaveWidth;
1824
+ const pk = 'polygon_back' + index;
1825
+ endGroup.forEachObject((ng, gidx) => {
1826
+ const start_x0 = item.aCoords.tl.x + startGroup.left + startGroup.width / 2; // 开始点
1827
+ const end_x0 = ng.aCoords.tl.x + endGroup.left + endGroup.width / 2;
1828
+ if (start_x0 + need_t > end_x0 && start_x0 + need_t < end_x0 + ng.width && start_x0 + item.width + need_t > end_x0 + ng.width) {
1829
+ x1 = start_x0;
1830
+ x4 = start_x0 + time * this.singleWaveWidth;
1831
+ x3 = end_x0 + ng.width;
1832
+ x2 = x3 - x4 + x1;
1833
+ } else if (start_x0 + need_t > end_x0 && start_x0 + need_t < end_x0 + ng.width && start_x0 + item.width + need_t > end_x0 && start_x0 + item.width + need_t < end_x0 + ng.width) {
1834
+ x1 = start_x0;
1835
+ x4 = start_x0 + need_t;
1836
+ x3 = start_x0 + item.width + need_t;
1837
+ x2 = start_x0 + item.width;
1838
+ } else if (start_x0 + need_t < end_x0 && start_x0 + item.width + need_t > end_x0 && start_x0 + item.width + need_t < end_x0 + ng.width) {
1839
+ x2 = start_x0 + item.width;
1840
+ x3 = x2 + time * this.singleWaveWidth;
1841
+ x4 = end_x0;
1842
+ x1 = x2 - (x3 - x4);
1843
+ } else if (end_x0 - need_t > start_x0 && end_x0 - need_t < start_x0 + item.width && end_x0 + ng.width - need_t > start_x0 && end_x0 + ng.width - need_t < start_x0 + item.width) {
1844
+ x1 = end_x0 - need_t;
1845
+ x4 = end_x0;
1846
+ x3 = end_x0 + ng.width;
1847
+ x2 = x3 - need_t;
1848
+ } else if (end_x0 - need_t > start_x0 && end_x0 - need_t < start_x0 + item.width && end_x0 + ng.width - need_t > start_x0 + item.width) {
1849
+ x1 = end_x0 - need_t;
1850
+ x4 = end_x0;
1851
+ x2 = start_x0 + item.width;
1852
+ x3 = x4 + need_t;
1853
+ } else if (end_x0 - need_t < start_x0 && end_x0 + ng.width - need_t > start_x0 && end_x0 + ng.width - need_t < start_x0 + item.width) {
1854
+ x1 = start_x0;
1855
+ x3 = end_x0 + ng.width;
1856
+ x2 = x3 - need_t;
1857
+ x4 = x1 + need_t;
1858
+ }
1859
+ });
1860
+ if (item[pk]) {
1861
+ this.canvas.remove(item[pk]);
1862
+ item[pk] = null;
1863
+ }
1864
+ if (x1 !== x3 && x2 !== x4) {
1865
+ item[pk] = this.drawPolygon([{
1866
+ x: x1,
1867
+ y: y1
1868
+ }, {
1869
+ x: x2,
1870
+ y: y1
1871
+ }, {
1872
+ x: x3,
1873
+ y: y2
1874
+ }, {
1875
+ x: x4,
1876
+ y: y2
1877
+ }], this.backwardColor);
1878
+ this.canvas.add(item[pk]);
1879
+ }
1880
+ });
1881
+ },
1882
+ drawPolygon(points = [], color = this.forwardColor) {
1883
+ const polygon = new fabric["fabric"].Polygon(points, {
1884
+ fill: color,
1885
+ opacity: 0.5,
1886
+ selectable: false,
1887
+ evented: false,
1888
+ objectCaching: false
1889
+ });
1890
+ // polygon.sendToBack();
1891
+ return polygon;
1892
+ }
1893
+ }
1894
+ });
1895
+ // CONCATENATED MODULE: ./src/components/green-wave/index.vue?vue&type=script&lang=js
1896
+ /* harmony default export */ var components_green_wavevue_type_script_lang_js = (green_wavevue_type_script_lang_js);
1897
+ // EXTERNAL MODULE: ./src/components/green-wave/index.vue?vue&type=style&index=0&id=9b8515cc&prod&lang=scss&scoped=true
1898
+ var green_wavevue_type_style_index_0_id_9b8515cc_prod_lang_scss_scoped_true = __webpack_require__("9518");
1899
+
1900
+ // CONCATENATED MODULE: ./src/components/green-wave/index.vue
1901
+
1902
+
1903
+
1904
+
1905
+
1906
+
1907
+ /* normalize component */
1908
+
1909
+ var green_wave_component = Object(componentNormalizer["a" /* default */])(
1910
+ components_green_wavevue_type_script_lang_js,
1911
+ green_wavevue_type_template_id_9b8515cc_scoped_true_render,
1912
+ green_wavevue_type_template_id_9b8515cc_scoped_true_staticRenderFns,
1913
+ false,
1914
+ null,
1915
+ "9b8515cc",
1916
+ null
1917
+
1918
+ )
1919
+
1920
+ /* harmony default export */ var green_wave = (green_wave_component.exports);
1921
+ // CONCATENATED MODULE: ./src/index.js
1922
+
1923
+
1924
+
1925
+
1926
+
1927
+
1928
+ // 初始化事件总线
1929
+ bus(external_commonjs_vue_commonjs2_vue_root_Vue_default.a);
1930
+
1931
+ // 注册全局图片对象
1932
+ external_commonjs_vue_commonjs2_vue_root_Vue_default.a.prototype.pics = pics_load_tool;
1933
+ window.pics = pics_load_tool;
1934
+
1935
+ // 组件安装方法
1936
+ traffic_lane.install = function (Vue) {
1937
+ Vue.component('traffic-lane', traffic_lane);
1938
+ };
1939
+ green_wave.install = function (Vue) {
1940
+ Vue.component('green-wave', green_wave);
1941
+ };
1942
+
1943
+ // 导出组件
1944
+ /* harmony default export */ var src = __webpack_exports__["a"] = ({
1945
+ trafficLane: traffic_lane,
1946
+ greenWave: green_wave
1947
+ });
1948
+
1949
+
1950
+ /***/ }),
1951
+
1952
+ /***/ "b943":
1953
+ /***/ (function(module, exports) {
1954
+
1955
+ module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAVZJREFUWEftlL8rRmEUxz/fleyUv8AgJaUsbGJlFQaLyWBQBu/AYDDIKsoiZZMVu5JBNrM/gPmrp+5bt9u973u793mv6J7x6ZznfM73/BCRzfYGMCLptMzXKuNU1sf2BPCW+C9Luu8XGxvgBZhKkn4Dk5I+ekFEA7B9Bmxnkr1K6gLlckQBsL0JnBdUeitppUiF2gC2Q4VB+l52KGk/zyEGwDMw3W/YgDVJV1m/2gDdD20/APOZBI+SFpoawn8OYHsY2JV0kCfpQFtgewa4AS4ldRoFsL0OXCRJQ/VPGYAv4B24iz6Eto+D7CVWrMil2hYk/Q6SL9VIHkIrA+wAJzWTVwcIkbbngGtgvAZINQVS120oTD6wmrzlbcAYsFUAWQ8gBbIHHAGdvDtgOwCGmclaHICkJYvA7K8copQSo5I+Gz1EZQdwoKe4DEQL0CrQKtAq8GcV+AFONbshRCVOIgAAAABJRU5ErkJggg=="
1956
+
1957
+ /***/ }),
1958
+
1959
+ /***/ "cdd5":
1960
+ /***/ (function(module, exports) {
1961
+
1962
+ module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAa1JREFUWEftlitPHVEUhb+VwC8gaRBVOBCtKKINCBTXUdGaPqjoQ1HfFAMYCB5UaUUfYFoBjqsqSqgoAgS4KkTThF8AySInOZcMkzuP28zcmtlmksk+63yzzt5nj/jHsP0cmABuA3eAA+AQ2JP0oaysyiYm82xvAzM5a3ck3S+j3TOAbZcRDjmSCvULE1JfvggslAUAliSFNZlRGsD2E+BzSuk7MC9p3/Y9YBmYSuU8lfQli6AXgI/AbELovaSXaWHbG8CLxPtPkp5VARAq/FZCaFLSXheA0Bk/Eu+PJIVO6Rq9OHCt+PIKLF2oebkNQONA40DjQONArgO294G7BeP3p6QwCa+isqvY9ts4YvMYwjheqQtgFDgucGBM0kktAEHU9i4wnQHRltTqMpJLT87CLrA9B6xlALyWtF43wA3gFBhMbXQO3JT0t1aAeAxfgQepjb5JetjNmcq6oCNu+xGwmdrssaStfgEMAH+AobjhGTAs6aIvAPEY3gGdv+ANSa+y2rPyI4gAoRVDS4ZoSWr3FSBC/A5PSSN5l1MtDkSA1Qjw5n8BjEeAX1UBXAINZgkw80nxDQAAAABJRU5ErkJggg=="
1963
+
1964
+ /***/ }),
1965
+
1966
+ /***/ "d420":
1967
+ /***/ (function(module, exports) {
1968
+
1969
+ module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAA0xJREFUSEullk1oVFcUx///+yZjviZptNMZFYKB2oKWWVorY0VEFwoqStRo1YWIgrgS0bYUpt1EaV25CqUBg1ETvxUMaaiCAdusa+jCRUsIOEmTmcSZydTJu/fYN5OExLz3BvFs3uKce37n475zLuEnP+eblKh9pNksgrUEw465QMYIDArUY0PTjeNVf3u5oauiLd9oKblAYB8AyzcIUgvkptY8hxNVQ2/bLgIE26daDNgGkZCv48XKrAJPFo5Vdc5XLQAEfpk6QyU/QuCeWTkiIWJ41j5WfWnWdM5RsCN7EMKr/s7lJyHDFBz1ZNHxIF8VjtRec2xKgCv5xqBlD1JY63qwGJn5tnCkrhUJUcGPp9op4gkRSragA2txtGqoCKjszNwAsN89Kmoxcur14VDbnD4hqvKTXDt8IAC6/jsUOsDKjokmBq0XHrelAIPD+YOh7kVwB/Jprp30zESLCqxmTfer8wK0ukUvxMV8c915z3onRFWvydwFsNPNhsDXrLk12QtimysASEztrf8+dOfVMkef2VM37nxrurPR3JJ8DrvCmerbkz8Q+M4jiD7W3psYpmClO4AJ25KOCsMeA92c2730T8cudCcVF6rLRlXssPT0aRCuWQowzNDDyWmKBDwA9wFZTyCijYnNAR6k4oTqBzAkxHMKtruXmK9Z/2hiGh6A+YdsSCy3YyaDB6m4sugA/IW0+UHP+DBI1xIt+OU1YukZQEOPUyKUBzglavh1vBdwb/KC8MhYemspg4a+VBwiZQEC9HHZb2NOg1yv6XyAMXYsvTU6AxiNK1Xsgb8IvmF9b7IpEKx4QYjvWNb2PMCT0bhVarKnCKhtZa0ujooPn/57g56jouTDFh1LbyplEH4yGkeZJgvQNfZl+EAR0NCfaqxQ+rnfDqA2sZFZQP9onH5NJjPTxvosvXFpadg5EnmWbAFVp+e4FrNFL7H+cmwtm+tgzD3X+jjjWnhoZEP4uqNfsFiif4ycAfFeCweCs8n1kcULZzaaFQPJFkO2EXinlSlEloKTL9dFvFfmLCT6+8tVCLD1/5dDc9mlD2gR3IaWc8kvlv/zdtl8d29kINlkWdgPYjNE1oD8aMbBGASDAB5rja6Rz6Oez5Y3mtVTetwb13sAAAAASUVORK5CYII="
1970
+
1971
+ /***/ }),
1972
+
1973
+ /***/ "e418":
1974
+ /***/ (function(module, exports) {
1975
+
1976
+ module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAEDSURBVFhH7dQxagJBGMXxIZ7AG9jY2XkBG2srwRPY2KURA4GAnW3AxtY6hSAWQsDCVi9gkZA7BFKt/1leEYgsM7NfrObX7JudnZ236K6z8ALFaA861jaEYhSzAlMoRjEr0MUYGgYzK+DNoXgf/qmPKH55gqb/1wza848mdJm9Dt6hvW5aQZfbeoT2qDSClthoYwfdv9IJWmanB93/pgsUiz60LEjt13CJNXzeYo9yIlByAf/UA0ygU+4ZisGSCrzCvw0b6JTz//wzNAyWVOANP9CwlPoVNPsUf0ExikmBBRSjmRT4hmI0s58gVS6QC+QCuUAukAs0dKzUwicO8iGarsG5K5lGFC/j6SCaAAAAAElFTkSuQmCC"
1977
+
1978
+ /***/ }),
1979
+
1980
+ /***/ "e63c":
1981
+ /***/ (function(module, exports) {
1982
+
1983
+ module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAEASURBVFhH7dUhjsJAFMbxAoIVBMcVuAIJCk8wBMdB0CsxQLIO1F5jFZoLIDAo4AgYwv5f84mSlG1mOpQs9Gf6hnbyvZmUaeSjhR40zKWqq5MJVBavjSuetgNPXX0Htnozhn4uzg+UH/tGE7r9WH0o98YRI+ixx9lBmamWqEOPh7eCsu7aYwBNCcsOH+Vk+oKmhTWDMjJpSlgfOMMC7CDaIE5LoSmZnA4iC59Cw6iLOTQszgHJo3iIE7T4mG5lqunq5AILtLfexls0kGzqEyr/5PU1XEBlbl4NhOTdwBoqc/m/OxBKsAZc/npJwRqoQKWTcgde5yX0VTZQNvDuDUTRL5qDP5+BXe6aAAAAAElFTkSuQmCC"
1984
+
1985
+ /***/ }),
1986
+
1987
+ /***/ "e7e7":
1988
+ /***/ (function(module, exports, __webpack_require__) {
1989
+
1990
+ // extracted by mini-css-extract-plugin
1991
+
1992
+ /***/ }),
1993
+
1994
+ /***/ "e9a7":
1995
+ /***/ (function(module, exports, __webpack_require__) {
1996
+
1997
+ module.exports = __webpack_require__.p + "static/img/demo.160f90e8.png";
1998
+
1999
+ /***/ }),
2000
+
2001
+ /***/ "fcf3":
2002
+ /***/ (function(module, exports) {
2003
+
2004
+ module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAv9JREFUSEuNlj9sFEcUxr9v5vDhA4ONjH22EC0tf4yMBFeALNJSREggYYQwSFAFiBSUNGniKghoQALzxwIiESkhbQQIhG0BwkYUKVJT2Jc7MOA7H5y9Ox/ZNeafz7czxWp355v5zZs3770h5tvFmU1WwU8itxFohVAG8RQy58LD6d8/6j57sRcquwEeBbABRJOAF5SGQ6Z+waGGsUjK6GEH3vZROg8gVWsikYPhwaUHQCru/1nGrnl3ldK+WnoAgcgjYV/jAJdcrnRLGIk4i4jnf38fHMycij5SlyonAPyaoA9JbGXq0vQtErsSxIjMD55nOmLA2so4gdWJY4i/uOTqdMFHHE0mq/WYAWj5LGnyWA8Umb5edtCcL5IajXYEgWatMUNJ2rifENM3SlMEmrwGiD0wrgrRCyCgxMabpSEI23wAigByVRo/AKARNt58s4fkbz4ARxMDDOBngbQ33vtlf0wNAupNhDjbE2qmaq1NBgjXpr9d2fvBuWLTn6VjoE4CWvT4OaDHyFXBek5m0QH907tWnI0C88vTc0+p5aXyOkrNtawpZYJ/msvkLNn1dT8NHAJXKLe0/IvtDOb7FwKq5XXWVdvhYBZMMmtH3WzZMNO4ccECDFzoTKG8rBZAYvPfk8cB/oA6EUoh52DSpLtTx19FQP2vv1n1aYtabk8OQh5OJnNOLm3AeoAPbF17tbO1ly13i3sMPI+pczljTfr/uPEAAM6avWy9/3IIkleghXA5o2iL/ABxoK1+UJyCb6oIlXPWpA3kZQGiVNE2XJgrIh5NkZONa7Aydz3kc/mu/WHxJaRVPgMUaj0aAIZ+6RrkJNsf/XeLSC44IIr5SltntJBspjAOeRac9of5blqOMKlkOh2b2JI9EwE6nuS/g3i6ntUCQoXaGkdyx2i+D8KiRZ/S4Pjm7KeiL7FzrHBF0v5FIAGIIxNd2YGPqaLj8XgXUuZHAPG1RdG1xeCpZM7lN7XVvLZkxwq7SXcUDhtJLI/qNoBhBK5/ortzNIK/B/tDQpBruQwSAAAAAElFTkSuQmCC"
2005
+
2006
+ /***/ }),
2007
+
2008
+ /***/ "fe4f":
2009
+ /***/ (function(module, exports) {
2010
+
2011
+ module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAA2pJREFUSEuVlk1sFGUYx///md21ZXf7BWXrRxqbQKKFeFvBBE0wEW96IXwUqIfGyIkLkionYtSQGA/GUzWaSKy0FKPRWCkESSQKGA4YpQc5aABh2l3a3Xbbrbs789eZdVu6uzOr723yPu/ze76fIYLOh/keQ8YuwnlWQC/BTldcUIrApGB859A5hZebf/dTw7oXQ/lu09Dxf5TsAmAGGkHagsZsm4N4pflmtWwNIPLx4l4HHIIUD1Rce5kzwIOFgebh+69WAUIfLR6moXcg1Pds5eXPIJ6okSMkh0dKA2verYguK4qcyPVB/LSxcv1WCEWTkWL+KKjBGkfoatD+Qn/sM/euDPgk3x0xS9cpxoLCInABcrYW+uO/4piMBzYsjEN4vvqNqFzBDm3CS803PUDT8PwIgN0NkikIB5b2xVZiPJxpb4L5E4ANdd6OLu2L72HTiUwPI+aNhtUCFgD9YpfQX9gfn/QMOzl/lsDjIB6pA7BVsDcyOjY3KOG4r/VuTO9PumEmF3dGr7rya07NWQASAT3wOqOnsxMgdtQVknFN1Bihtyr3kpKLO9s8QPRzFyBfAIBzjH2RuUXUuihyJGe2DETzqRaYkc1eB9NoMpdweb6vJe1+x7/MWpA/QMBtxr/OFimFqjw4OfdCW1+jRmv5KhvogcgSW8czRdQCbApvZK6+92Z776F4MRZ+2IWFw8U/Z5/ryFbArd9kgkNE/sW2MzO3UCdEXpMQ30IYF/C+p5TIFJeKjy28mJhyP9vOzDbKwW22n703AfgkuWxqCcByCB2YyeyOcpI7zt2zJP8qkpvktednBgHHv0yrEkFDyfT2Tg+w9nw6sEwhHGXrhNUTioRvEAoey8ugFcC6C/4AgXbJMDd6o2Ld96kRNhoV/wJkIJneVvag82LKgk+IBIymn+nc4wHaL850h1m6DiBw2LmyDrgMWP+DC6jXB8wVZW6afbqjPOzck/gx1Qeq4bi2TSbTW8oeJC5N13rg7gRbB6a3JbyhuGqxdF2eOgwicOHIwAcU7nhWCa+u8ro8t45YWxO1C6fiyUNXrL0OOUTgf61METkKB+8+Wba8cuquxq5Ldx9liG/jvyx9wBZwGiW9Zj314B9VVR28exNXrB7TxG4Q20H2Qlpf7mhOQ5qEcMG2MTq1pcv3t+VvhEpbaxd54pUAAAAASUVORK5CYII="
2012
+
2013
+ /***/ })
2014
+
2015
+ }]);