OpenCPNで使うKAPファイルの作成方法

# OpenCPN
[OpenCPN](https://opencpn.org/)はオープンソースの海図表示ソフトで、ソフト自体は無料で使う事ができる。船の運航には使わないものの、測量や作業でチャーター船に乗船する際に計画立案や現地での補助表示に使用するには非常に便利。

NOAAは合衆国沿岸部のENCを無料で公開しているし、ヨーロッパも内陸河川が無料で手に入る（詳しくはOpenCPNの[Chart Sources](https://opencpn.org/OpenCPN/info/chartsource.html)参照）。日本近海は日本水路協会が販売する[航海用電子海図](https://www.jha.or.jp/jp/shop/products/enc/index.html)以外はほとんどまともなデータが無い（もちろん、運航には必須）。公式の海図は必要な海域を揃えると費用が嵩むうえ、短期間で再購入の必要もある（サブスク状態）。

そこで無料の「海図」を表示して使うのだが、日本近海を広くカバーするデータは[OpenSeaMap](https://map.openseamap.org/)をベースにしたもの（[ここ](https://wiki.openstreetmap.org/wiki/KAP-charts_from_OpenSeaMap)の東シナ海のデータ）であるため、海図としての基本的な情報がほとんど掲載されていない。

応急措置として、更新は手動となるが紙海図のスキャン画像等に位置情報を付加したKAPファイルを作成し、 OpenCPN で表示している。

# KAPファイルとは
ヘッダと画像データで構成されていて、ヘッダに画像内のリファレンスポイントと緯度経度の対応関係などの情報が書き込まれている。ヘッダ部分はプレーンテキストで、その後ろにバイナリの画像データが続く構造になっている。

ヘッダの中身は本家に詳細が記載されている。
[BSB/KAP File Format](https://opencpn.org/wiki/dokuwiki/doku.php?id=opencpn:supplementary_software:chart_conversion_manual:bsb_kap_file_format)

# 画像ファイルからの変換方法
公式にも案内があるように、Imgkapというツールを使うと画像からKAPファイルが作成できる。このコマンドラインツールには画像ファイルとヘッダファイルが必要になる。

このヘッダの作成が少々面倒で、画像のピクセル位置と緯度経度の対応を画像ごとに手入力するのはしんどい。

そこで、GUIの支援ソフトを使った方法が下記のブログで紹介されている。
[How to Make an RNC eChart From a Chart Image](http://davidburchnavigation.blogspot.com/2019/12/imgkap.html)

必要なのは下記の３つのツール
1. [MapCal_2.exe](http://www.sping.com/seaclear) GUIツール
1. [mc2bsbh.exe](http://www.dacust.com/inlandwaters/mapcal) MapCalからヘッダを作成する専用ツール
1. [imgkap.exe](http://www.dacust.com/inlandwaters/imgkap) 画像+ヘッダでkapに変換

Windowsユーザの場合、これに従うと特に困ることなく変換できる。MapCalはかなり古いソフトだがWindwos10で問題なく動作した。

問題はMacで、おそらく[LibBSB](http://libbsb.sourceforge.net/)を使うほか無いのではなかろうか。

### 1. MapCal
[こちらのリンク](http://www.sping.com/seaclear)から```sc_setup.exe```をダウンロードしてインストールする。Downloadsの項目の一番上（2022/12現在）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88076/03f11659-e32f-9839-7f16-db4476c1aa11.png)
完了すると以下のアイコンがスタートメニューにある（はず）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88076/834092b5-0b3a-a259-aa03-2e164a9007bb.png)

起動して```File```メニューから```Open Image```で変換元のファイルを開く。PNGは読めたり読めなかったりするので、BMPを用意しておくと確実。ここでは```example.bmp```を読み込むとする。
![example.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88076/62a15756-1900-15c3-81cb-de224ca1ef88.png)
```Unknown```と表示された項目のうち、分かるものは選択/入力する。

キャリブレーションしたいポイントで右クリックして```Add New Cal. Point```を選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88076/a9644dd8-8a49-dc39-5970-05e8256779d8.png)

すると左のパネルに```Point1```が追加されるので、緯度経度（度分）を入力する。これを画像の四隅で行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88076/d88a772a-ee94-32a3-92c7-b5d8f6c950ea.png)

四隅のキャリブレーションを入力したら、```File```→```Save configuration```を選択し、キャリブレーションファイルを保存する。

画像と同じフォルダに```CHARTCAL.DIR```が作成されていればOK。

### 2. mc2bsbh.exe

ここからはコマンドプロンプトで行う。

まず下記を実行する。
```dosbatch
mc2bsbh.exe CHARTCAL.DIR
```
```example.hdr```が作成されればOK。

### 3. imgkap.exe
先ほどの```example.hdr```とイメージファイルからkapに変換する。
キャリブレーションの拡張子も```.kap```でないと動作しないため、リネームする。

```dosbatch
rename example.hdr example-hdr.kap
```

続けて

```dosbatch
imgkap.exe example.bmp example-hdr.kap
```

```example.kap```が作成されていれば完成。

#### エラーの場合
```dosbatch
ERROR - Could not open or error in image file".\example.bmp"
ERROR - imgkap return 2
```
というエラーが出た場合、
1. MapCalで```File```→```Open Image```で元画像(```example.bmp```)を表示
1. ```Tools```→```Convert```→```Current to WCI```を選び、WCIファイルを作成する
1. ```File```→```Close Image```ののち、```File```→```Open Image```で```example.WCI```を開く
1. ```Tools```→```Convert```→```Current WCI to BMP```で別名のBMP(ここでは```new_example.bmp```)を作成する
1. コマンドラインで下記を実行
```dosbatch
imgkap.exe  new_example.bmp example-hdr.kap
```
でエラーが出なければkapファイルが作成されているはず。
同じように作ったBMPはエラーになる可能性が高いため、最初からWCIを経由する手順で変換すると無難。エラーの原因は良くわからないが、色の階調が多すぎるとダメなのでは無いかと思っている。

# その他の情報

（随時更新予定）
### その他ツール
[SAT2Chart](https://opencpn.org/wiki/dokuwiki/doku.php?id=opencpn:opencpn_user_manual:plugins:navigation:ge2kap)

### 有料ツール
[mapc2mapc](https://www.the-thorns.org.uk/mapping/)

### その他データ
[KAP Download](http://svocelot.com/Cruise_Info/Equipment/KAP_Downloads.htm) # Google Earth の写真ベース