离线地图
							parent
							
								
									d3d72cd8e5
								
							
						
					
					
						commit
						a7b3afeb64
					
				| 
						 | 
				
			
			@ -1,143 +1,24 @@
 | 
			
		|||
# ---> Node
 | 
			
		||||
# Logs
 | 
			
		||||
logs
 | 
			
		||||
*.log
 | 
			
		||||
npm-debug.log*
 | 
			
		||||
yarn-debug.log*
 | 
			
		||||
yarn-error.log*
 | 
			
		||||
pnpm-debug.log*
 | 
			
		||||
lerna-debug.log*
 | 
			
		||||
.pnpm-debug.log*
 | 
			
		||||
 | 
			
		||||
# Diagnostic reports (https://nodejs.org/api/report.html)
 | 
			
		||||
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
 | 
			
		||||
 | 
			
		||||
# Runtime data
 | 
			
		||||
pids
 | 
			
		||||
*.pid
 | 
			
		||||
*.seed
 | 
			
		||||
*.pid.lock
 | 
			
		||||
 | 
			
		||||
# Directory for instrumented libs generated by jscoverage/JSCover
 | 
			
		||||
lib-cov
 | 
			
		||||
 | 
			
		||||
# Coverage directory used by tools like istanbul
 | 
			
		||||
coverage
 | 
			
		||||
*.lcov
 | 
			
		||||
 | 
			
		||||
# nyc test coverage
 | 
			
		||||
.nyc_output
 | 
			
		||||
 | 
			
		||||
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
 | 
			
		||||
.grunt
 | 
			
		||||
 | 
			
		||||
# Bower dependency directory (https://bower.io/)
 | 
			
		||||
bower_components
 | 
			
		||||
 | 
			
		||||
# node-waf configuration
 | 
			
		||||
.lock-wscript
 | 
			
		||||
 | 
			
		||||
# Compiled binary addons (https://nodejs.org/api/addons.html)
 | 
			
		||||
build/Release
 | 
			
		||||
 | 
			
		||||
# Dependency directories
 | 
			
		||||
node_modules/
 | 
			
		||||
jspm_packages/
 | 
			
		||||
 | 
			
		||||
# Snowpack dependency directory (https://snowpack.dev/)
 | 
			
		||||
web_modules/
 | 
			
		||||
 | 
			
		||||
# TypeScript cache
 | 
			
		||||
*.tsbuildinfo
 | 
			
		||||
 | 
			
		||||
# Optional npm cache directory
 | 
			
		||||
.npm
 | 
			
		||||
 | 
			
		||||
# Optional eslint cache
 | 
			
		||||
.eslintcache
 | 
			
		||||
 | 
			
		||||
# Optional stylelint cache
 | 
			
		||||
.stylelintcache
 | 
			
		||||
 | 
			
		||||
# Microbundle cache
 | 
			
		||||
.rpt2_cache/
 | 
			
		||||
.rts2_cache_cjs/
 | 
			
		||||
.rts2_cache_es/
 | 
			
		||||
.rts2_cache_umd/
 | 
			
		||||
 | 
			
		||||
# Optional REPL history
 | 
			
		||||
.node_repl_history
 | 
			
		||||
 | 
			
		||||
# Output of 'npm pack'
 | 
			
		||||
*.tgz
 | 
			
		||||
 | 
			
		||||
# Yarn Integrity file
 | 
			
		||||
.yarn-integrity
 | 
			
		||||
 | 
			
		||||
# dotenv environment variable files
 | 
			
		||||
.env
 | 
			
		||||
.env.development.local
 | 
			
		||||
.env.test.local
 | 
			
		||||
.env.production.local
 | 
			
		||||
.env.local
 | 
			
		||||
 | 
			
		||||
# parcel-bundler cache (https://parceljs.org/)
 | 
			
		||||
.cache
 | 
			
		||||
.parcel-cache
 | 
			
		||||
 | 
			
		||||
# Next.js build output
 | 
			
		||||
.next
 | 
			
		||||
out
 | 
			
		||||
 | 
			
		||||
# Nuxt.js build / generate output
 | 
			
		||||
.nuxt
 | 
			
		||||
node_modules
 | 
			
		||||
dist
 | 
			
		||||
dist-ssr
 | 
			
		||||
*.local
 | 
			
		||||
 | 
			
		||||
# Gatsby files
 | 
			
		||||
.cache/
 | 
			
		||||
# Comment in the public line in if your project uses Gatsby and not Next.js
 | 
			
		||||
# https://nextjs.org/blog/next-9-1#public-directory-support
 | 
			
		||||
# public
 | 
			
		||||
 | 
			
		||||
# vuepress build output
 | 
			
		||||
.vuepress/dist
 | 
			
		||||
 | 
			
		||||
# vuepress v2.x temp and cache directory
 | 
			
		||||
.temp
 | 
			
		||||
.cache
 | 
			
		||||
 | 
			
		||||
# Docusaurus cache and generated files
 | 
			
		||||
.docusaurus
 | 
			
		||||
 | 
			
		||||
# Serverless directories
 | 
			
		||||
.serverless/
 | 
			
		||||
 | 
			
		||||
# FuseBox cache
 | 
			
		||||
.fusebox/
 | 
			
		||||
 | 
			
		||||
# DynamoDB Local files
 | 
			
		||||
.dynamodb/
 | 
			
		||||
 | 
			
		||||
# TernJS port file
 | 
			
		||||
.tern-port
 | 
			
		||||
 | 
			
		||||
# Stores VSCode versions used for testing VSCode extensions
 | 
			
		||||
.vscode-test
 | 
			
		||||
 | 
			
		||||
# yarn v2
 | 
			
		||||
.yarn/cache
 | 
			
		||||
.yarn/unplugged
 | 
			
		||||
.yarn/build-state.yml
 | 
			
		||||
.yarn/install-state.gz
 | 
			
		||||
.pnp.*
 | 
			
		||||
 | 
			
		||||
# ---> Vue
 | 
			
		||||
# gitignore template for Vue.js projects
 | 
			
		||||
#
 | 
			
		||||
# Recommended template: Node.gitignore
 | 
			
		||||
 | 
			
		||||
# TODO: where does this rule come from?
 | 
			
		||||
docs/_book
 | 
			
		||||
 | 
			
		||||
# TODO: where does this rule come from?
 | 
			
		||||
test/
 | 
			
		||||
 | 
			
		||||
# Editor directories and files
 | 
			
		||||
.vscode/*
 | 
			
		||||
!.vscode/extensions.json
 | 
			
		||||
.idea
 | 
			
		||||
.DS_Store
 | 
			
		||||
*.suo
 | 
			
		||||
*.ntvs*
 | 
			
		||||
*.njsproj
 | 
			
		||||
*.sln
 | 
			
		||||
*.sw?
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										12
									
								
								README.md
								
								
								
								
							
							
						
						
									
										12
									
								
								README.md
								
								
								
								
							| 
						 | 
				
			
			@ -1,6 +1,8 @@
 | 
			
		|||
# map-offline
 | 
			
		||||
## 
 | 
			
		||||
 | 
			
		||||
离线地图
 | 
			
		||||
 | 
			
		||||
这个是离线地图
 | 
			
		||||
测试2
 | 
			
		||||
  // L.tileLayer("http://webrd0{s}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}", {
 | 
			
		||||
  //   attribution: '© ',
 | 
			
		||||
  //   maxZoom: 15,
 | 
			
		||||
  //   minZoom: 10,
 | 
			
		||||
  //   subdomains: "1234"
 | 
			
		||||
  // }).addTo(map.value)
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,13 @@
 | 
			
		|||
<!DOCTYPE html>
 | 
			
		||||
<html lang="en">
 | 
			
		||||
  <head>
 | 
			
		||||
    <meta charset="UTF-8" />
 | 
			
		||||
    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 | 
			
		||||
    <title>Vite + Vue + TS</title>
 | 
			
		||||
  </head>
 | 
			
		||||
  <body>
 | 
			
		||||
    <div id="app"></div>
 | 
			
		||||
    <script type="module" src="/src/main.ts"></script>
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,35 @@
 | 
			
		|||
{
 | 
			
		||||
  "name": "map-offline",
 | 
			
		||||
  "private": true,
 | 
			
		||||
  "version": "0.0.0",
 | 
			
		||||
  "type": "module",
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "dev": "vite --host",
 | 
			
		||||
    "build": "vue-tsc && vite build",
 | 
			
		||||
    "preview": "vite preview"
 | 
			
		||||
  },
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "@quasar/extras": "^1.16.5",
 | 
			
		||||
    "@types/leaflet-draw": "^1.0.7",
 | 
			
		||||
    "@types/proj4leaflet": "^1.0.7",
 | 
			
		||||
    "@vueuse/core": "^10.2.1",
 | 
			
		||||
    "geojson": "^0.5.0",
 | 
			
		||||
    "leaflet": "^1.9.4",
 | 
			
		||||
    "leaflet-draw": "^1.0.4",
 | 
			
		||||
    "proj4": "^2.9.0",
 | 
			
		||||
    "proj4leaflet": "^1.0.2",
 | 
			
		||||
    "quasar": "^2.12.3",
 | 
			
		||||
    "vue": "^3.3.4"
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@quasar/vite-plugin": "^1.4.1",
 | 
			
		||||
    "@types/geojson": "^7946.0.10",
 | 
			
		||||
    "@types/leaflet": "^1.9.3",
 | 
			
		||||
    "@types/proj4": "^2.5.2",
 | 
			
		||||
    "@vitejs/plugin-vue": "^4.2.3",
 | 
			
		||||
    "sass": "^1.32.12",
 | 
			
		||||
    "typescript": "^5.0.2",
 | 
			
		||||
    "vite": "^4.4.0",
 | 
			
		||||
    "vue-tsc": "^1.8.3"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,857 @@
 | 
			
		|||
lockfileVersion: '6.0'
 | 
			
		||||
 | 
			
		||||
settings:
 | 
			
		||||
  autoInstallPeers: true
 | 
			
		||||
  excludeLinksFromLockfile: false
 | 
			
		||||
 | 
			
		||||
dependencies:
 | 
			
		||||
  '@quasar/extras':
 | 
			
		||||
    specifier: ^1.16.5
 | 
			
		||||
    version: 1.16.5
 | 
			
		||||
  '@types/leaflet-draw':
 | 
			
		||||
    specifier: ^1.0.7
 | 
			
		||||
    version: 1.0.7
 | 
			
		||||
  '@types/proj4leaflet':
 | 
			
		||||
    specifier: ^1.0.7
 | 
			
		||||
    version: 1.0.7
 | 
			
		||||
  '@vueuse/core':
 | 
			
		||||
    specifier: ^10.2.1
 | 
			
		||||
    version: 10.2.1(vue@3.3.4)
 | 
			
		||||
  geojson:
 | 
			
		||||
    specifier: ^0.5.0
 | 
			
		||||
    version: 0.5.0
 | 
			
		||||
  leaflet:
 | 
			
		||||
    specifier: ^1.9.4
 | 
			
		||||
    version: 1.9.4
 | 
			
		||||
  leaflet-draw:
 | 
			
		||||
    specifier: ^1.0.4
 | 
			
		||||
    version: 1.0.4
 | 
			
		||||
  proj4:
 | 
			
		||||
    specifier: ^2.9.0
 | 
			
		||||
    version: 2.9.0
 | 
			
		||||
  proj4leaflet:
 | 
			
		||||
    specifier: ^1.0.2
 | 
			
		||||
    version: 1.0.2
 | 
			
		||||
  quasar:
 | 
			
		||||
    specifier: ^2.12.3
 | 
			
		||||
    version: 2.12.3
 | 
			
		||||
  vue:
 | 
			
		||||
    specifier: ^3.3.4
 | 
			
		||||
    version: 3.3.4
 | 
			
		||||
 | 
			
		||||
devDependencies:
 | 
			
		||||
  '@quasar/vite-plugin':
 | 
			
		||||
    specifier: ^1.4.1
 | 
			
		||||
    version: 1.4.1(@vitejs/plugin-vue@4.2.3)(quasar@2.12.3)(vite@4.4.4)(vue@3.3.4)
 | 
			
		||||
  '@types/geojson':
 | 
			
		||||
    specifier: ^7946.0.10
 | 
			
		||||
    version: 7946.0.10
 | 
			
		||||
  '@types/leaflet':
 | 
			
		||||
    specifier: ^1.9.3
 | 
			
		||||
    version: 1.9.3
 | 
			
		||||
  '@types/proj4':
 | 
			
		||||
    specifier: ^2.5.2
 | 
			
		||||
    version: 2.5.2
 | 
			
		||||
  '@vitejs/plugin-vue':
 | 
			
		||||
    specifier: ^4.2.3
 | 
			
		||||
    version: 4.2.3(vite@4.4.4)(vue@3.3.4)
 | 
			
		||||
  sass:
 | 
			
		||||
    specifier: ^1.32.12
 | 
			
		||||
    version: 1.32.12
 | 
			
		||||
  typescript:
 | 
			
		||||
    specifier: ^5.0.2
 | 
			
		||||
    version: 5.1.6
 | 
			
		||||
  vite:
 | 
			
		||||
    specifier: ^4.4.0
 | 
			
		||||
    version: 4.4.4(sass@1.32.12)
 | 
			
		||||
  vue-tsc:
 | 
			
		||||
    specifier: ^1.8.3
 | 
			
		||||
    version: 1.8.5(typescript@5.1.6)
 | 
			
		||||
 | 
			
		||||
packages:
 | 
			
		||||
 | 
			
		||||
  /@babel/helper-string-parser@7.22.5:
 | 
			
		||||
    resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==}
 | 
			
		||||
    engines: {node: '>=6.9.0'}
 | 
			
		||||
 | 
			
		||||
  /@babel/helper-validator-identifier@7.22.5:
 | 
			
		||||
    resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==}
 | 
			
		||||
    engines: {node: '>=6.9.0'}
 | 
			
		||||
 | 
			
		||||
  /@babel/parser@7.22.7:
 | 
			
		||||
    resolution: {integrity: sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==}
 | 
			
		||||
    engines: {node: '>=6.0.0'}
 | 
			
		||||
    hasBin: true
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@babel/types': 7.22.5
 | 
			
		||||
 | 
			
		||||
  /@babel/types@7.22.5:
 | 
			
		||||
    resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==}
 | 
			
		||||
    engines: {node: '>=6.9.0'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@babel/helper-string-parser': 7.22.5
 | 
			
		||||
      '@babel/helper-validator-identifier': 7.22.5
 | 
			
		||||
      to-fast-properties: 2.0.0
 | 
			
		||||
 | 
			
		||||
  /@esbuild/android-arm64@0.18.13:
 | 
			
		||||
    resolution: {integrity: sha512-j7NhycJUoUAG5kAzGf4fPWfd17N6SM3o1X6MlXVqfHvs2buFraCJzos9vbeWjLxOyBKHyPOnuCuipbhvbYtTAg==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [arm64]
 | 
			
		||||
    os: [android]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/android-arm@0.18.13:
 | 
			
		||||
    resolution: {integrity: sha512-KwqFhxRFMKZINHzCqf8eKxE0XqWlAVPRxwy6rc7CbVFxzUWB2sA/s3hbMZeemPdhN3fKBkqOaFhTbS8xJXYIWQ==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [arm]
 | 
			
		||||
    os: [android]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/android-x64@0.18.13:
 | 
			
		||||
    resolution: {integrity: sha512-M2eZkRxR6WnWfVELHmv6MUoHbOqnzoTVSIxgtsyhm/NsgmL+uTmag/VVzdXvmahak1I6sOb1K/2movco5ikDJg==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [x64]
 | 
			
		||||
    os: [android]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/darwin-arm64@0.18.13:
 | 
			
		||||
    resolution: {integrity: sha512-f5goG30YgR1GU+fxtaBRdSW3SBG9pZW834Mmhxa6terzcboz7P2R0k4lDxlkP7NYRIIdBbWp+VgwQbmMH4yV7w==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [arm64]
 | 
			
		||||
    os: [darwin]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/darwin-x64@0.18.13:
 | 
			
		||||
    resolution: {integrity: sha512-RIrxoKH5Eo+yE5BtaAIMZaiKutPhZjw+j0OCh8WdvKEKJQteacq0myZvBDLU+hOzQOZWJeDnuQ2xgSScKf1Ovw==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [x64]
 | 
			
		||||
    os: [darwin]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/freebsd-arm64@0.18.13:
 | 
			
		||||
    resolution: {integrity: sha512-AfRPhHWmj9jGyLgW/2FkYERKmYR+IjYxf2rtSLmhOrPGFh0KCETFzSjx/JX/HJnvIqHt/DRQD/KAaVsUKoI3Xg==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [arm64]
 | 
			
		||||
    os: [freebsd]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/freebsd-x64@0.18.13:
 | 
			
		||||
    resolution: {integrity: sha512-pGzWWZJBInhIgdEwzn8VHUBang8UvFKsvjDkeJ2oyY5gZtAM6BaxK0QLCuZY+qoj/nx/lIaItH425rm/hloETA==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [x64]
 | 
			
		||||
    os: [freebsd]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/linux-arm64@0.18.13:
 | 
			
		||||
    resolution: {integrity: sha512-hCzZbVJEHV7QM77fHPv2qgBcWxgglGFGCxk6KfQx6PsVIdi1u09X7IvgE9QKqm38OpkzaAkPnnPqwRsltvLkIQ==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [arm64]
 | 
			
		||||
    os: [linux]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/linux-arm@0.18.13:
 | 
			
		||||
    resolution: {integrity: sha512-4iMxLRMCxGyk7lEvkkvrxw4aJeC93YIIrfbBlUJ062kilUUnAiMb81eEkVvCVoh3ON283ans7+OQkuy1uHW+Hw==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [arm]
 | 
			
		||||
    os: [linux]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/linux-ia32@0.18.13:
 | 
			
		||||
    resolution: {integrity: sha512-I3OKGbynl3AAIO6onXNrup/ttToE6Rv2XYfFgLK/wnr2J+1g+7k4asLrE+n7VMhaqX+BUnyWkCu27rl+62Adug==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [ia32]
 | 
			
		||||
    os: [linux]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/linux-loong64@0.18.13:
 | 
			
		||||
    resolution: {integrity: sha512-8pcKDApAsKc6WW51ZEVidSGwGbebYw2qKnO1VyD8xd6JN0RN6EUXfhXmDk9Vc4/U3Y4AoFTexQewQDJGsBXBpg==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [loong64]
 | 
			
		||||
    os: [linux]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/linux-mips64el@0.18.13:
 | 
			
		||||
    resolution: {integrity: sha512-6GU+J1PLiVqWx8yoCK4Z0GnfKyCGIH5L2KQipxOtbNPBs+qNDcMJr9euxnyJ6FkRPyMwaSkjejzPSISD9hb+gg==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [mips64el]
 | 
			
		||||
    os: [linux]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/linux-ppc64@0.18.13:
 | 
			
		||||
    resolution: {integrity: sha512-pfn/OGZ8tyR8YCV7MlLl5hAit2cmS+j/ZZg9DdH0uxdCoJpV7+5DbuXrR+es4ayRVKIcfS9TTMCs60vqQDmh+w==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [ppc64]
 | 
			
		||||
    os: [linux]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/linux-riscv64@0.18.13:
 | 
			
		||||
    resolution: {integrity: sha512-aIbhU3LPg0lOSCfVeGHbmGYIqOtW6+yzO+Nfv57YblEK01oj0mFMtvDJlOaeAZ6z0FZ9D13oahi5aIl9JFphGg==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [riscv64]
 | 
			
		||||
    os: [linux]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/linux-s390x@0.18.13:
 | 
			
		||||
    resolution: {integrity: sha512-Pct1QwF2sp+5LVi4Iu5Y+6JsGaV2Z2vm4O9Dd7XZ5tKYxEHjFtb140fiMcl5HM1iuv6xXO8O1Vrb1iJxHlv8UA==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [s390x]
 | 
			
		||||
    os: [linux]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/linux-x64@0.18.13:
 | 
			
		||||
    resolution: {integrity: sha512-zTrIP0KzYP7O0+3ZnmzvUKgGtUvf4+piY8PIO3V8/GfmVd3ZyHJGz7Ht0np3P1wz+I8qJ4rjwJKqqEAbIEPngA==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [x64]
 | 
			
		||||
    os: [linux]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/netbsd-x64@0.18.13:
 | 
			
		||||
    resolution: {integrity: sha512-I6zs10TZeaHDYoGxENuksxE1sxqZpCp+agYeW039yqFwh3MgVvdmXL5NMveImOC6AtpLvE4xG5ujVic4NWFIDQ==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [x64]
 | 
			
		||||
    os: [netbsd]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/openbsd-x64@0.18.13:
 | 
			
		||||
    resolution: {integrity: sha512-W5C5nczhrt1y1xPG5bV+0M12p2vetOGlvs43LH8SopQ3z2AseIROu09VgRqydx5qFN7y9qCbpgHLx0kb0TcW7g==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [x64]
 | 
			
		||||
    os: [openbsd]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/sunos-x64@0.18.13:
 | 
			
		||||
    resolution: {integrity: sha512-X/xzuw4Hzpo/yq3YsfBbIsipNgmsm8mE/QeWbdGdTTeZ77fjxI2K0KP3AlhZ6gU3zKTw1bKoZTuKLnqcJ537qw==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [x64]
 | 
			
		||||
    os: [sunos]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/win32-arm64@0.18.13:
 | 
			
		||||
    resolution: {integrity: sha512-4CGYdRQT/ILd+yLLE5i4VApMPfGE0RPc/wFQhlluDQCK09+b4JDbxzzjpgQqTPrdnP7r5KUtGVGZYclYiPuHrw==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [arm64]
 | 
			
		||||
    os: [win32]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/win32-ia32@0.18.13:
 | 
			
		||||
    resolution: {integrity: sha512-D+wKZaRhQI+MUGMH+DbEr4owC2D7XnF+uyGiZk38QbgzLcofFqIOwFs7ELmIeU45CQgfHNy9Q+LKW3cE8g37Kg==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [ia32]
 | 
			
		||||
    os: [win32]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/win32-x64@0.18.13:
 | 
			
		||||
    resolution: {integrity: sha512-iVl6lehAfJS+VmpF3exKpNQ8b0eucf5VWfzR8S7xFve64NBNz2jPUgx1X93/kfnkfgP737O+i1k54SVQS7uVZA==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [x64]
 | 
			
		||||
    os: [win32]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@jridgewell/sourcemap-codec@1.4.15:
 | 
			
		||||
    resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
 | 
			
		||||
 | 
			
		||||
  /@quasar/extras@1.16.5:
 | 
			
		||||
    resolution: {integrity: sha512-3VAJS9NECr1OSHX674+3YvEMIlHclr81aZrEkoBtVqr+sX4In22Up44toua+qNFsxnoATPqzpwKOJxA3iAF71Q==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /@quasar/vite-plugin@1.4.1(@vitejs/plugin-vue@4.2.3)(quasar@2.12.3)(vite@4.4.4)(vue@3.3.4):
 | 
			
		||||
    resolution: {integrity: sha512-lLw7j1A7viLQ6++p29NuYUdfjpaWctRi6tRhMYm8VPumXs8enGeV59JEJ+1tJR2FcQUMYsGOoyHHcQrsakXIkA==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    peerDependencies:
 | 
			
		||||
      '@vitejs/plugin-vue': ^2.0.0 || ^3.0.0 || ^4.0.0
 | 
			
		||||
      quasar: ^2.8.0
 | 
			
		||||
      vite: ^2.0.0 || ^3.0.0 || ^4.0.0
 | 
			
		||||
      vue: ^3.0.0
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@vitejs/plugin-vue': 4.2.3(vite@4.4.4)(vue@3.3.4)
 | 
			
		||||
      quasar: 2.12.3
 | 
			
		||||
      vite: 4.4.4(sass@1.32.12)
 | 
			
		||||
      vue: 3.3.4
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /@types/geojson@7946.0.10:
 | 
			
		||||
    resolution: {integrity: sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==}
 | 
			
		||||
 | 
			
		||||
  /@types/leaflet-draw@1.0.7:
 | 
			
		||||
    resolution: {integrity: sha512-Tje5jjUC9aPmy9NSYx8HbPIVpX2VT3JyBk6wZ46PqneJzgev+UyBuK72Emvu8xaSmAEBkhlsImR7SACsdItXSw==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@types/leaflet': 1.9.3
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /@types/leaflet@1.9.3:
 | 
			
		||||
    resolution: {integrity: sha512-Caa1lYOgKVqDkDZVWkto2Z5JtVo09spEaUt2S69LiugbBpoqQu92HYFMGUbYezZbnBkyOxMNPXHSgRrRY5UyIA==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@types/geojson': 7946.0.10
 | 
			
		||||
 | 
			
		||||
  /@types/proj4@2.5.2:
 | 
			
		||||
    resolution: {integrity: sha512-/Nmfn9p08yaYw6xo5f2b0L+2oHk2kZeOkp5v+4VCeNfq+ETlLQbmHmC97/pjDIEZy8jxwz7pdPpwNzDHM5cuJw==}
 | 
			
		||||
 | 
			
		||||
  /@types/proj4leaflet@1.0.7:
 | 
			
		||||
    resolution: {integrity: sha512-GEqfFrl73zBVJH0GZsLASW5926pGZf2KC6/ETqiFUyYsNn4UtR0DxwfWbS9Vi9BGF0HYmCDkowlmivmxdkrtaQ==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@types/geojson': 7946.0.10
 | 
			
		||||
      '@types/leaflet': 1.9.3
 | 
			
		||||
      '@types/proj4': 2.5.2
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /@types/web-bluetooth@0.0.17:
 | 
			
		||||
    resolution: {integrity: sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /@vitejs/plugin-vue@4.2.3(vite@4.4.4)(vue@3.3.4):
 | 
			
		||||
    resolution: {integrity: sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==}
 | 
			
		||||
    engines: {node: ^14.18.0 || >=16.0.0}
 | 
			
		||||
    peerDependencies:
 | 
			
		||||
      vite: ^4.0.0
 | 
			
		||||
      vue: ^3.2.25
 | 
			
		||||
    dependencies:
 | 
			
		||||
      vite: 4.4.4(sass@1.32.12)
 | 
			
		||||
      vue: 3.3.4
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /@volar/language-core@1.9.0:
 | 
			
		||||
    resolution: {integrity: sha512-+PTRrGanAD2PxqMty0ZC46xhgW5BWzb67RLHhZyB3Im4+eMXsKlYjFUt7Z8ZCwTWQQOnj8NQ6gSgUEoOTwAHrQ==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@volar/source-map': 1.9.0
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /@volar/source-map@1.9.0:
 | 
			
		||||
    resolution: {integrity: sha512-TQWLY8ozUOHBHTMC2pHZsNbtM25Q9QCEwAL8JFR/gmR9Yv0d9qup/gQdd5sDI7RmoPYKD+gqjLrbM4Ib41QSJQ==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      muggle-string: 0.3.1
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /@volar/typescript@1.9.0:
 | 
			
		||||
    resolution: {integrity: sha512-B8X4/H6V93uD7zu5VCw05eB0Ukcc39SFKsZoeylkAk2sJ50oaJLpajnQ8Ov4c+FnVQ6iPA6Xy1qdWoWJjh6xEg==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@volar/language-core': 1.9.0
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /@vue/compiler-core@3.3.4:
 | 
			
		||||
    resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@babel/parser': 7.22.7
 | 
			
		||||
      '@vue/shared': 3.3.4
 | 
			
		||||
      estree-walker: 2.0.2
 | 
			
		||||
      source-map-js: 1.0.2
 | 
			
		||||
 | 
			
		||||
  /@vue/compiler-dom@3.3.4:
 | 
			
		||||
    resolution: {integrity: sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@vue/compiler-core': 3.3.4
 | 
			
		||||
      '@vue/shared': 3.3.4
 | 
			
		||||
 | 
			
		||||
  /@vue/compiler-sfc@3.3.4:
 | 
			
		||||
    resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@babel/parser': 7.22.7
 | 
			
		||||
      '@vue/compiler-core': 3.3.4
 | 
			
		||||
      '@vue/compiler-dom': 3.3.4
 | 
			
		||||
      '@vue/compiler-ssr': 3.3.4
 | 
			
		||||
      '@vue/reactivity-transform': 3.3.4
 | 
			
		||||
      '@vue/shared': 3.3.4
 | 
			
		||||
      estree-walker: 2.0.2
 | 
			
		||||
      magic-string: 0.30.1
 | 
			
		||||
      postcss: 8.4.26
 | 
			
		||||
      source-map-js: 1.0.2
 | 
			
		||||
 | 
			
		||||
  /@vue/compiler-ssr@3.3.4:
 | 
			
		||||
    resolution: {integrity: sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@vue/compiler-dom': 3.3.4
 | 
			
		||||
      '@vue/shared': 3.3.4
 | 
			
		||||
 | 
			
		||||
  /@vue/language-core@1.8.5(typescript@5.1.6):
 | 
			
		||||
    resolution: {integrity: sha512-DKQNiNQzNV7nrkZQujvjfX73zqKdj2+KoM4YeKl+ft3f+crO3JB4ycPnmgaRMNX/ULJootdQPGHKFRl5cXxwaw==}
 | 
			
		||||
    peerDependencies:
 | 
			
		||||
      typescript: '*'
 | 
			
		||||
    peerDependenciesMeta:
 | 
			
		||||
      typescript:
 | 
			
		||||
        optional: true
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@volar/language-core': 1.9.0
 | 
			
		||||
      '@volar/source-map': 1.9.0
 | 
			
		||||
      '@vue/compiler-dom': 3.3.4
 | 
			
		||||
      '@vue/reactivity': 3.3.4
 | 
			
		||||
      '@vue/shared': 3.3.4
 | 
			
		||||
      minimatch: 9.0.3
 | 
			
		||||
      muggle-string: 0.3.1
 | 
			
		||||
      typescript: 5.1.6
 | 
			
		||||
      vue-template-compiler: 2.7.14
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /@vue/reactivity-transform@3.3.4:
 | 
			
		||||
    resolution: {integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@babel/parser': 7.22.7
 | 
			
		||||
      '@vue/compiler-core': 3.3.4
 | 
			
		||||
      '@vue/shared': 3.3.4
 | 
			
		||||
      estree-walker: 2.0.2
 | 
			
		||||
      magic-string: 0.30.1
 | 
			
		||||
 | 
			
		||||
  /@vue/reactivity@3.3.4:
 | 
			
		||||
    resolution: {integrity: sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@vue/shared': 3.3.4
 | 
			
		||||
 | 
			
		||||
  /@vue/runtime-core@3.3.4:
 | 
			
		||||
    resolution: {integrity: sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@vue/reactivity': 3.3.4
 | 
			
		||||
      '@vue/shared': 3.3.4
 | 
			
		||||
 | 
			
		||||
  /@vue/runtime-dom@3.3.4:
 | 
			
		||||
    resolution: {integrity: sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@vue/runtime-core': 3.3.4
 | 
			
		||||
      '@vue/shared': 3.3.4
 | 
			
		||||
      csstype: 3.1.2
 | 
			
		||||
 | 
			
		||||
  /@vue/server-renderer@3.3.4(vue@3.3.4):
 | 
			
		||||
    resolution: {integrity: sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==}
 | 
			
		||||
    peerDependencies:
 | 
			
		||||
      vue: 3.3.4
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@vue/compiler-ssr': 3.3.4
 | 
			
		||||
      '@vue/shared': 3.3.4
 | 
			
		||||
      vue: 3.3.4
 | 
			
		||||
 | 
			
		||||
  /@vue/shared@3.3.4:
 | 
			
		||||
    resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==}
 | 
			
		||||
 | 
			
		||||
  /@vue/typescript@1.8.5(typescript@5.1.6):
 | 
			
		||||
    resolution: {integrity: sha512-domFBbNr3PEcjGBeB+cmgUM3cI6pJsJezguIUKZ1rphkfIkICyoMjCd3TitoP32yo2KABLiaXcGFzgFfQf6B3w==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@volar/typescript': 1.9.0
 | 
			
		||||
      '@vue/language-core': 1.8.5(typescript@5.1.6)
 | 
			
		||||
    transitivePeerDependencies:
 | 
			
		||||
      - typescript
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /@vueuse/core@10.2.1(vue@3.3.4):
 | 
			
		||||
    resolution: {integrity: sha512-c441bfMbkAwTNwVRHQ0zdYZNETK//P84rC01aP2Uy/aRFCiie9NE/k9KdIXbno0eDYP5NPUuWv0aA/I4Unr/7w==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@types/web-bluetooth': 0.0.17
 | 
			
		||||
      '@vueuse/metadata': 10.2.1
 | 
			
		||||
      '@vueuse/shared': 10.2.1(vue@3.3.4)
 | 
			
		||||
      vue-demi: 0.14.5(vue@3.3.4)
 | 
			
		||||
    transitivePeerDependencies:
 | 
			
		||||
      - '@vue/composition-api'
 | 
			
		||||
      - vue
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /@vueuse/metadata@10.2.1:
 | 
			
		||||
    resolution: {integrity: sha512-3Gt68mY/i6bQvFqx7cuGBzrCCQu17OBaGWS5JdwISpMsHnMKKjC2FeB5OAfMcCQ0oINfADP3i9A4PPRo0peHdQ==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /@vueuse/shared@10.2.1(vue@3.3.4):
 | 
			
		||||
    resolution: {integrity: sha512-QWHq2bSuGptkcxx4f4M/fBYC3Y8d3M2UYyLsyzoPgEoVzJURQ0oJeWXu79OiLlBb8gTKkqe4mO85T/sf39mmiw==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      vue-demi: 0.14.5(vue@3.3.4)
 | 
			
		||||
    transitivePeerDependencies:
 | 
			
		||||
      - '@vue/composition-api'
 | 
			
		||||
      - vue
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /anymatch@3.1.3:
 | 
			
		||||
    resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
 | 
			
		||||
    engines: {node: '>= 8'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      normalize-path: 3.0.0
 | 
			
		||||
      picomatch: 2.3.1
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /balanced-match@1.0.2:
 | 
			
		||||
    resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /binary-extensions@2.2.0:
 | 
			
		||||
    resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
 | 
			
		||||
    engines: {node: '>=8'}
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /brace-expansion@2.0.1:
 | 
			
		||||
    resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      balanced-match: 1.0.2
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /braces@3.0.2:
 | 
			
		||||
    resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
 | 
			
		||||
    engines: {node: '>=8'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      fill-range: 7.0.1
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /chokidar@3.5.3:
 | 
			
		||||
    resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
 | 
			
		||||
    engines: {node: '>= 8.10.0'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      anymatch: 3.1.3
 | 
			
		||||
      braces: 3.0.2
 | 
			
		||||
      glob-parent: 5.1.2
 | 
			
		||||
      is-binary-path: 2.1.0
 | 
			
		||||
      is-glob: 4.0.3
 | 
			
		||||
      normalize-path: 3.0.0
 | 
			
		||||
      readdirp: 3.6.0
 | 
			
		||||
    optionalDependencies:
 | 
			
		||||
      fsevents: 2.3.2
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /csstype@3.1.2:
 | 
			
		||||
    resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==}
 | 
			
		||||
 | 
			
		||||
  /de-indent@1.0.2:
 | 
			
		||||
    resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==}
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /esbuild@0.18.13:
 | 
			
		||||
    resolution: {integrity: sha512-vhg/WR/Oiu4oUIkVhmfcc23G6/zWuEQKFS+yiosSHe4aN6+DQRXIfeloYGibIfVhkr4wyfuVsGNLr+sQU1rWWw==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    hasBin: true
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    optionalDependencies:
 | 
			
		||||
      '@esbuild/android-arm': 0.18.13
 | 
			
		||||
      '@esbuild/android-arm64': 0.18.13
 | 
			
		||||
      '@esbuild/android-x64': 0.18.13
 | 
			
		||||
      '@esbuild/darwin-arm64': 0.18.13
 | 
			
		||||
      '@esbuild/darwin-x64': 0.18.13
 | 
			
		||||
      '@esbuild/freebsd-arm64': 0.18.13
 | 
			
		||||
      '@esbuild/freebsd-x64': 0.18.13
 | 
			
		||||
      '@esbuild/linux-arm': 0.18.13
 | 
			
		||||
      '@esbuild/linux-arm64': 0.18.13
 | 
			
		||||
      '@esbuild/linux-ia32': 0.18.13
 | 
			
		||||
      '@esbuild/linux-loong64': 0.18.13
 | 
			
		||||
      '@esbuild/linux-mips64el': 0.18.13
 | 
			
		||||
      '@esbuild/linux-ppc64': 0.18.13
 | 
			
		||||
      '@esbuild/linux-riscv64': 0.18.13
 | 
			
		||||
      '@esbuild/linux-s390x': 0.18.13
 | 
			
		||||
      '@esbuild/linux-x64': 0.18.13
 | 
			
		||||
      '@esbuild/netbsd-x64': 0.18.13
 | 
			
		||||
      '@esbuild/openbsd-x64': 0.18.13
 | 
			
		||||
      '@esbuild/sunos-x64': 0.18.13
 | 
			
		||||
      '@esbuild/win32-arm64': 0.18.13
 | 
			
		||||
      '@esbuild/win32-ia32': 0.18.13
 | 
			
		||||
      '@esbuild/win32-x64': 0.18.13
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /estree-walker@2.0.2:
 | 
			
		||||
    resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
 | 
			
		||||
 | 
			
		||||
  /fill-range@7.0.1:
 | 
			
		||||
    resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
 | 
			
		||||
    engines: {node: '>=8'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      to-regex-range: 5.0.1
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /fsevents@2.3.2:
 | 
			
		||||
    resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
 | 
			
		||||
    engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
 | 
			
		||||
    os: [darwin]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /geojson@0.5.0:
 | 
			
		||||
    resolution: {integrity: sha512-/Bx5lEn+qRF4TfQ5aLu6NH+UKtvIv7Lhc487y/c8BdludrCTpiWf9wyI0RTyqg49MFefIAvFDuEi5Dfd/zgNxQ==}
 | 
			
		||||
    engines: {node: '>= 0.10'}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /glob-parent@5.1.2:
 | 
			
		||||
    resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
 | 
			
		||||
    engines: {node: '>= 6'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      is-glob: 4.0.3
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /he@1.2.0:
 | 
			
		||||
    resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
 | 
			
		||||
    hasBin: true
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /is-binary-path@2.1.0:
 | 
			
		||||
    resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
 | 
			
		||||
    engines: {node: '>=8'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      binary-extensions: 2.2.0
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /is-extglob@2.1.1:
 | 
			
		||||
    resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
 | 
			
		||||
    engines: {node: '>=0.10.0'}
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /is-glob@4.0.3:
 | 
			
		||||
    resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
 | 
			
		||||
    engines: {node: '>=0.10.0'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      is-extglob: 2.1.1
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /is-number@7.0.0:
 | 
			
		||||
    resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
 | 
			
		||||
    engines: {node: '>=0.12.0'}
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /leaflet-draw@1.0.4:
 | 
			
		||||
    resolution: {integrity: sha512-rsQ6saQO5ST5Aj6XRFylr5zvarWgzWnrg46zQ1MEOEIHsppdC/8hnN8qMoFvACsPvTioAuysya/TVtog15tyAQ==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /leaflet@1.9.4:
 | 
			
		||||
    resolution: {integrity: sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /lru-cache@6.0.0:
 | 
			
		||||
    resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
 | 
			
		||||
    engines: {node: '>=10'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      yallist: 4.0.0
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /magic-string@0.30.1:
 | 
			
		||||
    resolution: {integrity: sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@jridgewell/sourcemap-codec': 1.4.15
 | 
			
		||||
 | 
			
		||||
  /mgrs@1.0.0:
 | 
			
		||||
    resolution: {integrity: sha512-awNbTOqCxK1DBGjalK3xqWIstBZgN6fxsMSiXLs9/spqWkF2pAhb2rrYCFSsr1/tT7PhcDGjZndG8SWYn0byYA==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /minimatch@9.0.3:
 | 
			
		||||
    resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==}
 | 
			
		||||
    engines: {node: '>=16 || 14 >=14.17'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      brace-expansion: 2.0.1
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /muggle-string@0.3.1:
 | 
			
		||||
    resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==}
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /nanoid@3.3.6:
 | 
			
		||||
    resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==}
 | 
			
		||||
    engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
 | 
			
		||||
    hasBin: true
 | 
			
		||||
 | 
			
		||||
  /normalize-path@3.0.0:
 | 
			
		||||
    resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
 | 
			
		||||
    engines: {node: '>=0.10.0'}
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /picocolors@1.0.0:
 | 
			
		||||
    resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
 | 
			
		||||
 | 
			
		||||
  /picomatch@2.3.1:
 | 
			
		||||
    resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
 | 
			
		||||
    engines: {node: '>=8.6'}
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /postcss@8.4.26:
 | 
			
		||||
    resolution: {integrity: sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw==}
 | 
			
		||||
    engines: {node: ^10 || ^12 || >=14}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      nanoid: 3.3.6
 | 
			
		||||
      picocolors: 1.0.0
 | 
			
		||||
      source-map-js: 1.0.2
 | 
			
		||||
 | 
			
		||||
  /proj4@2.9.0:
 | 
			
		||||
    resolution: {integrity: sha512-BoDXEzCVnRJVZoOKA0QHTFtYoE8lUxtX1jST38DJ8U+v1ixY70Kpwi0Llu6YqSWEH2xqu4XMEBNGcgeRIEywoA==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      mgrs: 1.0.0
 | 
			
		||||
      wkt-parser: 1.3.3
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /proj4leaflet@1.0.2:
 | 
			
		||||
    resolution: {integrity: sha512-6GdDeUlhX/tHUiMEj80xQhlPjwrXcdfD0D5OBymY8WvxfbmZcdhNqQk7n7nFf53ue6QdP9ls9ZPjsAxnbZDTsw==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      proj4: 2.9.0
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /quasar@2.12.3:
 | 
			
		||||
    resolution: {integrity: sha512-9KK5TXWGsZ6XFF6MJQ0E98yp++D1PagqSJrKpE91A6QnZ1gng4KtkFI5iPyuqXciFpXvxniiLsZtxD5ZICHvPw==}
 | 
			
		||||
    engines: {node: '>= 10.18.1', npm: '>= 6.13.4', yarn: '>= 1.21.1'}
 | 
			
		||||
 | 
			
		||||
  /readdirp@3.6.0:
 | 
			
		||||
    resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
 | 
			
		||||
    engines: {node: '>=8.10.0'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      picomatch: 2.3.1
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /rollup@3.26.3:
 | 
			
		||||
    resolution: {integrity: sha512-7Tin0C8l86TkpcMtXvQu6saWH93nhG3dGQ1/+l5V2TDMceTxO7kDiK6GzbfLWNNxqJXm591PcEZUozZm51ogwQ==}
 | 
			
		||||
    engines: {node: '>=14.18.0', npm: '>=8.0.0'}
 | 
			
		||||
    hasBin: true
 | 
			
		||||
    optionalDependencies:
 | 
			
		||||
      fsevents: 2.3.2
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /sass@1.32.12:
 | 
			
		||||
    resolution: {integrity: sha512-zmXn03k3hN0KaiVTjohgkg98C3UowhL1/VSGdj4/VAAiMKGQOE80PFPxFP2Kyq0OUskPKcY5lImkhBKEHlypJA==}
 | 
			
		||||
    engines: {node: '>=8.9.0'}
 | 
			
		||||
    hasBin: true
 | 
			
		||||
    dependencies:
 | 
			
		||||
      chokidar: 3.5.3
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /semver@7.5.4:
 | 
			
		||||
    resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==}
 | 
			
		||||
    engines: {node: '>=10'}
 | 
			
		||||
    hasBin: true
 | 
			
		||||
    dependencies:
 | 
			
		||||
      lru-cache: 6.0.0
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /source-map-js@1.0.2:
 | 
			
		||||
    resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
 | 
			
		||||
    engines: {node: '>=0.10.0'}
 | 
			
		||||
 | 
			
		||||
  /to-fast-properties@2.0.0:
 | 
			
		||||
    resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
 | 
			
		||||
    engines: {node: '>=4'}
 | 
			
		||||
 | 
			
		||||
  /to-regex-range@5.0.1:
 | 
			
		||||
    resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
 | 
			
		||||
    engines: {node: '>=8.0'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      is-number: 7.0.0
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /typescript@5.1.6:
 | 
			
		||||
    resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==}
 | 
			
		||||
    engines: {node: '>=14.17'}
 | 
			
		||||
    hasBin: true
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /vite@4.4.4(sass@1.32.12):
 | 
			
		||||
    resolution: {integrity: sha512-4mvsTxjkveWrKDJI70QmelfVqTm+ihFAb6+xf4sjEU2TmUCTlVX87tmg/QooPEMQb/lM9qGHT99ebqPziEd3wg==}
 | 
			
		||||
    engines: {node: ^14.18.0 || >=16.0.0}
 | 
			
		||||
    hasBin: true
 | 
			
		||||
    peerDependencies:
 | 
			
		||||
      '@types/node': '>= 14'
 | 
			
		||||
      less: '*'
 | 
			
		||||
      lightningcss: ^1.21.0
 | 
			
		||||
      sass: '*'
 | 
			
		||||
      stylus: '*'
 | 
			
		||||
      sugarss: '*'
 | 
			
		||||
      terser: ^5.4.0
 | 
			
		||||
    peerDependenciesMeta:
 | 
			
		||||
      '@types/node':
 | 
			
		||||
        optional: true
 | 
			
		||||
      less:
 | 
			
		||||
        optional: true
 | 
			
		||||
      lightningcss:
 | 
			
		||||
        optional: true
 | 
			
		||||
      sass:
 | 
			
		||||
        optional: true
 | 
			
		||||
      stylus:
 | 
			
		||||
        optional: true
 | 
			
		||||
      sugarss:
 | 
			
		||||
        optional: true
 | 
			
		||||
      terser:
 | 
			
		||||
        optional: true
 | 
			
		||||
    dependencies:
 | 
			
		||||
      esbuild: 0.18.13
 | 
			
		||||
      postcss: 8.4.26
 | 
			
		||||
      rollup: 3.26.3
 | 
			
		||||
      sass: 1.32.12
 | 
			
		||||
    optionalDependencies:
 | 
			
		||||
      fsevents: 2.3.2
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /vue-demi@0.14.5(vue@3.3.4):
 | 
			
		||||
    resolution: {integrity: sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    hasBin: true
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    peerDependencies:
 | 
			
		||||
      '@vue/composition-api': ^1.0.0-rc.1
 | 
			
		||||
      vue: ^3.0.0-0 || ^2.6.0
 | 
			
		||||
    peerDependenciesMeta:
 | 
			
		||||
      '@vue/composition-api':
 | 
			
		||||
        optional: true
 | 
			
		||||
    dependencies:
 | 
			
		||||
      vue: 3.3.4
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /vue-template-compiler@2.7.14:
 | 
			
		||||
    resolution: {integrity: sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      de-indent: 1.0.2
 | 
			
		||||
      he: 1.2.0
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /vue-tsc@1.8.5(typescript@5.1.6):
 | 
			
		||||
    resolution: {integrity: sha512-Jr8PTghJIwp69MFsEZoADDcv2l+lXA8juyN/5AYA5zxyZNvIHjSbgKgkYIYc1qnihrOyIG1VOnfk4ZE0jqn8bw==}
 | 
			
		||||
    hasBin: true
 | 
			
		||||
    peerDependencies:
 | 
			
		||||
      typescript: '*'
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@vue/language-core': 1.8.5(typescript@5.1.6)
 | 
			
		||||
      '@vue/typescript': 1.8.5(typescript@5.1.6)
 | 
			
		||||
      semver: 7.5.4
 | 
			
		||||
      typescript: 5.1.6
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /vue@3.3.4:
 | 
			
		||||
    resolution: {integrity: sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@vue/compiler-dom': 3.3.4
 | 
			
		||||
      '@vue/compiler-sfc': 3.3.4
 | 
			
		||||
      '@vue/runtime-dom': 3.3.4
 | 
			
		||||
      '@vue/server-renderer': 3.3.4(vue@3.3.4)
 | 
			
		||||
      '@vue/shared': 3.3.4
 | 
			
		||||
 | 
			
		||||
  /wkt-parser@1.3.3:
 | 
			
		||||
    resolution: {integrity: sha512-ZnV3yH8/k58ZPACOXeiHaMuXIiaTk1t0hSUVisbO0t4RjA5wPpUytcxeyiN2h+LZRrmuHIh/1UlrR9e7DHDvTw==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /yallist@4.0.0:
 | 
			
		||||
    resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
 | 
			
		||||
    dev: true
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 1.5 KiB  | 
| 
						 | 
				
			
			@ -0,0 +1,130 @@
 | 
			
		|||
<script setup lang="ts">
 | 
			
		||||
import { onBeforeMount, ref, watch } from 'vue';
 | 
			
		||||
import Map from './components/Map.vue'
 | 
			
		||||
import Mark from './components/mapChild/Mark.vue'
 | 
			
		||||
import useMarks, { markType } from './hook/useMarks.ts'
 | 
			
		||||
import ThemeSwitch from './components/ThemeSwitch.vue'
 | 
			
		||||
import MarkMenu from './components/left/MarkMenu.vue'
 | 
			
		||||
import CtrlMenu, { DataProps } from './components/left/CtrlMenu.vue'
 | 
			
		||||
import { mdiLanConnect } from '@quasar/extras/mdi-v7'
 | 
			
		||||
import { useWindowSize } from '@vueuse/core';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const map = ref<InstanceType<typeof Map>>(); // 获取地图的实例 纂取实例方法
 | 
			
		||||
const marks = useMarks([{ latlng: [39.92647400, 116.40328300], title: '北京故宫', opacity: 1 }])
 | 
			
		||||
const tab = ref('mark')
 | 
			
		||||
const sideStyle = ref('20em,logo');
 | 
			
		||||
const { width } = useWindowSize()
 | 
			
		||||
 | 
			
		||||
onBeforeMount(() => {
 | 
			
		||||
  sideStyle.value = width.value > 600 ? '20em,logo' : '0em,bar'
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
function changeSide(data: string) {
 | 
			
		||||
  const _data = data.split(',')
 | 
			
		||||
  document.body.style.setProperty('--side', _data[0])
 | 
			
		||||
  document.body.style.setProperty('--logoOrBar', _data[1])
 | 
			
		||||
}
 | 
			
		||||
watch(sideStyle, changeSide)
 | 
			
		||||
 | 
			
		||||
function pushMark(params: any, type: markType) {
 | 
			
		||||
  const { latlng } = params;
 | 
			
		||||
  marks.value.push({ latlng: [latlng.lat, latlng.lng], title: '新标点', opacity: 1, type })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function removeMark(index: number) {
 | 
			
		||||
  marks.value.splice(index, 1)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function flytoMark(index: number) {
 | 
			
		||||
  map.value?.flyTo(marks.value[index].latlng)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function ctrlMap(e: DataProps) {
 | 
			
		||||
  const { zoom, errorTileUrl, urlTemplate, zoomSnap } = e;
 | 
			
		||||
  map.value?.changeZoom([zoom.min, zoom.max])
 | 
			
		||||
  map.value?.changeMapUrl(urlTemplate, errorTileUrl)
 | 
			
		||||
  map.value?.changeZoomSnap(zoomSnap)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<template>
 | 
			
		||||
  <h5 class="logo">离线地图</h5>
 | 
			
		||||
  <Map ref="map" v-slot="{ contextmenu }">
 | 
			
		||||
    <q-menu touch-position context-menu>
 | 
			
		||||
      <q-list dense style="min-width: 100px">
 | 
			
		||||
        <q-item clickable v-close-popup>
 | 
			
		||||
          <q-item-section @click="pushMark(contextmenu, 'localtion')">添加标点</q-item-section>
 | 
			
		||||
        </q-item>
 | 
			
		||||
        <q-item clickable v-close-popup>
 | 
			
		||||
          <q-item-section @click="pushMark(contextmenu, 'equipment')">添加设备</q-item-section>
 | 
			
		||||
        </q-item>
 | 
			
		||||
      </q-list>
 | 
			
		||||
    </q-menu>
 | 
			
		||||
    <Mark v-for="(mark, i) in marks" :key="i" :latlng="mark.latlng" :title="mark.title" :opacity="mark.opacity"
 | 
			
		||||
      :ref="`mark-${i}`">
 | 
			
		||||
      <template v-if="mark.type === 'equipment'">
 | 
			
		||||
        <q-icon :name="mdiLanConnect" size="md"></q-icon>
 | 
			
		||||
      </template>
 | 
			
		||||
    </Mark>
 | 
			
		||||
  </Map>
 | 
			
		||||
  <div class="bar">
 | 
			
		||||
 | 
			
		||||
    <ThemeSwitch></ThemeSwitch>
 | 
			
		||||
  </div>
 | 
			
		||||
  <div class="left ">
 | 
			
		||||
    <q-toggle class="leftctl" v-model="sideStyle" true-value="20em,logo" false-value="0em,bar" />
 | 
			
		||||
    <q-tabs v-model="tab" dense active-color="primary" indicator-color="primary" align="justify" narrow-indicator>
 | 
			
		||||
      <q-tab name="mark" label="标点" />
 | 
			
		||||
      <q-tab name="ctrl" label="控制" />
 | 
			
		||||
    </q-tabs>
 | 
			
		||||
    <q-tab-panels v-model="tab" animated keep-alive>
 | 
			
		||||
      <q-tab-panel name="mark">
 | 
			
		||||
        <MarkMenu :marks="marks" @flyTo="flytoMark" @remove="removeMark"></MarkMenu>
 | 
			
		||||
      </q-tab-panel>
 | 
			
		||||
      <q-tab-panel name="ctrl">
 | 
			
		||||
        <CtrlMenu @change="ctrlMap"></CtrlMenu>
 | 
			
		||||
      </q-tab-panel>
 | 
			
		||||
    </q-tab-panels>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<style scoped lang="scss">
 | 
			
		||||
.logo {
 | 
			
		||||
  margin: unset;
 | 
			
		||||
  grid-area: var(--logoOrBar, logo);
 | 
			
		||||
  will-change: filter;
 | 
			
		||||
  transition: filter 300ms;
 | 
			
		||||
  align-self: center;
 | 
			
		||||
  text-align: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.logo:hover {
 | 
			
		||||
  filter: drop-shadow(0 0 2em #646cffaa);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.logo.vue:hover {
 | 
			
		||||
  filter: drop-shadow(0 0 2em #42b883aa);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.left {
 | 
			
		||||
  grid-area: left;
 | 
			
		||||
  overflow: auto;
 | 
			
		||||
  user-select: none;
 | 
			
		||||
 | 
			
		||||
  .leftctl {
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    top: 0px;
 | 
			
		||||
    left: 10px;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.bar {
 | 
			
		||||
  grid-area: bar;
 | 
			
		||||
  display: flex;
 | 
			
		||||
  align-items: center;
 | 
			
		||||
  justify-content: flex-end;
 | 
			
		||||
  margin-right: 20px;
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="37.07" height="36" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 198"><path fill="#41B883" d="M204.8 0H256L128 220.8L0 0h97.92L128 51.2L157.44 0h47.36Z"></path><path fill="#41B883" d="m0 0l128 220.8L256 0h-51.2L128 132.48L50.56 0H0Z"></path><path fill="#35495E" d="M50.56 0L128 133.12L204.8 0h-47.36L128 51.2L97.92 0H50.56Z"></path></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 496 B  | 
| 
						 | 
				
			
			@ -0,0 +1,161 @@
 | 
			
		|||
<script setup lang="ts">
 | 
			
		||||
import { ref, onMounted, provide } from 'vue'
 | 
			
		||||
import L from 'leaflet'
 | 
			
		||||
import 'leaflet/dist/leaflet.css'
 | 
			
		||||
import useCrs from '../hook/useCrs.ts'
 | 
			
		||||
import useZoom from '../hook/useZoom.ts'
 | 
			
		||||
import { useResizeObserver } from '@vueuse/core'
 | 
			
		||||
 | 
			
		||||
const mapContainer = ref()
 | 
			
		||||
const map = ref<L.Map>()
 | 
			
		||||
const layers = ref<L.TileLayer[]>([])
 | 
			
		||||
const slotProps = ref({
 | 
			
		||||
  contextmenu: {}
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
const baiduCrs = useCrs('baiduCrs')
 | 
			
		||||
const gaodeCrs = useCrs('gaodeCrs')
 | 
			
		||||
 | 
			
		||||
const mapFilter = ref('invert(1) grayscale(.2) saturate(0.8) brightness(1.8) opacity(1) hue-rotate(184deg) sepia(17%)'); // 地图滤镜
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const mapInfo: Record<string, { crs: L.Proj.CRS | L.CRS, url: string, error: string, center: L.LatLngExpression }> = {
 | 
			
		||||
  baidu: {
 | 
			
		||||
    crs: baiduCrs,
 | 
			
		||||
    url: "http://172.20.10.2/baidumaps/roadmap/{z}/{x}/{y}.png",
 | 
			
		||||
    error: 'http://172.20.10.2/baidumaps/roadmap/error.png',
 | 
			
		||||
    center: [39.926474, 116.403283]
 | 
			
		||||
  },
 | 
			
		||||
  gaode: {
 | 
			
		||||
    crs: gaodeCrs,
 | 
			
		||||
    url: "http://172.20.10.2/mapabc/roadmap/{z}/{x}/{y}.png",
 | 
			
		||||
    error: 'http://172.20.10.2/baidumaps/roadmap/error.png',
 | 
			
		||||
    center: [-97.00238024827533, 210.7725501856634]
 | 
			
		||||
  },
 | 
			
		||||
  gaodeLine: {
 | 
			
		||||
    crs: gaodeCrs,
 | 
			
		||||
    url: "http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}",
 | 
			
		||||
    error: 'http://172.20.10.2/baidumaps/roadmap/error.png',
 | 
			
		||||
    center: [-97.00238024827533, 210.7725501856634]
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
provide('map', map) // 注入的内容 mapChild 下
 | 
			
		||||
 | 
			
		||||
onMounted(() => {
 | 
			
		||||
  // const selfZoom = useZoom(mapContainer,map, [3,6,9,14,16,18])
 | 
			
		||||
 | 
			
		||||
  // L.Map.addInitHook('addHandler','scrollWheelZoom', selfZoom)
 | 
			
		||||
  // L.Map.mergeOptions({
 | 
			
		||||
  //   scrollWheelZoom:true
 | 
			
		||||
  // })
 | 
			
		||||
 | 
			
		||||
  const use: keyof typeof mapInfo = 'gaode'
 | 
			
		||||
 | 
			
		||||
  map.value = L.map(mapContainer.value, {
 | 
			
		||||
    center: mapInfo[use].center,
 | 
			
		||||
    zoom: 13,
 | 
			
		||||
    attributionControl: false,
 | 
			
		||||
    crs: mapInfo[use].crs,
 | 
			
		||||
    zoomControl: false,
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  // const scale= L.control.scale({ maxWidth: 200, metric: true, imperial: true });
 | 
			
		||||
  // map.value.addControl(scale)
 | 
			
		||||
  const layer = L.tileLayer(mapInfo[use].url, {
 | 
			
		||||
    minZoom: 3,
 | 
			
		||||
    maxZoom: 18,
 | 
			
		||||
    tms: true,
 | 
			
		||||
    errorTileUrl: mapInfo[use].error,
 | 
			
		||||
    className: "mapFilter",
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  // map.value.on('zoom', (e) => {
 | 
			
		||||
  //   console.log(e.target._animateToZoom)
 | 
			
		||||
  // })
 | 
			
		||||
 | 
			
		||||
  layers.value?.push(layer)
 | 
			
		||||
 | 
			
		||||
  layer.addTo(map.value)
 | 
			
		||||
 | 
			
		||||
  map.value.addEventListener("contextmenu", (e) => {
 | 
			
		||||
    slotProps.value.contextmenu = e
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
function flyTo(latLng: [number, number]) {
 | 
			
		||||
  map.value?.flyTo(L.latLng(latLng[0], latLng[1]))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function changeZoom(zoomSize: [number, number]) {
 | 
			
		||||
  map.value?.setMinZoom(zoomSize[0])
 | 
			
		||||
  map.value?.setMaxZoom(zoomSize[1])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function changeMapFilter(filterInfo: Record<'blur' |
 | 
			
		||||
  'brightness' |
 | 
			
		||||
  'contrast' |
 | 
			
		||||
  'drop-shadow' |
 | 
			
		||||
  'grayscale' |
 | 
			
		||||
  'hue-rotate' |
 | 
			
		||||
  'invert' |
 | 
			
		||||
  'opacity' |
 | 
			
		||||
  'saturate' |
 | 
			
		||||
  'sepia', string | number>) {
 | 
			
		||||
  mapFilter.value = Object.entries(filterInfo).map(([key, value]) => `${key}(${value})`).join(' ')
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function changeMapUrl(urlTemplate: string, errorTileUrl: string) {
 | 
			
		||||
  if (!layers.value[0]) return;
 | 
			
		||||
  layers.value[0].setUrl(urlTemplate);
 | 
			
		||||
  layers.value[0].options.errorTileUrl = errorTileUrl;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function changeAnimation(zoomAnimation: boolean, fadeAnimation: boolean) {
 | 
			
		||||
  if (!map.value) return;
 | 
			
		||||
  map.value.options.zoomAnimation = zoomAnimation
 | 
			
		||||
  map.value.options.fadeAnimation = fadeAnimation
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function changeZoomSnap(zoomAnimation: number) {
 | 
			
		||||
  if (!map.value) return;
 | 
			
		||||
  map.value.options.zoomSnap = zoomAnimation
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function pushLayers(addlayers: L.TileLayer[]) {
 | 
			
		||||
  const _map = map.value
 | 
			
		||||
  if (!_map) return
 | 
			
		||||
  addlayers.forEach(l => {
 | 
			
		||||
    if (_map.hasLayer(l)) return;
 | 
			
		||||
    layers.value.push(l)
 | 
			
		||||
    l.addTo(_map)
 | 
			
		||||
  })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
useResizeObserver(mapContainer, () => map.value?.invalidateSize(true))
 | 
			
		||||
 | 
			
		||||
defineExpose({ flyTo, changeZoom, changeMapFilter, changeMapUrl, pushLayers, changeAnimation,changeZoomSnap })
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="mapContainer" ref="mapContainer" :style="{ '--mapFilter': mapFilter }">
 | 
			
		||||
    <slot v-if="map" v-bind="slotProps"></slot>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<style  lang="scss">
 | 
			
		||||
.mapContainer {
 | 
			
		||||
  grid-area: map;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
body.body--dark {
 | 
			
		||||
  .mapFilter {
 | 
			
		||||
    filter: var(--mapFilter);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,23 @@
 | 
			
		|||
<script lang="ts" setup>
 | 
			
		||||
import { useQuasar } from 'quasar'
 | 
			
		||||
import { ref, watch } from 'vue'
 | 
			
		||||
import { mdiThemeLightDark, mdiWeatherSunny, mdiWeatherNight } from '@quasar/extras/mdi-v7'
 | 
			
		||||
 | 
			
		||||
const $q = useQuasar()
 | 
			
		||||
const status = ref($q.dark.mode)
 | 
			
		||||
 | 
			
		||||
function getThemeIcon(v: boolean | 'auto') {
 | 
			
		||||
    if (v === 'auto') return mdiThemeLightDark
 | 
			
		||||
    else return v ? mdiWeatherNight : mdiWeatherSunny
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
watch(status, $q.dark.set)
 | 
			
		||||
 | 
			
		||||
</script>
 | 
			
		||||
<template>
 | 
			
		||||
    <div style="width: 88px;"> 
 | 
			
		||||
        <q-toggle indeterminate-value="auto" v-model="status" toggle-indeterminate />
 | 
			
		||||
        <q-icon :name="getThemeIcon(status)" size="sm"></q-icon>
 | 
			
		||||
    </div>
 | 
			
		||||
</template>
 | 
			
		||||
<style></style>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,57 @@
 | 
			
		|||
<script lang="ts">
 | 
			
		||||
export type DataProps = { zoom: { min: number, max: number }, urlTemplate: string, errorTileUrl: string ,zoomSnap:number}
 | 
			
		||||
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<script lang="ts" setup>
 | 
			
		||||
import { ref, watch } from 'vue';
 | 
			
		||||
const data = ref<DataProps>({
 | 
			
		||||
    zoom: { min: 3, max: 17 },
 | 
			
		||||
    urlTemplate: 'http://localhost/mapabc/roadmap/{z}/{x}/{y}.png', // TODO 动态化,
 | 
			
		||||
    errorTileUrl: 'http://localhost/baidumaps/roadmap/error.png',
 | 
			
		||||
    zoomSnap:1,
 | 
			
		||||
})
 | 
			
		||||
const emit = defineEmits(['change'])
 | 
			
		||||
watch(data, (v) => emit('change', v), { deep: true })
 | 
			
		||||
 | 
			
		||||
</script>
 | 
			
		||||
<template>
 | 
			
		||||
    <q-list>
 | 
			
		||||
        <q-item clickable v-close-popup>
 | 
			
		||||
            <q-item-section>
 | 
			
		||||
                <q-item-label>缩放控制</q-item-label>
 | 
			
		||||
                <q-item-label caption>
 | 
			
		||||
                    <q-range v-model="data.zoom" :min="3" :max="19" color="deep-orange" label-always markers
 | 
			
		||||
                        switch-label-side />
 | 
			
		||||
                </q-item-label>
 | 
			
		||||
                <!-- TODO 控制多图层 ?? 缩放级别减少 直接控制路线等 -->
 | 
			
		||||
                <!-- TODO 地图不清楚 -->
 | 
			
		||||
            </q-item-section>
 | 
			
		||||
        </q-item>
 | 
			
		||||
        <q-item>
 | 
			
		||||
            <q-item-section>
 | 
			
		||||
                <q-item-label>访问地址</q-item-label>
 | 
			
		||||
                <q-item-label caption>
 | 
			
		||||
                    <q-input v-model="data.urlTemplate" />
 | 
			
		||||
                </q-item-label>
 | 
			
		||||
            </q-item-section>
 | 
			
		||||
        </q-item>
 | 
			
		||||
        <q-item>
 | 
			
		||||
            <q-item-section>
 | 
			
		||||
                <q-item-label>失败图片</q-item-label>
 | 
			
		||||
                <q-item-label caption>
 | 
			
		||||
                    <q-input v-model="data.errorTileUrl" />
 | 
			
		||||
                </q-item-label>
 | 
			
		||||
            </q-item-section>
 | 
			
		||||
        </q-item>
 | 
			
		||||
        <q-item>
 | 
			
		||||
            <q-item-section>
 | 
			
		||||
                <q-item-label>缩放倍数</q-item-label>
 | 
			
		||||
                <q-item-label caption>
 | 
			
		||||
                    <q-input v-model.number="data.zoomSnap"  type="number" />
 | 
			
		||||
                </q-item-label>
 | 
			
		||||
            </q-item-section>
 | 
			
		||||
        </q-item>
 | 
			
		||||
 | 
			
		||||
    </q-list>
 | 
			
		||||
</template>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,37 @@
 | 
			
		|||
<script lang="ts" setup>
 | 
			
		||||
import { markInfo } from '../../hook/useMarks'
 | 
			
		||||
import { mdiMapMarker, mdiLanConnect } from '@quasar/extras/mdi-v7'
 | 
			
		||||
 | 
			
		||||
defineProps({
 | 
			
		||||
    marks: Array<markInfo>
 | 
			
		||||
})
 | 
			
		||||
defineEmits(['flyTo', 'remove'])
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<template>
 | 
			
		||||
    <!-- TODO 移除-->
 | 
			
		||||
    <q-list bordered separator>
 | 
			
		||||
        <q-item clickable v-ripple v-for="(mark, i) in marks" :key="i">
 | 
			
		||||
            <q-menu touch-position context-menu>
 | 
			
		||||
                <q-list dense style="min-width: 100px">
 | 
			
		||||
                    <q-item clickable v-close-popup>
 | 
			
		||||
                        <q-item-section @click="$emit('flyTo', i)">跳转</q-item-section>
 | 
			
		||||
                    </q-item>
 | 
			
		||||
                    <q-item clickable v-close-popup>
 | 
			
		||||
                        <q-item-section @click="$emit('remove', i)">删除</q-item-section>
 | 
			
		||||
                    </q-item>
 | 
			
		||||
                </q-list>
 | 
			
		||||
            </q-menu>
 | 
			
		||||
            <q-item-section side>
 | 
			
		||||
                <q-input filled v-model="mark.title">
 | 
			
		||||
                    <template v-slot:append>
 | 
			
		||||
                        <q-icon :name="{ 'localtion': mdiMapMarker, 'equipment': mdiLanConnect }[mark.type ||'localtion']"></q-icon>
 | 
			
		||||
                    </template>
 | 
			
		||||
                </q-input>
 | 
			
		||||
            </q-item-section>
 | 
			
		||||
            <q-item-section side>
 | 
			
		||||
                <q-toggle color="blue" v-model="mark.opacity" :false-value="0" :true-value="1" />
 | 
			
		||||
            </q-item-section>
 | 
			
		||||
        </q-item>
 | 
			
		||||
    </q-list>
 | 
			
		||||
</template>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,68 @@
 | 
			
		|||
<script lang="ts" setup>
 | 
			
		||||
import L from 'leaflet';
 | 
			
		||||
import { Ref, inject, onMounted,onUnmounted, ref, watch } from 'vue';
 | 
			
		||||
import { mdiMapMarker } from '@quasar/extras/mdi-v7'
 | 
			
		||||
 | 
			
		||||
const props = defineProps({
 | 
			
		||||
    latlng: Array<Number>,
 | 
			
		||||
    title: String,
 | 
			
		||||
    opacity: Number
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
const map = inject<Ref<L.Map>>('map');
 | 
			
		||||
const mark = ref<L.Marker>()
 | 
			
		||||
const markInfo = ref()
 | 
			
		||||
 | 
			
		||||
watch(props, ({ title = '', latlng = [0, 0], opacity = 1 }) => {
 | 
			
		||||
    if (!mark.value) return
 | 
			
		||||
    mark.value.setLatLng(L.latLng(+latlng[0], +latlng[1]))
 | 
			
		||||
    mark.value.options.title = title
 | 
			
		||||
    mark.value.setOpacity(opacity)
 | 
			
		||||
    mark.value.getTooltip()?.setOpacity(opacity)
 | 
			
		||||
    mark.value.setTooltipContent(title)
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
onMounted(() => {
 | 
			
		||||
    const { latlng = [0, 0], title, opacity = 1 } = props;
 | 
			
		||||
    mark.value = L.marker(L.latLng(+latlng[0], +latlng[1]), {
 | 
			
		||||
        title, icon: L.divIcon({
 | 
			
		||||
            html: markInfo.value,
 | 
			
		||||
            className: 'markInfo',
 | 
			
		||||
            iconAnchor: L.point(12, 24)
 | 
			
		||||
        })
 | 
			
		||||
    }).bindTooltip(title || '', {
 | 
			
		||||
        permanent: !!title,
 | 
			
		||||
        offset: [15, -5],// 偏移
 | 
			
		||||
        direction: "right",// 放置位置
 | 
			
		||||
        opacity
 | 
			
		||||
    }).openTooltip()
 | 
			
		||||
 | 
			
		||||
    mark.value.setOpacity(opacity)
 | 
			
		||||
    map?.value && mark.value.addTo(map.value)
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
onUnmounted(()=>{
 | 
			
		||||
    mark.value?.remove()
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
function remove(call: () => void) {
 | 
			
		||||
    mark.value?.remove()
 | 
			
		||||
    call()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
defineExpose({ mark, remove })
 | 
			
		||||
</script>
 | 
			
		||||
<template>
 | 
			
		||||
    <div ref="markInfo">
 | 
			
		||||
        <slot>
 | 
			
		||||
            <q-icon :name="mdiMapMarker" size="md"></q-icon>
 | 
			
		||||
        </slot>
 | 
			
		||||
    </div>
 | 
			
		||||
</template>
 | 
			
		||||
<style lang="scss">
 | 
			
		||||
.markInfo {
 | 
			
		||||
    background-color: transparent;
 | 
			
		||||
    color: #ae1e1e;
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,30 @@
 | 
			
		|||
import L from 'leaflet'
 | 
			
		||||
import 'proj4'
 | 
			
		||||
import 'proj4leaflet'
 | 
			
		||||
const _level = 19;
 | 
			
		||||
 | 
			
		||||
const crss = {
 | 
			
		||||
    baiduCrs: new L.Proj.CRS('EPSG:900913',
 | 
			
		||||
        '+proj=merc +a=6378206 +b=6356584.314245179 +lat_ts=0.0 +lon_0=0.0 +x_0=0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext  +no_defs',
 | 
			
		||||
        {
 | 
			
		||||
            resolutions: function () {
 | 
			
		||||
                let level = 19
 | 
			
		||||
                var res = [];
 | 
			
		||||
                res[0] = Math.pow(2, 18);
 | 
			
		||||
                for (var i = 1; i < level; i++) {
 | 
			
		||||
                    res[i] = Math.pow(2, (18 - i))
 | 
			
		||||
                }
 | 
			
		||||
                return res;
 | 
			
		||||
            }(),
 | 
			
		||||
            origin: [0, 0],
 | 
			
		||||
            bounds: L.bounds([20037508.342789244, 0], [0, 20037508.342789244])
 | 
			
		||||
        }),
 | 
			
		||||
    gaodeCrs: L.CRS.Simple
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function useCrs(name: keyof typeof crss) {
 | 
			
		||||
    return crss[name]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
export default useCrs
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,6 @@
 | 
			
		|||
function useDraw(){
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
export default useDraw
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,12 @@
 | 
			
		|||
import { useLocalStorage } from "@vueuse/core"
 | 
			
		||||
 | 
			
		||||
const key = 'map-marks'
 | 
			
		||||
export type markType = 'localtion' | 'equipment'
 | 
			
		||||
export type markInfo = { latlng: [number, number], title: string, opacity?: number, type?: markType }
 | 
			
		||||
 | 
			
		||||
function useMarks(initData: markInfo[] = []) {
 | 
			
		||||
    const stroked = useLocalStorage<markInfo[]>(key, initData);
 | 
			
		||||
    return stroked;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default useMarks
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,69 @@
 | 
			
		|||
type RGBA = Record<'r' | 'g' | 'b' | 'a', number>;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function imageChange(img: HTMLImageElement, colorize: (pixel: RGBA) => RGBA) {
 | 
			
		||||
    if (img.getAttribute('data-colorized'))
 | 
			
		||||
        return;
 | 
			
		||||
    img.crossOrigin = 'anonymous'
 | 
			
		||||
    var canvas = document.createElement("canvas");
 | 
			
		||||
    canvas.width = img.width;
 | 
			
		||||
    canvas.height = img.height;
 | 
			
		||||
    var ctx = canvas.getContext("2d");
 | 
			
		||||
    if (!ctx) return
 | 
			
		||||
    ctx.drawImage(img, 0, 0);
 | 
			
		||||
    var imgd = ctx.getImageData(0, 0, canvas.width, canvas.height);
 | 
			
		||||
    var pix = imgd.data;
 | 
			
		||||
    for (var i = 0, n = pix.length; i < n; i += 4) {
 | 
			
		||||
 | 
			
		||||
        var pixel = colorize({ r: pix[i], g: pix[i + 1], b: pix[i + 2], a: pix[i + 3] });
 | 
			
		||||
        if (!!!pixel || pixel !== Object(pixel) || Object.prototype.toString.call(pixel) === '[object Array]') {
 | 
			
		||||
 | 
			
		||||
            if (i === 0) {
 | 
			
		||||
                throw 'The colorize option should return an object with at least one of "r", "g", "b", or "a" properties.';
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        } else {
 | 
			
		||||
            if (pixel.hasOwnProperty('r') && typeof pixel.r === 'number') {
 | 
			
		||||
                pix[i] = pixel.r;
 | 
			
		||||
            }
 | 
			
		||||
            if (pixel.hasOwnProperty('g')) {
 | 
			
		||||
                pix[i + 1] = pixel.g;
 | 
			
		||||
            }
 | 
			
		||||
            if (pixel.hasOwnProperty('b')) {
 | 
			
		||||
                pix[i + 2] = pixel.b;
 | 
			
		||||
            }
 | 
			
		||||
            if (pixel.hasOwnProperty('a')) {
 | 
			
		||||
                pix[i + 3] = pixel.a;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ctx.putImageData(imgd, 0, 0);
 | 
			
		||||
    img.setAttribute('data-colorized', 'true');
 | 
			
		||||
    img.src = canvas.toDataURL();
 | 
			
		||||
    return imgd;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 
 | 
			
		||||
 * @param img 图片
 | 
			
		||||
 * @param colorize 图片rgb颜色修改
 | 
			
		||||
 * @example  
 | 
			
		||||
 * const colorize = useRgb()
 | 
			
		||||
 * layer.on('tileload', (e) => {
 | 
			
		||||
 *      colorize(e.tile, (pixel) => {
 | 
			
		||||
 *          pixel.g += 17;
 | 
			
		||||
 *          pixel.b += 90;
 | 
			
		||||
 *          return pixel;
 | 
			
		||||
 *      })
 | 
			
		||||
 *  }) 
 | 
			
		||||
 * @returns 
 | 
			
		||||
 */
 | 
			
		||||
function useRgb() {
 | 
			
		||||
    return imageChange;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default useRgb
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,85 @@
 | 
			
		|||
import L from "leaflet"
 | 
			
		||||
import { ref, Ref } from "vue";
 | 
			
		||||
 | 
			
		||||
function close(used: number[], close: number): number { // 接近数字下表
 | 
			
		||||
    const closeUsed = used.map((v, i) => ({ v: close - v, i }))
 | 
			
		||||
    const p = closeUsed.shift();
 | 
			
		||||
    if (!p) throw new Error('传入使用数组不能为空');
 | 
			
		||||
    const a = closeUsed.reduce((pre, cur) => {
 | 
			
		||||
        if (pre.v < 0 && cur.v < 0) { // 双方小数
 | 
			
		||||
            return pre.v < cur.v ? cur : pre   // 取大
 | 
			
		||||
        } else if (pre.v < 0 || cur.v < 0) { // 有一方是小数
 | 
			
		||||
            return pre.v < 0 ? pre : cur // 取小数
 | 
			
		||||
        } else { // 都不是
 | 
			
		||||
            
 | 
			
		||||
            return pre.v < cur.v ? pre : cur // 取小
 | 
			
		||||
        }
 | 
			
		||||
    }, p)
 | 
			
		||||
 | 
			
		||||
    return a.i
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function limitZoom(min: number, max: number, zoom: number): number {
 | 
			
		||||
    return Math.max(min, Math.min(max, zoom))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function useZoom(mapContainer: Ref<HTMLElement>, map: Ref<L.Map | undefined>, used: number[]) {
 | 
			
		||||
    const _used = used.sort((a, b) => a - b)
 | 
			
		||||
    let _timer = 0;
 | 
			
		||||
    let _delta = 0;
 | 
			
		||||
    let _currentZoom = ref(0);
 | 
			
		||||
 | 
			
		||||
    const zoomControl = L.Handler.extend({
 | 
			
		||||
        addHooks: function () {
 | 
			
		||||
            console.log('add')
 | 
			
		||||
            L.DomEvent.on(mapContainer.value, 'wheel', this._onWheelScroll)
 | 
			
		||||
        },
 | 
			
		||||
        removeHooks: function () {
 | 
			
		||||
            console.log('remove')
 | 
			
		||||
            L.DomEvent.off(mapContainer.value, 'wheel', this._onWheelScroll)
 | 
			
		||||
        },
 | 
			
		||||
        _onWheelScroll: function (e: WheelEvent) {
 | 
			
		||||
            const _map = map.value;
 | 
			
		||||
            if (!_map) return;
 | 
			
		||||
            let _lastMousePos = _map.mouseEventToContainerPoint(e);
 | 
			
		||||
            let _debounce = _map.options.wheelDebounceTime
 | 
			
		||||
 | 
			
		||||
            const delta = L.DomEvent.getWheelDelta(e);  // 处理高度
 | 
			
		||||
            _delta += delta
 | 
			
		||||
 | 
			
		||||
            clearTimeout(_timer)
 | 
			
		||||
            _timer = setTimeout(() => {
 | 
			
		||||
 | 
			
		||||
                let zoom = _map.getZoom(),
 | 
			
		||||
                    snap = _map.options.zoomSnap || 0,
 | 
			
		||||
                    d2 = _delta / ((_map.options.wheelPxPerZoomLevel || 60) * 4),
 | 
			
		||||
                    d3 = 4 * Math.log(2 / (1 + Math.exp(-Math.abs(d2)))) / Math.LN2,
 | 
			
		||||
                    d4 = snap ? Math.ceil(d3 / snap) * snap : d3,
 | 
			
		||||
                    min = _map.getMinZoom(),
 | 
			
		||||
                    max = _map.getMaxZoom(),
 | 
			
		||||
                    limit = limitZoom(min, max, zoom + (_delta > 0 ? d4 : -d4)),
 | 
			
		||||
                    delta = limit - zoom;
 | 
			
		||||
 | 
			
		||||
                if (!delta) return
 | 
			
		||||
                _currentZoom.value = close(_used, limit) + delta
 | 
			
		||||
                const _to = _used[_currentZoom.value];
 | 
			
		||||
                console.log(_used, '当前', zoom, '放大缩小', delta, '接近', close(_used, limit), '转到', _currentZoom.value, '实际', _to)
 | 
			
		||||
                debugger
 | 
			
		||||
                if (_map.options.scrollWheelZoom === 'center') {
 | 
			
		||||
                    _map.setZoom(_to);
 | 
			
		||||
                } else {
 | 
			
		||||
                    _map.setZoomAround(_lastMousePos, _to);
 | 
			
		||||
                }
 | 
			
		||||
                _delta = 0
 | 
			
		||||
            }, _debounce);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            L.DomEvent.stop(e);
 | 
			
		||||
        },
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
    return zoomControl
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
export default useZoom
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,20 @@
 | 
			
		|||
import { createApp } from 'vue'
 | 
			
		||||
import './style.scss'
 | 
			
		||||
import App from './App.vue'
 | 
			
		||||
 | 
			
		||||
import { Quasar } from 'quasar'
 | 
			
		||||
 | 
			
		||||
// Import icon libraries
 | 
			
		||||
import '@quasar/extras/material-icons/material-icons.css'
 | 
			
		||||
 | 
			
		||||
import '@quasar/extras/mdi-v7/mdi-v7.css'
 | 
			
		||||
 | 
			
		||||
// Import Quasar css
 | 
			
		||||
import 'quasar/src/css/index.sass'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const myApp = createApp(App)
 | 
			
		||||
myApp.use(Quasar, {
 | 
			
		||||
    plugins: {}, // import Quasar plugins and add here
 | 
			
		||||
})
 | 
			
		||||
myApp.mount('#app')
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,11 @@
 | 
			
		|||
$primary   : #1976d2;
 | 
			
		||||
$secondary : #26A69A;
 | 
			
		||||
$accent    : #9C27B0;
 | 
			
		||||
 | 
			
		||||
$dark      : #1d1d1d;
 | 
			
		||||
$dark-page : #121212;
 | 
			
		||||
 | 
			
		||||
$positive  : #21BA45;
 | 
			
		||||
$negative  : #C10015;
 | 
			
		||||
$info      : #31CCEC;
 | 
			
		||||
$warning   : #F2C037;
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,9 @@
 | 
			
		|||
#app {
 | 
			
		||||
  display: grid;
 | 
			
		||||
  width: 100vw;
 | 
			
		||||
  height: 100vh;
 | 
			
		||||
  grid-template-areas: "logo bar"
 | 
			
		||||
    "left  map";
 | 
			
		||||
  grid-template-rows: 3em 1fr;
 | 
			
		||||
  grid-template-columns: var(--side, 20em) 1fr;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
/// <reference types="vite/client" />
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,25 @@
 | 
			
		|||
{
 | 
			
		||||
  "compilerOptions": {
 | 
			
		||||
    "target": "ES2020",
 | 
			
		||||
    "useDefineForClassFields": true,
 | 
			
		||||
    "module": "ESNext",
 | 
			
		||||
    "lib": ["ES2020", "DOM", "DOM.Iterable"],
 | 
			
		||||
    "skipLibCheck": true,
 | 
			
		||||
 | 
			
		||||
    /* Bundler mode */
 | 
			
		||||
    "moduleResolution": "bundler",
 | 
			
		||||
    "allowImportingTsExtensions": true,
 | 
			
		||||
    "resolveJsonModule": true,
 | 
			
		||||
    "isolatedModules": true,
 | 
			
		||||
    "noEmit": true,
 | 
			
		||||
    "jsx": "preserve",
 | 
			
		||||
 | 
			
		||||
    /* Linting */
 | 
			
		||||
    "strict": true,
 | 
			
		||||
    "noUnusedLocals": true,
 | 
			
		||||
    "noUnusedParameters": true,
 | 
			
		||||
    "noFallthroughCasesInSwitch": true
 | 
			
		||||
  },
 | 
			
		||||
  "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"],
 | 
			
		||||
  "references": [{ "path": "./tsconfig.node.json" }]
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,10 @@
 | 
			
		|||
{
 | 
			
		||||
  "compilerOptions": {
 | 
			
		||||
    "composite": true,
 | 
			
		||||
    "skipLibCheck": true,
 | 
			
		||||
    "module": "ESNext",
 | 
			
		||||
    "moduleResolution": "bundler",
 | 
			
		||||
    "allowSyntheticDefaultImports": true
 | 
			
		||||
  },
 | 
			
		||||
  "include": ["vite.config.ts"]
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,12 @@
 | 
			
		|||
import { defineConfig } from 'vite'
 | 
			
		||||
import vue from '@vitejs/plugin-vue'
 | 
			
		||||
import { quasar, transformAssetUrls } from '@quasar/vite-plugin'
 | 
			
		||||
 | 
			
		||||
export default defineConfig({
 | 
			
		||||
  plugins: [vue({
 | 
			
		||||
    template: { transformAssetUrls }
 | 
			
		||||
  }),
 | 
			
		||||
  quasar({
 | 
			
		||||
    sassVariables: 'src/quasar-variables.scss'
 | 
			
		||||
  })]
 | 
			
		||||
})
 | 
			
		||||
		Loading…
	
		Reference in New Issue