[Julia] GMT.jl を使って地理情報の可視化

# 経緯 データの前処理
最近、緯度経度を特徴量として持つデータの異常値を削除する方法を探しています。データが大陸上ではなく海洋上にあるデータを削除したいとき、みなさんどうなさっているのでしょうか。思いついた方法として、

- なんらかのAPIを用いて緯度経度をチェックする
- 地図にプロットし, 海洋上にプロットされたデータをうまいこと削除する
- 一個一個地道に見ていく

こんなところでしょうか。

実際にやってみたのは、二つ目のポチの「地図にプロットし, 海洋上にプロットされたデータをうまいこと削除する」です。これには、地図上に緯度経度を対応付けてプロットする必要があります。Juliaで探したところGMT.jlが良さそげだったのでこちらを利用してみます。

さて、今回は地図をプロットしたり、散布図追加したりするパッケージのレシピ紹介です。前処理についての記事ではないので、予めご了承ください。

# GMT (The Generic Mapping Tools)

GMTは気象データや海洋データの可視化によく用いられるツールです。公式サイトによると、通常コマンドラインから使用するGMTですが、C, MATLAB, Julia, Python などでラップされたライブラリも提供されているようです。

JuliaでもGMTが使えるようなので、せっかくなのでJuliaで書いてみました。GMTの公式サイト（GMT.jlのほうではない）のほうがレシピがたくさんあるので、一旦そちらで検索するのもいいかもしれないですね。


https://www.generic-mapping-tools.org/


# install 

記事制作時の環境です。

```ver-info.jl
# julia
Julia Version 1.6.0
Commit f9720dc2eb (2021-03-24 12:55 UTC)
Platform Info:
  OS: Windows (x86_64-w64-mingw32)
  CPU: Intel(R) Core(TM) i5-10210U CPU @ 1.60GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-11.0.1 (ORCJIT, skylake)

# GMT
GMT v0.38.2

# GhostScript
GhostScript 9.55.0
```

GMT.jlのインストールはJuliaのパッケージ管理モードを使って簡単にできます。

```install.jl
] add GMT
```

ただ、手元の環境だと`GMT.jl`をインストールしただけでは、エラーが発生してしましました。同様のエラーが出たという方がJuliaのコミュニティに[question](https://discourse.julialang.org/t/cannot-execute-ghostscript-gs-gmt-error-number-79/70531)を挙げていました。

questionにもある通り、`GhostScript`を別途インストールすることでエラーが解消されます。

# レシピ

GMTはオプションの数がかなり多く、その都度検索するというより一度作ったレシピをどこかに保存して置いて、随時それを参照するといったことを意識するといいかもしれません。

https://www.generic-mapping-tools.org/GMT.jl/dev/gallery/mapprojs/

## 表示した地図に散布図を重ねる

:::note info
赤い点は弊社テクノフェイスの位置です。
:::

![GMTjl_TF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1272355/d9e038df-1300-eac2-00cd-269f27584a58.png)

```show_tf.jl

using GMT

coast(
    #= 
    緯度経度の範囲指定 "経度左端/緯度下端/経度右端/緯度上端r"
    南緯:北緯 ⇔ -90:90
    西経:東経 ⇔ -180:180
    rは必須. 無いと表示がおかしくなる.
    =#
    region="139/41/146/46r", 
    # 地図の投影手法：今回はステレオ投影
    proj=(name=:stereographic, 
    center=(130,-30)), 
　　# 外枠のフレームの設定
    frame=:ag, 
    # 解像度
    res=:auto,
　　# km^2以下のポリゴンは表示しない => 値をちいさくすれば小さい湖なども表示できる
    area=5000, 
　　# 大陸の色
    land=:green,
    # 海洋の色 
    ocean=:lightblue, 
    # 海岸線の種類
    shore=:thinnest, 
    figsize=20
)
scatter!(
        [141.3520392704521],
        [43.06257096671451],
        marker=:circle,
        fill=:red,
        label="TF",
        show=true # 重要! これがないと図が表示されない!!
)
```
## 境界線/海岸線の色を変える

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1272355/e6e0c4e9-f267-7328-46c0-1ce4f1a1f753.png)



```change_shore.jl
coast(
    region=[-88 -70 18 24], 
    proj=(name=:eqdc, center=[-79 21], parallels=[19 23]),
    frame=:ag, 
    res=:intermediate,
    #=
    type
    1 : 国境
    2 : 南北アメリカ内の州の境界
    3 : 海上境界線
    a : すべての境界（1〜3）
    =#
    borders=(type=1, pen=("thick","red")),
    land=:green,
    #=
    海岸線の設定
    lebels
    1 : 海岸線
    2 : 湖岸
    3 : アイランド湖の湖岸？カナダの北東にある湖らしい
    4 : 湖内にある島の湖岸
    
    pen
    width
    color
    style
    =#
    shore=(lebels=(1,2), pen=(1, :blue, :solid)), 
    show=1
)
```




## 画像を保存する

```save.jl
# 例1
coast(
    # 略
    savefig="保存したいPATH"
)

# 例2
coast(
    # 略
)
scatter!(
    # 略
    savefig="保存したいPATH"
)
```

# 参考文献

- [GMT.jl docs](https://www.generic-mapping-tools.org/GMT.jl/dev/usage/)
- [Takuya Miyashita](https://hydrocoast.jp/index.php?Julia/GMT.jl)