✏️

GMT+Ghostscriptでの日本語表示

2023/01/08に公開

GMT(The Generic Mapping Tools)

地球科学分野では、地図上に描画するときのツールとして、GMT(The Generic Mapping Tools)がよく使われます。GMTは、きれいに図が描けるので個人的にはよく使います。また、PostScript形式やEncapsulated PostScript形式で出力することができることが特徴の1つで、ちょっとした修正ができたり、様々な画像形式への変換を後処理でできるので汎用的です。

今回は、GMTで作成した画像ファイルで日本語が文字化けしてしまったときの対応方法です。

環境

環境は以下です。

  • OS:CentOS 7
    ほぼGnome Desktopでインストールしたままです。
  • GMT:version 6

GMT6で日本語を書く

GMT6 で日本語を記載する方法は以下のサイトを参考にさせていただきました。
まだ、GMT6に関する情報は少ないのでありがたいです。

はじめよう!GMT6 -gmt textの使い方-

ここで、1つkeyとなるのは、日本語を描くときには一旦EUC(ja_JP.eucjp)に変換しないといけないところ。上記のサイトではnkfをインストールしていますが、ここではiconvを使いました。
amedas_aichi.txtには名古屋の気象官署の緯度経度が、amedas_aichi_str.txtに名称の文字列の配置位置の緯度経度が記載されています。

#! /bin/csh -f

gmt begin
    gmt figure map_aichi png
        gmt basemap -R136.4/138.0/34.3/35.5 -JM10c -Bafg -BWSEN
        gmt coast -Dh -W0.1 -G148/178/132 -S132/170/214
        cat amedas_aichi.txt | gmt plot -Sc0.1 -Gred
        cat amedas_aichi_str.txt | iconv -f UTF-8 -t EUC-JP | gmt text -F+f10p,37,black+jML
gmt end

このままだとこんな感じで文字化けします。

原因の調査

さて、何が原因かを探ります。疑った点は以下です。

  1. 実はUTF-8のままでいけるんじゃないの?
  2. GMTに日本語フォントが入ってないんじゃないの?
  3. CentOSに日本語フォントが必要なんじゃないの?
  4. PostScriptで日本語が表示できてないんじゃないの?

1.は、iconvをなくしてみましたが変化なし。
2.は以下のgmtのコマンドで37番はちゃんと存在していたので日本語フォントが入っていると判断。

% gmt text -L

ちなみに、GMT6では新たなフォントの追加は、$HOME/.gmt以下に"PSL_custom_fonts.txt"というファイルを作成して設定するようになったみたいです。
CentOSの日本語フォントは、テキストエディタで日本語入力をできるようにしていなかったので、これか!と思いましたが、設定後も変化なし。
4.はGMT6になってから、GMTのコマンドでPostScriptから画像ファイル(ここではpng)に一気に変換できるようになったので、一旦PostScriptで出力してみます。gmt figureコマンドの出力形式pngをpsに変更するだけで従来通りPostScript形式で出力できます。作成したPostScriptをgsで開いてみると、以下のErrorが出ました。

Can't find (or can't open) font file /usr/share/ghostscript/Resource/Font/GothicBBB-Medium-EUC-H.
Can't find (or can't open) font file GothicBBB-Medium-EUC-H.
Didn't find this font on the system!

これですね。つまり、GMT6の問題ではなく、PostScript形式からpngに変換する際のGhostscript(以下、gs)に対応する日本語フォントがないようです。
エラーメッセージにある日本語フォントを使えるように設定します。

参考にさせていただいたサイトは以下です。
eps,psポストスクリプトghostscript日本語文字化け

Ghostscriptの日本語フォント

日本語フォントは、IPAexフォントを使いました。大体これで対応できるようです。
dnfでインストールしてもよかったんですが、以下からダウンロードして来ました。
https://moji.or.jp/ipafont/ipafontdownload/

解凍してできる明朝体とゴシック体のファイルをそれぞれ以下に配置します。

  • 明朝体 ipaexm.ttf
    /usr/share/fonts/ipa-ex-mincho/ipaexm.ttf
  • ゴシック体 ipaexg.ttf
    /usr/share/fonts/ipa-ex-gothic/ipaexg.ttf

上記のディレクトリはなかったので、作成しました。
あとは、gsの設定ファイルであるcidfmapを編集して、以下を追記します。

/ipaexm << /FileType /TrueType /Path (/usr/share/fonts/ipa-ex-mincho/ipaexm.ttf) /SubfontID 0 /CSI [(Japan1) 6] >> ;
/ipaexg << /FileType /TrueType /Path (/usr/share/fonts/ipa-ex-gothic/ipaexg.ttf) /SubfontID 0 /CSI [(Japan1) 6] >> ;
/Ryumin-Light /ipaexm ;
/GothicBBB-Medium /ipaexg ;
/IPAexGothic /ipaexg ;
/IPAexMincho /ipaexm ;
/HaranoAjiMincho-Regular /ipaexm ;
/HaranoAjiGothic-Medium  /ipaexg ;

ここで、/PathはIPAフォントファイルを置いた場所を指定します。環境に応じて変えてください。

これで、再度スクリプトの出力形式をpngに戻すと、ばっちり日本語が表示されました!
名古屋だけでは寂しかったので、伊良湖も追加してみました。


GMT 6になってから、-K、-Oオプションがなくなり書き方がだいぶ変わったので、原因にたどり着くまでに時間がかかってしまった。。。

Discussion