flet-gpumap 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- flet_gpumap-0.1.0/LICENSE +21 -0
- flet_gpumap-0.1.0/PKG-INFO +74 -0
- flet_gpumap-0.1.0/README.md +58 -0
- flet_gpumap-0.1.0/pyproject.toml +34 -0
- flet_gpumap-0.1.0/setup.cfg +4 -0
- flet_gpumap-0.1.0/src/flet_gpumap/__init__.py +6 -0
- flet_gpumap-0.1.0/src/flet_gpumap/gpufield.py +139 -0
- flet_gpumap-0.1.0/src/flet_gpumap.egg-info/PKG-INFO +74 -0
- flet_gpumap-0.1.0/src/flet_gpumap.egg-info/SOURCES.txt +15 -0
- flet_gpumap-0.1.0/src/flet_gpumap.egg-info/dependency_links.txt +1 -0
- flet_gpumap-0.1.0/src/flet_gpumap.egg-info/requires.txt +1 -0
- flet_gpumap-0.1.0/src/flet_gpumap.egg-info/top_level.txt +2 -0
- flet_gpumap-0.1.0/src/flutter/flet_gpumap/lib/flet_gpumap.dart +6 -0
- flet_gpumap-0.1.0/src/flutter/flet_gpumap/lib/src/extension.dart +19 -0
- flet_gpumap-0.1.0/src/flutter/flet_gpumap/lib/src/gpufield.dart +1071 -0
- flet_gpumap-0.1.0/src/flutter/flet_gpumap/pubspec.yaml +23 -0
- flet_gpumap-0.1.0/src/flutter/flet_gpumap/shaders/field.frag +114 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Yasuhiro / AIseed
|
|
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.
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: flet-gpumap
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: GPU で格子データ(気象の予報など)を地図に描く Flet の拡張
|
|
5
|
+
Author: aiseed-dev
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/aiseed-dev/flet-tools/tree/main/flet-gpumap
|
|
8
|
+
Project-URL: Repository, https://github.com/aiseed-dev/flet-tools
|
|
9
|
+
Project-URL: Issues, https://github.com/aiseed-dev/flet-tools/issues
|
|
10
|
+
Keywords: flet,flutter,gpu,shader,map,weather,grid
|
|
11
|
+
Requires-Python: >=3.10
|
|
12
|
+
Description-Content-Type: text/markdown
|
|
13
|
+
License-File: LICENSE
|
|
14
|
+
Requires-Dist: flet>=1.0.4
|
|
15
|
+
Dynamic: license-file
|
|
16
|
+
|
|
17
|
+
# flet-gpumap
|
|
18
|
+
|
|
19
|
+
気象の格子データ(等緯度経度の格子)を GPU で描く [Flet](https://flet.dev) の拡張。
|
|
20
|
+
AIseed Weather(weather.time-j.net)の地図画面の「動く地図」で使っている。
|
|
21
|
+
|
|
22
|
+
- 色の場: シェーダー(`shaders/field.frag`)が画面の画素ごとに投影を逆にたどって
|
|
23
|
+
経緯度を求め、格子を双一次補間して配色する。配色表は透明度も持ち、透ける所には陸海の地色が出る
|
|
24
|
+
- 風の粒子: Dart で動かし、直近 12 コマの位置を細い三角形の列にして 1 回で描く
|
|
25
|
+
- 等値線と数値、海岸線: 経緯度の線を受け取り、表示に合わせて描く
|
|
26
|
+
- 投影: `plate_carree`(全球なら経度方向につながる)、`polar_north`・`polar_south`(正距方位)
|
|
27
|
+
- 拡大(ホイール・ピンチ)・移動(ドラッグ)・読み取りは部品の中で完結する
|
|
28
|
+
|
|
29
|
+
## Python から
|
|
30
|
+
|
|
31
|
+
```python
|
|
32
|
+
from flet_gpumap import GpuField, GpuFrame
|
|
33
|
+
|
|
34
|
+
GpuField(
|
|
35
|
+
nx=361, ny=281, lon0=95.0, lat0=65.0, dlon=0.25, dlat=0.25,
|
|
36
|
+
projection="plate_carree", center_lon=140, center_lat=30, px_per_deg=14,
|
|
37
|
+
vmin=-20, vmax=40, lut=lut_256_rgba, base=land_mask_bytes, coast=coast_bytes,
|
|
38
|
+
label="2m気温", unit="°C",
|
|
39
|
+
frames=[GpuFrame(index=i, scalar=..., wind=..., contours=..., contours_bold=..., labels=...)
|
|
40
|
+
for i in ...],
|
|
41
|
+
step=0,
|
|
42
|
+
attribution="Data: ECMWF Open Data (CC-BY-4.0)",
|
|
43
|
+
on_ready=..., on_stats=...,
|
|
44
|
+
)
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
データの形は `src/flet_gpumap/gpufield.py` の説明のとおり(値は 16 bit を RGBA の RG に、
|
|
48
|
+
風は int16 の 0.01 m/s、線は float32 の (経度, 緯度) で切れ目は NaN)。
|
|
49
|
+
時刻は `GpuFrame` を足していき、`step` を変えるだけで切り替える。
|
|
50
|
+
|
|
51
|
+
値が階級(レーダーの降水強度など)のときは `sampling="nearest"` で補間せずに塗り、
|
|
52
|
+
`classes=["", "〜1", "1〜5", …]` で読み取りに階級の名前を出す。細かい格子の階級は
|
|
53
|
+
`GpuFrame(scalar8=…)`(1 格子点 1 バイト)で送ると RGBA の 4 分の 1 で済む。風の無い量は
|
|
54
|
+
`show_particles=False, particles=0`。
|
|
55
|
+
|
|
56
|
+
## 実行環境
|
|
57
|
+
|
|
58
|
+
自作の部品は Flet の出来合いの実行環境では表示されない。部品入りの実行環境を `flet build` で
|
|
59
|
+
`build/linux` に作り、プロジェクトのフォルダーで `flet run` する(Linux の Flet は `build/linux` を
|
|
60
|
+
先に使う)。
|
|
61
|
+
部品(Dart・シェーダー)を変えたら作り直す。
|
|
62
|
+
|
|
63
|
+
Linux(Intel 内蔵 GPU)で 57〜59 fps(粒子 10,000、等値線・海岸線あり)。Web でも描ける。
|
|
64
|
+
|
|
65
|
+
## ライセンス
|
|
66
|
+
|
|
67
|
+
MIT([LICENSE](LICENSE))。aiai-tools のほかのコードは AGPL-3.0-or-later だが、この部品は
|
|
68
|
+
ほかのアプリでも使えるように MIT にした(2026-10-14)。AIseed Weather の flet-gpufield を元にし、
|
|
69
|
+
地図とグラフを描ける部品に広げる([DESIGN.md](DESIGN.md))。
|
|
70
|
+
|
|
71
|
+
## 公開
|
|
72
|
+
|
|
73
|
+
`flet-gpumap-v0.1.0` のようなタグを push すると、GitHub Actions(`.github/workflows/publish-flet-gpumap.yml`)
|
|
74
|
+
が PyPI に出す。
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# flet-gpumap
|
|
2
|
+
|
|
3
|
+
気象の格子データ(等緯度経度の格子)を GPU で描く [Flet](https://flet.dev) の拡張。
|
|
4
|
+
AIseed Weather(weather.time-j.net)の地図画面の「動く地図」で使っている。
|
|
5
|
+
|
|
6
|
+
- 色の場: シェーダー(`shaders/field.frag`)が画面の画素ごとに投影を逆にたどって
|
|
7
|
+
経緯度を求め、格子を双一次補間して配色する。配色表は透明度も持ち、透ける所には陸海の地色が出る
|
|
8
|
+
- 風の粒子: Dart で動かし、直近 12 コマの位置を細い三角形の列にして 1 回で描く
|
|
9
|
+
- 等値線と数値、海岸線: 経緯度の線を受け取り、表示に合わせて描く
|
|
10
|
+
- 投影: `plate_carree`(全球なら経度方向につながる)、`polar_north`・`polar_south`(正距方位)
|
|
11
|
+
- 拡大(ホイール・ピンチ)・移動(ドラッグ)・読み取りは部品の中で完結する
|
|
12
|
+
|
|
13
|
+
## Python から
|
|
14
|
+
|
|
15
|
+
```python
|
|
16
|
+
from flet_gpumap import GpuField, GpuFrame
|
|
17
|
+
|
|
18
|
+
GpuField(
|
|
19
|
+
nx=361, ny=281, lon0=95.0, lat0=65.0, dlon=0.25, dlat=0.25,
|
|
20
|
+
projection="plate_carree", center_lon=140, center_lat=30, px_per_deg=14,
|
|
21
|
+
vmin=-20, vmax=40, lut=lut_256_rgba, base=land_mask_bytes, coast=coast_bytes,
|
|
22
|
+
label="2m気温", unit="°C",
|
|
23
|
+
frames=[GpuFrame(index=i, scalar=..., wind=..., contours=..., contours_bold=..., labels=...)
|
|
24
|
+
for i in ...],
|
|
25
|
+
step=0,
|
|
26
|
+
attribution="Data: ECMWF Open Data (CC-BY-4.0)",
|
|
27
|
+
on_ready=..., on_stats=...,
|
|
28
|
+
)
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
データの形は `src/flet_gpumap/gpufield.py` の説明のとおり(値は 16 bit を RGBA の RG に、
|
|
32
|
+
風は int16 の 0.01 m/s、線は float32 の (経度, 緯度) で切れ目は NaN)。
|
|
33
|
+
時刻は `GpuFrame` を足していき、`step` を変えるだけで切り替える。
|
|
34
|
+
|
|
35
|
+
値が階級(レーダーの降水強度など)のときは `sampling="nearest"` で補間せずに塗り、
|
|
36
|
+
`classes=["", "〜1", "1〜5", …]` で読み取りに階級の名前を出す。細かい格子の階級は
|
|
37
|
+
`GpuFrame(scalar8=…)`(1 格子点 1 バイト)で送ると RGBA の 4 分の 1 で済む。風の無い量は
|
|
38
|
+
`show_particles=False, particles=0`。
|
|
39
|
+
|
|
40
|
+
## 実行環境
|
|
41
|
+
|
|
42
|
+
自作の部品は Flet の出来合いの実行環境では表示されない。部品入りの実行環境を `flet build` で
|
|
43
|
+
`build/linux` に作り、プロジェクトのフォルダーで `flet run` する(Linux の Flet は `build/linux` を
|
|
44
|
+
先に使う)。
|
|
45
|
+
部品(Dart・シェーダー)を変えたら作り直す。
|
|
46
|
+
|
|
47
|
+
Linux(Intel 内蔵 GPU)で 57〜59 fps(粒子 10,000、等値線・海岸線あり)。Web でも描ける。
|
|
48
|
+
|
|
49
|
+
## ライセンス
|
|
50
|
+
|
|
51
|
+
MIT([LICENSE](LICENSE))。aiai-tools のほかのコードは AGPL-3.0-or-later だが、この部品は
|
|
52
|
+
ほかのアプリでも使えるように MIT にした(2026-10-14)。AIseed Weather の flet-gpufield を元にし、
|
|
53
|
+
地図とグラフを描ける部品に広げる([DESIGN.md](DESIGN.md))。
|
|
54
|
+
|
|
55
|
+
## 公開
|
|
56
|
+
|
|
57
|
+
`flet-gpumap-v0.1.0` のようなタグを push すると、GitHub Actions(`.github/workflows/publish-flet-gpumap.yml`)
|
|
58
|
+
が PyPI に出す。
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "flet-gpumap"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "GPU で格子データ(気象の予報など)を地図に描く Flet の拡張"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
requires-python = ">=3.10"
|
|
7
|
+
authors = [{ name = "aiseed-dev" }]
|
|
8
|
+
keywords = ["flet", "flutter", "gpu", "shader", "map", "weather", "grid"]
|
|
9
|
+
license = "MIT"
|
|
10
|
+
dependencies = [
|
|
11
|
+
"flet>=1.0.4",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
[project.urls]
|
|
15
|
+
Homepage = "https://github.com/aiseed-dev/flet-tools/tree/main/flet-gpumap"
|
|
16
|
+
Repository = "https://github.com/aiseed-dev/flet-tools"
|
|
17
|
+
Issues = "https://github.com/aiseed-dev/flet-tools/issues"
|
|
18
|
+
|
|
19
|
+
[dependency-groups]
|
|
20
|
+
dev = [
|
|
21
|
+
"mkdocs",
|
|
22
|
+
"mkdocs-material",
|
|
23
|
+
"mkdocstrings[python]"
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
[tool.setuptools.package-data]
|
|
27
|
+
"flutter.flet_gpumap" = ["**/*"]
|
|
28
|
+
|
|
29
|
+
[tool.setuptools]
|
|
30
|
+
license-files = ["LICENSE"]
|
|
31
|
+
|
|
32
|
+
[build-system]
|
|
33
|
+
requires = ["setuptools"]
|
|
34
|
+
build-backend = "setuptools.build_meta"
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2026 Yasuhiro / AIseed
|
|
3
|
+
|
|
4
|
+
"""気象の格子データを GPU で描く Flet の部品。
|
|
5
|
+
|
|
6
|
+
Python は格子データと表示の決まり(投影・配色・範囲)を渡すだけで、拡大・移動・風の粒子の
|
|
7
|
+
動きは Flutter 側(GPU のシェーダーと Dart)が 1 コマごとに描く。
|
|
8
|
+
|
|
9
|
+
時刻ごとのデータは子の `GpuFrame` で渡し、`step`(番号)を変えるだけで切り替える。
|
|
10
|
+
Flet は足された子だけを送るので、全時刻を順に足していけば、切り替えのたびに
|
|
11
|
+
データを送り直すことはない。
|
|
12
|
+
"""
|
|
13
|
+
from dataclasses import dataclass, field
|
|
14
|
+
from typing import Optional
|
|
15
|
+
|
|
16
|
+
import flet as ft
|
|
17
|
+
|
|
18
|
+
__all__ = ["GpuField", "GpuFrame", "GpuFieldStatsEvent"]
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@dataclass
|
|
22
|
+
class GpuFieldStatsEvent(ft.Event["GpuField"]):
|
|
23
|
+
"""描画の速さの報告(約 2 秒ごと)。"""
|
|
24
|
+
|
|
25
|
+
fps: float
|
|
26
|
+
"""1 秒あたりのコマ数。"""
|
|
27
|
+
|
|
28
|
+
frame_ms: float
|
|
29
|
+
"""粒子の移動の計算にかかった時間の平均(ミリ秒)。"""
|
|
30
|
+
|
|
31
|
+
particles: int
|
|
32
|
+
"""動かしている粒子の数。"""
|
|
33
|
+
|
|
34
|
+
upload_ms: float
|
|
35
|
+
"""最後に時刻のデータを GPU 用の画像にするのにかかった時間(ミリ秒)。"""
|
|
36
|
+
|
|
37
|
+
build_ms: float = 0.0
|
|
38
|
+
"""Flutter が測った 1 コマの組み立て(build)の時間の平均(ミリ秒)。"""
|
|
39
|
+
|
|
40
|
+
raster_ms: float = 0.0
|
|
41
|
+
"""Flutter が測った 1 コマの描画(raster)の時間の平均(ミリ秒)。"""
|
|
42
|
+
|
|
43
|
+
frames: int = 0
|
|
44
|
+
"""受け取っている時刻の数。"""
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@ft.control("GpuFrame")
|
|
48
|
+
class GpuFrame(ft.BaseControl):
|
|
49
|
+
"""1 時刻分のデータ。
|
|
50
|
+
|
|
51
|
+
- `scalar`: 色で描く量。格子点ごとに RGBA 4 バイト。RG が `vmin`〜`vmax` を 0〜65535 に
|
|
52
|
+
詰めた値(R が上位)、A が 255 なら値あり・0 なら欠測。
|
|
53
|
+
- `scalar8`: `scalar` の代わりに 1 格子点 1 バイト(0〜255 が `vmin`〜`vmax`、欠測なし)。
|
|
54
|
+
階級のような粗い値を細かい格子で送るとき(送る量が 4 分の 1)。
|
|
55
|
+
- `wind`: 風の粒子用の u・v。int16 little-endian(0.01 m/s 単位)で u を ny × nx、続けて v。
|
|
56
|
+
- `contours` / `contours_bold`: 等値線。float32 LE の (経度, 緯度) の並び、線の切れ目は NaN。
|
|
57
|
+
- `labels`: 等値線の数値。float32 LE の (経度, 緯度, 値) の並び。
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
index: int = 0
|
|
61
|
+
scalar: Optional[bytes] = None
|
|
62
|
+
scalar8: Optional[bytes] = None
|
|
63
|
+
wind: Optional[bytes] = None
|
|
64
|
+
contours: Optional[bytes] = None
|
|
65
|
+
contours_bold: Optional[bytes] = None
|
|
66
|
+
labels: Optional[bytes] = None
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
@ft.control("GpuField")
|
|
70
|
+
class GpuField(ft.LayoutControl):
|
|
71
|
+
"""等緯度経度の格子(北から南の行順)を GPU で描く。"""
|
|
72
|
+
|
|
73
|
+
nx: int = 0
|
|
74
|
+
ny: int = 0
|
|
75
|
+
lon0: ft.Number = 0.0
|
|
76
|
+
"""最初の列(西端)の格子点の経度。"""
|
|
77
|
+
lat0: ft.Number = 0.0
|
|
78
|
+
"""最初の行(北端)の格子点の緯度。"""
|
|
79
|
+
dlon: ft.Number = 0.25
|
|
80
|
+
dlat: ft.Number = 0.25
|
|
81
|
+
periodic: bool = False
|
|
82
|
+
"""経度方向に一周つながる格子か(全球)。"""
|
|
83
|
+
|
|
84
|
+
projection: str = "plate_carree"
|
|
85
|
+
""""plate_carree"(正距円筒)、"polar_north"・"polar_south"(極の正距方位)。"""
|
|
86
|
+
|
|
87
|
+
center_lon: ft.Number = 137.0
|
|
88
|
+
"""最初の表示の中心の経度。極の投影では画面の真下に来る経度。"""
|
|
89
|
+
center_lat: ft.Number = 36.0
|
|
90
|
+
px_per_deg: ft.Number = 14.0
|
|
91
|
+
"""最初の表示の縮尺(1 度あたりの論理画素。極では余緯度 1 度あたり)。"""
|
|
92
|
+
|
|
93
|
+
vmin: ft.Number = 0.0
|
|
94
|
+
vmax: ft.Number = 1.0
|
|
95
|
+
"""配色の両端に対応する値(読み取りの値の換算にも使う)。"""
|
|
96
|
+
|
|
97
|
+
lut: Optional[bytes] = None
|
|
98
|
+
"""配色。256 段 × RGBA8(vmin から vmax まで)。A が透明度。"""
|
|
99
|
+
|
|
100
|
+
base: Optional[bytes] = None
|
|
101
|
+
"""陸海。格子点ごとに 1 バイト(1 が陸)。配色が透ける所に地色として出る。"""
|
|
102
|
+
|
|
103
|
+
coast: Optional[bytes] = None
|
|
104
|
+
"""海岸線。float32 LE の (経度, 緯度) の並び、線の切れ目は NaN。"""
|
|
105
|
+
|
|
106
|
+
label: str = ""
|
|
107
|
+
unit: str = ""
|
|
108
|
+
"""読み取りに出す量の名前と単位。"""
|
|
109
|
+
|
|
110
|
+
sampling: str = "bilinear"
|
|
111
|
+
""""bilinear"(双一次補間)か "nearest"(最寄りの格子点)。階級のような値は "nearest" に
|
|
112
|
+
する(階級の間を補間すると、観測されていない値の縁ができる)。"""
|
|
113
|
+
|
|
114
|
+
classes: list[str] = field(default_factory=list)
|
|
115
|
+
"""値が階級の番号(0, 1, 2, …)のときの、番号ごとの名前。読み取りに数値の代わりに出す
|
|
116
|
+
(空の名前は出さない。label・unit が空なら名前だけを出す)。"""
|
|
117
|
+
|
|
118
|
+
frames: list[GpuFrame] = field(default_factory=list)
|
|
119
|
+
"""時刻ごとのデータ。"""
|
|
120
|
+
|
|
121
|
+
step: int = 0
|
|
122
|
+
"""描く時刻(GpuFrame.index)。まだ届いていなければ、届くまで前の時刻を描く。"""
|
|
123
|
+
|
|
124
|
+
particles: int = 10000
|
|
125
|
+
"""風の粒子の数(Intel 内蔵 GPU で 12,000 まで 60 fps)。"""
|
|
126
|
+
|
|
127
|
+
show_particles: bool = True
|
|
128
|
+
|
|
129
|
+
attribution: str = ""
|
|
130
|
+
"""右下に出す出典(図には必ず出典を付ける)。"""
|
|
131
|
+
|
|
132
|
+
status_text: str = ""
|
|
133
|
+
"""左上に出す状態の知らせ(読み込み中、この時刻のデータが無い、など)。空なら出さない。"""
|
|
134
|
+
|
|
135
|
+
on_ready: Optional[ft.ControlEventHandler["GpuField"]] = None
|
|
136
|
+
"""部品が画面に出たとき(実行環境に部品が入っている印)。"""
|
|
137
|
+
|
|
138
|
+
on_stats: Optional[ft.EventHandler[GpuFieldStatsEvent]] = None
|
|
139
|
+
"""描画の速さの報告を受け取る。"""
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: flet-gpumap
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: GPU で格子データ(気象の予報など)を地図に描く Flet の拡張
|
|
5
|
+
Author: aiseed-dev
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/aiseed-dev/flet-tools/tree/main/flet-gpumap
|
|
8
|
+
Project-URL: Repository, https://github.com/aiseed-dev/flet-tools
|
|
9
|
+
Project-URL: Issues, https://github.com/aiseed-dev/flet-tools/issues
|
|
10
|
+
Keywords: flet,flutter,gpu,shader,map,weather,grid
|
|
11
|
+
Requires-Python: >=3.10
|
|
12
|
+
Description-Content-Type: text/markdown
|
|
13
|
+
License-File: LICENSE
|
|
14
|
+
Requires-Dist: flet>=1.0.4
|
|
15
|
+
Dynamic: license-file
|
|
16
|
+
|
|
17
|
+
# flet-gpumap
|
|
18
|
+
|
|
19
|
+
気象の格子データ(等緯度経度の格子)を GPU で描く [Flet](https://flet.dev) の拡張。
|
|
20
|
+
AIseed Weather(weather.time-j.net)の地図画面の「動く地図」で使っている。
|
|
21
|
+
|
|
22
|
+
- 色の場: シェーダー(`shaders/field.frag`)が画面の画素ごとに投影を逆にたどって
|
|
23
|
+
経緯度を求め、格子を双一次補間して配色する。配色表は透明度も持ち、透ける所には陸海の地色が出る
|
|
24
|
+
- 風の粒子: Dart で動かし、直近 12 コマの位置を細い三角形の列にして 1 回で描く
|
|
25
|
+
- 等値線と数値、海岸線: 経緯度の線を受け取り、表示に合わせて描く
|
|
26
|
+
- 投影: `plate_carree`(全球なら経度方向につながる)、`polar_north`・`polar_south`(正距方位)
|
|
27
|
+
- 拡大(ホイール・ピンチ)・移動(ドラッグ)・読み取りは部品の中で完結する
|
|
28
|
+
|
|
29
|
+
## Python から
|
|
30
|
+
|
|
31
|
+
```python
|
|
32
|
+
from flet_gpumap import GpuField, GpuFrame
|
|
33
|
+
|
|
34
|
+
GpuField(
|
|
35
|
+
nx=361, ny=281, lon0=95.0, lat0=65.0, dlon=0.25, dlat=0.25,
|
|
36
|
+
projection="plate_carree", center_lon=140, center_lat=30, px_per_deg=14,
|
|
37
|
+
vmin=-20, vmax=40, lut=lut_256_rgba, base=land_mask_bytes, coast=coast_bytes,
|
|
38
|
+
label="2m気温", unit="°C",
|
|
39
|
+
frames=[GpuFrame(index=i, scalar=..., wind=..., contours=..., contours_bold=..., labels=...)
|
|
40
|
+
for i in ...],
|
|
41
|
+
step=0,
|
|
42
|
+
attribution="Data: ECMWF Open Data (CC-BY-4.0)",
|
|
43
|
+
on_ready=..., on_stats=...,
|
|
44
|
+
)
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
データの形は `src/flet_gpumap/gpufield.py` の説明のとおり(値は 16 bit を RGBA の RG に、
|
|
48
|
+
風は int16 の 0.01 m/s、線は float32 の (経度, 緯度) で切れ目は NaN)。
|
|
49
|
+
時刻は `GpuFrame` を足していき、`step` を変えるだけで切り替える。
|
|
50
|
+
|
|
51
|
+
値が階級(レーダーの降水強度など)のときは `sampling="nearest"` で補間せずに塗り、
|
|
52
|
+
`classes=["", "〜1", "1〜5", …]` で読み取りに階級の名前を出す。細かい格子の階級は
|
|
53
|
+
`GpuFrame(scalar8=…)`(1 格子点 1 バイト)で送ると RGBA の 4 分の 1 で済む。風の無い量は
|
|
54
|
+
`show_particles=False, particles=0`。
|
|
55
|
+
|
|
56
|
+
## 実行環境
|
|
57
|
+
|
|
58
|
+
自作の部品は Flet の出来合いの実行環境では表示されない。部品入りの実行環境を `flet build` で
|
|
59
|
+
`build/linux` に作り、プロジェクトのフォルダーで `flet run` する(Linux の Flet は `build/linux` を
|
|
60
|
+
先に使う)。
|
|
61
|
+
部品(Dart・シェーダー)を変えたら作り直す。
|
|
62
|
+
|
|
63
|
+
Linux(Intel 内蔵 GPU)で 57〜59 fps(粒子 10,000、等値線・海岸線あり)。Web でも描ける。
|
|
64
|
+
|
|
65
|
+
## ライセンス
|
|
66
|
+
|
|
67
|
+
MIT([LICENSE](LICENSE))。aiai-tools のほかのコードは AGPL-3.0-or-later だが、この部品は
|
|
68
|
+
ほかのアプリでも使えるように MIT にした(2026-10-14)。AIseed Weather の flet-gpufield を元にし、
|
|
69
|
+
地図とグラフを描ける部品に広げる([DESIGN.md](DESIGN.md))。
|
|
70
|
+
|
|
71
|
+
## 公開
|
|
72
|
+
|
|
73
|
+
`flet-gpumap-v0.1.0` のようなタグを push すると、GitHub Actions(`.github/workflows/publish-flet-gpumap.yml`)
|
|
74
|
+
が PyPI に出す。
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
LICENSE
|
|
2
|
+
README.md
|
|
3
|
+
pyproject.toml
|
|
4
|
+
src/flet_gpumap/__init__.py
|
|
5
|
+
src/flet_gpumap/gpufield.py
|
|
6
|
+
src/flet_gpumap.egg-info/PKG-INFO
|
|
7
|
+
src/flet_gpumap.egg-info/SOURCES.txt
|
|
8
|
+
src/flet_gpumap.egg-info/dependency_links.txt
|
|
9
|
+
src/flet_gpumap.egg-info/requires.txt
|
|
10
|
+
src/flet_gpumap.egg-info/top_level.txt
|
|
11
|
+
src/flutter/flet_gpumap/pubspec.yaml
|
|
12
|
+
src/flutter/flet_gpumap/lib/flet_gpumap.dart
|
|
13
|
+
src/flutter/flet_gpumap/lib/src/extension.dart
|
|
14
|
+
src/flutter/flet_gpumap/lib/src/gpufield.dart
|
|
15
|
+
src/flutter/flet_gpumap/shaders/field.frag
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
flet>=1.0.4
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
// Copyright (c) 2026 Yasuhiro / AIseed
|
|
3
|
+
|
|
4
|
+
import 'package:flet/flet.dart';
|
|
5
|
+
import 'package:flutter/widgets.dart';
|
|
6
|
+
|
|
7
|
+
import 'gpufield.dart';
|
|
8
|
+
|
|
9
|
+
class Extension extends FletExtension {
|
|
10
|
+
@override
|
|
11
|
+
Widget? createWidget(Key? key, Control control) {
|
|
12
|
+
switch (control.type) {
|
|
13
|
+
case "GpuField":
|
|
14
|
+
return GpuFieldControl(key: key, control: control);
|
|
15
|
+
default:
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|