ブラウザだけでジオリファレンス

これは [FOSS4G Advent Calendar 2019](https://qiita.com/advent-calendar/2019/foss4g) の13日目の記事です。

# はじめに

ブラウザの地図上で直接画像を変形させてジオリファレンス～地図タイル生成ができるツールを GitHub 上に公開しました。HTML と Javascript ですべてをやってしまうので、特別なサーバは不要です。

**Aplication** <https://frogcat.github.io/petaviron/>
**GitHub** <https://github.com/frogcat/petaviron>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82494/d4c2a034-a091-d86c-0f5b-1649d09af17f.png)




# 使い方

## 1. 準備

とりあえず地図の上にのせてみたい画像ファイルをどこかから持ってきて保存しておきましょう。以下の例では [二子玉川小学校付近空撮2.jpg](https://commons.wikimedia.org/wiki/File:%E4%BA%8C%E5%AD%90%E7%8E%89%E5%B7%9D%E5%B0%8F%E5%AD%A6%E6%A0%A1%E4%BB%98%E8%BF%91%E7%A9%BA%E6%92%AE2.jpg) をダウンロードして使っています。


## 2. 画像のオーバーレイ

まずブラウザで
<https://frogcat.github.io/petaviron/> を開きましょう。地図が表示されていますね。


画面中心に「Click me to overlay your image」というボタンがあるので押します。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82494/1b2e2a52-2f48-3568-9ddd-9d5f28acfb90.png)

ファイルダイアログが表示されるので、ダウンロードしておいた **二子玉川小学校付近空撮2.jpg** を選択して **開く** ボタンを押しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82494/eec735fd-5048-5a07-a472-c4bec77162ba.png)

画像が地図上に表示されましたね？


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82494/ac8fed7d-820f-1c57-5fb9-c3a71648a3dc.png)

### TIPS

画像をアップロードする前に作業したいエリアが表示されるように、地図をズーム＆パンしておきましょう。

## 3. ジオリファレンス

画像の四隅にはマーカーがあるので、言われるがままにドラッグしてみましょう。マーカーに合わせて画像が変形していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82494/9790da83-18e4-5fa6-6b20-09c6b126d1a0.png)

いいかんじに画像が重なるようにマーカーを動かしていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82494/c02604d6-cdfa-a6df-8733-c60dadbd7588.png)

地図を拡大縮小したり

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82494/da24ab55-4afc-c2c9-c3e8-a8b3c442886b.png)

**Opacity** スライダーで画像の透明度を変更したりしながら作業していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82494/d4c2a034-a091-d86c-0f5b-1649d09af17f.png)


### TIPS

画像をクリックするとマーカーが追加できます。自分で追加したマーカーは削除も可能です。

イラストやデフォルメされた地図などの場合は、こんな風に四隅をだいたい合わせてから

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82494/7cb6c02e-69c6-4ca9-5628-99465dcfc2d7.png)

動かしたい部分をクリックしてマーカーを追加、ピッタリあうように動かしていきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82494/c82946cb-9a0b-fcb7-6893-1290f8620f64.png)

## 4. タイルの生成

満足がいったら **save** ボタンを押しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82494/a70e4878-3f3e-59b2-d9dc-0480c1aecf94.png)

**petaviron000000000000.zip** のようなファイルがダウンロードされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82494/772b15df-a9a5-4202-a316-5ae1f8c3de60.png)

展開してみましょう。タイルを収録したフォルダが見えますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82494/080a707c-a110-217c-2520-1c73e46d1c32.png)

これを適当な Web サーバにアップすると、みんなが使える地図タイルとして公開できます。ためしに [GitHub](https://github.com/frogcat/petaviron-example) に公開して [GitHub Pages](https://frogcat.github.io/petaviron-example/) で見たものがこちら。作業結果がタイルに反映されていますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82494/114c82cc-3065-c7e1-7b9e-b78e1962e5dd.png)

### TIPS

ダウンロードされるファイルの中にはタイル画像以外にプレビュー用の **index.html** と [tilejson spec 2.2.0](https://github.com/mapbox/tilejson-spec/tree/master/2.2.0) に従った **tilejson.json** ファイルが含まれています。

**index.html** の上部には **https://frogcat.github.io/petaviron-example/{z}/{x}/{y}.png** のような、いわゆるタイルURLが表示されるようになっています。別の GIS ソフトやウェブサービスにタイルを載せるときには、だいたいこのタイルURLが必要になるので覚えておきましょう。

## 5. 地理院地図にのせてみる

**https://frogcat.github.io/petaviron-example/{z}/{x}/{y}.png** をクリップボードにコピーしておきましょう。

<https://maps.gsi.go.jp/> を開いて **機能 > ツール > 外部タイル読込** を選択します。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82494/2e36a67f-cc39-5809-a1c6-c0584fcb5b28.png)


するとこのように外部タイル読込のダイアログが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82494/5eff2c53-62e9-1fd3-0abd-b37ac9eb0de1.png)

**レイヤー名** 欄に適当なレイヤー名を、**URL** 欄に先ほどコピーしたタイルURLをぺースト、 **上記の内容で読み込み開始** ボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82494/db5a3ef6-be36-a341-3ba3-7afc3c913eb2.png)

自力でタイルが表示されているであろう東京都世田谷区の二子玉川あたりにズームパンしてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82494/c402580a-ddd5-ef81-7b5d-1edf4f8b81cb.png)

かさなってますね。

# 技術情報

## 画像の変形

<https://github.com/mapbox/delaunator> で TIN 分割した結果を WebGL 上に Triangle としてあたえて、そこに Texture を載せているというものです。<https://github.com/frogcat/canvas-morph> という拡張としてカプセル化しています。くわしくはソースをどうぞ。


## タイルの生成

Canvas の表示内容は (WebGL であっても) [HTMLCanvasElement.toBlob](https://developer.mozilla.org/ja/docs/Web/API/HTMLCanvasElement/toBlob) メソッドで png などに変換することができます。
これで必要なタイル blob を生成して [JSZip](https://stuk.github.io/jszip/) で zip にして [FileSaver.js](https://github.com/eligrey/FileSaver.js) を使ってダウンロードさせる、という仕組みです。こちらもくわしくはソースをどうぞ。


# まとめ

手軽にジオリファレンスしたい方、どうぞ使ってみてください。