Add map
This commit is contained in:
		
							
								
								
									
										465
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										465
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@@ -10,6 +10,7 @@
 | 
				
			|||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@emotion/react": "^11.13.3",
 | 
					        "@emotion/react": "^11.13.3",
 | 
				
			||||||
        "@emotion/styled": "^11.13.0",
 | 
					        "@emotion/styled": "^11.13.0",
 | 
				
			||||||
 | 
					        "@mapbox/polyline": "^1.2.1",
 | 
				
			||||||
        "@mui/icons-material": "^6.1.6",
 | 
					        "@mui/icons-material": "^6.1.6",
 | 
				
			||||||
        "@mui/material": "^6.1.6",
 | 
					        "@mui/material": "^6.1.6",
 | 
				
			||||||
        "@mui/x-date-pickers": "^7.22.2",
 | 
					        "@mui/x-date-pickers": "^7.22.2",
 | 
				
			||||||
@@ -17,9 +18,14 @@
 | 
				
			|||||||
        "@testing-library/jest-dom": "^6.6.3",
 | 
					        "@testing-library/jest-dom": "^6.6.3",
 | 
				
			||||||
        "@testing-library/react": "^16.0.1",
 | 
					        "@testing-library/react": "^16.0.1",
 | 
				
			||||||
        "@testing-library/user-event": "^14.5.2",
 | 
					        "@testing-library/user-event": "^14.5.2",
 | 
				
			||||||
 | 
					        "@turf/rhumb-bearing": "^7.1.0",
 | 
				
			||||||
 | 
					        "@turf/rhumb-distance": "^7.1.0",
 | 
				
			||||||
 | 
					        "@types/leaflet": "^1.9.14",
 | 
				
			||||||
        "dayjs": "^1.11.13",
 | 
					        "dayjs": "^1.11.13",
 | 
				
			||||||
 | 
					        "leaflet": "^1.9.4",
 | 
				
			||||||
        "react": "^18.3.1",
 | 
					        "react": "^18.3.1",
 | 
				
			||||||
        "react-dom": "^18.3.1",
 | 
					        "react-dom": "^18.3.1",
 | 
				
			||||||
 | 
					        "react-leaflet": "^4.2.1",
 | 
				
			||||||
        "react-router-dom": "^6.28.0",
 | 
					        "react-router-dom": "^6.28.0",
 | 
				
			||||||
        "react-scripts": "^5.0.1",
 | 
					        "react-scripts": "^5.0.1",
 | 
				
			||||||
        "react-transition-group": "^4.4.5",
 | 
					        "react-transition-group": "^4.4.5",
 | 
				
			||||||
@@ -3558,6 +3564,17 @@
 | 
				
			|||||||
      "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==",
 | 
					      "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==",
 | 
				
			||||||
      "license": "MIT"
 | 
					      "license": "MIT"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/@mapbox/polyline": {
 | 
				
			||||||
 | 
					      "version": "1.2.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@mapbox/polyline/-/polyline-1.2.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-sn0V18O3OzW4RCcPoUIVDWvEGQaBNH9a0y5lgqrf5hUycyw1CzrhEoxV5irzrMNXKCkw1xRsZXcaVbsVZggHXA==",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "meow": "^9.0.0"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "bin": {
 | 
				
			||||||
 | 
					        "polyline": "bin/polyline.bin.js"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/@mui/core-downloads-tracker": {
 | 
					    "node_modules/@mui/core-downloads-tracker": {
 | 
				
			||||||
      "version": "6.1.6",
 | 
					      "version": "6.1.6",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.1.6.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.1.6.tgz",
 | 
				
			||||||
@@ -4313,6 +4330,17 @@
 | 
				
			|||||||
        "url": "https://opencollective.com/popperjs"
 | 
					        "url": "https://opencollective.com/popperjs"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/@react-leaflet/core": {
 | 
				
			||||||
 | 
					      "version": "2.1.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@react-leaflet/core/-/core-2.1.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-Qk7Pfu8BSarKGqILj4x7bCSZ1pjuAPZ+qmRwH5S7mDS91VSbVVsJSrW4qA+GPrro8t69gFYVMWb1Zc4yFmPiVg==",
 | 
				
			||||||
 | 
					      "license": "Hippocratic-2.1",
 | 
				
			||||||
 | 
					      "peerDependencies": {
 | 
				
			||||||
 | 
					        "leaflet": "^1.9.0",
 | 
				
			||||||
 | 
					        "react": "^18.0.0",
 | 
				
			||||||
 | 
					        "react-dom": "^18.0.0"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/@remix-run/router": {
 | 
					    "node_modules/@remix-run/router": {
 | 
				
			||||||
      "version": "1.21.0",
 | 
					      "version": "1.21.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.21.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.21.0.tgz",
 | 
				
			||||||
@@ -4807,6 +4835,63 @@
 | 
				
			|||||||
        "node": ">=10.13.0"
 | 
					        "node": ">=10.13.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/@turf/helpers": {
 | 
				
			||||||
 | 
					      "version": "7.1.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-7.1.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-dTeILEUVeNbaEeoZUOhxH5auv7WWlOShbx7QSd4s0T4Z0/iz90z9yaVCtZOLbU89umKotwKaJQltBNO9CzVgaQ==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "@types/geojson": "^7946.0.10",
 | 
				
			||||||
 | 
					        "tslib": "^2.6.2"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "funding": {
 | 
				
			||||||
 | 
					        "url": "https://opencollective.com/turf"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/@turf/invariant": {
 | 
				
			||||||
 | 
					      "version": "7.1.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-7.1.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-OCLNqkItBYIP1nE9lJGuIUatWGtQ4rhBKAyTfFu0z8npVzGEYzvguEeof8/6LkKmTTEHW53tCjoEhSSzdRh08Q==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "@turf/helpers": "^7.1.0",
 | 
				
			||||||
 | 
					        "@types/geojson": "^7946.0.10",
 | 
				
			||||||
 | 
					        "tslib": "^2.6.2"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "funding": {
 | 
				
			||||||
 | 
					        "url": "https://opencollective.com/turf"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/@turf/rhumb-bearing": {
 | 
				
			||||||
 | 
					      "version": "7.1.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@turf/rhumb-bearing/-/rhumb-bearing-7.1.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-ESZt70eOljHVnQMFKIdiu8LIHuQlpZgzh2nqSfV40BrYjsjI/sBKeK+sp2cBWk88nsSDlriPuMTNh4f50Jqpkw==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "@turf/helpers": "^7.1.0",
 | 
				
			||||||
 | 
					        "@turf/invariant": "^7.1.0",
 | 
				
			||||||
 | 
					        "@types/geojson": "^7946.0.10",
 | 
				
			||||||
 | 
					        "tslib": "^2.6.2"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "funding": {
 | 
				
			||||||
 | 
					        "url": "https://opencollective.com/turf"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/@turf/rhumb-distance": {
 | 
				
			||||||
 | 
					      "version": "7.1.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@turf/rhumb-distance/-/rhumb-distance-7.1.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-fR1V+yC4E1tnbdThomosiLcv0PQOwbfLSPM8rSWuxbMcJtffsncWxyJ0+N1F5juuHbcdaYhlduX8ri5I0ZCejw==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "@turf/helpers": "^7.1.0",
 | 
				
			||||||
 | 
					        "@turf/invariant": "^7.1.0",
 | 
				
			||||||
 | 
					        "@types/geojson": "^7946.0.10",
 | 
				
			||||||
 | 
					        "tslib": "^2.6.2"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "funding": {
 | 
				
			||||||
 | 
					        "url": "https://opencollective.com/turf"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/@types/aria-query": {
 | 
					    "node_modules/@types/aria-query": {
 | 
				
			||||||
      "version": "5.0.4",
 | 
					      "version": "5.0.4",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz",
 | 
				
			||||||
@@ -4955,6 +5040,12 @@
 | 
				
			|||||||
        "@types/send": "*"
 | 
					        "@types/send": "*"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/@types/geojson": {
 | 
				
			||||||
 | 
					      "version": "7946.0.14",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==",
 | 
				
			||||||
 | 
					      "license": "MIT"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/@types/graceful-fs": {
 | 
					    "node_modules/@types/graceful-fs": {
 | 
				
			||||||
      "version": "4.1.9",
 | 
					      "version": "4.1.9",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz",
 | 
				
			||||||
@@ -5021,12 +5112,27 @@
 | 
				
			|||||||
      "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
 | 
					      "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
 | 
				
			||||||
      "license": "MIT"
 | 
					      "license": "MIT"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/@types/leaflet": {
 | 
				
			||||||
 | 
					      "version": "1.9.14",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.14.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-sx2q6MDJaajwhKeVgPSvqXd8rhNJSTA3tMidQGduZn9S6WBYxDkCpSpV5xXEmSg7Cgdk/5vJGhVF1kMYLzauBg==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "@types/geojson": "*"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/@types/mime": {
 | 
					    "node_modules/@types/mime": {
 | 
				
			||||||
      "version": "1.3.5",
 | 
					      "version": "1.3.5",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
 | 
				
			||||||
      "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
 | 
					      "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
 | 
				
			||||||
      "license": "MIT"
 | 
					      "license": "MIT"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/@types/minimist": {
 | 
				
			||||||
 | 
					      "version": "1.2.5",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==",
 | 
				
			||||||
 | 
					      "license": "MIT"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/@types/node": {
 | 
					    "node_modules/@types/node": {
 | 
				
			||||||
      "version": "22.9.0",
 | 
					      "version": "22.9.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz",
 | 
				
			||||||
@@ -5045,6 +5151,12 @@
 | 
				
			|||||||
        "@types/node": "*"
 | 
					        "@types/node": "*"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/@types/normalize-package-data": {
 | 
				
			||||||
 | 
					      "version": "2.4.4",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
 | 
				
			||||||
 | 
					      "license": "MIT"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/@types/parse-json": {
 | 
					    "node_modules/@types/parse-json": {
 | 
				
			||||||
      "version": "4.0.2",
 | 
					      "version": "4.0.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
 | 
				
			||||||
@@ -6071,6 +6183,15 @@
 | 
				
			|||||||
        "url": "https://github.com/sponsors/ljharb"
 | 
					        "url": "https://github.com/sponsors/ljharb"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/arrify": {
 | 
				
			||||||
 | 
					      "version": "1.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=0.10.0"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/asap": {
 | 
					    "node_modules/asap": {
 | 
				
			||||||
      "version": "2.0.6",
 | 
					      "version": "2.0.6",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
 | 
				
			||||||
@@ -6710,6 +6831,32 @@
 | 
				
			|||||||
        "node": ">= 6"
 | 
					        "node": ">= 6"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/camelcase-keys": {
 | 
				
			||||||
 | 
					      "version": "6.2.2",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "camelcase": "^5.3.1",
 | 
				
			||||||
 | 
					        "map-obj": "^4.0.0",
 | 
				
			||||||
 | 
					        "quick-lru": "^4.0.1"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=8"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "funding": {
 | 
				
			||||||
 | 
					        "url": "https://github.com/sponsors/sindresorhus"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/camelcase-keys/node_modules/camelcase": {
 | 
				
			||||||
 | 
					      "version": "5.3.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=6"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/caniuse-api": {
 | 
					    "node_modules/caniuse-api": {
 | 
				
			||||||
      "version": "3.0.0",
 | 
					      "version": "3.0.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
 | 
				
			||||||
@@ -7719,6 +7866,40 @@
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/decamelize": {
 | 
				
			||||||
 | 
					      "version": "1.2.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=0.10.0"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/decamelize-keys": {
 | 
				
			||||||
 | 
					      "version": "1.1.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "decamelize": "^1.1.0",
 | 
				
			||||||
 | 
					        "map-obj": "^1.0.0"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=0.10.0"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "funding": {
 | 
				
			||||||
 | 
					        "url": "https://github.com/sponsors/sindresorhus"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/decamelize-keys/node_modules/map-obj": {
 | 
				
			||||||
 | 
					      "version": "1.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=0.10.0"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/decimal.js": {
 | 
					    "node_modules/decimal.js": {
 | 
				
			||||||
      "version": "10.4.3",
 | 
					      "version": "10.4.3",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
 | 
				
			||||||
@@ -9961,6 +10142,15 @@
 | 
				
			|||||||
      "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
 | 
					      "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
 | 
				
			||||||
      "license": "MIT"
 | 
					      "license": "MIT"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/hard-rejection": {
 | 
				
			||||||
 | 
					      "version": "2.1.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=6"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/harmony-reflect": {
 | 
					    "node_modules/harmony-reflect": {
 | 
				
			||||||
      "version": "1.6.2",
 | 
					      "version": "1.6.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz",
 | 
				
			||||||
@@ -10081,6 +10271,36 @@
 | 
				
			|||||||
        "node": ">= 6.0.0"
 | 
					        "node": ">= 6.0.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/hosted-git-info": {
 | 
				
			||||||
 | 
					      "version": "4.1.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
 | 
				
			||||||
 | 
					      "license": "ISC",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "lru-cache": "^6.0.0"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=10"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/hosted-git-info/node_modules/lru-cache": {
 | 
				
			||||||
 | 
					      "version": "6.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
 | 
				
			||||||
 | 
					      "license": "ISC",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "yallist": "^4.0.0"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=10"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/hosted-git-info/node_modules/yallist": {
 | 
				
			||||||
 | 
					      "version": "4.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
 | 
				
			||||||
 | 
					      "license": "ISC"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/hpack.js": {
 | 
					    "node_modules/hpack.js": {
 | 
				
			||||||
      "version": "2.1.6",
 | 
					      "version": "2.1.6",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
 | 
				
			||||||
@@ -13190,6 +13410,12 @@
 | 
				
			|||||||
        "shell-quote": "^1.8.1"
 | 
					        "shell-quote": "^1.8.1"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/leaflet": {
 | 
				
			||||||
 | 
					      "version": "1.9.4",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==",
 | 
				
			||||||
 | 
					      "license": "BSD-2-Clause"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/leven": {
 | 
					    "node_modules/leven": {
 | 
				
			||||||
      "version": "3.1.0",
 | 
					      "version": "3.1.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
 | 
				
			||||||
@@ -13380,6 +13606,18 @@
 | 
				
			|||||||
        "tmpl": "1.0.5"
 | 
					        "tmpl": "1.0.5"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/map-obj": {
 | 
				
			||||||
 | 
					      "version": "4.3.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=8"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "funding": {
 | 
				
			||||||
 | 
					        "url": "https://github.com/sponsors/sindresorhus"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/mdn-data": {
 | 
					    "node_modules/mdn-data": {
 | 
				
			||||||
      "version": "2.0.4",
 | 
					      "version": "2.0.4",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
 | 
				
			||||||
@@ -13407,6 +13645,44 @@
 | 
				
			|||||||
        "node": ">= 4.0.0"
 | 
					        "node": ">= 4.0.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/meow": {
 | 
				
			||||||
 | 
					      "version": "9.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "@types/minimist": "^1.2.0",
 | 
				
			||||||
 | 
					        "camelcase-keys": "^6.2.2",
 | 
				
			||||||
 | 
					        "decamelize": "^1.2.0",
 | 
				
			||||||
 | 
					        "decamelize-keys": "^1.1.0",
 | 
				
			||||||
 | 
					        "hard-rejection": "^2.1.0",
 | 
				
			||||||
 | 
					        "minimist-options": "4.1.0",
 | 
				
			||||||
 | 
					        "normalize-package-data": "^3.0.0",
 | 
				
			||||||
 | 
					        "read-pkg-up": "^7.0.1",
 | 
				
			||||||
 | 
					        "redent": "^3.0.0",
 | 
				
			||||||
 | 
					        "trim-newlines": "^3.0.0",
 | 
				
			||||||
 | 
					        "type-fest": "^0.18.0",
 | 
				
			||||||
 | 
					        "yargs-parser": "^20.2.3"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=10"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "funding": {
 | 
				
			||||||
 | 
					        "url": "https://github.com/sponsors/sindresorhus"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/meow/node_modules/type-fest": {
 | 
				
			||||||
 | 
					      "version": "0.18.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
 | 
				
			||||||
 | 
					      "license": "(MIT OR CC0-1.0)",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=10"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "funding": {
 | 
				
			||||||
 | 
					        "url": "https://github.com/sponsors/sindresorhus"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/merge-descriptors": {
 | 
					    "node_modules/merge-descriptors": {
 | 
				
			||||||
      "version": "1.0.3",
 | 
					      "version": "1.0.3",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
 | 
				
			||||||
@@ -13551,6 +13827,29 @@
 | 
				
			|||||||
        "url": "https://github.com/sponsors/ljharb"
 | 
					        "url": "https://github.com/sponsors/ljharb"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/minimist-options": {
 | 
				
			||||||
 | 
					      "version": "4.1.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "arrify": "^1.0.1",
 | 
				
			||||||
 | 
					        "is-plain-obj": "^1.1.0",
 | 
				
			||||||
 | 
					        "kind-of": "^6.0.3"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">= 6"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/minimist-options/node_modules/is-plain-obj": {
 | 
				
			||||||
 | 
					      "version": "1.1.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=0.10.0"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/minipass": {
 | 
					    "node_modules/minipass": {
 | 
				
			||||||
      "version": "7.1.2",
 | 
					      "version": "7.1.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
 | 
				
			||||||
@@ -13685,6 +13984,21 @@
 | 
				
			|||||||
      "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==",
 | 
					      "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==",
 | 
				
			||||||
      "license": "MIT"
 | 
					      "license": "MIT"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/normalize-package-data": {
 | 
				
			||||||
 | 
					      "version": "3.0.3",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
 | 
				
			||||||
 | 
					      "license": "BSD-2-Clause",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "hosted-git-info": "^4.0.1",
 | 
				
			||||||
 | 
					        "is-core-module": "^2.5.0",
 | 
				
			||||||
 | 
					        "semver": "^7.3.4",
 | 
				
			||||||
 | 
					        "validate-npm-package-license": "^3.0.1"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=10"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/normalize-path": {
 | 
					    "node_modules/normalize-path": {
 | 
				
			||||||
      "version": "3.0.0",
 | 
					      "version": "3.0.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
 | 
				
			||||||
@@ -15778,6 +16092,15 @@
 | 
				
			|||||||
      ],
 | 
					      ],
 | 
				
			||||||
      "license": "MIT"
 | 
					      "license": "MIT"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/quick-lru": {
 | 
				
			||||||
 | 
					      "version": "4.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=8"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/raf": {
 | 
					    "node_modules/raf": {
 | 
				
			||||||
      "version": "3.4.1",
 | 
					      "version": "3.4.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
 | 
				
			||||||
@@ -15997,6 +16320,20 @@
 | 
				
			|||||||
      "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
 | 
					      "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
 | 
				
			||||||
      "license": "MIT"
 | 
					      "license": "MIT"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/react-leaflet": {
 | 
				
			||||||
 | 
					      "version": "4.2.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/react-leaflet/-/react-leaflet-4.2.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-p9chkvhcKrWn/H/1FFeVSqLdReGwn2qmiobOQGO3BifX+/vV/39qhY8dGqbdcPh1e6jxh/QHriLXr7a4eLFK4Q==",
 | 
				
			||||||
 | 
					      "license": "Hippocratic-2.1",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "@react-leaflet/core": "^2.1.0"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "peerDependencies": {
 | 
				
			||||||
 | 
					        "leaflet": "^1.9.0",
 | 
				
			||||||
 | 
					        "react": "^18.0.0",
 | 
				
			||||||
 | 
					        "react-dom": "^18.0.0"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/react-refresh": {
 | 
					    "node_modules/react-refresh": {
 | 
				
			||||||
      "version": "0.11.0",
 | 
					      "version": "0.11.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz",
 | 
				
			||||||
@@ -16136,6 +16473,83 @@
 | 
				
			|||||||
        "pify": "^2.3.0"
 | 
					        "pify": "^2.3.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/read-pkg": {
 | 
				
			||||||
 | 
					      "version": "5.2.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "@types/normalize-package-data": "^2.4.0",
 | 
				
			||||||
 | 
					        "normalize-package-data": "^2.5.0",
 | 
				
			||||||
 | 
					        "parse-json": "^5.0.0",
 | 
				
			||||||
 | 
					        "type-fest": "^0.6.0"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=8"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/read-pkg-up": {
 | 
				
			||||||
 | 
					      "version": "7.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "find-up": "^4.1.0",
 | 
				
			||||||
 | 
					        "read-pkg": "^5.2.0",
 | 
				
			||||||
 | 
					        "type-fest": "^0.8.1"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=8"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "funding": {
 | 
				
			||||||
 | 
					        "url": "https://github.com/sponsors/sindresorhus"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/read-pkg-up/node_modules/type-fest": {
 | 
				
			||||||
 | 
					      "version": "0.8.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
 | 
				
			||||||
 | 
					      "license": "(MIT OR CC0-1.0)",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=8"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/read-pkg/node_modules/hosted-git-info": {
 | 
				
			||||||
 | 
					      "version": "2.8.9",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
 | 
				
			||||||
 | 
					      "license": "ISC"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/read-pkg/node_modules/normalize-package-data": {
 | 
				
			||||||
 | 
					      "version": "2.5.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
 | 
				
			||||||
 | 
					      "license": "BSD-2-Clause",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "hosted-git-info": "^2.1.4",
 | 
				
			||||||
 | 
					        "resolve": "^1.10.0",
 | 
				
			||||||
 | 
					        "semver": "2 || 3 || 4 || 5",
 | 
				
			||||||
 | 
					        "validate-npm-package-license": "^3.0.1"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/read-pkg/node_modules/semver": {
 | 
				
			||||||
 | 
					      "version": "5.7.2",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
 | 
				
			||||||
 | 
					      "license": "ISC",
 | 
				
			||||||
 | 
					      "bin": {
 | 
				
			||||||
 | 
					        "semver": "bin/semver"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/read-pkg/node_modules/type-fest": {
 | 
				
			||||||
 | 
					      "version": "0.6.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
 | 
				
			||||||
 | 
					      "license": "(MIT OR CC0-1.0)",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=8"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/readable-stream": {
 | 
					    "node_modules/readable-stream": {
 | 
				
			||||||
      "version": "3.6.2",
 | 
					      "version": "3.6.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
 | 
				
			||||||
@@ -17177,6 +17591,38 @@
 | 
				
			|||||||
      "deprecated": "Please use @jridgewell/sourcemap-codec instead",
 | 
					      "deprecated": "Please use @jridgewell/sourcemap-codec instead",
 | 
				
			||||||
      "license": "MIT"
 | 
					      "license": "MIT"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/spdx-correct": {
 | 
				
			||||||
 | 
					      "version": "3.2.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
 | 
				
			||||||
 | 
					      "license": "Apache-2.0",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "spdx-expression-parse": "^3.0.0",
 | 
				
			||||||
 | 
					        "spdx-license-ids": "^3.0.0"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/spdx-exceptions": {
 | 
				
			||||||
 | 
					      "version": "2.5.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==",
 | 
				
			||||||
 | 
					      "license": "CC-BY-3.0"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/spdx-expression-parse": {
 | 
				
			||||||
 | 
					      "version": "3.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "spdx-exceptions": "^2.1.0",
 | 
				
			||||||
 | 
					        "spdx-license-ids": "^3.0.0"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/spdx-license-ids": {
 | 
				
			||||||
 | 
					      "version": "3.0.20",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==",
 | 
				
			||||||
 | 
					      "license": "CC0-1.0"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/spdy": {
 | 
					    "node_modules/spdy": {
 | 
				
			||||||
      "version": "4.0.2",
 | 
					      "version": "4.0.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
 | 
				
			||||||
@@ -18227,6 +18673,15 @@
 | 
				
			|||||||
        "node": ">=8"
 | 
					        "node": ">=8"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/trim-newlines": {
 | 
				
			||||||
 | 
					      "version": "3.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=8"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/tryer": {
 | 
					    "node_modules/tryer": {
 | 
				
			||||||
      "version": "1.0.1",
 | 
					      "version": "1.0.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz",
 | 
				
			||||||
@@ -18671,6 +19126,16 @@
 | 
				
			|||||||
        "node": ">= 8"
 | 
					        "node": ">= 8"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/validate-npm-package-license": {
 | 
				
			||||||
 | 
					      "version": "3.0.4",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
 | 
				
			||||||
 | 
					      "license": "Apache-2.0",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "spdx-correct": "^3.0.0",
 | 
				
			||||||
 | 
					        "spdx-expression-parse": "^3.0.0"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/vary": {
 | 
					    "node_modules/vary": {
 | 
				
			||||||
      "version": "1.1.2",
 | 
					      "version": "1.1.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,6 +5,7 @@
 | 
				
			|||||||
  "dependencies": {
 | 
					  "dependencies": {
 | 
				
			||||||
    "@emotion/react": "^11.13.3",
 | 
					    "@emotion/react": "^11.13.3",
 | 
				
			||||||
    "@emotion/styled": "^11.13.0",
 | 
					    "@emotion/styled": "^11.13.0",
 | 
				
			||||||
 | 
					    "@mapbox/polyline": "^1.2.1",
 | 
				
			||||||
    "@mui/icons-material": "^6.1.6",
 | 
					    "@mui/icons-material": "^6.1.6",
 | 
				
			||||||
    "@mui/material": "^6.1.6",
 | 
					    "@mui/material": "^6.1.6",
 | 
				
			||||||
    "@mui/x-date-pickers": "^7.22.2",
 | 
					    "@mui/x-date-pickers": "^7.22.2",
 | 
				
			||||||
@@ -12,9 +13,14 @@
 | 
				
			|||||||
    "@testing-library/jest-dom": "^6.6.3",
 | 
					    "@testing-library/jest-dom": "^6.6.3",
 | 
				
			||||||
    "@testing-library/react": "^16.0.1",
 | 
					    "@testing-library/react": "^16.0.1",
 | 
				
			||||||
    "@testing-library/user-event": "^14.5.2",
 | 
					    "@testing-library/user-event": "^14.5.2",
 | 
				
			||||||
 | 
					    "@turf/rhumb-bearing": "^7.1.0",
 | 
				
			||||||
 | 
					    "@turf/rhumb-distance": "^7.1.0",
 | 
				
			||||||
 | 
					    "@types/leaflet": "^1.9.14",
 | 
				
			||||||
    "dayjs": "^1.11.13",
 | 
					    "dayjs": "^1.11.13",
 | 
				
			||||||
 | 
					    "leaflet": "^1.9.4",
 | 
				
			||||||
    "react": "^18.3.1",
 | 
					    "react": "^18.3.1",
 | 
				
			||||||
    "react-dom": "^18.3.1",
 | 
					    "react-dom": "^18.3.1",
 | 
				
			||||||
 | 
					    "react-leaflet": "^4.2.1",
 | 
				
			||||||
    "react-router-dom": "^6.28.0",
 | 
					    "react-router-dom": "^6.28.0",
 | 
				
			||||||
    "react-scripts": "^5.0.1",
 | 
					    "react-scripts": "^5.0.1",
 | 
				
			||||||
    "react-transition-group": "^4.4.5",
 | 
					    "react-transition-group": "^4.4.5",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,6 +8,7 @@ import 'dayjs/locale/fr'
 | 
				
			|||||||
import './App.css'
 | 
					import './App.css'
 | 
				
			||||||
import {QueryClient, QueryClientProvider} from "@tanstack/react-query"
 | 
					import {QueryClient, QueryClientProvider} from "@tanstack/react-query"
 | 
				
			||||||
import Home from "./Home"
 | 
					import Home from "./Home"
 | 
				
			||||||
 | 
					import TrainMap from "./Map"
 | 
				
			||||||
import dayjs from "dayjs"
 | 
					import dayjs from "dayjs"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function App() {
 | 
					function App() {
 | 
				
			||||||
@@ -19,6 +20,10 @@ function App() {
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
      path: "/station/:theme/:stationId",
 | 
					      path: "/station/:theme/:stationId",
 | 
				
			||||||
      element: <Station />
 | 
					      element: <Station />
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      path: "/map",
 | 
				
			||||||
 | 
					      element: <TrainMap />
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  ])
 | 
					  ])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										194
									
								
								src/Map.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										194
									
								
								src/Map.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,194 @@
 | 
				
			|||||||
 | 
					import "leaflet/dist/leaflet.css"
 | 
				
			||||||
 | 
					import L from 'leaflet'
 | 
				
			||||||
 | 
					import {MapContainer, Marker, TileLayer, useMapEvents} from 'react-leaflet'
 | 
				
			||||||
 | 
					import {useEffect, useMemo, useState} from "react"
 | 
				
			||||||
 | 
					import dayjs from "dayjs"
 | 
				
			||||||
 | 
					import polyline from "@mapbox/polyline"
 | 
				
			||||||
 | 
					import getDistance from '@turf/rhumb-distance'
 | 
				
			||||||
 | 
					import getBearing from '@turf/rhumb-bearing'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default function TrainMap () {
 | 
				
			||||||
 | 
					  return <>
 | 
				
			||||||
 | 
					    <MapContainer center={[46.47, 2.37]} zoom={6} style={{height: "100vh"}}>
 | 
				
			||||||
 | 
					      <TileLayer
 | 
				
			||||||
 | 
					        attribution='Données cartographiques : © Les contributeurices <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>'
 | 
				
			||||||
 | 
					        url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
 | 
				
			||||||
 | 
					      />
 | 
				
			||||||
 | 
					      <TileLayer
 | 
				
			||||||
 | 
					        attribution="Rendu : OpenRailwayMap"
 | 
				
			||||||
 | 
					        url="https://{s}.tiles.openrailwaymap.org/standard/{z}/{x}/{y}.png"></TileLayer>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      <MapContent />
 | 
				
			||||||
 | 
					    </MapContainer>
 | 
				
			||||||
 | 
					  </>
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function MapContent () {
 | 
				
			||||||
 | 
					  const [latitude, setLatitude] = useState(46.47)
 | 
				
			||||||
 | 
					  const [longitude, setLongitude] = useState(2.37)
 | 
				
			||||||
 | 
					  const [zoom, setZoom] = useState(6)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  useEffect(() => {
 | 
				
			||||||
 | 
					    fetch(`${process.env.REACT_APP_MOTIS_SERVER}/api/v1/map/initial`)
 | 
				
			||||||
 | 
					      .then(response => response.json())
 | 
				
			||||||
 | 
					      .then(data => {
 | 
				
			||||||
 | 
					        setLatitude(data['lat'])
 | 
				
			||||||
 | 
					        setLongitude(data['lon'])
 | 
				
			||||||
 | 
					        setZoom(data['zoom'])
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					  }, [])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const map = useMapEvents({
 | 
				
			||||||
 | 
					    moveend: () => {
 | 
				
			||||||
 | 
					      updateTrips(map, setTrips)
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    zoomend: () => {
 | 
				
			||||||
 | 
					      updateTrips(map, setTrips)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  useEffect(() => {
 | 
				
			||||||
 | 
					    map.flyTo([latitude, longitude], zoom)
 | 
				
			||||||
 | 
					  }, [map, latitude, longitude, zoom])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const [trips, setTrips] = useState([])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  useEffect(() => {
 | 
				
			||||||
 | 
					    updateTrips(map, setTrips)
 | 
				
			||||||
 | 
					    setInterval(() => updateTrips(map, setTrips), 30000)
 | 
				
			||||||
 | 
					  }, [map])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return <>
 | 
				
			||||||
 | 
					    {trips.map(trip => <TripMarker trip={trip} />)}
 | 
				
			||||||
 | 
					  </>
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function TripMarker ({trip}) {
 | 
				
			||||||
 | 
					  const [position, setPosition] = useState([trip.from.lat, trip.from.lon])
 | 
				
			||||||
 | 
					  const [heading, setHeading] = useState(0)
 | 
				
			||||||
 | 
					  const style = getModeStyle(trip.mode)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const keyframes = useMemo(() => {
 | 
				
			||||||
 | 
					    const keyframes = []
 | 
				
			||||||
 | 
					    const departure = dayjs(trip.departure)
 | 
				
			||||||
 | 
					    const arrival = dayjs(trip.arrival)
 | 
				
			||||||
 | 
					    const coordinates = polyline.decode(trip.polyline)
 | 
				
			||||||
 | 
					    const totalDuration = arrival.diff(departure, 'seconds')
 | 
				
			||||||
 | 
					    let currDistance = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let totalDistance = 0
 | 
				
			||||||
 | 
							for (let i = 0; i < coordinates.length - 1; i++) {
 | 
				
			||||||
 | 
								let from = coordinates[i]
 | 
				
			||||||
 | 
								let to = coordinates[i + 1]
 | 
				
			||||||
 | 
								totalDistance += getDistance(from, to, { units: 'meters' })
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for (let i = 0; i < coordinates.length - 1; i++) {
 | 
				
			||||||
 | 
								let from = coordinates[i]
 | 
				
			||||||
 | 
								let to = coordinates[i + 1]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								const distance = getDistance(from, to, { units: 'meters' })
 | 
				
			||||||
 | 
								const heading = getBearing(from, to)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								const r = currDistance / totalDistance
 | 
				
			||||||
 | 
								keyframes.push({ point: from, time: departure.add(r * totalDuration, 'seconds'), heading: heading })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								currDistance += distance
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							keyframes.push({ point: coordinates[coordinates.length - 1], time: arrival, heading: 0 })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return keyframes
 | 
				
			||||||
 | 
					  }, [trip])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  useEffect(() => {
 | 
				
			||||||
 | 
					    const interval = setInterval(() => {
 | 
				
			||||||
 | 
					      const now = dayjs()
 | 
				
			||||||
 | 
					      const index = keyframes.findIndex((kf) => kf.time >= now)
 | 
				
			||||||
 | 
					      if (index === -1 || index === 0)
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const startState = keyframes[index - 1]
 | 
				
			||||||
 | 
							  const endState = keyframes[index]
 | 
				
			||||||
 | 
					      const r = (now.diff(startState.time)) / (endState.time.diff(startState.time))
 | 
				
			||||||
 | 
					      const lat = startState.point[0] * (1 - r) + endState.point[0] * r
 | 
				
			||||||
 | 
					      const lon = startState.point[1] * (1 - r) + endState.point[1] * r
 | 
				
			||||||
 | 
					      setPosition([lat, lon])
 | 
				
			||||||
 | 
					      setHeading(startState.heading)
 | 
				
			||||||
 | 
					    }, 100)
 | 
				
			||||||
 | 
					    return () => clearInterval(interval)
 | 
				
			||||||
 | 
					  }, [keyframes])
 | 
				
			||||||
 | 
					  const icon = L.divIcon({
 | 
				
			||||||
 | 
					    html: `<svg fill="${style[1]}" fill-opacity="0.8" xmlns="http://www.w3.org/2000/svg"
 | 
				
			||||||
 | 
					\t width="36px" height="36px" viewBox="0 0 512 512" xml:space="preserve">
 | 
				
			||||||
 | 
					<g transform="rotate(${-heading - 90}, 256, 256)">
 | 
				
			||||||
 | 
					\t<path d="M256 17.108c-75.73 0-137.122 61.392-137.122 137.122.055 23.25 6.022 46.107 11.58 56.262L256 494.892l119.982-274.244h-.063c11.27-20.324 17.188-43.18 17.202-66.418C393.122 78.5 331.73 17.108 256 17.108zm0 68.56a68.56 68.56 0 0 1 68.56 68.562A68.56 68.56 0 0 1 256 222.79a68.56 68.56 0 0 1-68.56-68.56A68.56 68.56 0 0 1 256 85.67z" />
 | 
				
			||||||
 | 
					</g>
 | 
				
			||||||
 | 
					</svg>`,
 | 
				
			||||||
 | 
					    className: "",
 | 
				
			||||||
 | 
					    iconSize: [36, 36],
 | 
				
			||||||
 | 
					    iconAnchor: [36, 36],
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					  return <Marker position={position} icon={icon} />
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function getModeStyle (mode) {
 | 
				
			||||||
 | 
						switch (mode) {
 | 
				
			||||||
 | 
							case 'WALK':
 | 
				
			||||||
 | 
							case 'FLEXIBLE':
 | 
				
			||||||
 | 
								return ['walk', 'hsl(var(--foreground) / 1)', 'hsl(var(--background) / 1)']
 | 
				
			||||||
 | 
							case 'BIKE':
 | 
				
			||||||
 | 
							case 'BIKE_TO_PARK':
 | 
				
			||||||
 | 
							case 'BIKE_RENTAL':
 | 
				
			||||||
 | 
							case 'SCOOTER_RENTAL':
 | 
				
			||||||
 | 
								return ['bike', '#075985', 'white']
 | 
				
			||||||
 | 
							case 'CAR':
 | 
				
			||||||
 | 
							case 'CAR_TO_PARK':
 | 
				
			||||||
 | 
							case 'CAR_HAILING':
 | 
				
			||||||
 | 
							case 'CAR_SHARING':
 | 
				
			||||||
 | 
							case 'CAR_PICKUP':
 | 
				
			||||||
 | 
							case 'CAR_RENTAL':
 | 
				
			||||||
 | 
								return ['car', '#333', 'white']
 | 
				
			||||||
 | 
							case 'TRANSIT':
 | 
				
			||||||
 | 
							case 'BUS':
 | 
				
			||||||
 | 
								return ['bus', '#ff9800', 'white']
 | 
				
			||||||
 | 
							case 'COACH':
 | 
				
			||||||
 | 
								return ['bus', '#9ccc65', 'white']
 | 
				
			||||||
 | 
							case 'TRAM':
 | 
				
			||||||
 | 
								return ['tram', '#ff9800', 'white']
 | 
				
			||||||
 | 
							case 'METRO':
 | 
				
			||||||
 | 
								return ['sbahn', '#4caf50', 'white']
 | 
				
			||||||
 | 
							case 'SUBWAY':
 | 
				
			||||||
 | 
								return ['ubahn', '#3f51b5', 'white']
 | 
				
			||||||
 | 
							case 'FERRY':
 | 
				
			||||||
 | 
								return ['ship', '#00acc1', 'white']
 | 
				
			||||||
 | 
							case 'AIRPLANE':
 | 
				
			||||||
 | 
								return ['plane', '#90a4ae', 'white']
 | 
				
			||||||
 | 
							case 'HIGHSPEED_RAIL':
 | 
				
			||||||
 | 
								return ['train', '#9c27b0', 'white']
 | 
				
			||||||
 | 
							case 'LONG_DISTANCE':
 | 
				
			||||||
 | 
								return ['train', '#e91e63', 'white']
 | 
				
			||||||
 | 
							case 'NIGHT_RAIL':
 | 
				
			||||||
 | 
								return ['train', '#1a237e', 'white']
 | 
				
			||||||
 | 
							case 'REGIONAL_FAST_RAIL':
 | 
				
			||||||
 | 
							case 'REGIONAL_RAIL':
 | 
				
			||||||
 | 
							case 'RAIL':
 | 
				
			||||||
 | 
								return ['train', '#f44336', 'white']
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return ['train', '#000000', 'white']
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function updateTrips(map, setTrips) {
 | 
				
			||||||
 | 
					  const bounds = map.getBounds()
 | 
				
			||||||
 | 
					  const now = dayjs()
 | 
				
			||||||
 | 
					  const now_plus_1_min = now.add(60000)
 | 
				
			||||||
 | 
					  const query_params = new URLSearchParams({
 | 
				
			||||||
 | 
					    min: `${bounds.getNorth()},${bounds.getWest()}`,
 | 
				
			||||||
 | 
					    max: `${bounds.getSouth()},${bounds.getEast()}`,
 | 
				
			||||||
 | 
					    zoom: map.getZoom(),
 | 
				
			||||||
 | 
					    startTime: now.format(),
 | 
				
			||||||
 | 
					    endTime: now_plus_1_min.format(),
 | 
				
			||||||
 | 
					  }).toString()
 | 
				
			||||||
 | 
					  fetch(`${process.env.REACT_APP_MOTIS_SERVER}/api/v1/map/trips?${query_params}`)
 | 
				
			||||||
 | 
					    .then(data => data.json())
 | 
				
			||||||
 | 
					    .then(setTrips)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user