Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kartore: Maplibre のための Style Editor とその Toolkit

Kartore: Maplibre のための Style Editor とその Toolkit

Avatar for Taiyu Yoshizawa

Taiyu Yoshizawa

September 02, 2026

More Decks by Taiyu Yoshizawa

Other Decks in Technology

Transcript

  1. Who are you? Taiyu Yoshizawa (a.k.a. ɴᴇᴋᴏʏᴀsᴀɴ) Software Engineer @MIERUNE

    Inc. Co-founder & Software Engineer @ ReMotive LLC. GitHub: @NEKOYASAN Twitter: @Nekoya3_ Web: nekoyasan.me
  2. 現状なにができるの? GitHubと連携してCommit / Push / Pull Requestが出せる 差分をSide by Sideで確認できる

    styleのGit上での変更を追跡することができる。 色や値、interporationを変数化して複数の場所から利用できる 保存先などを拡張できる
  3. それぞれの責務 web (github.com/kartore/svelte) MapLibre Style Editor の UI 全般 map、inspector、style

    editor など Style JSON / split style / project pack などの仮想ファ イル群の生成・復元 Style 内の値の変数化・バインド・解決 adapter の拡張 API UI、保存、履歴、プロジェクト読み込み 元 SVG・font の保管と、spritore / glyphore の利用
  4. それぞれの責務 web (github.com/kartore/svelte) MapLibre Style Editor の UI 全般 map、inspector、style

    editor など Style JSON / split style / project pack などの仮想ファ イル群の生成・復元 Style 内の値の変数化・バインド・解決 adapter の拡張 API UI、保存、履歴、プロジェクト読み込み 元 SVG・font の保管と、spritore / glyphore の利用
  5. それぞれの責務 file-adapter (github.com/kartore/file-adapter) File System Access API による Style の

    open / read / write / save ファイル接続状態・未保存変更・保存 UI の管理 .kartore ファイルの import / export
  6. それぞれの責務 file-adapter (github.com/kartore/file-adapter) File System Access API による Style の

    open / read / write / save ファイル接続状態・未保存変更・保存 UI の管理 .kartore ファイルの import / export
  7. それぞれの責務 github-adapter GitHub OAuth / GitHub App 経由の repository・ branch・file

    操作 Style の読み込み・commit・branch 作成・conflict 検 知 commit history、diff、preview link、Pull Request、 webhook GitHub 連携用の UI と adapter 実装
  8. adapterとは? エディタ本体と、保存先・外部サービスを分離する拡張 web は共通の編集 UI・編集状態・Editor API を提供 各 adapter は外部サービスとの接続方法と、固有の

    UI を 担当 保存、読み込み、履歴、認証などを adapter ごとに実装 host が adapter を登録すると、adapter の UI・ provider・API がエディタに組み込まれる 共通の契約を使うため、保存先を差し替えてもエディタ本体を変 更せずに利用できる
  9. 各モードのStyle JSONをそれぞれ出力する 1 { 2 "name": "JP Street Light", 3

    "layers": [ 4 ... 5 { 6 "id": "water", 7 "type": "fill", 8 "layout": {}, 9 "paint": { 10 "fill-color": "#FF1FE7", 11 } 12 } 13 ] 14 }
  10. 各モードのStyle JSONをそれぞれ出力する 1 { 2 "name": "JP Street Dark", 3

    "layers": [ 4 ... 5 { 6 "id": "water", 7 "type": "fill", 8 "layout": {}, 9 "paint": { 10 "fill-color": "#33002D", 11 } 12 } 13 ] 14 }
  11. 各モードのStyle JSONをそれぞれ出力する 1 { 2 "name": "JP Street Light", 3

    "layers": [ 4 ... 5 { 6 "id": "water", 7 "type": "fill", 8 "layout": {}, 9 "paint": { 10 "fill-color": "#FF1FE7", 11 } 12 } 13 ] 14 } 1 { 2 "name": "JP Street Dark", 3 "layers": [ 4 ... 5 { 6 "id": "water", 7 "type": "fill", 8 "layout": {}, 9 "paint": { 10 "fill-color": "#33002D", 11 } 12 } 13 ] 14 }
  12. 各モードのStyle JSONをそれぞれ出力する 1 { 2 "name": "JP Street Light", 3

    "layers": [ 4 ... 5 { 6 "id": "water", 7 "type": "fill", 8 "layout": {}, 9 "paint": { 10 "fill-color": "#FF1FE7", 11 } 12 } 13 ] 14 } street-light.json 1 { 2 "name": "JP Street Dark", 3 "layers": [ 4 ... 5 { 6 "id": "water", 7 "type": "fill", 8 "layout": {}, 9 "paint": { 10 "fill-color": "#33002D", 11 } 12 } 13 ] 14 } street-dark.json
  13. `global-state` を使い1つのJSONで出力する 1 { 2 "name": "JP Street", 3 "layers":

    [ 4 ... 5 { 6 "id": "water", 7 "type": "fill", 8 "layout": {}, 9 "paint": { 10 "fill-color": "#FF1FE7", 11 } 12 } 13 ] 14 }
  14. `global-state` を使い1つのJSONで出力する 1 { 2 "name": "JP Street", 3 "state":

    { 4 "mode": { 5 "default": "light" 6 } 7 }, 8 "layers": [ 9 ... 10 { 11 "id": "water", 12 "type": "fill", 13 ...
  15. 1 2 3 4 5 6 7 8 9 10

    11 12 13 14 `global-state` を使い1つのJSONで出力する "layers": [ { "id": "water", "type": "fill", "paint": { "fill-color": [ "case", ["==", ["global-state", "mode"], "dark"], "#33002D", "#FF1FE7", ] } } ]
  16. 1 2 3 4 5 6 7 8 9 10

    11 12 13 14 `global-state` を使い1つのJSONで出力する "layers": [ { "id": "water", "type": "fill", "paint": { "fill-color": [ "case", ["==", ["global-state", "mode"], "dark"], "#33002D", "#FF1FE7", ] } } ]
  17. それぞれの責務 glyphore (github.com/kartore/glyphore) OTF / WOFF / TTF から MapLibre

    用 glyph SDF PBF を生成 web が元 font を保管し、MapLibre から要求された range をオンデマンドで生成する font metadata と対応 Unicode range の抽出 Rust / WebAssembly / JavaScript / CLI から利用可能
  18. それぞれの責務 spritore (github.com/kartore/spritore) SVG から MapLibre 用 sprite を生成 ある程度の軽量化も合わせて実施する

    個別画像の rasterize、PNG sprite sheet、JSON index の生成 個別画像はスタイル作成中に map.addImage 経由で利 用される Rust / WebAssembly / JavaScript / CLI から利用可能
  19. Kartore × GitHub GitHubからスタイルをロードできる Branchを切って変更を加え、Add / Commitできる Branch間の変更をSide-by-Sideで確認できる 確認した上でPull Request

    を出せる GitHubからもプレビューできる (feature) 場所を指定した状態で対応するレイヤにレビューコメントをつけ られる (feature)