├── .changeset ├── README.md └── config.json ├── .editorconfig ├── .eslintignore ├── .eslintrc.cjs ├── .github └── workflows │ └── ci.yml ├── .gitignore ├── .nvmrc ├── .prettierignore ├── .prettierrc.js ├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── docs ├── .eslintrc.cjs ├── .vitepress │ ├── config.ts │ ├── hooks │ │ └── usePlayground.ts │ ├── plugins │ │ └── md.ts │ └── theme │ │ ├── custom.less │ │ └── index.ts ├── guide │ ├── amap.md │ ├── bmap.md │ ├── color.md │ ├── data.md │ ├── getting-started.md │ ├── index.md │ ├── leaflet.md │ ├── mapbox-gl.md │ ├── maplibre-gl.md │ ├── maptalks.md │ ├── ol.md │ └── openlayers.md ├── index.md ├── package.json ├── playgrounds │ ├── amap │ │ ├── amap.vue │ │ └── particles.md │ ├── bmap │ │ ├── bmap.vue │ │ └── particles.md │ ├── leaflet │ │ ├── gl-arrow-tile.vue │ │ ├── gl-colorize-image.vue │ │ ├── gl-colorize.vue │ │ ├── gl-image.vue │ │ ├── gl-layer.md │ │ ├── gl-particles-image.vue │ │ ├── gl-particles-tile.vue │ │ ├── gl-raster.vue │ │ ├── particles.md │ │ └── particles.vue │ ├── mapbox-gl │ │ ├── arrow-image.vue │ │ ├── arrow-tile.vue │ │ ├── arrow.md │ │ ├── colorize-image.vue │ │ ├── colorize-tile.vue │ │ ├── colorize.md │ │ ├── index.vue │ │ ├── particles-image.vue │ │ ├── particles-tile.vue │ │ ├── particles.md │ │ ├── raster.md │ │ └── raster.vue │ ├── maplibre-gl │ │ ├── colorize-image.vue │ │ ├── colorize-tile.vue │ │ ├── colorize.md │ │ ├── index.vue │ │ ├── raster.md │ │ └── raster.vue │ ├── maptalks │ │ ├── colorize-image.vue │ │ ├── colorize-tile.vue │ │ ├── colorize.md │ │ ├── image.vue │ │ ├── raster.md │ │ └── tile.vue │ └── ol │ │ ├── ol-3413.vue │ │ ├── ol-4326.vue │ │ ├── ol-moll.vue │ │ ├── ol.vue │ │ ├── ol5.vue │ │ └── particles.md ├── public │ ├── animation.mp4 │ ├── arrow.mp4 │ ├── data │ │ ├── china.geojson │ │ ├── countries-110m.geojson │ │ ├── float.png │ │ ├── tiles │ │ │ └── 2023111700 │ │ │ │ └── 2023111703 │ │ │ │ ├── 0 │ │ │ │ └── 0 │ │ │ │ │ └── 0 │ │ │ │ │ ├── wind-surface.jpeg │ │ │ │ │ ├── wind-surface.jpeg.aux.xml │ │ │ │ │ └── wind-surface.tiff │ │ │ │ ├── 1 │ │ │ │ ├── 0 │ │ │ │ │ ├── 0 │ │ │ │ │ │ ├── wind-surface.jpeg │ │ │ │ │ │ ├── wind-surface.jpeg.aux.xml │ │ │ │ │ │ └── wind-surface.tiff │ │ │ │ │ └── 1 │ │ │ │ │ │ ├── wind-surface.jpeg │ │ │ │ │ │ ├── wind-surface.jpeg.aux.xml │ │ │ │ │ │ └── wind-surface.tiff │ │ │ │ └── 1 │ │ │ │ │ ├── 0 │ │ │ │ │ ├── wind-surface.jpeg │ │ │ │ │ ├── wind-surface.jpeg.aux.xml │ │ │ │ │ └── wind-surface.tiff │ │ │ │ │ └── 1 │ │ │ │ │ ├── wind-surface.jpeg │ │ │ │ │ ├── wind-surface.jpeg.aux.xml │ │ │ │ │ └── wind-surface.tiff │ │ │ │ └── 2 │ │ │ │ ├── 0 │ │ │ │ ├── 0 │ │ │ │ │ ├── wind-surface.jpeg │ │ │ │ │ ├── wind-surface.jpeg.aux.xml │ │ │ │ │ └── wind-surface.tiff │ │ │ │ ├── 1 │ │ │ │ │ ├── wind-surface.jpeg │ │ │ │ │ ├── wind-surface.jpeg.aux.xml │ │ │ │ │ └── wind-surface.tiff │ │ │ │ ├── 2 │ │ │ │ │ ├── wind-surface.jpeg │ │ │ │ │ ├── wind-surface.jpeg.aux.xml │ │ │ │ │ └── wind-surface.tiff │ │ │ │ └── 3 │ │ │ │ │ ├── wind-surface.jpeg │ │ │ │ │ ├── wind-surface.jpeg.aux.xml │ │ │ │ │ └── wind-surface.tiff │ │ │ │ ├── 1 │ │ │ │ ├── 0 │ │ │ │ │ ├── wind-surface.jpeg │ │ │ │ │ ├── wind-surface.jpeg.aux.xml │ │ │ │ │ └── wind-surface.tiff │ │ │ │ ├── 1 │ │ │ │ │ ├── wind-surface.jpeg │ │ │ │ │ ├── wind-surface.jpeg.aux.xml │ │ │ │ │ └── wind-surface.tiff │ │ │ │ ├── 2 │ │ │ │ │ ├── wind-surface.jpeg │ │ │ │ │ ├── wind-surface.jpeg.aux.xml │ │ │ │ │ └── wind-surface.tiff │ │ │ │ └── 3 │ │ │ │ │ ├── wind-surface.jpeg │ │ │ │ │ ├── wind-surface.jpeg.aux.xml │ │ │ │ │ └── wind-surface.tiff │ │ │ │ ├── 2 │ │ │ │ ├── 0 │ │ │ │ │ ├── wind-surface.jpeg │ │ │ │ │ ├── wind-surface.jpeg.aux.xml │ │ │ │ │ └── wind-surface.tiff │ │ │ │ ├── 1 │ │ │ │ │ ├── wind-surface.jpeg │ │ │ │ │ ├── wind-surface.jpeg.aux.xml │ │ │ │ │ └── wind-surface.tiff │ │ │ │ ├── 2 │ │ │ │ │ ├── wind-surface.jpeg │ │ │ │ │ ├── wind-surface.jpeg.aux.xml │ │ │ │ │ └── wind-surface.tiff │ │ │ │ └── 3 │ │ │ │ │ ├── wind-surface.jpeg │ │ │ │ │ ├── wind-surface.jpeg.aux.xml │ │ │ │ │ └── wind-surface.tiff │ │ │ │ └── 3 │ │ │ │ ├── 0 │ │ │ │ ├── wind-surface.jpeg │ │ │ │ ├── wind-surface.jpeg.aux.xml │ │ │ │ └── wind-surface.tiff │ │ │ │ ├── 1 │ │ │ │ ├── wind-surface.jpeg │ │ │ │ ├── wind-surface.jpeg.aux.xml │ │ │ │ └── wind-surface.tiff │ │ │ │ ├── 2 │ │ │ │ ├── wind-surface.jpeg │ │ │ │ ├── wind-surface.jpeg.aux.xml │ │ │ │ └── wind-surface.tiff │ │ │ │ └── 3 │ │ │ │ ├── wind-surface.jpeg │ │ │ │ ├── wind-surface.jpeg.aux.xml │ │ │ │ └── wind-surface.tiff │ │ ├── var_tmp.json │ │ ├── var_tmp.png │ │ ├── var_ugrd-var_vgrd.json │ │ ├── var_ugrd-var_vgrd.png │ │ └── wind.json │ ├── manifest.json │ ├── mapbox.gif │ ├── maptalks.gif │ ├── particles-poc.mp4 │ ├── particles.mp4 │ ├── poc.mp4 │ ├── wind-animation.mp4 │ ├── wind.gif │ └── wind.png ├── typings.d.ts └── vite.config.ts ├── docsearch-config.json ├── docsearch.sh ├── examples ├── amap.html ├── bmap.html ├── data │ ├── 1.png │ ├── 10.jpeg │ ├── 11.png │ ├── 12.png │ ├── 2.png │ ├── 3.png │ ├── china.geojson │ ├── num │ │ ├── 1.png │ │ ├── 2.png │ │ ├── 3.png │ │ ├── 4.png │ │ └── 5.png │ ├── temp.png │ ├── temp.tiff │ ├── uv-mc.png │ ├── uv.png │ ├── var_tmp.json │ ├── var_tmp.png │ ├── var_ugrd-var_vgrd.json │ ├── var_ugrd-var_vgrd.png │ ├── wind-mc.png │ ├── wind-uv.png │ └── wind.json ├── index.html ├── leaflet-gl.html ├── leaflet.html ├── mapbox-tile.html ├── mapbox.html ├── maplibre-raster.html ├── maptalks-fill.html ├── maptalks-particles-layer.html ├── maptalks-pattern-layer.html ├── maptalks-pattern-timeline-layer.html ├── maptalks-raster-layer.html ├── maptalks-wind-arrow.html ├── maptalks.html ├── math.html ├── ol3.html ├── ol4-epsg3413.html ├── ol4-moll.html ├── ol4.html ├── ol5.html ├── poc.html ├── timeline-pattern.html ├── timeline-raster.html ├── wind-arrow-animate.html ├── wind-arrow.html ├── wind-particles.html └── wind-raster.html ├── package.json ├── packages ├── amap │ ├── CHANGELOG.md │ ├── README.md │ ├── __tests__ │ │ └── amap.test.ts │ ├── package.json │ ├── rollup.config.ts │ ├── src │ │ └── index.ts │ ├── tsconfig.docs.json │ ├── tsconfig.json │ ├── typedoc.json │ ├── typings.d.ts │ └── vitest.config.ts ├── bmap │ ├── CHANGELOG.md │ ├── README.md │ ├── __tests__ │ │ └── bmap.test.ts │ ├── package.json │ ├── rollup.config.ts │ ├── src │ │ └── index.ts │ ├── tsconfig.docs.json │ ├── tsconfig.json │ ├── typedoc.json │ ├── typings.d.ts │ └── vitest.config.ts ├── core │ ├── CHANGELOG.md │ ├── README.md │ ├── __tests__ │ │ └── core.test.ts │ ├── package.json │ ├── rollup.config.ts │ ├── src │ │ ├── Field.ts │ │ ├── Vector.ts │ │ ├── index.ts │ │ └── utils.ts │ ├── tsconfig.docs.json │ ├── tsconfig.json │ ├── typedoc.json │ ├── typings.d.ts │ └── vitest.config.ts ├── gl-core │ ├── CHANGELOG.md │ ├── README.md │ ├── __tests__ │ │ └── core.test.ts │ ├── package.json │ ├── rollup.config.ts │ ├── src │ │ ├── index.ts │ │ ├── renderer │ │ │ ├── Pipelines.ts │ │ │ ├── index.ts │ │ │ └── pass │ │ │ │ ├── arrow │ │ │ │ ├── README.md │ │ │ │ ├── arrow.ts │ │ │ │ └── compose.ts │ │ │ │ ├── base.ts │ │ │ │ ├── color │ │ │ │ ├── README.md │ │ │ │ ├── colorize.ts │ │ │ │ └── compose.ts │ │ │ │ ├── mask.ts │ │ │ │ ├── particles │ │ │ │ ├── README.md │ │ │ │ ├── compose-test.ts │ │ │ │ ├── compose.ts │ │ │ │ ├── particles.ts │ │ │ │ ├── screen.ts │ │ │ │ └── update.ts │ │ │ │ ├── picker.ts │ │ │ │ └── raster │ │ │ │ ├── README.md │ │ │ │ ├── compose.ts │ │ │ │ └── image.ts │ │ ├── shaders │ │ │ ├── arraw.frag.glsl │ │ │ ├── arrow.vert.glsl │ │ │ ├── color.frag.glsl │ │ │ ├── common.frag.glsl │ │ │ ├── common.vert.glsl │ │ │ ├── compose-render.vert.glsl │ │ │ ├── compose.frag.glsl │ │ │ ├── compose.vert.glsl │ │ │ ├── decode-float.glsl │ │ │ ├── decode.glsl │ │ │ ├── encode-float.glsl │ │ │ ├── encode.glsl │ │ │ ├── mask.frag.glsl │ │ │ ├── mask.vert.glsl │ │ │ ├── mercatorToWGS84.glsl │ │ │ ├── particles │ │ │ │ ├── draw.frag.glsl │ │ │ │ ├── draw.vert.glsl │ │ │ │ ├── screen.frag.glsl │ │ │ │ └── update.frag.glsl │ │ │ ├── picker.frag.glsl │ │ │ ├── picker.vert.glsl │ │ │ ├── random.glsl │ │ │ ├── raster-texture.frag.glsl │ │ │ ├── shaderLib.ts │ │ │ └── wgs84ToMercator.glsl │ │ ├── source │ │ │ ├── README.md │ │ │ ├── Timeline.ts │ │ │ ├── cahce.ts │ │ │ ├── image.ts │ │ │ ├── index.ts │ │ │ └── tile.ts │ │ ├── tile │ │ │ ├── Tile.ts │ │ │ ├── TileID.ts │ │ │ └── TileMesh.ts │ │ ├── type.ts │ │ └── utils │ │ │ ├── LRUCache.ts │ │ │ ├── Track.ts │ │ │ ├── TrackManger.ts │ │ │ ├── common.ts │ │ │ └── style-parser.ts │ ├── tsconfig.docs.json │ ├── tsconfig.json │ ├── typedoc.json │ ├── typings.d.ts │ └── vitest.config.ts ├── leaflet │ ├── CHANGELOG.md │ ├── README.md │ ├── __tests__ │ │ └── leaflet.test.ts │ ├── package.json │ ├── rollup.config.ts │ ├── src │ │ ├── index.ts │ │ ├── layer │ │ │ ├── Base.ts │ │ │ ├── canvas.ts │ │ │ └── webgl.ts │ │ └── utils │ │ │ ├── CameraSync.ts │ │ │ ├── mercatorCoordinate.ts │ │ │ └── tile.ts │ ├── tsconfig.docs.json │ ├── tsconfig.json │ ├── typedoc.json │ ├── typings.d.ts │ └── vitest.config.ts ├── mapbox-gl │ ├── CHANGELOG.md │ ├── README.md │ ├── __tests__ │ │ └── mapbox.test.ts │ ├── package.json │ ├── rollup.config.ts │ ├── src │ │ ├── index.ts │ │ ├── layer.ts │ │ └── utils │ │ │ ├── CameraSync.ts │ │ │ ├── mercatorCoordinate.ts │ │ │ └── tile.ts │ ├── tsconfig.docs.json │ ├── tsconfig.json │ ├── typedoc.json │ ├── typings.d.ts │ └── vitest.config.ts ├── maplibre-gl │ ├── CHANGELOG.md │ ├── README.md │ ├── __tests__ │ │ └── maplibre.test.ts │ ├── package.json │ ├── rollup.config.ts │ ├── src │ │ ├── index.ts │ │ ├── layer.ts │ │ └── utils │ │ │ ├── CameraSync.ts │ │ │ ├── mercatorCoordinate.ts │ │ │ └── tile.ts │ ├── tsconfig.docs.json │ ├── tsconfig.json │ ├── typedoc.json │ ├── typings.d.ts │ └── vitest.config.ts ├── maptalks │ ├── CHANGELOG.md │ ├── README.md │ ├── __tests__ │ │ └── maptalks.test.ts │ ├── package.json │ ├── rollup.config.ts │ ├── src │ │ ├── Canvas.ts │ │ ├── index.ts │ │ ├── layer.ts │ │ └── utils.ts │ ├── tsconfig.docs.json │ ├── tsconfig.json │ ├── typedoc.json │ ├── typings.d.ts │ └── vitest.config.ts ├── ol │ ├── CHANGELOG.md │ ├── README.md │ ├── __tests__ │ │ └── ol.test.ts │ ├── package.json │ ├── rollup.config.ts │ ├── src │ │ ├── index.ts │ │ └── renderer.ts │ ├── tsconfig.docs.json │ ├── tsconfig.json │ ├── typedoc.json │ ├── typings.d.ts │ └── vitest.config.ts ├── ol5 │ ├── CHANGELOG.md │ ├── README.md │ ├── __tests__ │ │ └── ol5.test.ts │ ├── package.json │ ├── rollup.config.ts │ ├── src │ │ └── index.ts │ ├── tsconfig.docs.json │ ├── tsconfig.json │ ├── typedoc.json │ ├── typings.d.ts │ └── vitest.config.ts ├── openlayers │ ├── CHANGELOG.md │ ├── README.md │ ├── __tests__ │ │ └── openlayers.test.ts │ ├── package.json │ ├── rollup.config.ts │ ├── src │ │ └── index.ts │ ├── tsconfig.docs.json │ ├── tsconfig.json │ ├── typedoc.json │ ├── typings.d.ts │ └── vitest.config.ts ├── particles-poc │ ├── CHANGELOG.md │ ├── README.md │ ├── __tests__ │ │ └── core.test.ts │ ├── package.json │ ├── rollup.config.ts │ ├── src │ │ ├── index.ts │ │ ├── maptalks.ts │ │ └── shaders │ │ │ ├── global-particle-draw.vert.glsl │ │ │ ├── particle-draw.frag.glsl │ │ │ ├── particle-draw.vert.glsl │ │ │ ├── particle-update.frag.glsl │ │ │ ├── particle-update.vert.glsl │ │ │ ├── point.glsl │ │ │ ├── screen.frag.glsl │ │ │ └── screen.vert.glsl │ ├── tsconfig.docs.json │ ├── tsconfig.json │ ├── typedoc.json │ ├── typings.d.ts │ └── vitest.config.ts ├── rbush │ ├── CHANGELOG.md │ ├── README.md │ ├── __tests__ │ │ └── index.test.ts │ ├── package.json │ ├── rollup.config.ts │ ├── src │ │ └── index.ts │ ├── tsconfig.docs.json │ ├── tsconfig.json │ ├── typedoc.json │ ├── typings.d.ts │ └── vitest.config.ts └── worker-fetch │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── __tests__ │ └── requestScheduler.test.ts │ ├── bundle │ ├── index.js │ └── prelude.js │ ├── package.json │ ├── rollup.config.ts │ ├── src │ ├── Actor.ts │ ├── Dispatcher.ts │ ├── Request.ts │ ├── RequestScheduler.ts │ ├── ThrottledInvoker.ts │ ├── UPNG.js │ ├── WorkerPool.ts │ ├── config.ts │ ├── index.ts │ ├── util.ts │ ├── webWorkerTransfer.ts │ ├── worker.ts │ └── workerFactory.ts │ ├── tsconfig.docs.json │ ├── tsconfig.json │ ├── typedoc.json │ ├── typings.d.ts │ └── vitest.config.ts ├── playground ├── .eslintrc.cjs ├── index.html ├── package.json ├── src │ ├── index.ts │ └── mapbox.ts ├── tsconfig.json └── vite.config.ts ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── tsconfig.eslint.json ├── tsconfig.json ├── turbo.json └── vitest └── setupTests.ts /.changeset/README.md: -------------------------------------------------------------------------------- 1 | # Changesets 2 | 3 | Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works 4 | with multi-package repos, or single-package repos to help you version and publish your code. You can 5 | find the full documentation for it [in our repository](https://github.com/changesets/changesets) 6 | 7 | We have a quick list of common questions to get you started engaging with this project in 8 | [our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) 9 | -------------------------------------------------------------------------------- /.changeset/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://unpkg.com/@changesets/config@2.2.0/schema.json", 3 | "changelog": ["@changesets/changelog-github", { "repo": "sakitam-fdd/wind-layer" }], 4 | "commit": false, 5 | "fixed": [], 6 | "linked": [], 7 | "access": "public", 8 | "baseBranch": "master", 9 | "updateInternalDependencies": "patch", 10 | "ignore": [] 11 | } 12 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | end_of_line = lf 6 | trim_trailing_whitespace = true 7 | insert_final_newline = true 8 | charset = utf-8 9 | 10 | [*.{js.ts,html,css}] 11 | indent_style = space 12 | indent_size = 2 13 | 14 | [*.{json,yml}] 15 | indent_style = space 16 | indent_size = 2 17 | 18 | [*.md] 19 | trim_trailing_whitespace = false 20 | 21 | [Makefile] 22 | indent_style = tab 23 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | *.html 2 | 3 | node_modules 4 | 5 | # build 6 | coverage 7 | dist 8 | 9 | # other 10 | .eslintrc.js 11 | .prettierrc.js 12 | vitest.config.ts 13 | 14 | # lib 15 | 16 | playground/lib 17 | -------------------------------------------------------------------------------- /.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | extends: [ 4 | '@aurorafe/eslint-config-ts', 5 | ], 6 | }; 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | .idea/ 4 | .vscode/ 5 | 6 | # dependencies 7 | node_modules 8 | 9 | # vuepress build output 10 | .vuepress/dist 11 | /docs/.vitepress/cache/ 12 | 13 | .cache 14 | cache/ 15 | .turbo/ 16 | 17 | # log 18 | *.log 19 | npm-debug.log* 20 | yarn-error.log* 21 | yarn.lock 22 | package-lock.json 23 | pnpm-lock 24 | # production 25 | dist 26 | 27 | # misc 28 | .DS_Store 29 | 30 | # idea 31 | .idea 32 | .vscode 33 | .labe 34 | 35 | # Coverage directory used by tools like istanbul 36 | coverage 37 | *.lcov 38 | .turbo 39 | 40 | # others 41 | .env 42 | .env.local 43 | /docs/api/ 44 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v18.16.1 2 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | ## OS 2 | .DS_Store 3 | .idea 4 | .npmrc 5 | .husky 6 | 7 | ## Ignored 8 | .dockerignore 9 | .eslintignore 10 | .editorconfig 11 | .gitignore 12 | .prettierignore 13 | .eslintcache 14 | 15 | ## Other 16 | *.toml 17 | *.lock 18 | *.log 19 | *.md 20 | *.svg 21 | *.png 22 | 23 | LICENSE 24 | Dockerfile* 25 | 26 | package.json 27 | package-lock.json 28 | yarn-error.log 29 | -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | const { prettierRules } = require('@aurorafe/eslint-config-base/rules') 2 | 3 | module.exports = { 4 | ...prettierRules, 5 | }; 6 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## Commit 2 | 3 | - revert: 恢复上一版本 4 | - feat: 功能性更新 5 | - update: 更新 6 | - fixed: 修复 7 | - docs: 新增文档 8 | - style: 样式修改 9 | - refactor: 重构 10 | - perf: 优化 11 | - test: 增加测试模块,不涉及生产环境的代码 12 | - chore: 更新核心模块,包配置文件,不涉及生产环境的代码 13 | - release: 发布版本 14 | - wip: 开发中 15 | - types: 类型定义 16 | - remove: 移除功能或者代码 17 | 18 | ## 0.0.7 (2019.03.20) 19 | 20 | * 修复ol插件投影问题 21 | * 修复server无法解析问题 22 | 23 | ## 0.0.6 (2018.09.07) 24 | 25 | # fix #15 26 | # update build flow 27 | 28 | ## 0.0.5 (2018.03.17) 29 | 30 | # fix #8 31 | # test BMap and add example 32 | 33 | ## 0.0.4 (2018.03.09) 34 | 35 | * 更新 ``CanvasLayer`` 创建方式。 36 | * 优化事件处理。 37 | 38 | ## 0.0.3 (2018.02.02) 39 | 40 | * 抓取服务新增 3 个接口,包括查询文件树和支持通过文件名查询数据。 41 | * 暂时新增了 ``EPSG:4326`` 投影的兼容处理。#5 42 | * 解决了与 [ol3Echarts](https://github.com/sakitam-fdd/ol3Echarts) 事件处理冲突问题。 43 | 44 | ## 0.0.2 (2018.01.20) 45 | 46 | * 更新部分依赖。 47 | * 修复 `setData` 和 `clearWind` bug。 48 | * 新增数据抓取服务,使用koa2构建。 49 | 50 | ## 0.0.1 (2017.12.16) 51 | 52 | * 实现基础功能 53 | 54 | ## 0.0.0 (2017.12.14) 55 | 56 | * init 57 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # 贡献指南 2 | 3 | ## 版本 4 | 5 | | 主版本号 | 次版本号 | 修订号 | 6 | | ------------- | -------------------------- | -------------------- | 7 | | 破坏性变更 | 功能添加,无破坏性变更 | Bug修正,无破坏性变更 | 8 | 9 | ### 版本号递增规则如下: 10 | 11 | - 主版本号:当你做了不兼容的 API 修改, 12 | - 次版本号:当你做了向下兼容的功能性新增, 13 | - 修订号:当你做了向下兼容的问题修正. 14 | 15 | ## Issue 规范 16 | 17 | - issue 仅用于提交 Bug 或 Feature 以及设计相关的内容,其它内容可能会被直接关闭。 18 | 19 | - 在提交 issue 之前,请搜索相关内容是否已被提出。 20 | 21 | - 请说明使用的插件的版本号,并提供操作系统和浏览器信息。推荐使用 [JSFiddle](https://jsfiddle.net/) 或者[codepen](https://codepen.io/)生成在线 demo,这能够更直观地重现问题。 22 | 23 | ## Pull Request 规范 24 | - 请先 fork 一份到自己的项目下,不要直接在仓库下建分支。 25 | 26 | - commit 信息要以# [记录] + messages 27 | 28 | 29 | - 执行 `npm run dev && npm run build` 后可以正确打包文件。 30 | 31 | - 提交 PR 前请 rebase,确保 commit 记录的整洁。 32 | 33 | - 确保 PR 是提交到 `dev` 分支,而不是 `master` 分支。 34 | 35 | - 如果是修复 bug,请在 PR 中给出描述信息。 36 | 37 | 38 | ## 开发环境搭建 39 | 40 | 首先你需要 Node.js 14+ 和 NPM 6+ 41 | ```shell 42 | git clone https://github.com/sakitam-fdd/wind-layer.git 43 | npm install 44 | npm run dev 45 | ``` 46 | -------------------------------------------------------------------------------- /docs/.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | extends: [ 4 | '@aurorafe/eslint-config-vue', 5 | ], 6 | }; 7 | -------------------------------------------------------------------------------- /docs/.vitepress/hooks/usePlayground.ts: -------------------------------------------------------------------------------- 1 | export const usePlayground = (cb1?: () => void, cb2?: () => void) => { 2 | const pause = () => { 3 | cb1?.(); 4 | }; 5 | 6 | const resume = () => { 7 | cb2?.(); 8 | }; 9 | 10 | return { 11 | pause, 12 | resume, 13 | }; 14 | }; 15 | -------------------------------------------------------------------------------- /docs/.vitepress/theme/index.ts: -------------------------------------------------------------------------------- 1 | // import { defineClientComponent } from 'vitepress'; 2 | import DefaultTheme from 'vitepress/theme'; 3 | import { SfcPlayground } from '@sakitam-gis/vitepress-playground'; 4 | import '@sakitam-gis/vitepress-playground/dist/style.css'; 5 | import './custom.less'; 6 | 7 | export default { 8 | ...DefaultTheme, 9 | enhanceApp({ app, router, siteData }) { 10 | app.component('SfcPlayground', SfcPlayground); 11 | }, 12 | } as any; 13 | -------------------------------------------------------------------------------- /docs/guide/amap.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 高德地图 3 | description: 4 | --- 5 | 6 | # 高德地图 7 | 8 | ## 示例 9 | 10 | ### 基础地图展示 11 | 12 | ::: tip 13 | 基础使用, 默认不要开启 `3D` 模式。 14 | 以下默认是 `codesandbox` 示例,[codepen](https://codepen.io/sakitam-fdd/full/QWxqRqE) 示例请查看此链接。 15 | ::: 16 | 17 | 22 | 23 | -------------------------------------------------------------------------------- /docs/guide/bmap.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 百度地图 3 | description: 4 | --- 5 | 6 | # 百度地图 7 | 8 | ## 示例 9 | 10 | ### 基础地图展示 11 | 12 | ::: tip 13 | 基础使用, 14 | 以下默认是 `codesandbox` 示例,[codepen](https://codepen.io/sakitam-fdd/full/YzvrmzZ) 示例请查看此链接。 15 | ::: 16 | 17 | 22 | -------------------------------------------------------------------------------- /docs/guide/data.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 数据说明 3 | --- 4 | 5 | # 关于数据来源 6 | 7 | [[toc]] 8 | 9 | ## 1.x 数据说明 10 | 11 | 对应数据来源可以是gfs或者ecmwf,无论数据来源是哪个地方,最终此插件目前只支持`json`数据格式输入。 12 | 13 | 关于如何将数据文件转换为 `json` ,你可以查阅 [grib2json](https://github.com/cambecc/grib2json), 或者 14 | [ecmwf](https://software.ecmwf.int/wiki/display/GRIB/Releases) 的数据处理库,当然,你也可以自行处理格点数据; 15 | 16 | 另外在解析数据时需要注意数据是否翻转了,默认对于地图展示来说我们知道经度默认从左向右递增,纬度从上向下依次递减(不一定完全正确), 17 | 所以在处理数据时我们需要注意数据的范围和方向,避免展示出错,相关有一个讨论可以在 [44](https://github.com/sakitam-fdd/wind-layer/issues/44) 18 | 看到。 19 | 20 | ### 数据详解 21 | 22 | 返回 `json` 数据为一个数组类型,两个元素分别为 U和V对应数据,数据中应该至少包含以下字段: 23 | 24 | ```bash 25 | dx: Increment in X direction, cannot be negative(x方向增量) 26 | dy: Increment in Y direction, cannot be negative(Y方向增量) 27 | nx: cols 数据行数 28 | ny: rows 数据列数 29 | # 以下四个为数据矩形范围 30 | lo1: xmin 31 | lo2: xmax 32 | la1: ymin 33 | la2: ymax 34 | # u/v 主要由以下参数区分 35 | parameterCategory: data type 36 | parameterNumber: data type 37 | ``` 38 | 39 | 一般情况下由 `grib2json` 转出的数据`parameterCategory`参数为`1`,当`parameterNumber` 为 `2` 时为`u` 分量, 40 | 当`parameterNumber` 为 `3` 时为`v` 分量。 41 | 42 | 并且还需要注意的是 `dy`(纬度)增量 (默认我们采用的数据和格点原始数据方向保持一致,数据从左上到右下) 但是需要注意的是此时 `dy` 为 -(ymax - ymin) / ny 43 | 有些情况下我们格点数据组织形式可能 Y 轴是上下翻转的,此时我们可以配置 `options.fieldOptions.flipY = true`,来主动翻转数据(默认情况下我们检测到数据配置中的 44 | `deltaY > 0` 时并且未配置`flipY`参数项默认去翻转数据)。 45 | 46 | ## 2.x 数据说明 47 | 48 | 在 2.0 版本之后(目前包括 `mapbox`、`maplibre`、`maptalks`)做了多数据源支持(`geotiff`、灰度图-可解析带 [exif](https://en.wikipedia.org/wiki/Exif) 信息、png-多通道浮点数压缩),其中 `geotiff` 的支持需要配置 `configDeps`, `exif` 默认支持,因为在 `safari` 浏览器下 `configDeps` 有兼容性问题,所以默认打包了 exif 的解析库。 49 | ```ts 50 | mapboxWind.configDeps(['https://unpkg.com/geotiff/dist-browser/geotiff.js']); 51 | ``` 52 | 53 | 对于 2.x 版本的数据格式我们可以使用 https://github.com/sakitam-gis/raster-process 来生成所需要的瓦片和单张图片。 54 | -------------------------------------------------------------------------------- /docs/guide/leaflet.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: leaflet 3 | description: 4 | importMap: { 5 | "leaflet": "https://esm.sh/leaflet", 6 | "leaflet-wind": "https://esm.sh/leaflet-wind", 7 | "tweakpane": "https://esm.sh/tweakpane" 8 | } 9 | --- 10 | 11 | # leaflet 12 | 13 | ## 示例 14 | 15 | ### 添加风场图层 16 | 17 | 18 | -------------------------------------------------------------------------------- /docs/guide/maptalks.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: maptalks 3 | description: 4 | importMap: { 5 | "maptalks": "https://esm.sh/maptalks", 6 | "@sakitam-gis/maptalks-wind": "https://esm.sh/@sakitam-gis/maptalks-wind" 7 | } 8 | --- 9 | 10 | # maptalks 11 | 12 | [[toc]] 13 | 14 | ## 安装插件 15 | 16 | ::: code-group 17 | 18 | ```sh [npm] 19 | $ npm add @sakitam-gis/maptalks-wind 20 | ``` 21 | 22 | ```sh [pnpm] 23 | $ pnpm add @sakitam-gis/maptalks-wind 24 | ``` 25 | 26 | ```sh [yarn] 27 | $ yarn add @sakitam-gis/maptalks-wind 28 | ``` 29 | 30 | ```html [script] 31 | 32 | ``` 33 | 34 | ::: 35 | 36 | ## 创建地图实例 37 | 38 | 当我们准备好相关依赖后就可以进行地图和图层的创建了 39 | 40 | ::: code-group 41 | 42 | ```ts 43 | import maptalks from 'maptalks'; 44 | 45 | const map = new maptalks.Map(mapRef.value, { 46 | zoom: 2, 47 | center: [34.371, 131.287].reverse(), 48 | baseLayer: new maptalks.TileLayer('base', { 49 | urlTemplate: 'https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png', 50 | // urlTemplate: 'https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png', 51 | subdomains: ['a', 'b', 'c', 'd'], 52 | repeatWorld: 'x', 53 | }) 54 | }); 55 | ``` 56 | ::: 57 | 58 | ## 创建数据源 59 | 60 | 参考 `mapbox-gl` 的使用,关于数据源和图层的创建这块的 api 基本保持了一致。 61 | 62 | ## 创建图层 63 | 64 | 参考 `mapbox-gl` 的使用,关于数据源和图层的创建这块的 api 基本保持了一致。 65 | 66 | ## 示例 67 | 68 | ::: tip 69 | 灰度图瓦片数据 70 | ::: 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: home 3 | 4 | title: wind-layer 5 | titleTemplate: 风场插件 6 | 7 | hero: 8 | name: wind-layer 9 | text: Visualization library of meteorological data. 10 | tagline: a maptalks / mapbox-gl / maplibre-gl / leaflet / openlayers / bmap / amap extension to show grib data. 11 | actions: 12 | - theme: brand 13 | text: Get Started / 开始 14 | link: /guide/getting-started 15 | - theme: alt 16 | text: View on GitHub 17 | link: https://github.com/sakitam-fdd/wind-layer 18 | 19 | features: 20 | - title: 易扩展(Easy to extend) 21 | details: 抽离了核心渲染库,便于扩展到其他地图渲染库(The core rendering library is separated, which is easy to extend to other map rendering libraries.)。 22 | - title: 易用(Easy to use, more user-defined parameters) 23 | details: 粒子数量、线宽、颜色支持多种配置方式(The number of particles, line width and color support multiple configurations.)。 24 | - title: 高性能(High performance) 25 | details: 核心图层支持 webgl 渲染,已适配了 mapbox-gl、maptalks、leaflet、openlayers 地图类库(The core layer supports webgl rendering, which is currently adapted to mapbox gl, maptalks, leaflet and openlayers.)。 26 | --- 27 | -------------------------------------------------------------------------------- /docs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "docs", 3 | "version": "1.0.0", 4 | "type": "module", 5 | "scripts": { 6 | "dev": "vitepress dev --base /", 7 | "build": "vitepress build --base /wind-layer/", 8 | "serve": "vitepress preview" 9 | }, 10 | "dependencies": { 11 | "@sakitam-gis/vitepress-playground": "^1.1.8", 12 | "@sakitam-gis/ol5": "^5.3.3", 13 | "@sakitam-gis/maptalks-wind": "workspace:*", 14 | "@sakitam-gis/mapbox-wind": "workspace:*", 15 | "@sakitam-gis/maplibre-wind": "workspace:*", 16 | "@vue/repl": "^4.1.1", 17 | "@amap/amap-jsapi-loader": "^1.0.1", 18 | "mapbox-gl": "^2.15.0", 19 | "maplibre-gl": "^4.1.1", 20 | "ol": "^6.15.1", 21 | "ol-wind": "workspace:*", 22 | "ol5-wind": "workspace:*", 23 | "amap-wind": "workspace:*", 24 | "bmap-wind": "workspace:*", 25 | "leaflet": "^1.9.4", 26 | "leaflet-wind": "workspace:*", 27 | "maptalks": "^1.0.0-rc.33", 28 | "proj4": "2.6.0", 29 | "tweakpane": "^4.0.0" 30 | }, 31 | "devDependencies": { 32 | "@types/node": "^18.19.26", 33 | "@types/mapbox-gl": "^2.7.19", 34 | "@types/proj4": "^2.5.5", 35 | "@types/markdown-it": "latest", 36 | "@types/leaflet": "^1.9.9", 37 | "@vue/compiler-core": "^3.3.7", 38 | "less": "^4.2.0", 39 | "fs-extra": "^11.2.0", 40 | "markdown-it": "^14.0.0", 41 | "markdown-it-container": "^4.0.0", 42 | "vitepress": "^1.0.2", 43 | "vite": "^5.1.7", 44 | "vue": "^3.3.7", 45 | "vite-plugin-external": "^4.3.0" 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /docs/playgrounds/amap/particles.md: -------------------------------------------------------------------------------- 1 | --- 2 | aside: false 3 | importMap: { 4 | "amap-wind": "https://esm.sh/amap-wind", 5 | "@amap/amap-jsapi-loader": "https://esm.sh/@amap/amap-jsapi-loader" 6 | } 7 | --- 8 | 9 | ## 添加风场图层 10 | 11 | 12 | -------------------------------------------------------------------------------- /docs/playgrounds/bmap/particles.md: -------------------------------------------------------------------------------- 1 | --- 2 | aside: false 3 | importMap: { 4 | "bmap-wind": "https://esm.sh/bmap-wind" 5 | } 6 | --- 7 | 8 | ## 添加风场图层 9 | 10 | 11 | -------------------------------------------------------------------------------- /docs/playgrounds/leaflet/gl-layer.md: -------------------------------------------------------------------------------- 1 | --- 2 | aside: false 3 | importMap: { 4 | "leaflet": "https://esm.sh/leaflet", 5 | "leaflet-wind": "https://esm.sh/leaflet-wind", 6 | "tweakpane": "https://esm.sh/tweakpane" 7 | } 8 | --- 9 | 10 | ## 基于 leaflet 的 webgl 图层 11 | 12 | ### 常规瓦片图层 13 | 14 | 可替代 leaflet 内部的 TileLayer dom 实现的图层 15 | 16 | 17 | 18 | ### 常规图片图层 19 | 20 | 可替代 leaflet 内部的 ImageOverlay 实现的图层 21 | 22 | 23 | 24 | ### 气象数据图层 25 | 26 | 1. 色斑图瓦片 27 | 28 | 29 | 30 | 2. 色斑图单张图片 31 | 32 | 33 | 34 | 3. 粒子图层-单张 35 | 36 | 37 | 38 | 4. 粒子图层-瓦片 39 | 40 | 41 | 42 | 5. Arrow图层-瓦片 43 | 44 | 45 | -------------------------------------------------------------------------------- /docs/playgrounds/leaflet/particles.md: -------------------------------------------------------------------------------- 1 | --- 2 | aside: false 3 | importMap: { 4 | "leaflet": "https://esm.sh/leaflet", 5 | "leaflet-wind": "https://esm.sh/leaflet-wind", 6 | "tweakpane": "https://esm.sh/tweakpane" 7 | } 8 | --- 9 | 10 | ## 添加风场图层 11 | 12 | 13 | -------------------------------------------------------------------------------- /docs/playgrounds/mapbox-gl/arrow.md: -------------------------------------------------------------------------------- 1 | --- 2 | aside: false 3 | importMap: { 4 | "mapbox-gl": "https://esm.sh/mapbox-gl", 5 | "@sakitam-gis/mapbox-wind": "https://esm.sh/@sakitam-gis/mapbox-wind", 6 | "tweakpane": "https://esm.sh/tweakpane" 7 | } 8 | --- 9 | 10 | 这里是气象风场箭头图层的相关示例。 11 | 12 | ## 添加气象数据 - 单张 13 | 14 | ::: tip 15 | 单张灰度图数据 16 | ::: 17 | 18 | 19 | 20 | ## 添加气象数据 - 瓦片 21 | 22 | ::: tip 23 | 灰度图瓦片数据 24 | ::: 25 | 26 | 27 | -------------------------------------------------------------------------------- /docs/playgrounds/mapbox-gl/colorize.md: -------------------------------------------------------------------------------- 1 | --- 2 | aside: false 3 | importMap: { 4 | "mapbox-gl": "https://esm.sh/mapbox-gl", 5 | "@sakitam-gis/mapbox-wind": "https://esm.sh/@sakitam-gis/mapbox-wind", 6 | "tweakpane": "https://esm.sh/tweakpane" 7 | } 8 | --- 9 | 10 | 这里是气象色斑图的展示示例。 11 | 12 | ## 添加气象数据 - 单张 13 | 14 | ::: tip 15 | 单张灰度图数据 16 | ::: 17 | 18 | 19 | 20 | ## 添加气象数据 - 瓦片 21 | 22 | ::: tip 23 | 灰度图瓦片数据 24 | ::: 25 | 26 | 27 | -------------------------------------------------------------------------------- /docs/playgrounds/mapbox-gl/particles.md: -------------------------------------------------------------------------------- 1 | --- 2 | aside: false 3 | importMap: { 4 | "mapbox-gl": "https://esm.sh/mapbox-gl", 5 | "@sakitam-gis/mapbox-wind": "https://esm.sh/@sakitam-gis/mapbox-wind", 6 | "tweakpane": "https://esm.sh/tweakpane" 7 | } 8 | --- 9 | 10 | 这里是气象风场粒子的相关示例。 11 | 12 | ## 添加气象数据 - 单张 13 | 14 | ::: tip 15 | 单张灰度图数据 16 | ::: 17 | 18 | 19 | 20 | ## 添加气象数据 - 瓦片 21 | 22 | ::: tip 23 | 灰度图瓦片数据 24 | ::: 25 | 26 | 27 | -------------------------------------------------------------------------------- /docs/playgrounds/mapbox-gl/raster.md: -------------------------------------------------------------------------------- 1 | --- 2 | aside: false 3 | importMap: { 4 | "mapbox-gl": "https://esm.sh/mapbox-gl", 5 | "@sakitam-gis/mapbox-wind": "https://esm.sh/@sakitam-gis/mapbox-wind", 6 | "tweakpane": "https://esm.sh/tweakpane" 7 | } 8 | --- 9 | 10 | 这里是栅格相关的实例,虽然他们的效果与 mapbox 的 ImageSource 和 RasterSource 展示效果相同,但是提供了如时序播放和图层掩膜的能力。 11 | 12 | ## 添加栅格数据 - 单张 13 | 14 | ::: tip 15 | 可以视作 mapbox-gl 中的 ImageSource 16 | ::: 17 | 18 | 19 | 20 | ## 添加栅格数据 - 瓦片 21 | 22 | ::: tip 23 | 等同于 mapbox-gl 中的 RasterSource 24 | ::: 25 | 26 | 27 | -------------------------------------------------------------------------------- /docs/playgrounds/maplibre-gl/colorize.md: -------------------------------------------------------------------------------- 1 | --- 2 | aside: false 3 | importMap: { 4 | "maplibre-gl": "https://esm.sh/maplibre-gl", 5 | "@sakitam-gis/maplibre-wind": "https://esm.sh/@sakitam-gis/maplibre-wind" 6 | } 7 | --- 8 | 9 | 这里是气象色斑图的展示示例。 10 | 11 | ## 添加气象数据 - 单张 12 | 13 | ::: tip 14 | 单张灰度图数据 15 | ::: 16 | 17 | 18 | 19 | ## 添加气象数据 - 瓦片 20 | 21 | ::: tip 22 | 单张灰度图数据 23 | ::: 24 | 25 | 26 | -------------------------------------------------------------------------------- /docs/playgrounds/maplibre-gl/raster.md: -------------------------------------------------------------------------------- 1 | --- 2 | aside: false 3 | importMap: { 4 | "maplibre-gl": "https://esm.sh/maplibre-gl", 5 | "@sakitam-gis/maplibre-wind": "https://esm.sh/@sakitam-gis/maplibre-wind" 6 | } 7 | --- 8 | 9 | 这里是栅格相关的实例,虽然他们的效果与 maplibre 的 ImageSource 和 RasterSource 展示效果相同,但是提供了如时序播放和图层掩膜的能力。 10 | 11 | ## 添加栅格数据 - 单张 12 | 13 | ::: tip 14 | 可以视作 maplibre-gl 中的 ImageSource 15 | ::: 16 | 17 | 18 | 19 | ## 添加栅格数据 - 瓦片 20 | 21 | ::: tip 22 | 等同于 maplibre-gl 中的 RasterSource 23 | ::: 24 | 25 | 26 | -------------------------------------------------------------------------------- /docs/playgrounds/maptalks/colorize.md: -------------------------------------------------------------------------------- 1 | --- 2 | aside: false 3 | importMap: { 4 | "maptalks": "https://esm.sh/maptalks", 5 | "@sakitam-gis/maptalks-wind": "https://esm.sh/@sakitam-gis/maptalks-wind" 6 | } 7 | --- 8 | 9 | 这里是气象色斑图的展示示例。 10 | 11 | ## 添加气象数据 - 单张 12 | 13 | ::: tip 14 | 单张灰度图数据 15 | ::: 16 | 17 | 18 | 19 | ## 添加气象数据 - 瓦片 20 | 21 | ::: tip 22 | 灰度图瓦片数据 23 | ::: 24 | 25 | 26 | -------------------------------------------------------------------------------- /docs/playgrounds/maptalks/image.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 72 | 73 | 81 | -------------------------------------------------------------------------------- /docs/playgrounds/maptalks/raster.md: -------------------------------------------------------------------------------- 1 | --- 2 | aside: false 3 | importMap: { 4 | "maptalks": "https://esm.sh/maptalks", 5 | "@sakitam-gis/maptalks-wind": "https://esm.sh/@sakitam-gis/maptalks-wind" 6 | } 7 | --- 8 | 9 | ## 添加栅格数据 - 单张 10 | 11 | 这里我们使用 maptalks 配合 ``wind-layer`` 的 `ImageSource` 创建栅格展示数据。 12 | 13 | 14 | 15 | 如示例代码所示 `ImageSource` 对应 maptalks 的 `ImageLayer`。 16 | 17 | ## 添加栅格数据 - 瓦片 18 | 19 | 这里我们使用 maptalks 配合 ``wind-layer`` 的 `TileSource` 创建栅格展示数据。 20 | 21 | 22 | 23 | 如示例代码所示 `ImageSource` 对应 maptalks 的 `TileLayer`。 24 | -------------------------------------------------------------------------------- /docs/playgrounds/maptalks/tile.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 71 | 72 | 80 | -------------------------------------------------------------------------------- /docs/playgrounds/ol/particles.md: -------------------------------------------------------------------------------- 1 | --- 2 | aside: false 3 | importMap: { 4 | "ol": "https://esm.sh/ol", 5 | "@sakitam-gis/ol5": "https://esm.sh/@sakitam-gis/ol5", 6 | "ol-wind": "https://esm.sh/ol-wind", 7 | "ol5-wind": "https://esm.sh/ol5-wind", 8 | "proj4": "https://esm.sh/proj4@2.6.0" 9 | } 10 | --- 11 | 12 | ## ol 13 | 14 | ### 基础地图展示 15 | 16 | ::: tip 17 | 基础使用,地图投影默认为 `EPSG:3857` 墨卡托投影。 18 | ::: 19 | 20 | 21 | 22 | ### 投影变换 23 | 24 | 此处用于展示各类投影下的风场效果。 25 | 26 | #### epsg:4326 27 | 28 | ::: tip 29 | 投影变换,地图投影默认为 `EPSG:4326`, 可以看到地图两极有明显变形; 30 | ::: 31 | 32 | 33 | 34 | #### epsg:3413 极投影 35 | 36 | ::: tip 37 | 投影变换,地图投影默认为 `EPSG:3413` 极投影; 38 | ::: 39 | 40 | 41 | 42 | #### ESRI:53009 moll 43 | 44 | ::: tip 45 | 投影变换,地图投影默认为 `ESRI:53009`; 46 | ::: 47 | 48 | 49 | 50 | ## ol5 51 | 52 | ol5 的相关支持 53 | 54 | ### 基础地图展示 55 | 56 | ::: tip 57 | 基础使用,地图投影默认为 `EPSG:3857` 墨卡托投影。 58 | ::: 59 | 60 | 61 | -------------------------------------------------------------------------------- /docs/public/animation.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/animation.mp4 -------------------------------------------------------------------------------- /docs/public/arrow.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/arrow.mp4 -------------------------------------------------------------------------------- /docs/public/data/float.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/float.png -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/0/0/0/wind-surface.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/0/0/0/wind-surface.jpeg -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/0/0/0/wind-surface.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/0/0/0/wind-surface.tiff -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/1/0/0/wind-surface.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/1/0/0/wind-surface.jpeg -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/1/0/0/wind-surface.jpeg.aux.xml: -------------------------------------------------------------------------------- 1 | 2 | PROJCS["WGS 84 / Pseudo-Mercator",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs"],AUTHORITY["EPSG","3857"]] 3 | -2.0037508342789244e+07, 7.8271516964020484e+04, 0.0000000000000000e+00, 2.0037508342789244e+07, 0.0000000000000000e+00, -7.8271516964020484e+04 4 | 5 | JPEG 6 | PIXEL 7 | CMYK 8 | 9 | 10 | -19.805362701416016,20.85378074645996;-20.47370147705078,17.38047218322754; 11 | 20.85378074645996,17.38047218322754 12 | -19.805362701416016,-20.47370147705078 13 | 14 | 15 | 16 | JPEG 17 | 18 | 19 | 20 | 21 | JPEG 22 | 23 | 24 | 25 | 26 | JPEG 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/1/0/0/wind-surface.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/1/0/0/wind-surface.tiff -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/1/0/1/wind-surface.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/1/0/1/wind-surface.jpeg -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/1/0/1/wind-surface.jpeg.aux.xml: -------------------------------------------------------------------------------- 1 | 2 | PROJCS["WGS 84 / Pseudo-Mercator",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs"],AUTHORITY["EPSG","3857"]] 3 | -2.0037508342789244e+07, 7.8271516964020484e+04, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, -7.8271516964020484e+04 4 | 5 | JPEG 6 | PIXEL 7 | CMYK 8 | 9 | 10 | -15.681386947631836,16.796632766723633;-21.066377639770508,21.75660514831543; 11 | 16.796632766723633,21.75660514831543 12 | -15.681386947631836,-21.066377639770508 13 | 14 | 15 | 16 | JPEG 17 | 18 | 19 | 20 | 21 | JPEG 22 | 23 | 24 | 25 | 26 | JPEG 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/1/0/1/wind-surface.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/1/0/1/wind-surface.tiff -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/1/1/0/wind-surface.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/1/1/0/wind-surface.jpeg -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/1/1/0/wind-surface.jpeg.aux.xml: -------------------------------------------------------------------------------- 1 | 2 | PROJCS["WGS 84 / Pseudo-Mercator",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs"],AUTHORITY["EPSG","3857"]] 3 | 0.0000000000000000e+00, 7.8271516964020484e+04, 0.0000000000000000e+00, 2.0037508342789244e+07, 0.0000000000000000e+00, -7.8271516964020484e+04 4 | 5 | JPEG 6 | PIXEL 7 | CMYK 8 | 9 | 10 | -15.327841758728027,15.18124771118164;-17.66584014892578,16.16832733154297; 11 | 15.18124771118164,16.16832733154297 12 | -15.327841758728027,-17.66584014892578 13 | 14 | 15 | 16 | JPEG 17 | 18 | 19 | 20 | 21 | JPEG 22 | 23 | 24 | 25 | 26 | JPEG 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/1/1/0/wind-surface.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/1/1/0/wind-surface.tiff -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/1/1/1/wind-surface.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/1/1/1/wind-surface.jpeg -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/1/1/1/wind-surface.jpeg.aux.xml: -------------------------------------------------------------------------------- 1 | 2 | PROJCS["WGS 84 / Pseudo-Mercator",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs"],AUTHORITY["EPSG","3857"]] 3 | 0.0000000000000000e+00, 7.8271516964020484e+04, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, -7.8271516964020484e+04 4 | 5 | JPEG 6 | PIXEL 7 | CMYK 8 | 9 | 10 | -22.817684173583984,24.274259567260742;-17.444974899291992,19.631595611572266; 11 | 24.274259567260742,19.631595611572266 12 | -22.817684173583984,-17.444974899291992 13 | 14 | 15 | 16 | JPEG 17 | 18 | 19 | 20 | 21 | JPEG 22 | 23 | 24 | 25 | 26 | JPEG 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/1/1/1/wind-surface.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/1/1/1/wind-surface.tiff -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/0/0/wind-surface.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/2/0/0/wind-surface.jpeg -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/0/0/wind-surface.jpeg.aux.xml: -------------------------------------------------------------------------------- 1 | 2 | PROJCS["WGS 84 / Pseudo-Mercator",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs"],AUTHORITY["EPSG","3857"]] 3 | -2.0037508342789244e+07, 3.9135758482010242e+04, 0.0000000000000000e+00, 2.0037508342789244e+07, 0.0000000000000000e+00, -3.9135758482010242e+04 4 | 5 | JPEG 6 | PIXEL 7 | CMYK 8 | 9 | 10 | -9.761820793151855,13.393077850341797;-10.700143814086914,10.808058738708496; 11 | 13.393077850341797,10.808058738708496 12 | -9.761820793151855,-10.700143814086914 13 | 14 | 15 | 16 | JPEG 17 | 18 | 19 | 20 | 21 | JPEG 22 | 23 | 24 | 25 | 26 | JPEG 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/0/0/wind-surface.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/2/0/0/wind-surface.tiff -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/0/1/wind-surface.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/2/0/1/wind-surface.jpeg -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/0/1/wind-surface.jpeg.aux.xml: -------------------------------------------------------------------------------- 1 | 2 | PROJCS["WGS 84 / Pseudo-Mercator",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs"],AUTHORITY["EPSG","3857"]] 3 | -2.0037508342789244e+07, 3.9135758482010242e+04, 0.0000000000000000e+00, 1.0018754171394622e+07, 0.0000000000000000e+00, -3.9135758482010242e+04 4 | 5 | JPEG 6 | PIXEL 7 | CMYK 8 | 9 | 10 | -11.853748321533203,16.327966690063477;-14.252401351928711,14.267011642456055; 11 | 16.327966690063477,14.267011642456055 12 | -11.853748321533203,-14.252401351928711 13 | 14 | 15 | 16 | JPEG 17 | 18 | 19 | 20 | 21 | JPEG 22 | 23 | 24 | 25 | 26 | JPEG 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/0/1/wind-surface.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/2/0/1/wind-surface.tiff -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/0/2/wind-surface.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/2/0/2/wind-surface.jpeg -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/0/2/wind-surface.jpeg.aux.xml: -------------------------------------------------------------------------------- 1 | 2 | PROJCS["WGS 84 / Pseudo-Mercator",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs"],AUTHORITY["EPSG","3857"]] 3 | -2.0037508342789244e+07, 3.9135758482010242e+04, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, -3.9135758482010242e+04 4 | 5 | JPEG 6 | PIXEL 7 | CMYK 8 | 9 | 10 | -16.817934036254883,16.353755950927734;-15.663369178771973,15.342354774475098; 11 | 16.353755950927734,15.342354774475098 12 | -16.817934036254883,-15.663369178771973 13 | 14 | 15 | 16 | JPEG 17 | 18 | 19 | 20 | 21 | JPEG 22 | 23 | 24 | 25 | 26 | JPEG 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/0/2/wind-surface.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/2/0/2/wind-surface.tiff -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/0/3/wind-surface.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/2/0/3/wind-surface.jpeg -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/0/3/wind-surface.jpeg.aux.xml: -------------------------------------------------------------------------------- 1 | 2 | PROJCS["WGS 84 / Pseudo-Mercator",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs"],AUTHORITY["EPSG","3857"]] 3 | -2.0037508342789244e+07, 3.9135758482010242e+04, 0.0000000000000000e+00, -1.0018754171394620e+07, 0.0000000000000000e+00, -3.9135758482010235e+04 4 | 5 | JPEG 6 | PIXEL 7 | CMYK 8 | 9 | 10 | -12.825658798217773,11.456625938415527;-10.884737968444824,11.49609088897705; 11 | 11.456625938415527,11.49609088897705 12 | -12.825658798217773,-10.884737968444824 13 | 14 | 15 | 16 | JPEG 17 | 18 | 19 | 20 | 21 | JPEG 22 | 23 | 24 | 25 | 26 | JPEG 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/0/3/wind-surface.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/2/0/3/wind-surface.tiff -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/1/0/wind-surface.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/2/1/0/wind-surface.jpeg -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/1/0/wind-surface.jpeg.aux.xml: -------------------------------------------------------------------------------- 1 | 2 | PROJCS["WGS 84 / Pseudo-Mercator",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs"],AUTHORITY["EPSG","3857"]] 3 | -1.0018754171394622e+07, 3.9135758482010242e+04, 0.0000000000000000e+00, 2.0037508342789244e+07, 0.0000000000000000e+00, -3.9135758482010242e+04 4 | 5 | JPEG 6 | PIXEL 7 | CMYK 8 | 9 | 10 | -12.974503517150879,15.233001708984375;-14.398733139038086,13.384988784790039; 11 | 15.233001708984375,13.384988784790039 12 | -12.974503517150879,-14.398733139038086 13 | 14 | 15 | 16 | JPEG 17 | 18 | 19 | 20 | 21 | JPEG 22 | 23 | 24 | 25 | 26 | JPEG 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/1/0/wind-surface.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/2/1/0/wind-surface.tiff -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/1/1/wind-surface.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/2/1/1/wind-surface.jpeg -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/1/1/wind-surface.jpeg.aux.xml: -------------------------------------------------------------------------------- 1 | 2 | PROJCS["WGS 84 / Pseudo-Mercator",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs"],AUTHORITY["EPSG","3857"]] 3 | -1.0018754171394622e+07, 3.9135758482010242e+04, 0.0000000000000000e+00, 1.0018754171394622e+07, 0.0000000000000000e+00, -3.9135758482010242e+04 4 | 5 | JPEG 6 | PIXEL 7 | CMYK 8 | 9 | 10 | -20.72325897216797,21.732053756713867;-21.60259246826172,18.007219314575195; 11 | 21.732053756713867,18.007219314575195 12 | -20.72325897216797,-21.60259246826172 13 | 14 | 15 | 16 | JPEG 17 | 18 | 19 | 20 | 21 | JPEG 22 | 23 | 24 | 25 | 26 | JPEG 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/1/1/wind-surface.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/2/1/1/wind-surface.tiff -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/1/2/wind-surface.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/2/1/2/wind-surface.jpeg -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/1/2/wind-surface.jpeg.aux.xml: -------------------------------------------------------------------------------- 1 | 2 | PROJCS["WGS 84 / Pseudo-Mercator",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs"],AUTHORITY["EPSG","3857"]] 3 | -1.0018754171394622e+07, 3.9135758482010242e+04, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, -3.9135758482010242e+04 4 | 5 | JPEG 6 | PIXEL 7 | CMYK 8 | 9 | 10 | -12.599445343017578,17.346298217773438;-16.1553955078125,22.387126922607422; 11 | 17.346298217773438,22.387126922607422 12 | -12.599445343017578,-16.1553955078125 13 | 14 | 15 | 16 | JPEG 17 | 18 | 19 | 20 | 21 | JPEG 22 | 23 | 24 | 25 | 26 | JPEG 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/1/2/wind-surface.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/2/1/2/wind-surface.tiff -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/1/3/wind-surface.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/2/1/3/wind-surface.jpeg -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/1/3/wind-surface.jpeg.aux.xml: -------------------------------------------------------------------------------- 1 | 2 | PROJCS["WGS 84 / Pseudo-Mercator",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs"],AUTHORITY["EPSG","3857"]] 3 | -1.0018754171394622e+07, 3.9135758482010242e+04, 0.0000000000000000e+00, -1.0018754171394620e+07, 0.0000000000000000e+00, -3.9135758482010235e+04 4 | 5 | JPEG 6 | PIXEL 7 | CMYK 8 | 9 | 10 | -15.390647888183594,8.478999137878418;-21.39316177368164,10.489214897155765; 11 | 8.478999137878418,10.489214897155765 12 | -15.390647888183594,-21.39316177368164 13 | 14 | 15 | 16 | JPEG 17 | 18 | 19 | 20 | 21 | JPEG 22 | 23 | 24 | 25 | 26 | JPEG 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/1/3/wind-surface.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/2/1/3/wind-surface.tiff -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/2/0/wind-surface.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/2/2/0/wind-surface.jpeg -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/2/0/wind-surface.jpeg.aux.xml: -------------------------------------------------------------------------------- 1 | 2 | PROJCS["WGS 84 / Pseudo-Mercator",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs"],AUTHORITY["EPSG","3857"]] 3 | 0.0000000000000000e+00, 3.9135758482010242e+04, 0.0000000000000000e+00, 2.0037508342789244e+07, 0.0000000000000000e+00, -3.9135758482010242e+04 4 | 5 | JPEG 6 | PIXEL 7 | CMYK 8 | 9 | 10 | -14.87779712677002,15.651535034179688;-18.279232025146484,11.315524101257324; 11 | 15.651535034179688,11.315524101257324 12 | -14.87779712677002,-18.279232025146484 13 | 14 | 15 | 16 | JPEG 17 | 18 | 19 | 20 | 21 | JPEG 22 | 23 | 24 | 25 | 26 | JPEG 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/2/0/wind-surface.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/2/2/0/wind-surface.tiff -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/2/1/wind-surface.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/2/2/1/wind-surface.jpeg -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/2/1/wind-surface.jpeg.aux.xml: -------------------------------------------------------------------------------- 1 | 2 | PROJCS["WGS 84 / Pseudo-Mercator",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs"],AUTHORITY["EPSG","3857"]] 3 | 0.0000000000000000e+00, 3.9135758482010242e+04, 0.0000000000000000e+00, 1.0018754171394622e+07, 0.0000000000000000e+00, -3.9135758482010242e+04 4 | 5 | JPEG 6 | PIXEL 7 | CMYK 8 | 9 | 10 | -13.388615608215332,16.20417594909668;-15.389498710632324,16.064620971679688; 11 | 16.20417594909668,16.064620971679688 12 | -13.388615608215332,-15.389498710632324 13 | 14 | 15 | 16 | JPEG 17 | 18 | 19 | 20 | 21 | JPEG 22 | 23 | 24 | 25 | 26 | JPEG 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/2/1/wind-surface.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/2/2/1/wind-surface.tiff -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/2/2/wind-surface.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/2/2/2/wind-surface.jpeg -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/2/2/wind-surface.jpeg.aux.xml: -------------------------------------------------------------------------------- 1 | 2 | PROJCS["WGS 84 / Pseudo-Mercator",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs"],AUTHORITY["EPSG","3857"]] 3 | 0.0000000000000000e+00, 3.9135758482010242e+04, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, -3.9135758482010242e+04 4 | 5 | JPEG 6 | PIXEL 7 | CMYK 8 | 9 | 10 | -14.87116527557373,16.81208038330078;-12.166154861450195,11.636382102966309; 11 | 16.81208038330078,11.636382102966309 12 | -14.87116527557373,-12.166154861450195 13 | 14 | 15 | 16 | JPEG 17 | 18 | 19 | 20 | 21 | JPEG 22 | 23 | 24 | 25 | 26 | JPEG 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/2/2/wind-surface.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/2/2/2/wind-surface.tiff -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/2/3/wind-surface.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/2/2/3/wind-surface.jpeg -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/2/3/wind-surface.jpeg.aux.xml: -------------------------------------------------------------------------------- 1 | 2 | PROJCS["WGS 84 / Pseudo-Mercator",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs"],AUTHORITY["EPSG","3857"]] 3 | 0.0000000000000000e+00, 3.9135758482010242e+04, 0.0000000000000000e+00, -1.0018754171394620e+07, 0.0000000000000000e+00, -3.9135758482010235e+04 4 | 5 | JPEG 6 | PIXEL 7 | CMYK 8 | 9 | 10 | -19.467660903930664,9.122272491455078;-7.488211154937744,19.937063217163086; 11 | 9.122272491455078,19.937063217163086 12 | -19.467660903930664,-7.488211154937744 13 | 14 | 15 | 16 | JPEG 17 | 18 | 19 | 20 | 21 | JPEG 22 | 23 | 24 | 25 | 26 | JPEG 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/2/3/wind-surface.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/2/2/3/wind-surface.tiff -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/3/0/wind-surface.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/2/3/0/wind-surface.jpeg -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/3/0/wind-surface.jpeg.aux.xml: -------------------------------------------------------------------------------- 1 | 2 | PROJCS["WGS 84 / Pseudo-Mercator",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs"],AUTHORITY["EPSG","3857"]] 3 | 1.0018754171394620e+07, 3.9135758482010235e+04, 0.0000000000000000e+00, 2.0037508342789244e+07, 0.0000000000000000e+00, -3.9135758482010242e+04 4 | 5 | JPEG 6 | PIXEL 7 | CMYK 8 | 9 | 10 | -11.514059066772461,14.256670951843262;-12.005725860595703,12.618420600891113; 11 | 14.256670951843262,12.618420600891113 12 | -11.514059066772461,-12.005725860595703 13 | 14 | 15 | 16 | JPEG 17 | 18 | 19 | 20 | 21 | JPEG 22 | 23 | 24 | 25 | 26 | JPEG 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/3/0/wind-surface.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/2/3/0/wind-surface.tiff -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/3/1/wind-surface.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/2/3/1/wind-surface.jpeg -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/3/1/wind-surface.jpeg.aux.xml: -------------------------------------------------------------------------------- 1 | 2 | PROJCS["WGS 84 / Pseudo-Mercator",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs"],AUTHORITY["EPSG","3857"]] 3 | 1.0018754171394620e+07, 3.9135758482010235e+04, 0.0000000000000000e+00, 1.0018754171394622e+07, 0.0000000000000000e+00, -3.9135758482010242e+04 4 | 5 | JPEG 6 | PIXEL 7 | CMYK 8 | 9 | 10 | -16.69487953186035,15.332477569580078;-17.438154220581055,16.742582321166992; 11 | 15.332477569580078,16.742582321166992 12 | -16.69487953186035,-17.438154220581055 13 | 14 | 15 | 16 | JPEG 17 | 18 | 19 | 20 | 21 | JPEG 22 | 23 | 24 | 25 | 26 | JPEG 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/3/1/wind-surface.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/2/3/1/wind-surface.tiff -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/3/2/wind-surface.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/2/3/2/wind-surface.jpeg -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/3/2/wind-surface.jpeg.aux.xml: -------------------------------------------------------------------------------- 1 | 2 | PROJCS["WGS 84 / Pseudo-Mercator",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs"],AUTHORITY["EPSG","3857"]] 3 | 1.0018754171394620e+07, 3.9135758482010235e+04, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, -3.9135758482010242e+04 4 | 5 | JPEG 6 | PIXEL 7 | CMYK 8 | 9 | 10 | -23.42014503479004,24.86884117126465;-18.267148971557617,16.122346878051758; 11 | 24.86884117126465,16.122346878051758 12 | -23.42014503479004,-18.267148971557617 13 | 14 | 15 | 16 | JPEG 17 | 18 | 19 | 20 | 21 | JPEG 22 | 23 | 24 | 25 | 26 | JPEG 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/3/2/wind-surface.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/2/3/2/wind-surface.tiff -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/3/3/wind-surface.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/2/3/3/wind-surface.jpeg -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/3/3/wind-surface.jpeg.aux.xml: -------------------------------------------------------------------------------- 1 | 2 | PROJCS["WGS 84 / Pseudo-Mercator",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs"],AUTHORITY["EPSG","3857"]] 3 | 1.0018754171394620e+07, 3.9135758482010235e+04, 0.0000000000000000e+00, -1.0018754171394620e+07, 0.0000000000000000e+00, -3.9135758482010235e+04 4 | 5 | JPEG 6 | PIXEL 7 | CMYK 8 | 9 | 10 | -21.488113403320312,12.604643821716309;-8.369563102722168,11.552475929260254; 11 | 12.604643821716309,11.552475929260254 12 | -21.488113403320312,-8.369563102722168 13 | 14 | 15 | 16 | JPEG 17 | 18 | 19 | 20 | 21 | JPEG 22 | 23 | 24 | 25 | 26 | JPEG 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /docs/public/data/tiles/2023111700/2023111703/2/3/3/wind-surface.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/tiles/2023111700/2023111703/2/3/3/wind-surface.tiff -------------------------------------------------------------------------------- /docs/public/data/var_tmp.json: -------------------------------------------------------------------------------- 1 | [{"header": {"nx": 1440, "ny": 721, "dx": 0.25, "dy": 0.25, "min": -50.84996643066404, "max": 42.25002441406252, "extent": [-180.125, -90.125, 179.875, 90.125], "GRIB_COMMENT": "Temperature [C]", "GRIB_DISCIPLINE": "0(Meteorological)", "GRIB_ELEMENT": "TMP", "GRIB_FORECAST_SECONDS": "0 sec", "GRIB_IDS": "CENTER=7(US-NCEP) SUBCENTER=0 MASTER_TABLE=2 LOCAL_TABLE=1 SIGNF_REF_TIME=1(Start_of_Forecast) REF_TIME=2020-06-20T00:00:00Z PROD_STATUS=0(Operational) TYPE=1(Forecast)", "GRIB_PDS_PDTN": "0", "GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES": "0 0 2 0 81 0 0 1 0 103 0 80 255 0 0", "GRIB_PDS_TEMPLATE_NUMBERS": "0 0 2 0 81 0 0 0 1 0 0 0 0 103 0 0 0 0 80 255 0 0 0 0 0", "GRIB_REF_TIME": "1592611200 sec UTC", "GRIB_SHORT_NAME": "80-HTGL", "GRIB_UNIT": "[C]", "GRIB_VALID_TIME": "1592611200 sec UTC"}, "data": "20200620/00/0p25/f000/var_tmp.png"}] -------------------------------------------------------------------------------- /docs/public/data/var_tmp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/var_tmp.png -------------------------------------------------------------------------------- /docs/public/data/var_ugrd-var_vgrd.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "header": { 4 | "nx": 1440, 5 | "ny": 721, 6 | "dx": 0.25, 7 | "dy": 0.25, 8 | "min": -21.34380340576172, 9 | "max": 30.7261962890625, 10 | "extent": [ 11 | -180.125, 12 | -90.125, 13 | 179.875, 14 | 90.125 15 | ], 16 | "GRIB_COMMENT": "u-component of wind [m/s]", 17 | "GRIB_DISCIPLINE": "0(Meteorological)", 18 | "GRIB_ELEMENT": "UGRD", 19 | "GRIB_FORECAST_SECONDS": "0 sec", 20 | "GRIB_IDS": "CENTER=7(US-NCEP) SUBCENTER=0 MASTER_TABLE=2 LOCAL_TABLE=1 SIGNF_REF_TIME=1(Start_of_Forecast) REF_TIME=2020-06-20T00:00:00Z PROD_STATUS=0(Operational) TYPE=1(Forecast)", 21 | "GRIB_PDS_PDTN": "0", 22 | "GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES": "2 2 2 0 81 0 0 1 0 103 0 10 255 0 0", 23 | "GRIB_PDS_TEMPLATE_NUMBERS": "2 2 2 0 81 0 0 0 1 0 0 0 0 103 0 0 0 0 10 255 0 0 0 0 0", 24 | "GRIB_REF_TIME": "1592611200 sec UTC", 25 | "GRIB_SHORT_NAME": "10-HTGL", 26 | "GRIB_UNIT": "[m/s]", 27 | "GRIB_VALID_TIME": "1592611200 sec UTC" 28 | }, 29 | "data": "20200620/00/0p25/f000/var_ugrd-var_vgrd.png" 30 | }, 31 | { 32 | "header": { 33 | "nx": 1440, 34 | "ny": 721, 35 | "dx": 0.25, 36 | "dy": 0.25, 37 | "min": -23.916271209716797, 38 | "max": 24.693727493286133, 39 | "extent": [ 40 | -180.125, 41 | -90.125, 42 | 179.875, 43 | 90.125 44 | ], 45 | "GRIB_COMMENT": "v-component of wind [m/s]", 46 | "GRIB_DISCIPLINE": "0(Meteorological)", 47 | "GRIB_ELEMENT": "VGRD", 48 | "GRIB_FORECAST_SECONDS": "0 sec", 49 | "GRIB_IDS": "CENTER=7(US-NCEP) SUBCENTER=0 MASTER_TABLE=2 LOCAL_TABLE=1 SIGNF_REF_TIME=1(Start_of_Forecast) REF_TIME=2020-06-20T00:00:00Z PROD_STATUS=0(Operational) TYPE=1(Forecast)", 50 | "GRIB_PDS_PDTN": "0", 51 | "GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES": "2 3 2 0 81 0 0 1 0 103 0 10 255 0 0", 52 | "GRIB_PDS_TEMPLATE_NUMBERS": "2 3 2 0 81 0 0 0 1 0 0 0 0 103 0 0 0 0 10 255 0 0 0 0 0", 53 | "GRIB_REF_TIME": "1592611200 sec UTC", 54 | "GRIB_SHORT_NAME": "10-HTGL", 55 | "GRIB_UNIT": "[m/s]", 56 | "GRIB_VALID_TIME": "1592611200 sec UTC" 57 | }, 58 | "data": "20200620/00/0p25/f000/var_ugrd-var_vgrd.png" 59 | } 60 | ] 61 | -------------------------------------------------------------------------------- /docs/public/data/var_ugrd-var_vgrd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/data/var_ugrd-var_vgrd.png -------------------------------------------------------------------------------- /docs/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "wind-layer", 3 | "short_name": "wind-layer", 4 | "description": "a openlayers && maptalks && amap && bmap && leaflet && mapbox-gl && maplibre-gl extension like windy.com", 5 | "start_url": "/index.html", 6 | "display": "standalone", 7 | "background_color": "#1e1e20", 8 | "theme_color": "#1e1e20", 9 | "icons": [], 10 | "lang": "zh" 11 | } 12 | -------------------------------------------------------------------------------- /docs/public/mapbox.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/mapbox.gif -------------------------------------------------------------------------------- /docs/public/maptalks.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/maptalks.gif -------------------------------------------------------------------------------- /docs/public/particles-poc.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/particles-poc.mp4 -------------------------------------------------------------------------------- /docs/public/particles.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/particles.mp4 -------------------------------------------------------------------------------- /docs/public/poc.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/poc.mp4 -------------------------------------------------------------------------------- /docs/public/wind-animation.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/wind-animation.mp4 -------------------------------------------------------------------------------- /docs/public/wind.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/wind.gif -------------------------------------------------------------------------------- /docs/public/wind.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/docs/public/wind.png -------------------------------------------------------------------------------- /docs/typings.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.json'; 2 | declare module '*.glsl'; 3 | declare module 'web-worker:*' { 4 | const WokerFactory: new () => Worker; 5 | export default WokerFactory; 6 | } 7 | interface Window {} 8 | -------------------------------------------------------------------------------- /docs/vite.config.ts: -------------------------------------------------------------------------------- 1 | // import { fileURLToPath } from 'url'; 2 | import { defineConfig } from 'vite'; 3 | // import vitePluginExternal from 'vite-plugin-external'; 4 | 5 | export default defineConfig(({ mode }) => ({ 6 | plugins: [ 7 | // vitePluginExternal({ 8 | // // nodeBuiltins: true, 9 | // // externalizeDeps: [ 10 | // // 11 | // // ], 12 | // interop: 'auto', 13 | // externals: { 14 | // maptalks: 'maptalks', 15 | // }, 16 | // }), 17 | ], 18 | // resolve: { 19 | // alias: [ 20 | // { 21 | // find: '@sakitam-gis/mapbox-wind', 22 | // replacement: '@sakitam-gis/mapbox-wind/dist/mapbox-wind.esm.js' // 解决构建报错 23 | // } 24 | // ], 25 | // // dedupe: ['vue'] // 将所有相同的依赖置为同一版本,常用在多仓库中(https://cn.vitejs.dev/config/shared-options.html#resolve-dedupe) 26 | // }, 27 | optimizeDeps: { 28 | exclude: ['@sakitam-gis/mapbox-wind'], 29 | }, 30 | })); 31 | -------------------------------------------------------------------------------- /docsearch-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "index_name": "wind-layer", 3 | "start_urls": [ 4 | "https://blog.sakitam.com/wind-layer/" 5 | ], 6 | "sitemap_urls": [], 7 | "sitemap_alternate_links": true, 8 | "stop_urls": [ 9 | "/tests" 10 | ], 11 | "selectors": { 12 | "lvl0": { 13 | "selector": "(//ul[contains(@class,'menu__list')]//a[contains(@class, 'menu__link menu__link--sublist menu__link--active')]/text() | //nav[contains(@class, 'navbar')]//a[contains(@class, 'navbar__link--active')]/text())[last()]", 14 | "type": "xpath", 15 | "global": true, 16 | "default_value": "Documentation" 17 | }, 18 | "lvl1": "header h1", 19 | "lvl2": "article h2", 20 | "lvl3": "article h3", 21 | "lvl4": "article h4", 22 | "lvl5": "article h5, article td:first-child", 23 | "lvl6": "article h6", 24 | "text": "article p, article li, article td:last-child" 25 | }, 26 | "strip_chars": " .,;:#", 27 | "custom_settings": { 28 | "separatorsToIndex": "_", 29 | "attributesForFaceting": [ 30 | "language", 31 | "version", 32 | "type" 33 | ], 34 | "attributesToRetrieve": [ 35 | "hierarchy", 36 | "content", 37 | "anchor", 38 | "url", 39 | "url_without_anchor", 40 | "type" 41 | ] 42 | }, 43 | "js_render": true, 44 | "conversation_id": [ 45 | "833762294" 46 | ], 47 | "nb_hits": 46250 48 | } 49 | -------------------------------------------------------------------------------- /docsearch.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 本地运行 3 | docker run -it --env-file=.env -e "CONFIG=$(cat docsearch-config.json | jq -r tostring)" algolia/docsearch-scraper 4 | -------------------------------------------------------------------------------- /examples/data/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/examples/data/1.png -------------------------------------------------------------------------------- /examples/data/10.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/examples/data/10.jpeg -------------------------------------------------------------------------------- /examples/data/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/examples/data/11.png -------------------------------------------------------------------------------- /examples/data/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/examples/data/12.png -------------------------------------------------------------------------------- /examples/data/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/examples/data/2.png -------------------------------------------------------------------------------- /examples/data/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/examples/data/3.png -------------------------------------------------------------------------------- /examples/data/num/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/examples/data/num/1.png -------------------------------------------------------------------------------- /examples/data/num/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/examples/data/num/2.png -------------------------------------------------------------------------------- /examples/data/num/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/examples/data/num/3.png -------------------------------------------------------------------------------- /examples/data/num/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/examples/data/num/4.png -------------------------------------------------------------------------------- /examples/data/num/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/examples/data/num/5.png -------------------------------------------------------------------------------- /examples/data/temp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/examples/data/temp.png -------------------------------------------------------------------------------- /examples/data/temp.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/examples/data/temp.tiff -------------------------------------------------------------------------------- /examples/data/uv-mc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/examples/data/uv-mc.png -------------------------------------------------------------------------------- /examples/data/uv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/examples/data/uv.png -------------------------------------------------------------------------------- /examples/data/var_tmp.json: -------------------------------------------------------------------------------- 1 | [{"header": {"nx": 1440, "ny": 721, "dx": 0.25, "dy": 0.25, "min": -50.84996643066404, "max": 42.25002441406252, "extent": [-180.125, -90.125, 179.875, 90.125], "GRIB_COMMENT": "Temperature [C]", "GRIB_DISCIPLINE": "0(Meteorological)", "GRIB_ELEMENT": "TMP", "GRIB_FORECAST_SECONDS": "0 sec", "GRIB_IDS": "CENTER=7(US-NCEP) SUBCENTER=0 MASTER_TABLE=2 LOCAL_TABLE=1 SIGNF_REF_TIME=1(Start_of_Forecast) REF_TIME=2020-06-20T00:00:00Z PROD_STATUS=0(Operational) TYPE=1(Forecast)", "GRIB_PDS_PDTN": "0", "GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES": "0 0 2 0 81 0 0 1 0 103 0 80 255 0 0", "GRIB_PDS_TEMPLATE_NUMBERS": "0 0 2 0 81 0 0 0 1 0 0 0 0 103 0 0 0 0 80 255 0 0 0 0 0", "GRIB_REF_TIME": "1592611200 sec UTC", "GRIB_SHORT_NAME": "80-HTGL", "GRIB_UNIT": "[C]", "GRIB_VALID_TIME": "1592611200 sec UTC"}, "data": "20200620/00/0p25/f000/var_tmp.png"}] -------------------------------------------------------------------------------- /examples/data/var_tmp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/examples/data/var_tmp.png -------------------------------------------------------------------------------- /examples/data/var_ugrd-var_vgrd.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "header": { 4 | "nx": 1440, 5 | "ny": 721, 6 | "dx": 0.25, 7 | "dy": 0.25, 8 | "min": -21.34380340576172, 9 | "max": 30.7261962890625, 10 | "extent": [ 11 | -180.125, 12 | -90.125, 13 | 179.875, 14 | 90.125 15 | ], 16 | "GRIB_COMMENT": "u-component of wind [m/s]", 17 | "GRIB_DISCIPLINE": "0(Meteorological)", 18 | "GRIB_ELEMENT": "UGRD", 19 | "GRIB_FORECAST_SECONDS": "0 sec", 20 | "GRIB_IDS": "CENTER=7(US-NCEP) SUBCENTER=0 MASTER_TABLE=2 LOCAL_TABLE=1 SIGNF_REF_TIME=1(Start_of_Forecast) REF_TIME=2020-06-20T00:00:00Z PROD_STATUS=0(Operational) TYPE=1(Forecast)", 21 | "GRIB_PDS_PDTN": "0", 22 | "GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES": "2 2 2 0 81 0 0 1 0 103 0 10 255 0 0", 23 | "GRIB_PDS_TEMPLATE_NUMBERS": "2 2 2 0 81 0 0 0 1 0 0 0 0 103 0 0 0 0 10 255 0 0 0 0 0", 24 | "GRIB_REF_TIME": "1592611200 sec UTC", 25 | "GRIB_SHORT_NAME": "10-HTGL", 26 | "GRIB_UNIT": "[m/s]", 27 | "GRIB_VALID_TIME": "1592611200 sec UTC" 28 | }, 29 | "data": "20200620/00/0p25/f000/var_ugrd-var_vgrd.png" 30 | }, 31 | { 32 | "header": { 33 | "nx": 1440, 34 | "ny": 721, 35 | "dx": 0.25, 36 | "dy": 0.25, 37 | "min": -23.916271209716797, 38 | "max": 24.693727493286133, 39 | "extent": [ 40 | -180.125, 41 | -90.125, 42 | 179.875, 43 | 90.125 44 | ], 45 | "GRIB_COMMENT": "v-component of wind [m/s]", 46 | "GRIB_DISCIPLINE": "0(Meteorological)", 47 | "GRIB_ELEMENT": "VGRD", 48 | "GRIB_FORECAST_SECONDS": "0 sec", 49 | "GRIB_IDS": "CENTER=7(US-NCEP) SUBCENTER=0 MASTER_TABLE=2 LOCAL_TABLE=1 SIGNF_REF_TIME=1(Start_of_Forecast) REF_TIME=2020-06-20T00:00:00Z PROD_STATUS=0(Operational) TYPE=1(Forecast)", 50 | "GRIB_PDS_PDTN": "0", 51 | "GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES": "2 3 2 0 81 0 0 1 0 103 0 10 255 0 0", 52 | "GRIB_PDS_TEMPLATE_NUMBERS": "2 3 2 0 81 0 0 0 1 0 0 0 0 103 0 0 0 0 10 255 0 0 0 0 0", 53 | "GRIB_REF_TIME": "1592611200 sec UTC", 54 | "GRIB_SHORT_NAME": "10-HTGL", 55 | "GRIB_UNIT": "[m/s]", 56 | "GRIB_VALID_TIME": "1592611200 sec UTC" 57 | }, 58 | "data": "20200620/00/0p25/f000/var_ugrd-var_vgrd.png" 59 | } 60 | ] 61 | -------------------------------------------------------------------------------- /examples/data/var_ugrd-var_vgrd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/examples/data/var_ugrd-var_vgrd.png -------------------------------------------------------------------------------- /examples/data/wind-mc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/examples/data/wind-mc.png -------------------------------------------------------------------------------- /examples/data/wind-uv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sakitam-fdd/wind-layer/bf11d2108459e11fa50e1590ee448a09d075138c/examples/data/wind-uv.png -------------------------------------------------------------------------------- /examples/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | map 7 | 8 | 9 | 30 | 31 | 32 |
33 |
34 |
35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /examples/math.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Title 6 | 7 | 8 | 9 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /examples/ol4.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ol4 wind-layer 6 | 7 | 8 | 19 | 20 | 21 |
22 | 23 | 24 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /packages/amap/README.md: -------------------------------------------------------------------------------- 1 | # `amap-wind` 2 | 3 | > [amap](https://amap.com) wind layer adapter 4 | 5 | ## Usage 6 | 7 | ### Install 8 | 9 | ```bash 10 | pnpm i amap-wind -D 11 | ``` 12 | 13 | ### Example 14 | 15 | ```tsx 16 | requireSDK('//webapi.amap.com/maps?v=1.4.2', '6cb85da518029607d421917b7ddeb94a', 'webapi.amap.com') 17 | .then(flag => { 18 | if (flag) { 19 | const map = new AMap.Map('amap', { 20 | resizeEnable: true, 21 | zoom: 0, 22 | center: [113.53450137499999, 34.44104525], 23 | zooms: [0, 18] 24 | }); 25 | 26 | import('amap-wind').then(({ WindLayer }) => { 27 | fetch(this.$withBase('/data/wind.json')) 28 | .then(res => res.json()) 29 | .then(res => { 30 | const windLayer = new WindLayer(res, { 31 | windOptions: { 32 | // colorScale: scale, 33 | velocityScale: 1 / 20, 34 | paths: 5000, 35 | // eslint-disable-next-line no-unused-vars 36 | colorScale: [ 37 | "rgb(36,104, 180)", 38 | "rgb(60,157, 194)", 39 | "rgb(128,205,193 )", 40 | "rgb(151,218,168 )", 41 | "rgb(198,231,181)", 42 | "rgb(238,247,217)", 43 | "rgb(255,238,159)", 44 | "rgb(252,217,125)", 45 | "rgb(255,182,100)", 46 | "rgb(252,150,75)", 47 | "rgb(250,112,52)", 48 | "rgb(245,64,32)", 49 | "rgb(237,45,28)", 50 | "rgb(220,24,32)", 51 | "rgb(180,0,35)" 52 | ], 53 | lineWidth: 2, 54 | // colorScale: scale, 55 | generateParticleOption: false 56 | }, 57 | zIndex: 20, 58 | }); 59 | 60 | console.log(map, windLayer); 61 | 62 | windLayer.appendTo(map); 63 | }); 64 | }); 65 | } 66 | }) 67 | .catch(e => console.error(e)); 68 | ``` 69 | -------------------------------------------------------------------------------- /packages/amap/__tests__/amap.test.ts: -------------------------------------------------------------------------------- 1 | import { test, expect, describe, beforeAll, afterAll, vi } from 'vitest'; 2 | 3 | vi.stubGlobal('AMap', vi.fn()); 4 | 5 | beforeAll(async () => { 6 | console.log(`[amap-wind]: start testing...`); 7 | }); 8 | 9 | afterAll(async () => { 10 | console.log(`[amap-wind]: test end`); 11 | }); 12 | 13 | describe('amap', async () => { 14 | test('instance', async () => { 15 | const { WindLayer } = await import('../src'); 16 | const layer = new WindLayer([], { 17 | // projection: 'EPSG:4326', 18 | zIndex: 20, 19 | colorScale: 'rgb(255, 255, 255)', 20 | velocityScale: 1 / 30, 21 | paths: 1000, 22 | // bounds: map.getBounds(), 23 | }); 24 | expect(layer).toBeInstanceOf(WindLayer); 25 | }); 26 | }); 27 | -------------------------------------------------------------------------------- /packages/amap/tsconfig.docs.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "noEmit": true 5 | }, 6 | "include": [ 7 | "typings.d.ts", 8 | "src/**/*.ts", 9 | "src/**/*.json" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /packages/amap/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "dist", 5 | "rootDir": "src", 6 | "module": "esnext", 7 | "target": "esnext" 8 | }, 9 | "include": [ 10 | "src/**/*.ts", 11 | "src/**/*.json", 12 | "package.json", 13 | "rollup.config.ts", 14 | "typings.d.ts" 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /packages/amap/typedoc.json: -------------------------------------------------------------------------------- 1 | { 2 | "entryPoints": [ 3 | "./src/index.ts" 4 | ], 5 | "gitRevision": "master", 6 | "sourceLinkTemplate": "https://github.com/sakitam-fdd/wind-layer/blob/{gitRevision}/{path}#L{line}", 7 | "excludeExternals": true, 8 | "excludePrivate": true, 9 | "excludeInternal": true, 10 | "excludeProtected": true, 11 | "hideGenerator": true, 12 | "includeVersion": true, 13 | "hideBreadcrumbs": true, 14 | "allReflectionsHaveOwnDocument": true, 15 | "sort": ["source-order"], 16 | "plugin": [ 17 | "typedoc-plugin-markdown", 18 | "typedoc-plugin-not-exported" 19 | ], 20 | "name": "amap-wind", 21 | "out": "../../docs/api/amap-wind", 22 | "readme": "none", 23 | "entryDocument": "index.md", 24 | "tsconfig": "./tsconfig.docs.json" 25 | } 26 | -------------------------------------------------------------------------------- /packages/amap/typings.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.json'; 2 | 3 | declare module 'AMap' { 4 | const AmapFactory: new () => any; 5 | export default AmapFactory; 6 | } 7 | -------------------------------------------------------------------------------- /packages/amap/vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { UserConfig } from 'vitest'; 2 | 3 | const config: { test: UserConfig } = { 4 | test: { 5 | testTimeout: 50000, 6 | coverage: { 7 | reporter: ['lcov', 'html'], 8 | } as any, 9 | }, 10 | } 11 | 12 | export default config; 13 | -------------------------------------------------------------------------------- /packages/bmap/__tests__/bmap.test.ts: -------------------------------------------------------------------------------- 1 | import { test, expect, describe, beforeAll, afterAll, vi } from 'vitest'; 2 | 3 | vi.stubGlobal( 4 | 'BMap', 5 | vi.mocked({ 6 | Overlay: class {}, 7 | }), 8 | ); 9 | 10 | beforeAll(async () => { 11 | console.log(`[bmap-wind]: start testing...`); 12 | }); 13 | 14 | afterAll(async () => { 15 | console.log(`[bmap-wind]: test end`); 16 | }); 17 | 18 | describe('bmap', async () => { 19 | test('instance', async () => { 20 | const { WindLayer } = await import('../src'); 21 | const layer = new WindLayer([], { 22 | zIndex: 20, 23 | colorScale: 'rgb(255, 255, 255)', 24 | velocityScale: 1 / 30, 25 | paths: 1000, 26 | // bounds: map.getBounds(), 27 | }); 28 | expect(layer).toBeInstanceOf(WindLayer); 29 | }); 30 | }); 31 | -------------------------------------------------------------------------------- /packages/bmap/tsconfig.docs.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "noEmit": true 5 | }, 6 | "include": [ 7 | "typings.d.ts", 8 | "src/**/*.ts", 9 | "src/**/*.json" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /packages/bmap/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "dist", 5 | "rootDir": "src", 6 | "module": "esnext", 7 | "target": "esnext" 8 | }, 9 | "include": [ 10 | "src/**/*.ts", 11 | "src/**/*.json", 12 | "package.json", 13 | "rollup.config.ts", 14 | "typings.d.ts" 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /packages/bmap/typedoc.json: -------------------------------------------------------------------------------- 1 | { 2 | "entryPoints": [ 3 | "./src/index.ts" 4 | ], 5 | "gitRevision": "master", 6 | "sourceLinkTemplate": "https://github.com/sakitam-fdd/wind-layer/blob/{gitRevision}/{path}#L{line}", 7 | "excludeExternals": true, 8 | "excludePrivate": true, 9 | "excludeInternal": true, 10 | "excludeProtected": true, 11 | "hideGenerator": true, 12 | "includeVersion": true, 13 | "hideBreadcrumbs": true, 14 | "allReflectionsHaveOwnDocument": true, 15 | "sort": ["source-order"], 16 | "plugin": [ 17 | "typedoc-plugin-markdown", 18 | "typedoc-plugin-not-exported" 19 | ], 20 | "name": "bmap-wind", 21 | "out": "../../docs/api/bmap-wind", 22 | "readme": "none", 23 | "entryDocument": "index.md", 24 | "tsconfig": "./tsconfig.docs.json" 25 | } 26 | -------------------------------------------------------------------------------- /packages/bmap/typings.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.json'; 2 | -------------------------------------------------------------------------------- /packages/bmap/vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { UserConfig } from 'vitest'; 2 | 3 | const config: { test: UserConfig } = { 4 | test: { 5 | testTimeout: 50000, 6 | coverage: { 7 | reporter: ['lcov', 'html'], 8 | } as any, 9 | }, 10 | } 11 | 12 | export default config; 13 | -------------------------------------------------------------------------------- /packages/core/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # wind-core 2 | 3 | ## 1.1.8 4 | 5 | ### Patch Changes 6 | 7 | - [`44c0d33`](https://github.com/sakitam-fdd/wind-layer/commit/44c0d33a0d937d586f3086dbb873007b9a826a53) Thanks [@sakitam-fdd](https://github.com/sakitam-fdd)! - bump version 8 | 9 | ## 1.1.7 10 | 11 | ### Patch Changes 12 | 13 | - [`0b59e55`](https://github.com/sakitam-fdd/wind-layer/commit/0b59e554db71039b1f73a30e80cd4a0c423967b8) Thanks [@sakitam-fdd](https://github.com/sakitam-fdd)! - bump version 14 | 15 | ## 1.1.6 16 | 17 | ### Patch Changes 18 | 19 | - [`9089371`](https://github.com/sakitam-fdd/wind-layer/commit/9089371bd2f7afdd074f500cb73fd532695e20b8) Thanks [@sakitam-fdd](https://github.com/sakitam-fdd)! - bump version 20 | 21 | ## 1.1.5 22 | 23 | ### Patch Changes 24 | 25 | - [`515d3dc`](https://github.com/sakitam-fdd/wind-layer/commit/515d3dcdc94432b783d3d08a7079d3cc1d722a5f) Thanks [@sakitam-fdd](https://github.com/sakitam-fdd)! - release: bump version 26 | 27 | ## 1.1.4 28 | 29 | ### Patch Changes 30 | 31 | - [`9a8ed0d`](https://github.com/sakitam-fdd/wind-layer/commit/9a8ed0d298cbb8240d23e81e480e7cf5a046d52c) Thanks [@sakitam-fdd](https://github.com/sakitam-fdd)! - release: bump version 32 | 33 | ## 1.1.2 34 | 35 | ### Patch Changes 36 | 37 | - [`2721a99`](https://github.com/sakitam-fdd/wind-layer/commit/2721a996e6158e63ee9c98f444f802e229d22f58) Thanks [@sakitam-fdd](https://github.com/sakitam-fdd)! - release: v1.1.2 38 | 39 | ## 1.1.1 40 | 41 | ### Patch Changes 42 | 43 | - [`4323d1e`](https://github.com/sakitam-fdd/wind-layer/commit/4323d1ef0334dd30b4ae74d1cd231467a3e81046) Thanks [@sakitam-fdd](https://github.com/sakitam-fdd)! - chore(release): publish 44 | -------------------------------------------------------------------------------- /packages/core/README.md: -------------------------------------------------------------------------------- 1 | # `wind-core` 2 | 3 | > Wind field core 4 | 5 | ## Usage 6 | 7 | ```js 8 | import WindCore from 'wind-core'; 9 | 10 | const wind = new WindCore(this.context, opt, data); 11 | 12 | wind.project = (coordinate) => pixel; 13 | wind.intersectsCoordinate = (coordinate) => true; 14 | wind.postrender = () => {}; 15 | ``` 16 | -------------------------------------------------------------------------------- /packages/core/__tests__/core.test.ts: -------------------------------------------------------------------------------- 1 | import { test, expect, describe, beforeAll, afterAll } from 'vitest'; 2 | import { isFunction, compareVersion } from '../src'; 3 | 4 | beforeAll(async () => { 5 | console.log(`[wind-core]: start testing...`); 6 | }); 7 | 8 | afterAll(async () => { 9 | console.log(`[wind-core]: test end`); 10 | }); 11 | 12 | describe('utils', async () => { 13 | test('isFunction', async () => { 14 | expect(isFunction(1)).toBe(false); 15 | }); 16 | 17 | test('compareVersion', async () => { 18 | expect(compareVersion('2.0.0', '2.0.0') >= 0).toBe(true); 19 | expect(compareVersion('2.0', '2.0.0') >= 0).toBe(true); 20 | expect(compareVersion('1.0', '2.0.0') >= 0).toBe(false); 21 | }); 22 | }); 23 | -------------------------------------------------------------------------------- /packages/core/src/Vector.ts: -------------------------------------------------------------------------------- 1 | export default class Vector { 2 | public u: number; 3 | public v: number; 4 | public m: number; 5 | 6 | constructor(u: number, v: number) { 7 | this.u = u; 8 | this.v = v; 9 | 10 | this.m = this.magnitude(); 11 | } 12 | 13 | /** 14 | * 向量值(这里指风速) 15 | * @returns {Number} 16 | */ 17 | public magnitude() { 18 | return Math.sqrt(this.u ** 2 + this.v ** 2); 19 | } 20 | 21 | /** 22 | * 流体方向 (这里指风向,范围为0-360º) 23 | * N is 0º and E is 90º 24 | * @returns {Number} 25 | */ 26 | public directionTo() { 27 | const verticalAngle = Math.atan2(this.u, this.v); 28 | let inDegrees = verticalAngle * (180.0 / Math.PI); 29 | if (inDegrees < 0) { 30 | inDegrees += 360.0; 31 | } 32 | return inDegrees; 33 | } 34 | 35 | /** 36 | * Angle in degrees (0 to 360º) From x--> 37 | * N is 0º and E is 90º 38 | * @returns {Number} 39 | */ 40 | public directionFrom() { 41 | const a = this.directionTo(); 42 | return (a + 180.0) % 360.0; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /packages/core/tsconfig.docs.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "noEmit": true 5 | }, 6 | "include": [ 7 | "typings.d.ts", 8 | "src/**/*.ts", 9 | "src/**/*.json" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /packages/core/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "dist", 5 | "rootDir": "src", 6 | "module": "esnext", 7 | "target": "esnext" 8 | }, 9 | "include": [ 10 | "src/**/*.ts", 11 | "src/**/*.json", 12 | "package.json", 13 | "rollup.config.ts", 14 | "typings.d.ts" 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /packages/core/typedoc.json: -------------------------------------------------------------------------------- 1 | { 2 | "entryPoints": [ 3 | "./src/index.ts" 4 | ], 5 | "gitRevision": "master", 6 | "sourceLinkTemplate": "https://github.com/sakitam-fdd/wind-layer/blob/{gitRevision}/{path}#L{line}", 7 | "excludeExternals": true, 8 | "excludePrivate": true, 9 | "excludeInternal": true, 10 | "excludeProtected": true, 11 | "hideGenerator": true, 12 | "includeVersion": true, 13 | "hideBreadcrumbs": true, 14 | "allReflectionsHaveOwnDocument": true, 15 | "sort": ["source-order"], 16 | "plugin": [ 17 | "typedoc-plugin-markdown", 18 | "typedoc-plugin-not-exported" 19 | ], 20 | "name": "wind-core", 21 | "out": "../../docs/api/wind-core", 22 | "readme": "none", 23 | "entryDocument": "index.md", 24 | "tsconfig": "./tsconfig.docs.json" 25 | } 26 | -------------------------------------------------------------------------------- /packages/core/typings.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.json'; 2 | -------------------------------------------------------------------------------- /packages/core/vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { UserConfig } from 'vitest'; 2 | 3 | const config: { test: UserConfig } = { 4 | test: { 5 | testTimeout: 50000, 6 | coverage: { 7 | reporter: ['lcov', 'html'], 8 | } as any, 9 | }, 10 | } 11 | 12 | export default config; 13 | -------------------------------------------------------------------------------- /packages/gl-core/__tests__/core.test.ts: -------------------------------------------------------------------------------- 1 | import { test, expect, describe, beforeAll, afterAll } from 'vitest'; 2 | 3 | beforeAll(async () => { 4 | console.log(`[wind-gl-core]: start testing...`); 5 | }); 6 | 7 | afterAll(async () => { 8 | console.log(`[wind-gl-core]: test end`); 9 | }); 10 | 11 | describe('utils', async () => { 12 | test('isNumber', async () => { 13 | expect(1).toBe(1); 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /packages/gl-core/src/index.ts: -------------------------------------------------------------------------------- 1 | import wgw from 'wind-gl-worker'; 2 | import BaseLayer, { defaultOptions } from './renderer'; 3 | import TileID from './tile/TileID'; 4 | import Tile from './tile/Tile'; 5 | import type { BaseLayerOptions, UserOptions } from './renderer'; 6 | 7 | const configDeps = wgw.configDeps; 8 | 9 | export * from './utils/common'; 10 | 11 | export { BaseLayer, BaseLayerOptions, UserOptions, TileID, Tile, defaultOptions, configDeps }; 12 | 13 | export * from './source'; 14 | 15 | export * from './type'; 16 | -------------------------------------------------------------------------------- /packages/gl-core/src/renderer/Pipelines.ts: -------------------------------------------------------------------------------- 1 | import type { Renderer } from '@sakitam-gis/vis-engine'; 2 | 3 | export default class Pipelines { 4 | #passes: any[] = []; 5 | 6 | public enabled: boolean; 7 | public renderer: Renderer; 8 | 9 | constructor(renderer) { 10 | this.enabled = true; 11 | this.renderer = renderer; 12 | } 13 | 14 | get passes() { 15 | return this.#passes; 16 | } 17 | 18 | get length() { 19 | return this.passes.length; 20 | } 21 | 22 | resize(width: number, height: number) { 23 | const len = this.#passes.length; 24 | for (let i = 0; i < len; i++) { 25 | const pass = this.#passes[i]; 26 | pass.resize?.(width, height); 27 | } 28 | } 29 | 30 | addPass(pass) { 31 | this.#passes.push(pass); 32 | } 33 | 34 | removePass(pass) { 35 | const idx = this.#passes.indexOf(pass); 36 | if (idx > -1) { 37 | this.#passes.splice(pass, 1); 38 | pass.destroy(); 39 | } 40 | } 41 | 42 | removePasses() { 43 | this.#passes.forEach((pass) => pass.destroy()); 44 | this.#passes = []; 45 | } 46 | 47 | getPass(id) { 48 | return this.#passes.find((pass) => pass.id === id); 49 | } 50 | 51 | prerender(rendererParams, rendererState) { 52 | const passes = this.#passes.filter((p) => p.enabled && p.prerender === true); 53 | if (passes.length > 0) { 54 | const len = passes.length; 55 | for (let i = 0; i < len; i++) { 56 | const pass = passes[i]; 57 | pass.render(rendererParams, rendererState); 58 | } 59 | this.renderer.resetState(); 60 | } 61 | } 62 | 63 | render(rendererParams, rendererState) { 64 | const passes = this.#passes.filter((p) => p.enabled && p.prerender !== true); 65 | if (passes.length > 0) { 66 | const len = passes.length; 67 | for (let i = 0; i < len; i++) { 68 | const pass = passes[i]; 69 | pass.render(rendererParams, rendererState); 70 | } 71 | this.renderer.resetState(); 72 | } 73 | } 74 | 75 | destroy() { 76 | this.#passes.forEach((pass) => pass.destroy()); 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /packages/gl-core/src/renderer/pass/arrow/README.md: -------------------------------------------------------------------------------- 1 | ## 渲染箭头图层 2 | -------------------------------------------------------------------------------- /packages/gl-core/src/renderer/pass/arrow/compose.ts: -------------------------------------------------------------------------------- 1 | import ComposePass from '../particles/compose'; 2 | 3 | export default class ArrowComposePass extends ComposePass {} 4 | -------------------------------------------------------------------------------- /packages/gl-core/src/renderer/pass/base.ts: -------------------------------------------------------------------------------- 1 | import type { Renderer } from '@sakitam-gis/vis-engine'; 2 | 3 | const ERR_PASS_METHOD_UNDEFINED = 'Pass subclass must define virtual methods'; 4 | 5 | export default class Pass { 6 | public id: string; 7 | 8 | public readonly renderer: Renderer; 9 | 10 | public options: T; 11 | 12 | public maskPass: any; 13 | 14 | #enabled = true; 15 | 16 | constructor(id: string, renderer: Renderer, options: T = {} as T) { 17 | this.id = id; 18 | this.renderer = renderer; 19 | this.options = options; 20 | 21 | this.setMaskPass((this.options as any).maskPass); 22 | } 23 | 24 | get enabled() { 25 | return this.#enabled; 26 | } 27 | 28 | set enabled(state) { 29 | this.#enabled = state; 30 | } 31 | 32 | setMaskPass(pass) { 33 | this.maskPass = pass; 34 | } 35 | 36 | render(rendererParams, rendererState, cb) { // eslint-disable-line 37 | throw new Error(ERR_PASS_METHOD_UNDEFINED); 38 | } 39 | 40 | destroy() { 41 | throw new Error(ERR_PASS_METHOD_UNDEFINED); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /packages/gl-core/src/renderer/pass/color/README.md: -------------------------------------------------------------------------------- 1 | ## 主要用于色斑图的渲染 2 | -------------------------------------------------------------------------------- /packages/gl-core/src/renderer/pass/particles/README.md: -------------------------------------------------------------------------------- 1 | ## 粒子图层 2 | 3 | 共计四个 pass,关系如下: 4 | 5 | - compose:瓦片数据合并 6 | - update:更新 GPU 粒子位置,并编码到 rbga 7 | - particles:绘制粒子 8 | - screen:绘制到 canvas buffer 9 | -------------------------------------------------------------------------------- /packages/gl-core/src/renderer/pass/raster/README.md: -------------------------------------------------------------------------------- 1 | ## 用于普通瓦片的渲染 2 | -------------------------------------------------------------------------------- /packages/gl-core/src/shaders/common.frag.glsl: -------------------------------------------------------------------------------- 1 | precision highp float; 2 | 3 | uniform sampler2D u_texture; 4 | uniform sampler2D u_textureNext; 5 | uniform float u_fade_t; 6 | uniform float opacity; 7 | 8 | varying vec2 vUv; 9 | 10 | void main () { 11 | vec2 uv = vUv; 12 | 13 | vec4 color0 = texture2D(u_texture, vUv); 14 | vec4 color1 = texture2D(u_textureNext, vUv); 15 | 16 | vec4 color = mix(color0, color1, u_fade_t); 17 | 18 | gl_FragColor = vec4(floor(255.0 * color * opacity) / 255.0); 19 | } 20 | -------------------------------------------------------------------------------- /packages/gl-core/src/shaders/common.vert.glsl: -------------------------------------------------------------------------------- 1 | #defines 2 | 3 | attribute vec2 uv; 4 | attribute vec3 position; 5 | uniform vec2 resolution; 6 | uniform mat4 modelViewMatrix; 7 | uniform mat4 projectionMatrix; 8 | 9 | varying vec2 vUv; 10 | 11 | void main () { 12 | vUv = uv; 13 | 14 | gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); 15 | } 16 | -------------------------------------------------------------------------------- /packages/gl-core/src/shaders/compose-render.vert.glsl: -------------------------------------------------------------------------------- 1 | #defines 2 | 3 | attribute vec2 uv; 4 | attribute vec3 position; 5 | uniform vec2 resolution; 6 | uniform mat4 modelViewMatrix; 7 | uniform mat4 projectionMatrix; 8 | 9 | uniform vec4 u_tile_bbox; // 瓦片范围 10 | uniform vec4 u_data_bbox; // 瓦片范围 11 | 12 | varying vec2 vUv; 13 | 14 | void main () { 15 | vec2 pos = u_tile_bbox.xy + position.xy * (u_tile_bbox.zw - u_tile_bbox.xy); 16 | 17 | vec2 textureCoord = (pos.xy - u_data_bbox.xy) / (u_data_bbox.zw - u_data_bbox.xy); 18 | 19 | vUv = vec2(textureCoord.x, 1.0 - textureCoord.y); 20 | 21 | gl_Position = projectionMatrix * modelViewMatrix * vec4(pos, 0.0, 1.0); 22 | } 23 | -------------------------------------------------------------------------------- /packages/gl-core/src/shaders/compose.frag.glsl: -------------------------------------------------------------------------------- 1 | #defines 2 | precision highp float; 3 | 4 | varying vec2 vUv; 5 | uniform sampler2D u_image0; 6 | uniform sampler2D u_image1; 7 | 8 | #include 9 | 10 | #if RENDER_TYPE == 1 11 | uniform vec4 dataRange; 12 | 13 | vec4 getColor(const vec2 uv) { 14 | vec2 rg = texture2D(u_image0, uv).rg; 15 | vec2 data = rg * (dataRange.yw - dataRange.xz) + dataRange.xz; 16 | return vec4(data.xy, 0.0, 1.0); 17 | } 18 | 19 | #elif RENDER_TYPE == 0 20 | uniform vec2 dataRange; 21 | 22 | vec4 getColor(const vec2 uv) { 23 | float r = texture2D(u_image0, uv).r; 24 | float rf = r * (dataRange.y - dataRange.x) + dataRange.x; 25 | return vec4(rf, 0.0, 0.0, 1.0); 26 | } 27 | #elif RENDER_TYPE == 2 28 | vec4 getColor(const vec2 uv) { 29 | vec4 rgba = texture2D(u_image0, uv).rgba; 30 | float r = decode_float(rgba, LITTLE_ENDIAN); 31 | return vec4(r, 0.0, 0.0, 1.0); 32 | } 33 | #else 34 | vec4 getColor(const vec2 uv) { 35 | return texture2D(u_image0, uv).rgba; 36 | } 37 | #endif 38 | 39 | void main() { 40 | gl_FragColor = getColor(vUv); 41 | } 42 | -------------------------------------------------------------------------------- /packages/gl-core/src/shaders/compose.vert.glsl: -------------------------------------------------------------------------------- 1 | attribute vec2 uv; 2 | attribute vec3 position; 3 | uniform vec3 cameraPosition; 4 | uniform mat4 viewMatrix; 5 | uniform mat4 modelMatrix; 6 | uniform mat4 modelViewMatrix; 7 | uniform mat4 projectionMatrix; 8 | 9 | varying vec2 vUv; 10 | 11 | void main() { 12 | vUv = vec2(uv.x, 1.0 - uv.y); 13 | 14 | gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); 15 | } 16 | -------------------------------------------------------------------------------- /packages/gl-core/src/shaders/decode-float.glsl: -------------------------------------------------------------------------------- 1 | //https://stackoverflow.com/questions/18453302/how-do-you-pack-one-32bit-int-into-4-8bit-ints-in-glsl-webgl/18454838#18454838 2 | 3 | // Denormalize 8-bit color channels to integers in the range 0 to 255. 4 | vec4 floatsToBytes(vec4 inputFloats, bool littleEndian) { 5 | vec4 bytes = vec4(inputFloats * 255.0); 6 | return ( 7 | littleEndian 8 | ? bytes.abgr 9 | : bytes 10 | ); 11 | } 12 | 13 | // https://stackoverflow.com/questions/63827836/is-it-possible-to-do-a-rgba-to-float-and-back-round-trip-and-read-the-pixels-in 14 | float decode_float(vec4 v, bool littleEndian) { 15 | vec4 bits = floatsToBytes(v, littleEndian); 16 | float sign = mix(-1.0, 1.0, step(bits[3], 128.0)); 17 | // note: the 0.1s here an there are voodoo related to precision 18 | float expo = floor(mod(bits[3] + 0.2, 128.0)) * 2.0 + floor((bits[2] + 0.2) / 128.0) - 127.0; 19 | float sig = bits[0] + bits[1] * 256.0 + floor(mod(bits[2] + 0.2, 128.0)) * 256.0 * 256.0; 20 | return sign * (1.0 + sig / 8388607.0) * pow(2.0, expo); 21 | } 22 | -------------------------------------------------------------------------------- /packages/gl-core/src/shaders/decode.glsl: -------------------------------------------------------------------------------- 1 | const vec2 bitEnc = vec2(1.0, 255.0); 2 | const vec2 bitDec = 1.0 / bitEnc; 3 | 4 | // decode particle position from pixel RGBA 5 | vec2 fromRGBA(const vec4 color) { 6 | vec4 rounded_color = floor(color * 255.0 + 0.5) / 255.0; 7 | float x = dot(rounded_color.rg, bitDec); 8 | float y = dot(rounded_color.ba, bitDec); 9 | return vec2(x, y); 10 | } 11 | -------------------------------------------------------------------------------- /packages/gl-core/src/shaders/encode-float.glsl: -------------------------------------------------------------------------------- 1 | #define FLOAT_MAX 1.70141184e38 2 | #define FLOAT_MIN 1.17549435e-38 3 | 4 | lowp vec4 encode_float(highp float v) { 5 | highp float av = abs(v); 6 | 7 | //Handle special cases 8 | if(av < FLOAT_MIN) { 9 | return vec4(0.0, 0.0, 0.0, 0.0); 10 | } else if(v > FLOAT_MAX) { 11 | return vec4(127.0, 128.0, 0.0, 0.0) / 255.0; 12 | } else if(v < -FLOAT_MAX) { 13 | return vec4(255.0, 128.0, 0.0, 0.0) / 255.0; 14 | } 15 | 16 | highp vec4 c = vec4(0,0,0,0); 17 | 18 | //Compute exponent and mantissa 19 | highp float e = floor(log2(av)); 20 | highp float m = av * pow(2.0, -e) - 1.0; 21 | 22 | //Unpack mantissa 23 | c[1] = floor(128.0 * m); 24 | m -= c[1] / 128.0; 25 | c[2] = floor(32768.0 * m); 26 | m -= c[2] / 32768.0; 27 | c[3] = floor(8388608.0 * m); 28 | 29 | //Unpack exponent 30 | highp float ebias = e + 127.0; 31 | c[0] = floor(ebias / 2.0); 32 | ebias -= c[0] * 2.0; 33 | c[1] += floor(ebias) * 128.0; 34 | 35 | //Unpack sign bit 36 | c[0] += 128.0 * step(0.0, -v); 37 | 38 | //Scale back to range 39 | return c / 255.0; 40 | } 41 | -------------------------------------------------------------------------------- /packages/gl-core/src/shaders/encode.glsl: -------------------------------------------------------------------------------- 1 | const vec2 bitEnc = vec2(1.0, 255.0); 2 | const vec2 bitDec = 1.0 / bitEnc; 3 | 4 | vec4 toRGBA (const vec2 pos) { 5 | vec2 rg = bitEnc * pos.x; 6 | rg = fract(rg); 7 | rg -= rg.yy * vec2(1.0 / 255.0, 0.0); 8 | 9 | vec2 ba = bitEnc * pos.y; 10 | ba = fract(ba); 11 | ba -= ba.yy * vec2(1.0 / 255.0, 0.0); 12 | 13 | return vec4(rg, ba); 14 | } 15 | -------------------------------------------------------------------------------- /packages/gl-core/src/shaders/mask.frag.glsl: -------------------------------------------------------------------------------- 1 | #defines 2 | precision mediump float; 3 | 4 | void main () { 5 | gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0); 6 | } 7 | -------------------------------------------------------------------------------- /packages/gl-core/src/shaders/mask.vert.glsl: -------------------------------------------------------------------------------- 1 | attribute vec3 position; 2 | uniform vec3 cameraPosition; 3 | uniform mat4 viewMatrix; 4 | uniform mat4 modelMatrix; 5 | uniform mat4 modelViewMatrix; 6 | uniform mat4 projectionMatrix; 7 | uniform float u_offset; 8 | 9 | void main() { 10 | gl_Position = projectionMatrix * modelViewMatrix * vec4(position + vec3(u_offset, 0.0, 0.0), 1.0); 11 | } 12 | -------------------------------------------------------------------------------- /packages/gl-core/src/shaders/mercatorToWGS84.glsl: -------------------------------------------------------------------------------- 1 | const float PI = 3.14159265359; 2 | 3 | /** 4 | * Converts mapbox style pseudo-mercator coordinates (this is just like mercator, but the unit isn't a meter, but 0..1 5 | * spans the entire world) into texture like WGS84 coordinates (this is just like WGS84, but instead of angles, it uses 6 | * intervals of 0..1). 7 | */ 8 | vec2 mercatorToWGS84(vec2 xy) { 9 | // convert lat into an angle 10 | float y = radians(180.0 - xy.y * 360.0); 11 | // use the formula to convert mercator -> WGS84 12 | y = 360.0 / PI * atan(exp(y)) - 90.0; 13 | // normalize back into 0..1 interval 14 | y = y / -180.0 + 0.5; 15 | // pass lng through, as it doesn't change 16 | return vec2(xy.x, y); 17 | } 18 | -------------------------------------------------------------------------------- /packages/gl-core/src/shaders/particles/draw.frag.glsl: -------------------------------------------------------------------------------- 1 | #defines 2 | 3 | precision highp float; 4 | 5 | uniform sampler2D u_texture; 6 | uniform sampler2D u_textureNext; 7 | uniform vec2 u_colorRange; 8 | uniform sampler2D u_colorRamp; 9 | 10 | uniform vec4 u_bbox; 11 | uniform vec4 u_data_bbox; 12 | uniform float u_fade_t; 13 | uniform vec2 u_image_res; 14 | 15 | varying vec2 v_particle_pos; 16 | 17 | vec4 calcTexture(const vec2 puv) { 18 | vec4 color0 = texture2D(u_texture, puv); 19 | vec4 color1 = texture2D(u_textureNext, puv); 20 | 21 | return mix(color0, color1, u_fade_t); 22 | } 23 | 24 | #if RENDER_TYPE == 1 25 | // rg 26 | vec2 decodeValue(const vec2 vc) { 27 | vec4 rgba = calcTexture(vc); 28 | return rgba.rg; 29 | } 30 | #else 31 | float decodeValue(const vec2 vc) { 32 | return calcTexture(vc).r; 33 | } 34 | #endif 35 | 36 | vec2 bilinear(const vec2 uv) { 37 | vec2 px = 1.0 / u_image_res; 38 | vec2 vc = (floor(uv * u_image_res)) * px; 39 | vec2 f = fract(uv * u_image_res); 40 | vec2 tl = decodeValue(vc); 41 | vec2 tr = decodeValue(vc + vec2(px.x, 0)); 42 | vec2 bl = decodeValue(vc + vec2(0, px.y)); 43 | vec2 br = decodeValue(vc + px); 44 | return mix(mix(tl, tr, f.x), mix(bl, br, f.x), f.y); 45 | } 46 | 47 | bool containsXY(vec2 pos, vec4 bbox) { 48 | float x = pos.x; 49 | return ( 50 | bbox.x < x && x < bbox.z && 51 | bbox.y < pos.y && pos.y < bbox.w 52 | ); 53 | } 54 | 55 | void main() { 56 | vec2 pos = v_particle_pos; 57 | 58 | if (!containsXY(pos.xy, u_data_bbox) || !containsXY(pos.xy, u_bbox) || calcTexture(pos).a == 0.0) { 59 | discard; 60 | } 61 | 62 | vec2 velocity = bilinear(pos); 63 | 64 | float value = length(velocity); 65 | 66 | float value_t = (value - u_colorRange.x) / (u_colorRange.y - u_colorRange.x); 67 | vec2 ramp_pos = vec2(value_t, 0.5); 68 | 69 | vec4 color = texture2D(u_colorRamp, ramp_pos); 70 | 71 | float distance = length(2.0 * gl_PointCoord - 1.0); 72 | if (distance > 1.0) { 73 | discard; 74 | } 75 | 76 | gl_FragColor = vec4(floor(255.0 * color * color.a) / 255.0); 77 | } 78 | -------------------------------------------------------------------------------- /packages/gl-core/src/shaders/particles/draw.vert.glsl: -------------------------------------------------------------------------------- 1 | attribute vec2 reference; 2 | 3 | attribute float a_index; 4 | 5 | uniform vec2 resolution; 6 | uniform mat4 modelViewMatrix; 7 | uniform mat4 viewMatrix; 8 | uniform mat4 modelMatrix; 9 | uniform mat4 projectionMatrix; 10 | 11 | uniform sampler2D u_particles; 12 | uniform sampler2D u_particles_next; 13 | 14 | uniform float u_particleSize; 15 | uniform float u_particlesRes; 16 | 17 | varying vec2 v_particle_pos; 18 | 19 | void main() { 20 | float v_index = floor(a_index / 6.0); 21 | vec2 uv = reference; 22 | vec4 color = texture2D(u_particles, uv); 23 | vec4 color1 = texture2D(u_particles_next, uv); 24 | 25 | v_particle_pos = mix(color.rg, color1.rg, 0.0); 26 | 27 | gl_PointSize = u_particleSize; 28 | 29 | gl_Position = projectionMatrix * modelViewMatrix * vec4(v_particle_pos, 0.0, 1.0); 30 | } 31 | 32 | -------------------------------------------------------------------------------- /packages/gl-core/src/shaders/particles/screen.frag.glsl: -------------------------------------------------------------------------------- 1 | precision highp float; 2 | 3 | uniform sampler2D u_screen; 4 | uniform float u_opacity; 5 | uniform float u_fade; 6 | 7 | varying vec2 vUv; 8 | 9 | void main() { 10 | vec4 color = texture2D(u_screen, vUv); 11 | gl_FragColor = vec4(floor(255.0 * color * u_opacity * u_fade) / 255.0); 12 | } 13 | -------------------------------------------------------------------------------- /packages/gl-core/src/shaders/picker.frag.glsl: -------------------------------------------------------------------------------- 1 | precision highp float; 2 | 3 | uniform sampler2D u_texture; 4 | uniform sampler2D u_textureNext; 5 | uniform float u_fade_t; 6 | 7 | varying vec2 vUv; 8 | 9 | void main () { 10 | vec2 uv = vUv; 11 | 12 | vec4 color0 = texture2D(u_texture, vUv); 13 | vec4 color1 = texture2D(u_textureNext, vUv); 14 | 15 | vec4 color = mix(color0, color1, u_fade_t); 16 | 17 | gl_FragColor = color; 18 | } 19 | -------------------------------------------------------------------------------- /packages/gl-core/src/shaders/picker.vert.glsl: -------------------------------------------------------------------------------- 1 | #defines 2 | 3 | attribute vec2 uv; 4 | attribute vec3 position; 5 | uniform vec2 resolution; 6 | uniform mat4 modelViewMatrix; 7 | uniform mat4 projectionMatrix; 8 | 9 | varying vec2 vUv; 10 | 11 | void main () { 12 | vUv = vec2(uv.x, 1.0 - uv.y); 13 | 14 | gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); 15 | } 16 | -------------------------------------------------------------------------------- /packages/gl-core/src/shaders/random.glsl: -------------------------------------------------------------------------------- 1 | // pseudo-random generator 2 | // https://stackoverflow.com/questions/4200224/random-noise-functions-for-glsl 3 | 4 | //const vec3 rand_constants = vec3(12.9898, 78.233, 4375.85453); 5 | //float rand(const vec2 co) { 6 | // float t = dot(rand_constants.xy, co); 7 | // return fract(sin(t) * (rand_constants.z + t)); 8 | //} 9 | 10 | highp float rand(vec2 co) { 11 | highp float a = 12.9898; 12 | highp float b = 78.233; 13 | highp float c = 43758.5453; 14 | // dot可以根据不同的值位置,返回一个 0.0 到 1.0 之间的值 15 | highp float dt = dot(co.xy ,vec2(a, b)); 16 | highp float sn = mod(dt, 3.14); 17 | // 因为sin函数的值域 [-1, 1]; 所以我们这步操作是将一个随机的浮点数d,转换到[-1, 1]这个区间 18 | // 这个fract是获取d的小数部分,目的是将[-43758.5453, 43758.5453]之间的值域,重新压入到[0, 1]之间 19 | return fract(sin(sn) * c); 20 | } 21 | -------------------------------------------------------------------------------- /packages/gl-core/src/shaders/raster-texture.frag.glsl: -------------------------------------------------------------------------------- 1 | precision highp float; 2 | 3 | varying vec2 vUv; 4 | uniform sampler2D u_image0; 5 | 6 | vec4 getColor(const vec2 uv) { 7 | return texture2D(u_image0, uv).rgba; 8 | } 9 | 10 | void main() { 11 | gl_FragColor = getColor(vUv); 12 | } 13 | -------------------------------------------------------------------------------- /packages/gl-core/src/shaders/shaderLib.ts: -------------------------------------------------------------------------------- 1 | import random from './random.glsl'; 2 | import encode from './encode.glsl'; 3 | import encodeFloat from './encode-float.glsl'; 4 | import decode from './decode.glsl'; 5 | import decodeFloat from './decode-float.glsl'; 6 | // import mercatorToWGS84 from './mercatorToWGS84.glsl'; 7 | // import wgs84ToMercator from './wgs84ToMercator.glsl'; 8 | 9 | export { encode, decode, random, encodeFloat, decodeFloat }; 10 | -------------------------------------------------------------------------------- /packages/gl-core/src/shaders/wgs84ToMercator.glsl: -------------------------------------------------------------------------------- 1 | const float PI = 3.14159265359; 2 | 3 | vec2 wgs84ToMercator(vec2 xy) { 4 | // convert to angle 5 | float y = -180.0 * xy.y + 90.0; 6 | // use the formule to convert 7 | y = (180.0 - (180.0 / PI * log(tan(PI / 4.0 + y * PI / 360.0)))) / 360.0; 8 | // pass x through, as it doesn't change 9 | return vec2(xy.x, y); 10 | } 11 | -------------------------------------------------------------------------------- /packages/gl-core/src/source/README.md: -------------------------------------------------------------------------------- 1 | ## 数据源 2 | 3 | 注意这里抽离出数据配置是为了方便后续数据源复用,比如同一份数据瓦片需要多种不同的渲染方式。在过去的实现中每个图层都需要加载一次数据, 4 | 在我们抽离出数据配置后,我们可以公用一个数据配置,只需要加载一次数据。 5 | -------------------------------------------------------------------------------- /packages/gl-core/src/source/index.ts: -------------------------------------------------------------------------------- 1 | import TileSource from './tile'; 2 | import ImageSource from './image'; 3 | import TimelineSource from './Timeline'; 4 | 5 | export type SourceType = TileSource | ImageSource | TimelineSource; 6 | 7 | export { TileSource, ImageSource, TimelineSource }; 8 | -------------------------------------------------------------------------------- /packages/gl-core/src/tile/TileMesh.ts: -------------------------------------------------------------------------------- 1 | import type { Program } from '@sakitam-gis/vis-engine'; 2 | import { Mesh, Geometry } from '@sakitam-gis/vis-engine'; 3 | 4 | export default class TileMesh { 5 | public id: string; 6 | public program: Program; 7 | 8 | /** 9 | * 用于地图投影下的 Mesh 10 | */ 11 | public mesh: Mesh; 12 | 13 | /** 14 | * 用于平面绘制的 Mesh,常用于瓦片合并 Pass 15 | */ 16 | public planeMesh: Mesh; 17 | 18 | constructor(id, renderer, program, geometry) { 19 | this.id = id; 20 | this.program = program; 21 | 22 | this.mesh = new Mesh(renderer, { 23 | program, 24 | geometry, 25 | }); 26 | 27 | this.planeMesh = new Mesh(renderer, { 28 | program, 29 | geometry: new Geometry(renderer, { 30 | position: { 31 | size: 2, 32 | data: new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]), 33 | }, 34 | uv: { 35 | size: 2, 36 | data: new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]), 37 | }, 38 | index: { 39 | size: 1, 40 | data: new Uint16Array([0, 1, 2, 2, 1, 3]), 41 | }, 42 | }), 43 | }); 44 | } 45 | 46 | setCenter(center: number[]) { 47 | this.mesh.position.set(center[0], center[1], center[2] || 0); 48 | } 49 | 50 | getMesh() { 51 | return this.mesh; 52 | } 53 | 54 | destroy() { 55 | this.mesh.destroy(); 56 | this.planeMesh.destroy(); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /packages/gl-core/src/utils/TrackManger.ts: -------------------------------------------------------------------------------- 1 | import { Raf } from '@sakitam-gis/vis-engine'; 2 | import type Track from './Track'; 3 | 4 | class TrackManger { 5 | public raf: Raf; 6 | 7 | public tracks: Set; 8 | 9 | constructor() { 10 | this.tracks = new Set(); 11 | this.run = this.run.bind(this); 12 | this.raf = new Raf(this.run); 13 | } 14 | 15 | add(track) { 16 | if (!this.tracks.has(track)) { 17 | this.tracks.add(track); 18 | this.raf.start(); 19 | } 20 | } 21 | 22 | run(time) { 23 | this.tracks.forEach((t) => { 24 | t.tick(time); 25 | }); 26 | } 27 | 28 | remove(track) { 29 | if (this.tracks.has(track)) { 30 | this.tracks.delete(track); 31 | } 32 | 33 | if (this.tracks.size === 0) { 34 | this.raf.stop(); 35 | } 36 | } 37 | } 38 | 39 | let tm: WithNull = null; 40 | 41 | export default function () { 42 | if (!tm) { 43 | tm = new TrackManger(); 44 | } 45 | 46 | return tm; 47 | } 48 | -------------------------------------------------------------------------------- /packages/gl-core/tsconfig.docs.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "noEmit": true 5 | }, 6 | "include": [ 7 | "typings.d.ts", 8 | "src/**/*.ts", 9 | "src/**/*.json" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /packages/gl-core/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "dist", 5 | "rootDir": "src", 6 | "module": "esnext", 7 | "target": "esnext", 8 | "lib": [ 9 | "esnext", 10 | "dom", 11 | "webworker" 12 | ] 13 | }, 14 | "include": [ 15 | "src/**/*.ts", 16 | "src/**/*.json", 17 | "package.json", 18 | "rollup.config.ts", 19 | "typings.d.ts" 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /packages/gl-core/typedoc.json: -------------------------------------------------------------------------------- 1 | { 2 | "entryPoints": [ 3 | "./src/index.ts" 4 | ], 5 | "gitRevision": "master", 6 | "sourceLinkTemplate": "https://github.com/sakitam-fdd/wind-layer/blob/{gitRevision}/{path}#L{line}", 7 | "excludeExternals": true, 8 | "excludePrivate": true, 9 | "excludeInternal": true, 10 | "excludeProtected": true, 11 | "hideGenerator": true, 12 | "includeVersion": true, 13 | "hideBreadcrumbs": true, 14 | "allReflectionsHaveOwnDocument": true, 15 | "sort": ["source-order"], 16 | "plugin": [ 17 | "typedoc-plugin-markdown", 18 | "typedoc-plugin-not-exported" 19 | ], 20 | "name": "wind-gl-core", 21 | "out": "../../docs/api/wind-gl-core", 22 | "readme": "none", 23 | "entryDocument": "index.md", 24 | "tsconfig": "./tsconfig.docs.json" 25 | } 26 | -------------------------------------------------------------------------------- /packages/gl-core/typings.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.json'; 2 | declare module '*.glsl'; 3 | declare module 'web-worker:*' { 4 | const WokerFactory: new () => Worker; 5 | export default WokerFactory; 6 | } 7 | 8 | type WithNull = T | null; 9 | type WithUndef = T | undefined; 10 | -------------------------------------------------------------------------------- /packages/gl-core/vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { UserConfig } from 'vitest'; 2 | 3 | const config: { test: UserConfig } = { 4 | test: { 5 | testTimeout: 50000, 6 | // setupFiles: '../../vitest/setupTest.ts', 7 | coverage: { 8 | reporter: ['lcov', 'html'], 9 | } as any, 10 | }, 11 | } 12 | 13 | export default config; 14 | -------------------------------------------------------------------------------- /packages/leaflet/__tests__/leaflet.test.ts: -------------------------------------------------------------------------------- 1 | import { test, expect, describe, beforeAll, afterAll } from 'vitest'; 2 | 3 | // vi.stubGlobal('L', vi.mocked({ 4 | // Layer: class { 5 | // static extend = vi.fn(); 6 | // } 7 | // })); 8 | 9 | beforeAll(async () => { 10 | console.log(`[leaflet-wind]: start testing...`); 11 | }); 12 | 13 | afterAll(async () => { 14 | console.log(`[leaflet-wind]: test end`); 15 | }); 16 | 17 | describe('leaflet', async () => { 18 | test('instance', async () => { 19 | expect(1).toEqual(1); 20 | }); 21 | }); 22 | -------------------------------------------------------------------------------- /packages/leaflet/src/index.ts: -------------------------------------------------------------------------------- 1 | import { Field } from 'wind-core'; 2 | import { 3 | configDeps, 4 | TileID, 5 | ImageSource, 6 | TileSource, 7 | TimelineSource, 8 | RenderType, 9 | MaskType, 10 | RenderFrom, 11 | DecodeType, 12 | LayerSourceType, 13 | } from 'wind-gl-core'; 14 | import { WindLayer } from './layer/canvas'; 15 | import { WebglLayer } from './layer/webgl'; 16 | 17 | export { 18 | Field, 19 | WindLayer, 20 | WebglLayer, 21 | configDeps, 22 | TileID, 23 | ImageSource, 24 | TileSource, 25 | TimelineSource, 26 | RenderFrom, 27 | RenderType, 28 | MaskType, 29 | DecodeType, 30 | LayerSourceType, 31 | }; 32 | -------------------------------------------------------------------------------- /packages/leaflet/src/utils/tile.ts: -------------------------------------------------------------------------------- 1 | import type { TileBounds, TileID } from 'wind-gl-core'; 2 | import { fromLngLat, latFromMercatorY, lngFromMercatorX, MAX_MERCATOR_LATITUDE } from './mercatorCoordinate'; 3 | 4 | export function getTileProjBounds(tileID: TileID) { 5 | const numTiles = 1 << tileID.z; 6 | return { 7 | left: tileID.wrapedX / numTiles, 8 | top: tileID.wrapedY / numTiles, 9 | right: (tileID.wrapedX + 1) / numTiles, 10 | bottom: (tileID.wrapedY + 1) / numTiles, 11 | }; 12 | } 13 | 14 | export function getTileBounds(tileID: TileID): TileBounds { 15 | const { z, x, y } = tileID; 16 | const wrap = tileID.wrap; 17 | const numTiles = 1 << z; 18 | const leftLng = lngFromMercatorX(x / numTiles, wrap); 19 | const rightLng = lngFromMercatorX((x + 1) / numTiles, wrap); 20 | const topLat = latFromMercatorY(y / numTiles); 21 | const bottomLat = latFromMercatorY((y + 1) / numTiles); 22 | 23 | return [leftLng, bottomLat, rightLng, topLat]; 24 | } 25 | 26 | export function getExtent(map: any) { 27 | const bounds: any = map?.getBounds(); 28 | const southWest = bounds.getSouthWest(); 29 | const northEast = bounds.getNorthEast(); 30 | 31 | const [xmin, ymin, xmax, ymax] = [southWest.lng, southWest.lat, northEast.lng, northEast.lat]; 32 | 33 | const minY = Math.max(ymin, -MAX_MERCATOR_LATITUDE); 34 | const maxY = Math.min(ymax, MAX_MERCATOR_LATITUDE); 35 | const p0 = fromLngLat({ lng: xmin, lat: maxY }); 36 | const p1 = fromLngLat({ lng: xmax, lat: minY }); 37 | return [p0.x, p0.y, p1.x, p1.y]; 38 | } 39 | 40 | export function getClampZoom(options) { 41 | const z = options.zoom; 42 | if (undefined !== options.minzoom && z < options.minzoom) { 43 | return options.minzoom; 44 | } 45 | 46 | if (undefined !== options.maxzoom && options.maxzoom < z) { 47 | return options.maxzoom; 48 | } 49 | 50 | return z; 51 | } 52 | -------------------------------------------------------------------------------- /packages/leaflet/tsconfig.docs.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "noEmit": true 5 | }, 6 | "include": [ 7 | "typings.d.ts", 8 | "src/**/*.ts", 9 | "src/**/*.json" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /packages/leaflet/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "dist", 5 | "rootDir": "src", 6 | "module": "esnext", 7 | "target": "esnext" 8 | }, 9 | "include": [ 10 | "src/**/*.ts", 11 | "src/**/*.json", 12 | "package.json", 13 | "rollup.config.ts", 14 | "typings.d.ts" 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /packages/leaflet/typedoc.json: -------------------------------------------------------------------------------- 1 | { 2 | "entryPoints": [ 3 | "./src/index.ts" 4 | ], 5 | "gitRevision": "master", 6 | "sourceLinkTemplate": "https://github.com/sakitam-fdd/wind-layer/blob/{gitRevision}/{path}#L{line}", 7 | "excludeExternals": true, 8 | "excludePrivate": true, 9 | "excludeInternal": true, 10 | "excludeProtected": true, 11 | "hideGenerator": true, 12 | "includeVersion": true, 13 | "hideBreadcrumbs": true, 14 | "allReflectionsHaveOwnDocument": true, 15 | "sort": ["source-order"], 16 | "plugin": [ 17 | "typedoc-plugin-markdown", 18 | "typedoc-plugin-not-exported" 19 | ], 20 | "name": "leaflet-wind", 21 | "out": "../../docs/api/leaflet-wind", 22 | "readme": "none", 23 | "entryDocument": "index.md", 24 | "tsconfig": "./tsconfig.docs.json" 25 | } 26 | -------------------------------------------------------------------------------- /packages/leaflet/typings.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.json'; 2 | -------------------------------------------------------------------------------- /packages/leaflet/vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { UserConfig } from 'vitest'; 2 | 3 | const config: { test: UserConfig } = { 4 | test: { 5 | environment: 'jsdom', 6 | testTimeout: 50000, 7 | coverage: { 8 | reporter: ['lcov', 'html'], 9 | } as any, 10 | }, 11 | } 12 | 13 | export default config; 14 | -------------------------------------------------------------------------------- /packages/mapbox-gl/__tests__/mapbox.test.ts: -------------------------------------------------------------------------------- 1 | import { test, expect, describe, beforeAll, afterAll, vi } from 'vitest'; 2 | 3 | vi.stubGlobal( 4 | 'URL', 5 | vi.mocked({ 6 | createObjectURL: vi.fn(), 7 | }), 8 | ); 9 | 10 | beforeAll(async () => { 11 | console.log(`[mapbox-wind]: start testing...`); 12 | }); 13 | 14 | afterAll(async () => { 15 | console.log(`[mapbox-wind]: test end`); 16 | }); 17 | 18 | describe('mapbox-gl', async () => { 19 | test('instance', async () => { 20 | expect(1).toEqual(1); 21 | }); 22 | }); 23 | -------------------------------------------------------------------------------- /packages/mapbox-gl/src/index.ts: -------------------------------------------------------------------------------- 1 | import { 2 | configDeps, 3 | TileID, 4 | ImageSource, 5 | TileSource, 6 | TimelineSource, 7 | RenderType, 8 | MaskType, 9 | RenderFrom, 10 | DecodeType, 11 | LayerSourceType, 12 | } from 'wind-gl-core'; 13 | export { default as Layer } from './layer'; 14 | export { 15 | configDeps, 16 | TileID, 17 | ImageSource, 18 | TileSource, 19 | TimelineSource, 20 | RenderFrom, 21 | RenderType, 22 | MaskType, 23 | DecodeType, 24 | LayerSourceType, 25 | }; 26 | -------------------------------------------------------------------------------- /packages/mapbox-gl/tsconfig.docs.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "noEmit": true 5 | }, 6 | "include": [ 7 | "typings.d.ts", 8 | "src/**/*.ts", 9 | "src/**/*.json" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /packages/mapbox-gl/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "dist", 5 | "rootDir": "src", 6 | "module": "esnext", 7 | "target": "esnext" 8 | }, 9 | "include": [ 10 | "src/**/*.ts", 11 | "src/**/*.json", 12 | "package.json", 13 | "rollup.config.ts", 14 | "typings.d.ts" 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /packages/mapbox-gl/typedoc.json: -------------------------------------------------------------------------------- 1 | { 2 | "entryPoints": [ 3 | "./src/index.ts" 4 | ], 5 | "gitRevision": "master", 6 | "sourceLinkTemplate": "https://github.com/sakitam-fdd/wind-layer/blob/{gitRevision}/{path}#L{line}", 7 | "excludeExternals": true, 8 | "excludePrivate": true, 9 | "excludeInternal": true, 10 | "excludeProtected": true, 11 | "hideGenerator": true, 12 | "includeVersion": true, 13 | "hideBreadcrumbs": true, 14 | "allReflectionsHaveOwnDocument": true, 15 | "sort": ["source-order"], 16 | "plugin": [ 17 | "typedoc-plugin-markdown", 18 | "typedoc-plugin-not-exported" 19 | ], 20 | "name": "@sakitam-gis/mapbox-wind", 21 | "out": "../../docs/api/mapbox-wind", 22 | "readme": "none", 23 | "entryDocument": "index.md", 24 | "tsconfig": "./tsconfig.docs.json" 25 | } 26 | -------------------------------------------------------------------------------- /packages/mapbox-gl/typings.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.json'; 2 | 3 | type WithNull = T | null; 4 | type WithUndef = T | undefined; 5 | -------------------------------------------------------------------------------- /packages/mapbox-gl/vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { UserConfig } from 'vitest'; 2 | 3 | const config: { test: UserConfig } = { 4 | test: { 5 | environment: 'jsdom', 6 | testTimeout: 50000, 7 | coverage: { 8 | reporter: ['lcov', 'html'], 9 | } as any, 10 | }, 11 | } 12 | 13 | export default config; 14 | -------------------------------------------------------------------------------- /packages/maplibre-gl/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # @sakitam-gis/maplibre-wind 2 | 3 | ## 2.0.3 4 | 5 | ### Patch Changes 6 | 7 | - [`0b59e55`](https://github.com/sakitam-fdd/wind-layer/commit/0b59e554db71039b1f73a30e80cd4a0c423967b8) Thanks [@sakitam-fdd](https://github.com/sakitam-fdd)! - bump version 8 | 9 | - Updated dependencies [[`0b59e55`](https://github.com/sakitam-fdd/wind-layer/commit/0b59e554db71039b1f73a30e80cd4a0c423967b8)]: 10 | - wind-gl-core@2.0.2 11 | - @sakitam-gis/rbush@3.1.2 12 | 13 | ## 2.0.2 14 | 15 | ### Patch Changes 16 | 17 | - [`9089371`](https://github.com/sakitam-fdd/wind-layer/commit/9089371bd2f7afdd074f500cb73fd532695e20b8) Thanks [@sakitam-fdd](https://github.com/sakitam-fdd)! - bump version 18 | 19 | ## 2.0.1 20 | 21 | ### Patch Changes 22 | 23 | - [`515d3dc`](https://github.com/sakitam-fdd/wind-layer/commit/515d3dcdc94432b783d3d08a7079d3cc1d722a5f) Thanks [@sakitam-fdd](https://github.com/sakitam-fdd)! - release: bump version 24 | 25 | - Updated dependencies [[`515d3dc`](https://github.com/sakitam-fdd/wind-layer/commit/515d3dcdc94432b783d3d08a7079d3cc1d722a5f)]: 26 | - wind-gl-core@2.0.1 27 | - @sakitam-gis/rbush@3.1.1 28 | -------------------------------------------------------------------------------- /packages/maplibre-gl/__tests__/maplibre.test.ts: -------------------------------------------------------------------------------- 1 | import { test, expect, describe, beforeAll, afterAll, vi } from 'vitest'; 2 | 3 | vi.stubGlobal( 4 | 'URL', 5 | vi.mocked({ 6 | createObjectURL: vi.fn(), 7 | }), 8 | ); 9 | 10 | beforeAll(async () => { 11 | console.log(`[maplibre-wind]: start testing...`); 12 | }); 13 | 14 | afterAll(async () => { 15 | console.log(`[maplibre-wind]: test end`); 16 | }); 17 | 18 | describe('maplibre-gl', async () => { 19 | test('instance', async () => { 20 | expect(1).toEqual(1); 21 | }); 22 | }); 23 | -------------------------------------------------------------------------------- /packages/maplibre-gl/src/index.ts: -------------------------------------------------------------------------------- 1 | import { 2 | configDeps, 3 | TileID, 4 | ImageSource, 5 | TileSource, 6 | TimelineSource, 7 | RenderType, 8 | MaskType, 9 | RenderFrom, 10 | DecodeType, 11 | LayerSourceType, 12 | } from 'wind-gl-core'; 13 | export { default as Layer } from './layer'; 14 | export { 15 | configDeps, 16 | TileID, 17 | ImageSource, 18 | TileSource, 19 | TimelineSource, 20 | RenderFrom, 21 | RenderType, 22 | MaskType, 23 | DecodeType, 24 | LayerSourceType, 25 | }; 26 | -------------------------------------------------------------------------------- /packages/maplibre-gl/tsconfig.docs.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "noEmit": true 5 | }, 6 | "include": [ 7 | "typings.d.ts", 8 | "src/**/*.ts", 9 | "src/**/*.json" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /packages/maplibre-gl/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "dist", 5 | "rootDir": "src", 6 | "module": "esnext", 7 | "target": "esnext" 8 | }, 9 | "include": [ 10 | "src/**/*.ts", 11 | "src/**/*.json", 12 | "package.json", 13 | "rollup.config.ts", 14 | "typings.d.ts" 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /packages/maplibre-gl/typedoc.json: -------------------------------------------------------------------------------- 1 | { 2 | "entryPoints": [ 3 | "./src/index.ts" 4 | ], 5 | "gitRevision": "master", 6 | "sourceLinkTemplate": "https://github.com/sakitam-fdd/wind-layer/blob/{gitRevision}/{path}#L{line}", 7 | "excludeExternals": true, 8 | "excludePrivate": true, 9 | "excludeInternal": true, 10 | "excludeProtected": true, 11 | "hideGenerator": true, 12 | "includeVersion": true, 13 | "hideBreadcrumbs": true, 14 | "allReflectionsHaveOwnDocument": true, 15 | "sort": ["source-order"], 16 | "plugin": [ 17 | "typedoc-plugin-markdown", 18 | "typedoc-plugin-not-exported" 19 | ], 20 | "name": "@sakitam-gis/maplibre-wind", 21 | "out": "../../docs/api/maplibre-wind", 22 | "readme": "none", 23 | "entryDocument": "index.md", 24 | "tsconfig": "./tsconfig.docs.json" 25 | } 26 | -------------------------------------------------------------------------------- /packages/maplibre-gl/typings.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.json'; 2 | 3 | type WithNull = T | null; 4 | type WithUndef = T | undefined; 5 | -------------------------------------------------------------------------------- /packages/maplibre-gl/vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { UserConfig } from 'vitest'; 2 | 3 | const config: { test: UserConfig } = { 4 | test: { 5 | environment: 'jsdom', 6 | testTimeout: 50000, 7 | coverage: { 8 | reporter: ['lcov', 'html'], 9 | } as any, 10 | }, 11 | } 12 | 13 | export default config; 14 | -------------------------------------------------------------------------------- /packages/maptalks/__tests__/maptalks.test.ts: -------------------------------------------------------------------------------- 1 | import { test, expect, describe, beforeAll, afterAll } from 'vitest'; 2 | // import { WindLayer } from '../src'; 3 | 4 | beforeAll(async () => { 5 | console.log(`[maptalks-wind]: start testing...`); 6 | }); 7 | 8 | afterAll(async () => { 9 | console.log(`[maptalks-wind]: test end`); 10 | }); 11 | 12 | describe('maptalks', async () => { 13 | test('instance', async () => { 14 | // const layer = new WindLayer('wind-layer', [], { 15 | // zIndex: 20, 16 | // colorScale: "rgb(255, 255, 255)", 17 | // velocityScale: 1 / 30, 18 | // paths: 1000, 19 | // }); 20 | expect(1).toBe(1); 21 | }); 22 | }); 23 | -------------------------------------------------------------------------------- /packages/maptalks/src/index.ts: -------------------------------------------------------------------------------- 1 | import { 2 | configDeps, 3 | TileID, 4 | ImageSource, 5 | TileSource, 6 | TimelineSource, 7 | RenderType, 8 | MaskType, 9 | RenderFrom, 10 | DecodeType, 11 | LayerSourceType, 12 | } from 'wind-gl-core'; 13 | import WindLayer, { formatData, WindCore, Field } from './Canvas'; 14 | export { Layer } from './layer'; 15 | export { 16 | configDeps, 17 | formatData, 18 | TileID, 19 | ImageSource, 20 | TileSource, 21 | TimelineSource, 22 | WindLayer, 23 | Field, 24 | WindCore, 25 | RenderFrom, 26 | RenderType, 27 | DecodeType, 28 | LayerSourceType, 29 | MaskType, 30 | }; 31 | -------------------------------------------------------------------------------- /packages/maptalks/tsconfig.docs.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "noEmit": true 5 | }, 6 | "include": [ 7 | "typings.d.ts", 8 | "src/**/*.ts", 9 | "src/**/*.json" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /packages/maptalks/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "dist", 5 | "rootDir": "src", 6 | "module": "esnext", 7 | "target": "esnext" 8 | }, 9 | "include": [ 10 | "src/**/*.ts", 11 | "src/**/*.json", 12 | "package.json", 13 | "rollup.config.ts", 14 | "typings.d.ts" 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /packages/maptalks/typedoc.json: -------------------------------------------------------------------------------- 1 | { 2 | "entryPoints": [ 3 | "./src/index.ts" 4 | ], 5 | "gitRevision": "master", 6 | "sourceLinkTemplate": "https://github.com/sakitam-fdd/wind-layer/blob/{gitRevision}/{path}#L{line}", 7 | "excludeExternals": true, 8 | "excludePrivate": true, 9 | "excludeInternal": true, 10 | "excludeProtected": true, 11 | "hideGenerator": true, 12 | "includeVersion": true, 13 | "hideBreadcrumbs": true, 14 | "allReflectionsHaveOwnDocument": true, 15 | "sort": ["source-order"], 16 | "plugin": [ 17 | "typedoc-plugin-markdown", 18 | "typedoc-plugin-not-exported" 19 | ], 20 | "name": "@sakitam-gis/maptalks-wind", 21 | "out": "../../docs/api/maptalks-wind", 22 | "readme": "none", 23 | "entryDocument": "index.md", 24 | "tsconfig": "./tsconfig.docs.json" 25 | } 26 | -------------------------------------------------------------------------------- /packages/maptalks/typings.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.json'; 2 | declare module 'maptalks'; 3 | 4 | type WithNull = T | null; 5 | type WithUndef = T | undefined; 6 | -------------------------------------------------------------------------------- /packages/maptalks/vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { UserConfig } from 'vitest'; 2 | 3 | const config: { test: UserConfig } = { 4 | test: { 5 | environment: 'jsdom', 6 | testTimeout: 50000, 7 | coverage: { 8 | reporter: ['lcov', 'html'], 9 | } as any, 10 | }, 11 | } 12 | 13 | export default config; 14 | -------------------------------------------------------------------------------- /packages/ol/README.md: -------------------------------------------------------------------------------- 1 | # `ol-wind` 2 | 3 | > [openlayers](https://openlayers.org/) wind layer adapter 4 | 5 | ## Usage 6 | 7 | ### Install 8 | 9 | ```bash 10 | pnpm i ol-wind -S 11 | ``` 12 | 13 | ### Example 14 | 15 | ```js 16 | import { WindLayer } from 'ol-wind'; 17 | 18 | const windLayer = new WindLayer(res, { 19 | forceRender: false, 20 | windOptions: { 21 | // colorScale: scale, 22 | velocityScale: 1 / 20, 23 | paths: 5000, 24 | // eslint-disable-next-line no-unused-vars 25 | colorScale: () => { 26 | // console.log(m); 27 | return '#ff473c'; 28 | }, 29 | width: 3, 30 | // colorScale: scale, 31 | generateParticleOption: false 32 | }, 33 | // map: map, 34 | // projection: 'EPSG:4326' 35 | }); 36 | 37 | console.log(map, windLayer); 38 | 39 | map.addLayer(windLayer); 40 | ``` 41 | -------------------------------------------------------------------------------- /packages/ol/__tests__/ol.test.ts: -------------------------------------------------------------------------------- 1 | import { test, expect, describe, beforeAll, afterAll } from 'vitest'; 2 | import { WindLayer } from '../src'; 3 | 4 | beforeAll(async () => { 5 | console.log(`[ol-wind]: start testing...`); 6 | }); 7 | 8 | afterAll(async () => { 9 | console.log(`[ol-wind]: test end`); 10 | }); 11 | 12 | describe('ol', async () => { 13 | test('instance', async () => { 14 | const layer = new WindLayer([], { 15 | zIndex: 20, 16 | colorScale: "rgb(255, 255, 255)", 17 | velocityScale: 1 / 30, 18 | paths: 1000, 19 | }); 20 | expect(layer).toBeInstanceOf(WindLayer); 21 | }); 22 | }); 23 | -------------------------------------------------------------------------------- /packages/ol/tsconfig.docs.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "noEmit": true 5 | }, 6 | "include": [ 7 | "typings.d.ts", 8 | "src/**/*.ts", 9 | "src/**/*.json" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /packages/ol/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "dist", 5 | "rootDir": "src", 6 | "module": "esnext", 7 | "target": "esnext" 8 | }, 9 | "include": [ 10 | "src/**/*.ts", 11 | "src/**/*.json", 12 | "package.json", 13 | "rollup.config.ts", 14 | "typings.d.ts" 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /packages/ol/typedoc.json: -------------------------------------------------------------------------------- 1 | { 2 | "entryPoints": [ 3 | "./src/index.ts" 4 | ], 5 | "gitRevision": "master", 6 | "sourceLinkTemplate": "https://github.com/sakitam-fdd/wind-layer/blob/{gitRevision}/{path}#L{line}", 7 | "excludeExternals": true, 8 | "excludePrivate": true, 9 | "excludeInternal": true, 10 | "excludeProtected": true, 11 | "hideGenerator": true, 12 | "includeVersion": true, 13 | "hideBreadcrumbs": true, 14 | "allReflectionsHaveOwnDocument": true, 15 | "sort": ["source-order"], 16 | "plugin": [ 17 | "typedoc-plugin-markdown", 18 | "typedoc-plugin-not-exported" 19 | ], 20 | "name": "ol-wind", 21 | "out": "../../docs/api/ol-wind", 22 | "readme": "none", 23 | "entryDocument": "index.md", 24 | "tsconfig": "./tsconfig.docs.json" 25 | } 26 | -------------------------------------------------------------------------------- /packages/ol/typings.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.json'; 2 | 3 | type WithNull = T | null; 4 | type WithUndef = T | undefined; 5 | -------------------------------------------------------------------------------- /packages/ol/vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { UserConfig } from 'vitest'; 2 | 3 | const config: { test: UserConfig } = { 4 | test: { 5 | environment: 'jsdom', 6 | testTimeout: 50000, 7 | coverage: { 8 | reporter: ['lcov', 'html'], 9 | } as any, 10 | }, 11 | } 12 | 13 | export default config; 14 | -------------------------------------------------------------------------------- /packages/ol5/README.md: -------------------------------------------------------------------------------- 1 | # `ol5-wind` 2 | 3 | > [openlayers](https://openlayers.org/) wind layer adapter 4 | 5 | ## Usage 6 | 7 | ### Install 8 | 9 | ```bash 10 | pnpm i ol5-wind -S 11 | ``` 12 | 13 | ### Example 14 | 15 | ```js 16 | import { WindLayer } from 'ol5-wind'; 17 | 18 | const windLayer = new WindLayer(res, { 19 | forceRender: false, 20 | windOptions: { 21 | // colorScale: scale, 22 | velocityScale: 1 / 20, 23 | paths: 5000, 24 | // eslint-disable-next-line no-unused-vars 25 | colorScale: () => { 26 | // console.log(m); 27 | return '#ff473c'; 28 | }, 29 | width: 3, 30 | // colorScale: scale, 31 | generateParticleOption: false 32 | }, 33 | map: map, 34 | // projection: 'EPSG:4326' 35 | }); 36 | ``` 37 | -------------------------------------------------------------------------------- /packages/ol5/__tests__/ol5.test.ts: -------------------------------------------------------------------------------- 1 | import { test, expect, describe, beforeAll, afterAll } from 'vitest'; 2 | import OlWind from '../src'; 3 | 4 | beforeAll(async () => { 5 | console.log(`[ol5-wind]: start testing...`); 6 | }); 7 | 8 | afterAll(async () => { 9 | console.log(`[ol5-wind]: test end`); 10 | }); 11 | 12 | describe('ol5', async () => { 13 | test('instance', async () => { 14 | const layer = new OlWind([], { 15 | zIndex: 20, 16 | colorScale: 'rgb(255, 255, 255)', 17 | velocityScale: 1 / 30, 18 | paths: 1000, 19 | }); 20 | expect(layer).toBeInstanceOf(OlWind); 21 | }); 22 | }); 23 | -------------------------------------------------------------------------------- /packages/ol5/tsconfig.docs.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "noEmit": true 5 | }, 6 | "include": [ 7 | "typings.d.ts", 8 | "src/**/*.ts", 9 | "src/**/*.json" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /packages/ol5/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "dist", 5 | "rootDir": "src", 6 | "module": "esnext", 7 | "target": "esnext" 8 | }, 9 | "include": [ 10 | "src/**/*.ts", 11 | "src/**/*.json", 12 | "package.json", 13 | "rollup.config.ts", 14 | "typings.d.ts" 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /packages/ol5/typedoc.json: -------------------------------------------------------------------------------- 1 | { 2 | "entryPoints": [ 3 | "./src/index.ts" 4 | ], 5 | "gitRevision": "master", 6 | "sourceLinkTemplate": "https://github.com/sakitam-fdd/wind-layer/blob/{gitRevision}/{path}#L{line}", 7 | "excludeExternals": true, 8 | "excludePrivate": true, 9 | "excludeInternal": true, 10 | "excludeProtected": true, 11 | "hideGenerator": true, 12 | "includeVersion": true, 13 | "hideBreadcrumbs": true, 14 | "allReflectionsHaveOwnDocument": true, 15 | "sort": ["source-order"], 16 | "plugin": [ 17 | "typedoc-plugin-markdown", 18 | "typedoc-plugin-not-exported" 19 | ], 20 | "name": "ol5-wind", 21 | "out": "../../docs/api/ol5-wind", 22 | "readme": "none", 23 | "entryDocument": "index.md", 24 | "tsconfig": "./tsconfig.docs.json" 25 | } 26 | -------------------------------------------------------------------------------- /packages/ol5/typings.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.json'; 2 | -------------------------------------------------------------------------------- /packages/ol5/vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { UserConfig } from 'vitest'; 2 | 3 | const config: { test: UserConfig } = { 4 | test: { 5 | environment: 'jsdom', 6 | testTimeout: 50000, 7 | coverage: { 8 | reporter: ['lcov', 'html'], 9 | } as any, 10 | }, 11 | } 12 | 13 | export default config; 14 | -------------------------------------------------------------------------------- /packages/openlayers/README.md: -------------------------------------------------------------------------------- 1 | # `ol3-4-wind` 2 | 3 | > [openlayers](https://openlayers.org/) wind layer adapter 4 | 5 | ## Usage 6 | 7 | ### Install 8 | 9 | ```bash 10 | pnpm i openlayers-wind -S 11 | ``` 12 | 13 | ### Example 14 | 15 | ```js 16 | import { WindLayer } from 'openlayers-wind'; 17 | 18 | const windLayer = new WindLayer(res, { 19 | forceRender: false, 20 | windOptions: { 21 | // colorScale: scale, 22 | velocityScale: 1 / 20, 23 | paths: 5000, 24 | // eslint-disable-next-line no-unused-vars 25 | colorScale: () => { 26 | // console.log(m); 27 | return '#ff473c'; 28 | }, 29 | width: 3, 30 | // colorScale: scale, 31 | generateParticleOption: false 32 | }, 33 | map: map, 34 | // projection: 'EPSG:4326' 35 | }); 36 | ``` 37 | -------------------------------------------------------------------------------- /packages/openlayers/__tests__/openlayers.test.ts: -------------------------------------------------------------------------------- 1 | import { test, expect, describe, beforeAll, afterAll } from 'vitest'; 2 | // import OlWind from '../src'; 3 | 4 | beforeAll(async () => { 5 | console.log(`[openlayers-wind]: start testing...`); 6 | }); 7 | 8 | afterAll(async () => { 9 | console.log(`[openlayers-wind]: test end`); 10 | }); 11 | 12 | describe('openlayers', async () => { 13 | test('instance', async () => { 14 | // const layer = new OlWind([], { 15 | // zIndex: 20, 16 | // colorScale: "rgb(255, 255, 255)", 17 | // velocityScale: 1 / 30, 18 | // paths: 1000, 19 | // }); 20 | // expect(layer).toBeInstanceOf(OlWind); 21 | const a = 1; 22 | expect(a).toBe(1); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /packages/openlayers/tsconfig.docs.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "noEmit": true 5 | }, 6 | "include": [ 7 | "typings.d.ts", 8 | "src/**/*.ts", 9 | "src/**/*.json" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /packages/openlayers/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "dist", 5 | "rootDir": "src", 6 | "module": "esnext", 7 | "target": "esnext" 8 | }, 9 | "include": [ 10 | "src/**/*.ts", 11 | "src/**/*.json", 12 | "package.json", 13 | "rollup.config.ts", 14 | "typings.d.ts" 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /packages/openlayers/typedoc.json: -------------------------------------------------------------------------------- 1 | { 2 | "entryPoints": [ 3 | "./src/index.ts" 4 | ], 5 | "gitRevision": "master", 6 | "sourceLinkTemplate": "https://github.com/sakitam-fdd/wind-layer/blob/{gitRevision}/{path}#L{line}", 7 | "excludeExternals": true, 8 | "excludePrivate": true, 9 | "excludeInternal": true, 10 | "excludeProtected": true, 11 | "hideGenerator": true, 12 | "includeVersion": true, 13 | "hideBreadcrumbs": true, 14 | "allReflectionsHaveOwnDocument": true, 15 | "sort": ["source-order"], 16 | "plugin": [ 17 | "typedoc-plugin-markdown", 18 | "typedoc-plugin-not-exported" 19 | ], 20 | "name": "openlayers-wind", 21 | "out": "../../docs/api/openlayers-wind", 22 | "readme": "none", 23 | "entryDocument": "index.md", 24 | "tsconfig": "./tsconfig.docs.json" 25 | } 26 | -------------------------------------------------------------------------------- /packages/openlayers/typings.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.json'; 2 | -------------------------------------------------------------------------------- /packages/openlayers/vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { UserConfig } from 'vitest'; 2 | 3 | const config: { test: UserConfig } = { 4 | test: { 5 | // environment: 'jsdom', 6 | testTimeout: 50000, 7 | coverage: { 8 | reporter: ['lcov', 'html'], 9 | } as any, 10 | }, 11 | } 12 | 13 | export default config; 14 | -------------------------------------------------------------------------------- /packages/particles-poc/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # particles-poc 2 | 3 | ## 0.0.3 4 | 5 | ### Patch Changes 6 | 7 | - [`0b59e55`](https://github.com/sakitam-fdd/wind-layer/commit/0b59e554db71039b1f73a30e80cd4a0c423967b8) Thanks [@sakitam-fdd](https://github.com/sakitam-fdd)! - bump version 8 | 9 | ## 0.0.2 10 | 11 | ### Patch Changes 12 | 13 | - [`515d3dc`](https://github.com/sakitam-fdd/wind-layer/commit/515d3dcdc94432b783d3d08a7079d3cc1d722a5f) Thanks [@sakitam-fdd](https://github.com/sakitam-fdd)! - release: bump version 14 | 15 | ## 0.0.1 16 | 17 | ### Patch Changes 18 | 19 | - [`9a8ed0d`](https://github.com/sakitam-fdd/wind-layer/commit/9a8ed0d298cbb8240d23e81e480e7cf5a046d52c) Thanks [@sakitam-fdd](https://github.com/sakitam-fdd)! - release: bump version 20 | -------------------------------------------------------------------------------- /packages/particles-poc/README.md: -------------------------------------------------------------------------------- 1 | ## ParticlesLayer 验证 -------------------------------------------------------------------------------- /packages/particles-poc/__tests__/core.test.ts: -------------------------------------------------------------------------------- 1 | import { test, expect, describe, beforeAll, afterAll } from 'vitest'; 2 | 3 | beforeAll(async () => { 4 | console.log(`[wind-gl-core]: start testing...`); 5 | }); 6 | 7 | afterAll(async () => { 8 | console.log(`[wind-gl-core]: test end`); 9 | }); 10 | 11 | describe('utils', async () => { 12 | test('isNumber', async () => { 13 | expect(1).toBe(1); 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /packages/particles-poc/src/shaders/particle-draw.frag.glsl: -------------------------------------------------------------------------------- 1 | precision highp float; 2 | 3 | uniform sampler2D u_wind; 4 | uniform vec2 u_wind_min; 5 | uniform vec2 u_wind_max; 6 | 7 | varying vec2 v_particle_pos; 8 | varying vec2 v_normal; 9 | uniform vec4 u_bbox; 10 | uniform vec4 u_data_bbox; 11 | 12 | float wrapx(float x) { 13 | return mod(x + 1.0, 1.0); 14 | } 15 | 16 | float wrapx(float x, float min) { 17 | float wrappedX = wrapx(x); 18 | if (wrappedX < min) { 19 | wrappedX += 1.0; 20 | } 21 | return wrappedX; 22 | } 23 | 24 | bool containsXY(vec2 pos, vec4 bbox) { 25 | float x = wrapx(pos.x, bbox.x); 26 | return ( 27 | bbox.x < x && x < bbox.z && 28 | bbox.y < pos.y && pos.y < bbox.w 29 | ); 30 | } 31 | 32 | vec4 calcTexture(const vec2 puv) { 33 | return texture2D(u_wind, puv); 34 | } 35 | 36 | void main() { 37 | vec4 color = vec4(1.0, 1.0, 1.0, 0.9); 38 | 39 | vec4 pv = calcTexture(v_particle_pos); 40 | 41 | if (!containsXY(v_particle_pos.xy, u_data_bbox) || !containsXY(v_particle_pos.xy, u_bbox) || pv.a == 0.0) { 42 | discard; 43 | } 44 | 45 | vec2 velocity = mix(u_wind_min, u_wind_max, pv.rg); 46 | float speed_t = length(velocity) / length(u_wind_max); 47 | 48 | // float blur = 1.0; 49 | // blur = 1.0 - smoothstep(0.8, 1.0, length(v_particle_pos)); 50 | // color.a *= blur; 51 | 52 | float distance = length(2.0 * gl_PointCoord - 1.0); 53 | if (distance > 1.0) { 54 | // discard; 55 | } 56 | 57 | gl_FragColor = color; 58 | } 59 | -------------------------------------------------------------------------------- /packages/particles-poc/src/shaders/particle-update.vert.glsl: -------------------------------------------------------------------------------- 1 | attribute vec2 a_pos; 2 | 3 | varying vec2 v_tex_pos; 4 | 5 | void main() { 6 | v_tex_pos = a_pos; 7 | gl_Position = vec4(a_pos * 2.0 - 1.0, 0, 1); 8 | // gl_Position = vec4(1.0 - 2.0 * a_pos, 0, 1); 9 | } 10 | -------------------------------------------------------------------------------- /packages/particles-poc/src/shaders/screen.frag.glsl: -------------------------------------------------------------------------------- 1 | precision mediump float; 2 | uniform sampler2D u_screen; 3 | uniform float u_opacity; 4 | uniform float u_fade; 5 | 6 | varying vec2 v_tex_pos; 7 | 8 | void main() { 9 | vec4 color = texture2D(u_screen, v_tex_pos); 10 | gl_FragColor = vec4(floor(255.0 * color * u_opacity * u_fade) / 255.0); 11 | } 12 | -------------------------------------------------------------------------------- /packages/particles-poc/src/shaders/screen.vert.glsl: -------------------------------------------------------------------------------- 1 | attribute vec2 a_pos; 2 | 3 | varying vec2 v_tex_pos; 4 | 5 | void main() { 6 | v_tex_pos = a_pos; 7 | gl_Position = vec4(a_pos * 2.0 - 1.0, 0, 1); 8 | } 9 | -------------------------------------------------------------------------------- /packages/particles-poc/tsconfig.docs.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "noEmit": true 5 | }, 6 | "include": [ 7 | "typings.d.ts", 8 | "src/**/*.ts", 9 | "src/**/*.json" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /packages/particles-poc/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "dist", 5 | "rootDir": "src", 6 | "module": "esnext", 7 | "target": "esnext", 8 | "lib": [ 9 | "esnext", 10 | "dom", 11 | "webworker" 12 | ] 13 | }, 14 | "include": [ 15 | "src/**/*.ts", 16 | "src/**/*.json", 17 | "package.json", 18 | "rollup.config.ts", 19 | "typings.d.ts" 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /packages/particles-poc/typedoc.json: -------------------------------------------------------------------------------- 1 | { 2 | "entryPoints": [ 3 | "./src/index.ts" 4 | ], 5 | "gitRevision": "master", 6 | "sourceLinkTemplate": "https://github.com/sakitam-fdd/wind-layer/blob/{gitRevision}/{path}#L{line}", 7 | "excludeExternals": true, 8 | "excludePrivate": true, 9 | "excludeInternal": true, 10 | "excludeProtected": true, 11 | "hideGenerator": true, 12 | "includeVersion": true, 13 | "hideBreadcrumbs": true, 14 | "allReflectionsHaveOwnDocument": true, 15 | "sort": ["source-order"], 16 | "plugin": [ 17 | "typedoc-plugin-markdown", 18 | "typedoc-plugin-not-exported" 19 | ], 20 | "name": "particles-poc", 21 | "out": "../../docs/api/particles-poc", 22 | "readme": "none", 23 | "entryDocument": "index.md", 24 | "tsconfig": "./tsconfig.docs.json" 25 | } 26 | -------------------------------------------------------------------------------- /packages/particles-poc/typings.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.json'; 2 | declare module '*.glsl'; 3 | declare module 'web-worker:*' { 4 | const WokerFactory: new () => Worker; 5 | export default WokerFactory; 6 | } 7 | 8 | type WithNull = T | null; 9 | type WithUndef = T | undefined; 10 | -------------------------------------------------------------------------------- /packages/particles-poc/vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { UserConfig } from 'vitest'; 2 | 3 | const config: { test: UserConfig } = { 4 | test: { 5 | testTimeout: 50000, 6 | // setupFiles: '../../vitest/setupTest.ts', 7 | coverage: { 8 | reporter: ['lcov', 'html'], 9 | } as any, 10 | }, 11 | } 12 | 13 | export default config; 14 | -------------------------------------------------------------------------------- /packages/rbush/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # @sakitam-gis/rbush 2 | 3 | ## 3.1.2 4 | 5 | ### Patch Changes 6 | 7 | - [`0b59e55`](https://github.com/sakitam-fdd/wind-layer/commit/0b59e554db71039b1f73a30e80cd4a0c423967b8) Thanks [@sakitam-fdd](https://github.com/sakitam-fdd)! - bump version 8 | 9 | ## 3.1.1 10 | 11 | ### Patch Changes 12 | 13 | - [`515d3dc`](https://github.com/sakitam-fdd/wind-layer/commit/515d3dcdc94432b783d3d08a7079d3cc1d722a5f) Thanks [@sakitam-fdd](https://github.com/sakitam-fdd)! - release: bump version 14 | 15 | ## 3.1.0 16 | 17 | ### Minor Changes 18 | 19 | - [`9a8ed0d`](https://github.com/sakitam-fdd/wind-layer/commit/9a8ed0d298cbb8240d23e81e480e7cf5a046d52c) Thanks [@sakitam-fdd](https://github.com/sakitam-fdd)! - release: bump version 20 | -------------------------------------------------------------------------------- /packages/rbush/README.md: -------------------------------------------------------------------------------- 1 | # [rbush](https://github.com/mourner/rbush) 2 | 3 | -------------------------------------------------------------------------------- /packages/rbush/tsconfig.docs.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "noEmit": true 5 | }, 6 | "include": [ 7 | "typings.d.ts", 8 | "src/**/*.ts", 9 | "src/**/*.json" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /packages/rbush/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "dist", 5 | "rootDir": "src", 6 | "module": "esnext", 7 | "target": "esnext" 8 | }, 9 | "include": [ 10 | "src/**/*.ts", 11 | "src/**/*.json", 12 | "package.json", 13 | "rollup.config.ts", 14 | "typings.d.ts" 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /packages/rbush/typedoc.json: -------------------------------------------------------------------------------- 1 | { 2 | "entryPoints": [ 3 | "./src/index.ts" 4 | ], 5 | "gitRevision": "master", 6 | "sourceLinkTemplate": "https://github.com/sakitam-fdd/wind-layer/blob/{gitRevision}/{path}#L{line}", 7 | "excludeExternals": true, 8 | "excludePrivate": true, 9 | "excludeInternal": true, 10 | "excludeProtected": true, 11 | "hideGenerator": true, 12 | "includeVersion": true, 13 | "hideBreadcrumbs": true, 14 | "allReflectionsHaveOwnDocument": true, 15 | "sort": ["source-order"], 16 | "plugin": [ 17 | "typedoc-plugin-markdown", 18 | "typedoc-plugin-not-exported" 19 | ], 20 | "name": "@sakitam-gis/rbush", 21 | "out": "../../docs/api/rbush", 22 | "readme": "none", 23 | "entryDocument": "index.md", 24 | "tsconfig": "./tsconfig.docs.json" 25 | } 26 | -------------------------------------------------------------------------------- /packages/rbush/typings.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.json'; 2 | declare module 'quickselect'; 3 | 4 | type WithNull = T | null; 5 | type WithUndef = T | undefined; 6 | -------------------------------------------------------------------------------- /packages/rbush/vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { UserConfig } from 'vitest'; 2 | 3 | const config: { test: UserConfig } = { 4 | test: { 5 | environment: 'jsdom', 6 | testTimeout: 50000, 7 | coverage: { 8 | reporter: ['lcov', 'html'], 9 | } as any, 10 | }, 11 | } 12 | 13 | export default config; 14 | -------------------------------------------------------------------------------- /packages/worker-fetch/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # wind-gl-worker 2 | 3 | ## 2.0.2 4 | 5 | ### Patch Changes 6 | 7 | - [`0b59e55`](https://github.com/sakitam-fdd/wind-layer/commit/0b59e554db71039b1f73a30e80cd4a0c423967b8) Thanks [@sakitam-fdd](https://github.com/sakitam-fdd)! - bump version 8 | 9 | ## 2.0.1 10 | 11 | ### Patch Changes 12 | 13 | - [`515d3dc`](https://github.com/sakitam-fdd/wind-layer/commit/515d3dcdc94432b783d3d08a7079d3cc1d722a5f) Thanks [@sakitam-fdd](https://github.com/sakitam-fdd)! - release: bump version 14 | 15 | ## 2.0.0 16 | 17 | ### Major Changes 18 | 19 | - [`9a8ed0d`](https://github.com/sakitam-fdd/wind-layer/commit/9a8ed0d298cbb8240d23e81e480e7cf5a046d52c) Thanks [@sakitam-fdd](https://github.com/sakitam-fdd)! - release: bump version 20 | 21 | ## 2.0.0-alpha.0 22 | 23 | ### Major Changes 24 | 25 | - [`5463150`](https://github.com/sakitam-fdd/wind-layer/commit/5463150d2cafd05073ff716821fc29f306310b6b) Thanks [@sakitam-fdd](https://github.com/sakitam-fdd)! - prerelease 26 | -------------------------------------------------------------------------------- /packages/worker-fetch/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Photopea 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /packages/worker-fetch/README.md: -------------------------------------------------------------------------------- 1 | ## wind-gl-worker 2 | -------------------------------------------------------------------------------- /packages/worker-fetch/__tests__/requestScheduler.test.ts: -------------------------------------------------------------------------------- 1 | import { test, expect, describe } from 'vitest'; 2 | import exported from '../src'; 3 | 4 | describe('RequestScheduler', async () => { 5 | test('instance', async () => { 6 | const layer = new exported.RequestScheduler({ 7 | maxRequests: 6, 8 | }); 9 | expect(layer).toBeInstanceOf(exported.RequestScheduler); 10 | }); 11 | }); 12 | -------------------------------------------------------------------------------- /packages/worker-fetch/bundle/index.js: -------------------------------------------------------------------------------- 1 | import '../dist/build/wgw/shared'; 2 | import '../dist/build/wgw/worker'; 3 | import '../dist/build/wgw/index'; 4 | 5 | // eslint-disable-next-line no-undef 6 | export default wgw; 7 | -------------------------------------------------------------------------------- /packages/worker-fetch/bundle/prelude.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | var shared, worker, wgw; 4 | function define(_, chunk) { 5 | if (!shared) { 6 | shared = chunk; 7 | } else if (!worker) { 8 | worker = chunk; 9 | } else { 10 | var workerBundleString = 'var sharedChunk = {}; (' + shared + ')(sharedChunk); (' + worker + ')(sharedChunk);' 11 | 12 | var sharedChunk = {}; 13 | shared(sharedChunk); 14 | wgw = chunk(sharedChunk); 15 | if (typeof window !== 'undefined') { 16 | wgw.setWorkerUrl(window.URL.createObjectURL(new Blob([workerBundleString], { type: 'text/javascript' }))); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /packages/worker-fetch/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "wind-gl-worker", 3 | "version": "2.0.2", 4 | "description": "webworker for wind-gl-core", 5 | "keywords": [ 6 | "weather", 7 | "wind", 8 | "3d", 9 | "webgl", 10 | "map", 11 | "vis", 12 | "gis" 13 | ], 14 | "author": "sakitam-fdd ", 15 | "license": "MIT", 16 | "main": "dist/index.js", 17 | "module": "dist/index.esm.js", 18 | "unpkg": "dist/index.js", 19 | "commonjs": "dist/index.cjs.js", 20 | "namespace": "wgw", 21 | "types": "dist/index.d.ts", 22 | "files": [ 23 | "dist", 24 | "LICENSE", 25 | "README.md", 26 | "package.json" 27 | ], 28 | "exports": { 29 | ".": { 30 | "types": "./dist/index.d.ts", 31 | "import": "./dist/index.esm.js", 32 | "require": "./dist/index.cjs.js" 33 | }, 34 | "./dist/*": "./dist/*", 35 | "./package.json": "./package.json" 36 | }, 37 | "private": false, 38 | "sideEffects": false, 39 | "repository": { 40 | "type": "git", 41 | "url": "git+https://github.com/sakitam-fdd/wind-layer.git", 42 | "directory": "packages/worker-fetch" 43 | }, 44 | "scripts": { 45 | "api": "typedoc", 46 | "clean": "rimraf dist", 47 | "dev": "cross-env NODE_ENV=development rollup -wm -c rollup.config.ts --configPlugin esbuild", 48 | "build": "rollup --c rollup.config.ts --configPlugin esbuild", 49 | "build:minify": "cross-env MINIFY=true rollup --c rollup.config.ts --configPlugin esbuild", 50 | "lint": "eslint \"src/**/*.{js,jsx,mjs,ts,tsx}\"", 51 | "prettier": "prettier --parser=typescript --write **/*.{js,ts,md}", 52 | "test": "pnpm run build && pnpm run test-only", 53 | "test-only": "vitest run", 54 | "coverage": "vitest run --coverage" 55 | }, 56 | "bugs": { 57 | "url": "https://github.com/sakitam-fdd/wind-layer/issues" 58 | }, 59 | "homepage": "https://github.com/sakitam-fdd/wind-layer#readme", 60 | "dependencies": { 61 | "exifr": "^7.1.3" 62 | }, 63 | "publishConfig": { 64 | "access": "public" 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /packages/worker-fetch/src/Dispatcher.ts: -------------------------------------------------------------------------------- 1 | import Actor from './Actor'; 2 | import type WorkerPool from './WorkerPool'; 3 | import { nullFunction, asyncAll, uid } from './util'; 4 | 5 | class Dispatcher { 6 | workerPool: WorkerPool; 7 | actors: Array; 8 | currentActor: number; 9 | id: string; 10 | dispatcherId: number; 11 | 12 | constructor(workerPool: WorkerPool, parent: any, dispatcherId: number) { 13 | this.workerPool = workerPool; 14 | this.actors = []; 15 | this.currentActor = 0; 16 | this.id = uid('dispatcher'); 17 | this.dispatcherId = dispatcherId; 18 | const workers = this.workerPool.acquire(this.dispatcherId); 19 | for (let i = 0; i < workers.length; i++) { 20 | const worker = workers[i]; 21 | const actor = new Actor(worker, parent, this.dispatcherId); 22 | actor.name = `Worker ${i}`; 23 | this.actors.push(actor); 24 | } 25 | if (!this.actors.length) throw new Error('No actors found'); 26 | } 27 | 28 | /** 29 | * 广播到所有 Actor 30 | * @param type 31 | * @param data 32 | * @param cb 33 | */ 34 | broadcast(type: string, data: unknown, cb?: (...args: any[]) => any) { 35 | // eslint-disable-next-line no-param-reassign 36 | cb = cb || nullFunction; 37 | asyncAll( 38 | this.actors, 39 | (actor, done) => { 40 | actor.send(type, data, done); 41 | }, 42 | cb, 43 | ); 44 | } 45 | 46 | send(type, data: any, cb?: any, id?: string) { 47 | const actor = this.getActor(id); 48 | if (actor) { 49 | actor.send(type, data, cb); 50 | } 51 | } 52 | 53 | /** 54 | * 获取要发送消息的 `Actor` 55 | * TIP: 是否需要实现 `Actor` 是否占用判断 56 | */ 57 | getActor(id?: string): Actor { 58 | if (id !== undefined) { 59 | const index = this.actors.findIndex((a) => a.id === id); 60 | if (index > -1) { 61 | this.currentActor = index; 62 | } else { 63 | this.currentActor = (this.currentActor + 1) % this.actors.length; 64 | } 65 | } else { 66 | this.currentActor = (this.currentActor + 1) % this.actors.length; 67 | } 68 | return this.actors[this.currentActor]; 69 | } 70 | 71 | remove(removed = true) { 72 | this.actors.forEach((actor) => { 73 | actor.remove(); 74 | }); 75 | this.actors = []; 76 | if (removed) this.workerPool.release(this.id); 77 | } 78 | } 79 | 80 | export default Dispatcher; 81 | -------------------------------------------------------------------------------- /packages/worker-fetch/src/RequestScheduler.ts: -------------------------------------------------------------------------------- 1 | type Request = Promise & { 2 | cancel: () => void; 3 | }; 4 | 5 | interface IScheduleRequest { 6 | ref: () => Request; 7 | cancelled: boolean; 8 | completed: boolean; 9 | request: WithNull; 10 | cancel: () => void; 11 | } 12 | 13 | interface RequestSchedulerOptions { 14 | maxRequests: number; 15 | } 16 | 17 | const defaultOptions: RequestSchedulerOptions = { 18 | maxRequests: 6, 19 | }; 20 | 21 | export default class RequestScheduler { 22 | public options: RequestSchedulerOptions; 23 | public requestQueue: IScheduleRequest[]; 24 | public executing: Set; 25 | 26 | constructor(options: Partial) { 27 | this.options = { 28 | ...defaultOptions, 29 | ...options, 30 | }; 31 | this.requestQueue = []; 32 | this.executing = new Set(); 33 | } 34 | 35 | remove(p) { 36 | this.executing.delete(p); 37 | if (!p.cancelled) { 38 | p.completed = true; 39 | this.enqueue(); 40 | } 41 | } 42 | 43 | enqueue() { 44 | for ( 45 | let numImageRequests = this.executing.size; 46 | numImageRequests < this.options.maxRequests && this.requestQueue.length > 0; 47 | numImageRequests++ 48 | ) { 49 | const q = this.requestQueue.shift() as IScheduleRequest; 50 | if (q.cancelled) { 51 | this.remove(q); 52 | continue; 53 | } 54 | 55 | const p = Promise.resolve().then(() => { 56 | const request = q.ref(); 57 | q.request = request; 58 | return request; 59 | }); 60 | this.executing.add(q); 61 | p.then(() => { 62 | this.remove(q); 63 | }).catch(() => { 64 | this.remove(q); 65 | }); 66 | } 67 | } 68 | 69 | scheduleRequest(fn) { 70 | const request: IScheduleRequest = { 71 | ref: fn, 72 | cancelled: false, 73 | completed: false, 74 | request: null, 75 | cancel: () => { 76 | if (!request.completed && !request.cancelled) { 77 | request.cancelled = true; 78 | 79 | if (request.request) { 80 | request.request.cancel(); 81 | } 82 | this.enqueue(); 83 | } 84 | }, 85 | }; 86 | 87 | this.requestQueue.push(request); 88 | 89 | this.enqueue(); 90 | 91 | return request; 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /packages/worker-fetch/src/ThrottledInvoker.ts: -------------------------------------------------------------------------------- 1 | import { nullFunction } from './util'; 2 | 3 | /** 4 | * Invokes the wrapped function in a non-blocking way when trigger() is called. Invocation requests 5 | * are ignored until the function was actually invoked. 6 | */ 7 | class ThrottledInvoker { 8 | channel: WithNull; 9 | triggered: boolean; 10 | callback: () => void; 11 | 12 | constructor(callback: () => void) { 13 | this.callback = callback; 14 | this.triggered = false; 15 | if (typeof MessageChannel !== 'undefined') { 16 | this.channel = new MessageChannel(); 17 | this.channel.port2.onmessage = () => { 18 | this.triggered = false; 19 | this.callback(); 20 | }; 21 | } 22 | } 23 | 24 | trigger() { 25 | if (!this.triggered) { 26 | this.triggered = true; 27 | if (this.channel) { 28 | this.channel.port1.postMessage(true); 29 | } else { 30 | setTimeout(() => { 31 | this.triggered = false; 32 | this.callback(); 33 | }, 0); 34 | } 35 | } 36 | } 37 | 38 | remove() { 39 | this.channel = null; 40 | this.callback = nullFunction; 41 | } 42 | } 43 | 44 | export default ThrottledInvoker; 45 | -------------------------------------------------------------------------------- /packages/worker-fetch/src/WorkerPool.ts: -------------------------------------------------------------------------------- 1 | import workerFactory from './workerFactory'; 2 | import type { WorkerInterface } from './workerFactory'; 3 | 4 | export const PRELOAD_POOL_ID = '__wind_layer_preloaded_worker_pool__'; 5 | 6 | /** 7 | * 创建`webworker` 线程池 8 | */ 9 | export default class WorkerPool { 10 | static workerCount: number; 11 | 12 | active: { 13 | [_ in number | string]: boolean; 14 | }; 15 | workers: WithNull; 16 | 17 | constructor() { 18 | this.active = {}; 19 | } 20 | 21 | /** 22 | * 获取 `Worker` 实例 23 | * @param id 24 | */ 25 | acquire(id: number | string): WorkerInterface[] { 26 | if (!this.workers) { 27 | this.workers = []; 28 | for (let i = 0; i < WorkerPool.workerCount; i++) { 29 | const worker = workerFactory(); 30 | if (worker) { 31 | this.workers.push(worker); 32 | } 33 | } 34 | } 35 | 36 | this.active[id] = true; 37 | return this.workers.slice(); 38 | } 39 | 40 | /** 41 | * 释放所有 `Worker` 42 | * @param id 43 | */ 44 | release(id: number | string) { 45 | delete this.active[id]; 46 | if (this.numActive() === 0 && this.workers) { 47 | this.workers.forEach((w) => { 48 | w.terminate(); 49 | }); 50 | this.workers = null; 51 | } 52 | } 53 | 54 | isPreloaded(): boolean { 55 | return !!this.active[PRELOAD_POOL_ID]; 56 | } 57 | 58 | /** 59 | * 获取激活的`Worker` 数量 60 | */ 61 | numActive(): number { 62 | return Object.keys(this.active).length; 63 | } 64 | } 65 | 66 | const hardwareConcurrency = (typeof navigator !== 'undefined' && navigator.hardwareConcurrency) || 4; 67 | const availableLogicalProcessors = Math.floor(hardwareConcurrency / 2); 68 | WorkerPool.workerCount = Math.max(Math.min(availableLogicalProcessors, 6), 1); 69 | -------------------------------------------------------------------------------- /packages/worker-fetch/src/config.ts: -------------------------------------------------------------------------------- 1 | let u = ''; 2 | export function setWorkerUrl(url: string) { 3 | u = url; 4 | } 5 | 6 | export function getWorkerUrl() { 7 | return u; 8 | } 9 | 10 | let deps: string[] = []; 11 | 12 | /** 13 | * 设置外部依赖的路径 14 | * 一般我们在使用 importScripts 时需要指定 15 | * @param d 16 | */ 17 | export function configDeps(d: string[]) { 18 | deps = d; 19 | } 20 | 21 | export function getConfigDeps() { 22 | return deps; 23 | } 24 | -------------------------------------------------------------------------------- /packages/worker-fetch/src/index.ts: -------------------------------------------------------------------------------- 1 | import WorkerPool, { PRELOAD_POOL_ID } from './WorkerPool'; 2 | import Dispatcher from './Dispatcher'; 3 | import Actor from './Actor'; 4 | import request from './Request'; 5 | import RequestScheduler from './RequestScheduler'; 6 | import ThrottledInvoker from './ThrottledInvoker'; 7 | import { getReferrer } from './util'; 8 | import { setWorkerUrl, configDeps, getConfigDeps } from './config'; 9 | import { register } from './webWorkerTransfer'; 10 | import * as utils from './util'; 11 | 12 | let globalWorkerPool; 13 | 14 | function getGlobalWorkerPool() { 15 | if (!globalWorkerPool) { 16 | globalWorkerPool = new WorkerPool(); 17 | } 18 | return globalWorkerPool; 19 | } 20 | 21 | function prewarm() { 22 | const workerPool = getGlobalWorkerPool(); 23 | workerPool.acquire(PRELOAD_POOL_ID); 24 | } 25 | 26 | const exported = { 27 | utils, 28 | request, 29 | register, 30 | configDeps, 31 | getConfigDeps, 32 | prewarm, 33 | getReferrer, 34 | setWorkerUrl, 35 | getGlobalWorkerPool, 36 | Actor, 37 | WorkerPool, 38 | Dispatcher, 39 | RequestScheduler, 40 | ThrottledInvoker, 41 | }; 42 | 43 | export default exported; 44 | -------------------------------------------------------------------------------- /packages/worker-fetch/src/workerFactory.ts: -------------------------------------------------------------------------------- 1 | import { getWorkerUrl } from './config'; 2 | 3 | export type MessageListener = (a: { data: any; target: any }) => unknown; 4 | 5 | // The main thread interface. Provided by Worker in a browser environment, 6 | export interface WorkerInterface { 7 | addEventListener(type: 'message', listener: MessageListener): void; 8 | removeEventListener(type: 'message', listener: MessageListener): void; 9 | postMessage(message: any): void; 10 | terminate(): void; 11 | } 12 | 13 | export default function workerFactory() { 14 | return new Worker(getWorkerUrl()); 15 | } 16 | -------------------------------------------------------------------------------- /packages/worker-fetch/tsconfig.docs.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "noEmit": true 5 | }, 6 | "include": [ 7 | "typings.d.ts", 8 | "src/**/*.ts", 9 | "src/**/*.json" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /packages/worker-fetch/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "dist", 5 | "rootDir": "src", 6 | "module": "esnext", 7 | "target": "esnext", 8 | "lib": [ 9 | "esnext", 10 | "dom", 11 | "webworker" 12 | ] 13 | }, 14 | "include": [ 15 | "src/**/*.ts", 16 | "src/**/*.json", 17 | "package.json", 18 | "rollup.config.ts", 19 | "typings.d.ts" 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /packages/worker-fetch/typedoc.json: -------------------------------------------------------------------------------- 1 | { 2 | "entryPoints": [ 3 | "./src/index.ts" 4 | ], 5 | "gitRevision": "master", 6 | "sourceLinkTemplate": "https://github.com/sakitam-fdd/wind-layer/blob/{gitRevision}/{path}#L{line}", 7 | "excludeExternals": true, 8 | "excludePrivate": true, 9 | "excludeInternal": true, 10 | "excludeProtected": true, 11 | "hideGenerator": true, 12 | "includeVersion": true, 13 | "hideBreadcrumbs": true, 14 | "allReflectionsHaveOwnDocument": true, 15 | "sort": ["source-order"], 16 | "plugin": [ 17 | "typedoc-plugin-markdown", 18 | "typedoc-plugin-not-exported" 19 | ], 20 | "name": "wind-gl-worker", 21 | "out": "../../docs/api/wind-gl-worker", 22 | "readme": "none", 23 | "entryDocument": "index.md", 24 | "tsconfig": "./tsconfig.docs.json" 25 | } 26 | -------------------------------------------------------------------------------- /packages/worker-fetch/typings.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.json'; 2 | declare module '*.glsl'; 3 | declare module 'web-worker:*' { 4 | const WokerFactory: new () => Worker; 5 | export default WokerFactory; 6 | } 7 | 8 | type WithNull = T | null; 9 | type Callback = (error?: Error | null, result?: T | null) => void; 10 | interface Cancelable { 11 | cancel: () => void; 12 | } 13 | -------------------------------------------------------------------------------- /packages/worker-fetch/vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { UserConfig } from 'vitest'; 2 | 3 | const config: { test: UserConfig } = { 4 | test: { 5 | testTimeout: 50000, 6 | // setupFiles: '../../vitest/setupTest.ts', 7 | coverage: { 8 | reporter: ['lcov', 'html'], 9 | } as any, 10 | }, 11 | } 12 | 13 | export default config; 14 | -------------------------------------------------------------------------------- /playground/.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | extends: [ 4 | '@aurorafe/eslint-config-vue', 5 | ], 6 | }; 7 | -------------------------------------------------------------------------------- /playground/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | ol-wind 8 | 29 | 30 | 31 |
32 |
33 |
34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /playground/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "playground", 3 | "version": "1.0.0", 4 | "scripts": { 5 | "start": "vite --host", 6 | "build": "vite build" 7 | }, 8 | "dependencies": { 9 | "ol": "^6.15.1", 10 | "ol-wind": "workspace:*", 11 | "mapbox-gl": "^2.15.0", 12 | "@sakitam-gis/mapbox-wind": "workspace:*" 13 | }, 14 | "devDependencies": { 15 | "@types/mapbox-gl": "^2.7.19", 16 | "vite": "^5.1.7", 17 | "vite-plugin-html": "^3.2.2" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /playground/src/mapbox.ts: -------------------------------------------------------------------------------- 1 | import type { AnyLayer } from 'mapbox-gl'; 2 | import mapboxgl from 'mapbox-gl'; 3 | import 'mapbox-gl/dist/mapbox-gl.css'; 4 | import { TileSource, Layer, RenderType } from '@sakitam-gis/mapbox-wind'; 5 | 6 | mapboxgl.accessToken = 'pk.eyJ1IjoidTEwaW50IiwiYSI6InQtMnZvTkEifQ.c8mhXquPE7_xoB3P4Ag8cA'; 7 | 8 | const map = new mapboxgl.Map({ 9 | container: 'map', 10 | // style: 'mapbox://styles/mapbox/satellite-streets-v12', 11 | style: { 12 | version: 8, 13 | sources: {}, 14 | layers: [ 15 | { 16 | id: 'background', 17 | type: 'background', 18 | layout: { 19 | visibility: 'none', 20 | }, 21 | }, 22 | ], 23 | }, 24 | center: { lng: 105.70150033978689, lat: 22.76021405309811 }, // starting position [lng, lat] 25 | zoom: 0, // starting zoom 26 | antialias: true, 27 | }); 28 | 29 | map.on('load', async () => { 30 | const source = new TileSource('temp', { 31 | tileSize: 256, 32 | url: 'https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png', 33 | minZoom: 0, 34 | maxZoom: 18, 35 | roundZoom: true, 36 | subdomains: ['a', 'b', 'c', 'd'], 37 | wrapX: true, 38 | // tileBounds: [-90, -45, 90, 45], 39 | }); 40 | 41 | let flag = 0; 42 | map.on('click', () => { 43 | if (flag === 0) { 44 | flag = 1; 45 | source.update({ url: 'https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png' }, false); 46 | } else { 47 | flag = 0; 48 | source.update({ url: 'https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png' }, false); 49 | } 50 | }); 51 | 52 | const layer = new Layer('temp', source, { 53 | styleSpec: { 54 | 'fill-color': ['interpolate', ['step', 3], ['get', 'value'], 0, '#000', 1, '#fff'], 55 | opacity: ['interpolate', ['exponential', 0.5], ['zoom'], 1, 1, 2, 1], 56 | }, 57 | renderType: RenderType.image, 58 | picking: true, 59 | }); 60 | 61 | map.addLayer(layer as unknown as AnyLayer); 62 | 63 | map.on('click', (e) => { 64 | layer.picker(e.lngLat).then((v) => { 65 | console.log(v); 66 | }); 67 | }); 68 | }); 69 | -------------------------------------------------------------------------------- /playground/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "include": [ 4 | "src", 5 | "vite.config.ts" 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /playground/vite.config.ts: -------------------------------------------------------------------------------- 1 | // import { fileURLToPath } from 'url'; 2 | import { defineConfig } from 'vite'; 3 | 4 | export default defineConfig(({ mode }) => ({ 5 | base: './', 6 | publicDir: 'public', 7 | define: { 8 | 'process.env': { 9 | NODE_ENV: mode, 10 | }, 11 | }, 12 | // build: { 13 | // rollupOptions: { 14 | // input: { 15 | // ol: fileURLToPath(new URL('ol.html', import.meta.url)), 16 | // }, 17 | // }, 18 | // }, 19 | // plugins: [ 20 | // createHtmlPlugin({ 21 | // minify: true, 22 | // pages: [ 23 | // { 24 | // entry: 'src/ol.ts', 25 | // filename: 'ol.html', 26 | // template: 'ol.html', 27 | // injectOptions: { 28 | // data: { 29 | // title: 'src - v6', 30 | // // injectScript: ``, 31 | // }, 32 | // }, 33 | // }, 34 | // ], 35 | // }), 36 | // ], 37 | })); 38 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - examples/* 3 | - docs 4 | - packages/* 5 | - playground 6 | -------------------------------------------------------------------------------- /tsconfig.eslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "noEmit": true 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "compilerOptions": { 4 | "strict": false, 5 | "allowJs": true, 6 | "sourceMap": true, 7 | "esModuleInterop": true, 8 | "declaration": true, 9 | "declarationMap": true, 10 | "experimentalDecorators": true, 11 | "strictNullChecks": true, 12 | "resolveJsonModule": true, 13 | "skipLibCheck": true, 14 | "noUnusedLocals": true, 15 | "isolatedModules": true, 16 | "removeComments": false, 17 | "moduleResolution": "node", 18 | "module": "esnext", 19 | "target": "esnext", 20 | "jsx": "preserve", 21 | "types": ["node", "vitest"], 22 | "lib": ["esnext", "dom", "webworker"], 23 | "useDefineForClassFields": false, 24 | "allowSyntheticDefaultImports": true, 25 | "forceConsistentCasingInFileNames": true 26 | }, 27 | "include": ["packages/*/src/**/*.ts", "packages/*/typings.d.ts", "packages/*/__tests__/**/*.ts"], 28 | "exclude": ["**/node_modules/**", "**/dist/**", "packages/*/src/**/*.glsl"] 29 | } 30 | -------------------------------------------------------------------------------- /turbo.json: -------------------------------------------------------------------------------- 1 | { 2 | "pipeline": { 3 | "build": { 4 | "dependsOn": ["^build"], 5 | "outputs": ["dist/**"] 6 | }, 7 | "build:minify": { 8 | "outputs": ["dist/**"] 9 | }, 10 | "lint": { 11 | "outputs": [] 12 | }, 13 | "dev": { 14 | "cache": false 15 | }, 16 | "test": { 17 | "cache": false, 18 | "dependsOn": ["build"] 19 | }, 20 | "test-only": { 21 | "cache": false, 22 | "dependsOn": ["build"] 23 | }, 24 | "coverage": { 25 | "cache": false, 26 | "dependsOn": ["build"] 27 | }, 28 | "api": { 29 | "cache": false 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /vitest/setupTests.ts: -------------------------------------------------------------------------------- 1 | import { afterEach } from 'vitest'; 2 | 3 | afterEach(() => void 0); 4 | --------------------------------------------------------------------------------