Code for Historyのオープンソース群(非GISもあるでよ)

**[Code for History](https://code4history.dev/index_ja.html)**大塚恒平です。
歴史的民俗学的な地域史研究などに有用な、ITも含む活動を行うワンマンアーミーとして活動を行っております。

これまでバカの1つ覚えのように毎年[**Maplat**](https://code4history.dev/maplat_flyer_2021_ja.pdf)を紹介してきたわけですが、今年はその他の開発物にも目を向けて一度全部紹介したいと思います。
フラッグシップ？のMaplatすら、基本作りたいもの優先の作りっぱでドキュメントとか未整備なので、他の開発物は輪をかけて推して知るべしですが、もしご興味のある開発物がありましたら、ぜひご協力いただけると嬉しいです。

## Weiwudi (タイル地図アプリ向けPWAオフライン対応フレームワーク)

Maplatについでよく紹介している[**Weiwudi**](https://github.com/code4history/Weiwudi)(魏武帝:ウェイウディ)は、Webサイトをオフライン対応させる技術であるPWA(Progressive Web App)に、タイル地図アプリを対応させるフレームワークです。
こちらはネット上のリソースに誘導するにとどめます。

**Qiita記事**

* [PWA地図アプリ向けタイルキャッシュservice workerフレームワーク"Weiwudi"を開発した](https://qiita.com/kochizufan/items/b2fe0dffd326f79cf6be)

**SpeakerDeck**
<script async class="speakerdeck-embed" data-id="4f35db8700a644858aa86c0e273c6802" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>

残念ながらまだベクトル地図には対応していないのが難点ですが、つい先日、関連Advent Calendarの[ベクトルタイルカレンダー2021](https://qiita.com/advent-calendar/2021/vt)で、ベクトルタイルへの対応を宣言したところです。

* [タイル地図アプリ向けPWAオフライン対応フレームワークWeiwudiをベクトルタイルに対応させる宣言](https://qiita.com/kochizufan/items/0f01b08ca48d1109c59f)

## Gyeonghwon (Canvas地図APIでも、アニメーションマーカーを可能にするライブラリ)[^1]

古き良き（悪き？）HTML divによるタイル地図の時代には、地図マーカーもdivで張り付けているだけだったので、マーカー画像をアニメーション画像にするだけでアニメーションマーカーが実現可能でした。
しかしCanvasの時代になって、単にアニメーション画像を使うだけではアニメーションマーカーが実現できなくなりましたが、それを可能にするライブラリが[**Gyeonghwon**](https://github.com/code4history/Gyeonghwon)(甄萱:キョンフォン)です。

**OpenLayerで動いているサンプル:**
https://code4history.dev/Gyeonghwon/index.html

特定の地図APIのみへの対応ではなく、CanvasのContextを受け渡してマーカーを作れる系のAPIであればどれでも対応可能(のはず)です。
つまり、特に地図関連の処理をしているわけではなくContextを各画像の内部定義に従い定期的に書き替えているだけなので、ユースケースがあるのかどうかわかりませんが、同じくCanvasの中で画像をアニメーションさせたい場合は流用できると思います。
対応しているフォーマットは、アニメーションGIF/PNG/WebPです。

## Quyuan (GeoJSONを食わせてマーカーに必要なリソース群を生成するテンプレート)

GeoJSONからマーカーを作る場合、どんな処理が必要でしょうか？

1. GeoJSON内に含まれる地物の数だけループを回し
1. 地物の種別に従いマーカー画像を決定[^2]し
1. クリックしたときの表示するHTMLを生成し
1. それらのマーカーやHTMLを各地図APIの流儀で地図面上に落とす

だけですが、このうち地図API毎に固有なものは**4.**だけで、**1.**～**3.**については共通化できます。
さらに**2.**や**3.**については基本文字列を生成する処理[^3]で、最悪特殊なユースケースでも文字列から他のデータ形式にするのはパースすれば容易なので、地物データから文字列を生成するテンプレートを適用すれば、**2.**、**3.**も同じ処理化できます。

[**Quyuan**](https://github.com/code4history/Quyuan)(屈原:チュユェン)はこれを行うライブラリで、GeoJSONとそれを処理するためのいくつかのテンプレートを含んだハッシュを食べさせてやると、処理後の文字列の配列を返してくれます（わあシンプル！）。
あとは、各地図APIの流儀に従い文字列セットをループ回して処理するだけ。

**実際のサイトにおける動作例:**
このサイトのマーカーリソースは全部QuYuanで生成しています
https://code4history.dev/TatebayashiStones/

これだけだとなんなので、マーカーを作る際に便利ないくつかの便利処理も用意しています。

* 複数の画像が含まれていた場合、[**Swiper**](https://swiperjs.com/)を使い、画像をスライダー化してくれる関数
* RICOH THETAなどによる球面画像が含まれている場合、それを見ることができるビューア

将来的には3Dオブジェクトのビューアなども、便利機能に加えたいなと思っています。

## Torii (リレーショナルな位置情報付き文化財データをGeoJSONとExcelのダブルマスタで管理可にするユーティリティ)

[アニメの聖地における地域歴史資料の活用と公開、普及施策](https://speakerdeck.com/kochizufan/gumma-wu-rf-2021?slide=14)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10108/4bcd67ff-1825-8cd8-7a42-8fa5ca548e76.png)

上記資料の14ページ[^4]に記載しているような、技術者が得意なQGIS/GeoJSONの組み合わせでのデータ管理と、非技術者が得意なExcelでのデータ管理を双方マスタデータとして、一方を更新後に実行すれば自動的に修正がもう一方のマスタにも反映されるような仕組みを作りました。
[**Torii**](https://github.com/code4history/Torii)(鳥居:トリイ)として公開しています。

これを実行すると、

1. ExcelとGeoJSONどちらを変更しても[^5]、中間データを介して、双方のマスタを変更に一致するように反映してくれる。<Br>これにより、双方のマスタはどちらを変更しても常に等価になり、技術者や位置情報をいじりたい時はQGIS、非技術者や部分一括変換などを行いたい時はExcelと管理ツールを使い分けられる。
1. GeoJSONのフォーマットは、QGISで編集した時、プログラムで編集した時など、微妙に改行位置やスペースの入る入らないなど差が生じるため、gitで管理しても変更箇所が検知できないが、このプログラムを実行することで、フォーマットが揃いgitで変更箇所を管理できる。<br>変更箇所が検知できるということは自動マージもでき、自動マージした結果をExcelに反映もできるので分散管理が容易になる。
1. 画像ファイルを決まった仕様で画像フォルダに置くと、検知して自動で画像管理テーブル内のレコードの生成とサムネイルの生成を行ってくれる。
1. Web等で公開しやすい、リレーション関係を解決して1つのファイルにしたGeoJSONファイルを生成してくれる。<br>これにより、そのGeoJSONをQuYuenなどを用いて読み込み表示するindex.htmlを準備し、**github pages**で公開までしておけば、Webでの更新公開作業なども容易になる[^6]。

といった効用があります。
実際に、『[**「たてばやしの野仏巡り」全5巻相当のデータのオープンデータ化＆現況調査プロジェクト**](https://github.com/code4history/TatebayashiStones)』で使われており、『[**奈良市の道端の地蔵堂や小祠、石仏などをオープンデータ化するプロジェクト**](https://github.com/code4history/JizoProject)』にも適用予定です。

## Harumi (あいまいな情報からの年号特定もできる、日本の年号<=>西暦変換ライブラリ)

GISにはかすりもしない非GISプロジェクトですが、紹介しておきます。

石造物を調査していて、年号干支の一部しか読み取れない状況から年号を特定したいケースがままあったので、あいまいな情報から年号の候補を出すライブラリを作り、[**Harumi**](https://github.com/code4history/Harumi)(春海:ハルミ)として公開しました。
読み取れた元号、十干十二支、年数字の一部を指定してやると候補を羅列するところまでできています。
Webで実行できるようにもしたいと思います。

実行の様子はこんな感じ:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10108/e7d6c1bc-a0ef-df9f-01b1-1c196876921a.png)

元々これがやりたくて作ったライブラリなので個人的には以上、なのですが、せっかくデータベース作ったので、日本の年号、ユリウス暦、グレゴリオ暦の年月日の相互変換などにも対応したいと思っています。

## Maplat (古地図処理ライブラリ)

将来予定のライブラリ除いて、一応動くライブラリのトリとしては、一応Maplatにも触れておきましょうか。

Maplat関連の情報は、以下にまとまっています。

* 最新のフライヤー: [英語](https://code4history.dev/maplat_flyer_2021.pdf)、[日本語](https://code4history.dev/maplat_flyer_2021_ja.pdf)
* 最近の発表 (Geoアクティビティコンテスト2021 奨励賞受賞)
<script async class="speakerdeck-embed" data-id="4433e70977b34f9c819772c79c18c2e9" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>
* [Maplat関連のQiitaの過去投稿](https://qiita.com/tags/maplat) Qiitaの検索さんに丸投げ

この1年ちょっとの間の大きな変化は、以下の感じです。

* 線を線に変換する機能が、豊橋市のバスロケーションシステム「[のってみりん](https://knot.temirin.jp/)」にて採用
* 線を線に変換する座標変換方式で、古地図をWMTSのラスタタイルフォーマットに変換して出力可能に
* PWAによるオフライン対応機能をWeiwudiとして切り出し[^7]
* 国土地理院Geoアクティビティコンテスト2021で[奨励賞受賞](https://g-kukan.jp/exh-c/)[^8]

今後もMaplatは発展をしていきますので、よろしくお願いいたします。

## 開発予定のプロダクト群
まだ十分に動くものにはなっていないものの、開発予定のライブラリについて紹介します。
もし似たようなアイデアを既にお持ちの方がおられれば、ご協力いただいてもよいですし、逆にこちらが協力する形も可能かと思います。

### Dongju (ベクトルタイルダウンロードユーティリティ)

Weiwudiをベクトルタイル対応させるために、そのダウンロードロジックそのものをファイルシステムにも保存可能なツールとして、[**Dongju**](https://github.com/code4history/Dongju)(東柱:トンジュ)を整備するつもりです。
開発が止まっているMapboxタイルのダウンロードユーティリティ、[**mapbox-style-downloader**](https://www.npmjs.com/package/mapbox-style-downloader)を元に、Mapbox以外のデータソースにも対応させる形で、進めています。

### Wenruo (Mbtilesのダウンロード=>IndexedDB展開ライブラリ)
こちらの[**Wenruo**](https://github.com/code4history/Xunyu)(文若:ウエンルオ)リポジトリではまだ何も実装していませんが、WeiwudiをMbtiles対応させる際に、MbtilesをダウンロードしてindexedDBに蓄積させるロジック自体は、PWA用途以外でも使いたいユースケースがあるかもしれないと思い、独立ライブラリ化する方向で今のところ考えています。

### Hoshu (複数の平板GeoJSON同士のリレーションを定義し単独の構造化GeoJSONとするライブラリ)
こちらの[**Hoshu**](https://github.com/code4history/hoshu)(芳州:ホウシュウ)リポジトリではまだほぼ何も実装していませんが、QGIS等では実現できる複数の平板GeoJSON同士に対しリレーションを定義し、それに従って複数のGeoJSONを読み込み1つの構造化GeoJSONとして再構成するライブラリを考えていました。
ただ、そのやりたい機能自体は**Torii**の中の機能4.として実装してしまったので、引き続き作ろうと思えばそこからロジックを抜き出す形になるのですが、他のユースケースがあるかどうかよくわからないので、継続開発するかは少し黄信号が灯っています。
もしやるなら、GeoJSONを構造化するだけでなく、LOD(Linked Open Data)のどれかのフォーマットにも変換できるようにするとか、付加価値をつけるかもしれません。

## 2022年もよろしくお願いいたします。

そんなこんなで、自分以外誰が使うのかもわからないオープンソースGIS/非GISライブラリを粗製乱造しているCode for Hsitoryですが、2022年も空気読まず突っ走りますので、また来年もよろしくお願いいたします。

[^1]: すみません、記事初版ではWebGLも含め書いていましたが、確認したところCanvasにしか対応してなかったので、記事内容書き換えてます
[^2]: 場合によっては通常時、選択中など複数決定
[^3]: 画像であっても、png等ならファイルパス、SVGならXML記述で結局文字列
[^4]: なぜかページ指定での埋め込みが動作しないので画像+リンク
[^5]: 方向性の指示は明示的に指定要
[^6]: 非技術者だけで更新作業まで完結させられる
[^7]: 正確には昨年末にはかなりできていましたが
[^8]: Maplatとして4件目、個人として5件目のGeoアクティビティでの受賞