1
2

QGISとImageMagickを使って海底地形図および陰影起伏図つきのポスターサイズ日本地図を作る

Posted at

概要

ビックカメラで配布している日本地図つきのカレンダーのような、ポスターサイズの日本地図を作りたい。

国土地理院の陰影起伏図とNOAAの海底地形データを単純に組み合わせた地図では、湖や河川などの水域が塗られない。海底地形データに地理院地図Vectorを重ねた地図の場合、地理院地図の水域に日本近海も含むため、海底地形図が上書きされ隠れてしまう。

QGISを使って主なレイヤを個別に画像としてエクスポートするとともに、ImageMagickを使って各画像を加工し、重ねあわせることで目的の日本地図を作成する。

はじめに

ビックカメラでは毎年初冬に日本地図つきのカレンダーを配布している。筆者は毎年それを楽しみにしており、自宅でも活用している(職場にも貼られていたような気がする)。

似たような感じの自分流の日本地図を作ってみる。

出力画像サイズ

日本地図はPDFなどベクトル形式ではなく、取り扱いが容易な画像形式で出力する。A0版の印刷に耐えられる解像度の画像を作成したい。参考サイトの記述も参考にして次のように解像度を定めた。

  • 解像度: 300[dpi]
  • A0版: 841[mm] x 1189[mm] = 33.11..[インチ] x 46.81..[インチ]
    • 25.4[mm/インチ]とする
  • 画像サイズ: 9933[px] x 14043[px] (1dot=1pixelとする)
    • 幅: (841[mm]/ 25.4[mm/インチ]) x 300[dpi] = 9933 dot
    • 高さ: (1189[mm] / 25.4[mm/インチ]) x 300[dpi] = 14043 dot

ちなみに、最終的には作成した画像をPower Pointで取り込み、注記や説明などを追加した後にPDF出力したものを、印刷屋に依頼する想定でいる。
ちなみに、当初は600[dpi]で作成していたが、Power Pointの操作性が非常に悪くなったため300[dpi]に軽量化した。

レイヤー別の地図を作成

QGISのインストールと起動

オリジナルの地図を作りたい場合GIS(地理情報システム:Geographic Information System)を使うと便利。ここではオープンソースのGISであるQGIS(Quantom GIS)を使う。

QGISのサイトより最新安定版をダウンロードしてインストールする。執筆時点での最新版は3.34LTRであった。インストール手順に注意するべき点はとくにない。インストールウィザードにしたがうのみ。インストールには意外に時間が必要で、数分を費やした。

インストールできたらQGISを立ち上げる。なお筆者の環境はWindows 11である。

スクリーンショット 2024-09-05 151455.png

地理院地図ベクターの導入

以下資料のp.13からp.16までくらいを参考にして、QGISに地理院地図ベクターを導入した。

  1. アプリケーション左上にあるブラウザパネルのVector Tilesを右クリック
  2. コンテキストメニューにある新規一般接続を選択
    スクリーンショット 2024-09-05 152245.png
  3. 出現したベクトルタイル接続ダイアログに以下の値を設定してOKを押下
  4. ブラウザパネルのVector Tilesノードの配下に、前項で追加した地理院ベクトルタイルが出現
    スクリーンショット 2024-09-05 153009.png
  5. 前項の地理院ベクトルタイルノードをダブルクリックすると、レイヤパネルに地理院ベクトルタイルレイヤを追加し、極小の日本地図を表示
    スクリーンショット 2024-09-05 153327.png
  6. 地図領域中央にある黄土色のゴチャゴチャしている日本地図の上で、マウススクロールすると日本っぽい形が出現
    スクリーンショット 2024-09-05 153703.png

陰影起伏図の導入

以下のページ(陰影起伏図でページ内検索)に記載の諸元を設定して、陰影起伏図を導入する。

  1. アプリケーション左上にあるブラウザパネルのXYZ Tilesを右クリックし、コンテキストメニューにある新規接続を選択
    スクリーンショット 2024-09-05 165705.png
  2. 出現したXYZ接続ダイアログに以下の値を設定してOKを押下
  3. ブラウザパネルのXYZ Tilesノードの配下に、前項で追加した地理院陰影起伏図が出現
    スクリーンショット 2024-09-05 165958.png
  4. 前項の地理院陰影起伏図ノードをダブルクリックすると、レイヤパネルに地理院陰影起伏図レイヤを追加し、グレースケールの日本地図を表示
    スクリーンショット 2024-09-05 170106.png

地図範囲の設定

地図として出力する範囲を指定する。

以下は泥臭い方法である。もっとスマートな方法もあると思うが、見つけられていない。

  1. 地図を拡大・ドラッグして地図として出力したい北端と東端を表示
    スクリーンショット 2024-09-05 155102.png
  2. メニュー > プロジェクト > インポートとエクスポート > 地図を画像にエクスポートの順に選択して、地図を画像として保存ダイアログを表示
    スクリーンショット 2024-09-05 155134.png
  3. 領域(現在:マップビュー)パネルのおよびにある数値をメモし、キャンセルを押下してダイアログを閉じる
    • 北: 5707768.7965, 東: 16233775.6058 であった。
    • スクリーンショット 2024-09-05 160654.png
  4. 1項と同様に地図をドラッグして出力したい西端と南端を表示
    スクリーンショット 2024-09-05 161201.png
  5. 2項と同様にして地図を画像として保存ダイアログを表示
  6. 領域(現在:マップビュー)パネルの西およびにある数値をメモし、キャンセルを押下してダイアログを閉じる
    • 西: 14418522.2725, 南: 3638092.1298 であった。
    • スクリーンショット 2024-09-05 161303.png
  7. アプリケーション左上にあるブラウザパネルの空間ブックマークノードを展開して出現するユーザ・ブックマークノードを右クリック
    スクリーンショット 2024-09-05 161654.png
  8. コンテキストメニューにある新規空間ブックマーク項目を選択し、ブックマーク・エディタダイアログを表示、各項目に値を入力(3項および6項で取得した値)して保存押下でダイアログを消す
    • 名前: 北海道から九州まで
    • 北: 5707768.7965
    • 西: 14418522.2725
    • 東: 16233775.6058
    • 南: 3638092.1298
    • EPSG:3857
      スクリーンショット 2024-09-05 162506.png
  9. メニュー > プロジェクト > 閉じる で現在のプロジェクトを保存せずに閉じる

ここまでが大まかな準備で、次節から画像を作成する。水域つきの陰影起伏図、海底地形図、海岸線(日本の陸地)図の3枚である。

水域つきの陰影起伏図の作成とエクスポート

ここでは、陰影起伏図に、湖や河川など水域を重ねた画像をエクスポートする。

プロジェクトの作成と陰影起伏図レイヤの作成

  1. メニュー > プロジェクト > 新規 を選択して新しいプロジェクトを開始
    スクリーンショット 2024-09-05 174400.png
  2. ブラウザパネルのXYZ Tilesノード配下にある地理院陰影起伏図をダブルクリックしてレイヤに追加
  3. ブラウザパネルの空間ブックマークノード > ユーザー・ブックマークノード配下にある北海道から九州までをダブルクリックして地図表示
    スクリーンショット 2024-09-05 174926.png

陰影起伏図の着色

白黒表示はイマイチなのでいい感じにしてみる。

試行錯誤で設定したもので、もっと良い方法があると思う。

  1. レイヤパネル > 地理院陰影起伏図 上で右クリックして、コンテキストメニューのプロパティを選択
    • スクリーンショット 2024-09-09 134722.png
  2. レイヤプロパティダイアログが出現するので、シンボロジプロパティを選択、各項目に値を設定(以下は今回の例)
    • 混合モード: 通常(Normal)
    • 輝度: 0
    • コントラスト: 16
    • ガンマ: 2.00
    • 彩度: 0
    • グレースケール: オフ
    • 色相: 着色(R: 249, G: 255, B: 133)
    • 強調: 50%
    • スクリーンショット 2024-09-06 094412.png
    • スクリーンショット 2024-09-06 094405.png
  3. OKを押下してダイアログを閉じると着色した陰影になる
    • スクリーンショット 2024-09-09 140000.png

水域を重ね合わせ

前項の地図に湖や河川など水域を重ねる

  1. ブラウザパネルのVector Tilesノード配下の地理院ベクトルタイル項目をダブルクリックして、レイヤパネルに取り込む
    • スクリーンショット 2024-09-09 142304.png
  2. 画面中央下の縮尺ドロップリストの一番上1:1000000を選択
  3. レイヤパネル上の地理院ベクトルタイルレイヤ上で右クリックしてコンテキストメニューからプロパティを選択
    • スクリーンショット 2024-09-09 142503.png
  4. レイヤプロパティダイアログが出現
    • スクリーンショット 2024-09-09 142633.png
  5. あらかじめ登録してあるフィルタルールPolygonsLinesPointsを削除あるいはチェックボックスを外して無効にするとともに、ルール追加ドロップリストから塗りつぶし項目を選択してフィルタルールを追加する
    • スクリーンショット 2024-09-09 142937.png
  6. 追加したフィルタルールに以下の値を設定する、適用ボタンを押下すると支笏湖や洞爺湖、湖や河川および海が塗られていることが確認できる
    • ラベル: 水域
    • レイヤ: waterarea
    • スクリーンショット 2024-09-13 121832.png
    • スクリーンショット 2024-09-13 122222.png
  7. 水域フィルタルールをダブルクリックして、シンボルセレクタダイアログを表示し、項目を設定した後にOKボタンを押下
    • 画面上部の塗りつぶしノード配下の シンプル塗りつぶし項目を選択
    • 塗りつぶし色項目を選択、塗りつぶし色を選択ダイアログでR: 190, G: 210, B: 255の色を設定しOKボタンを押下、ダイアログが閉じる
    • ストロークスタイルドロップリストから線なしを選択
    • シンボルセレクタダイアログOKボタンを押下、ダイアログが閉じる
    • スクリーンショット 2024-09-09 145458.png
  8. レイヤプロパティダイアログでOKボタン押下で、ダイアログが閉じ、湖や河川など水域の色が変わる
    • スクリーンショット 2024-09-13 122707.png
  9. なお、レイヤプロパティダイアログの右下に現在のズーム: 8のようなラベル項目がある、これが別節(ズームレベルと事物)で言及しているズームレベル(ZL)である

地図のエクスポート

  1. メニュー > プロジェクト > インポートとエクスポート > 地図を画像にエクスポートの順に選択する
    スクリーンショット 2024-09-09 151714.png

  2. 地図を画像として保存ダイアログを表示し、以下の操作を行う

    • 縮尺ドロップリストから1:1000000を選択
    • ブックマークドロップリストから、保存済みの北海道から九州までを選択、先に定めた領域を設定
    • 解像度を調整して出力幅が上述の9933[px]に近くなるように設定
      • 今回は140dpi : 10003[px] x 11407[px]を選択
    • スクリーンショット 2024-09-09 152042.png
  3. 保存ボタンを押下して、適当な名前で保存

    • 今回は000-base.pngとして保存
  4. 最後にプロジェクトを保存して閉じる

    • 今回は000-base.qgzとして保存

作成した地図は以下の通り(記事用に縮小している)
000-base-small.png

ズームレベルと事物

GISの世界では、位置情報を持つオブジェクトを地物と呼ぶらしい。地理院地図ではズームレベルごとに表示できる地物には制限がある。
ズームレベルと地物との関係の詳細は以下のPDFファイルを参照してほしい。日本全体を表示するような地図では大まかな情報のみを表示したいという需要を考えれば、地物への制限も理解できる。

このデータ仕様を確認すれば、ズームレベルに対して表示可能な地物がわかるし、逆に、表示したい地物に必要なズームレベルを決めることもできる。
ズームレベルの中で表示する地物は、source-layer項目でのレイヤ名で一括指定することもできるし、ftCode項目の値で指定することもできる。

前項で指定した水域(waterarea)も、この資料に記載がある値である。

なお、QGIS上で確認してみると、水域において河川流域はズームレベル8以上でないと塗られないようである。ただし、ズームレベル8以上では近海も塗られてしまう。

今回は、湖や河川は水色で塗りつぶし、近海は海底深度の色で塗りたいため、近海についてはこの記事にあるように別の画像を重ねることにしている。

海底地形図の作成とエクスポート

上リンク先に記載の方法を参考にして設定する。

海底地形データを入手

上述のnoaaのサイトにアクセスし、範囲指定して海底地形データを入手する。

  1. select a dataset...ドロップリストから、ETOPO_2022 (Bedrock; 60 arcseconds)を選択
    • なんとなく60 arcsecondsがデータ量が多い気がして選んだので適切かどうかは不明
    • FireShot Capture 312 - Grid Extract - www.ncei.noaa.gov.png
  2. 地図をドラッグして日本を表示
  3. 地図左上にあるdrawExtentToolボタン(地図拡大【+】縮小【-】ボタンの下、図では選択して赤色になっている)をクリックし、およその範囲を選択
    • スクリーンショット 2024-09-05 173205.png
  4. 画面左側にあるDownload Dataボタンをクリック
    • 7.4MBほどのexportImage.tiffを取得(ちなみに全球だと467MBほどある)

海底地形データをQGISに導入

  1. QGISを起動し、メニュー > プロジェクト > 新規から、新規プロジェクトを開始
  2. プロジェクトの座標系をEPSG3857にするために、地理院ベクトルタイルをブラウザパネルから読み込む。表示はしないために、レイヤパネルでチェックボックスを解除しておく
    • 座標系の扱いについては理解が進んでないので、もっとよい方法があるはず…
  3. メニュー > レイヤ > レイヤを追加 > ラスタレイヤを追加 の順に選択しデータソースマネージャを表示する、
    • スクリーンショット 2024-09-09 154358.png
  4. ソース項目に第1項で取得したファイルを指定し、追加ボタンを押下したあとに閉じるボタンを押下
    • スクリーンショット 2024-09-09 154538.png
  5. グレースケールの海底地形図を確認できる
    スクリーンショット 2024-09-09 154846.png
  6. レイヤパネル > exportImage項目を右クリックしてコンテキストメニューからプロパティ項目を選択レイヤプロパティダイアログを表示
    • スクリーンショット 2024-09-09 155843.png
  7. レイヤスタイルを以下のようにして、いい感じの色合いにした
    • --- バンドレンダリング ---
    • レンダリングタイプ: 単バンドグレー
    • グレーバンド: バンド1(Gray)
    • グラデーション: 黒から白
    • 最小: -9677 (この値は取得した範囲によって変わってくると思う)
    • 最大: 0 (地上は別途塗っており、使用する色範囲を海面以下に限定するため)
    • コントラスト: 最小最大範囲に引き延ばす
    • --- レイヤレンダリング ---
    • 混合モード: 通常(Normal)
    • 輝度: 0
    • コントラスト: -20
    • ガンマ: 1.20
    • 彩度: 0
    • カラーを反転: オフ
    • グレースケール: オフ
    • 着色: オン
    • 色の設定ダイアログ:R: 190, G: 210, B: 255
    • 強調: 100%
    • --- リサンプリング ---
    • 拡大: 最近傍法(Nearest Neighbour)
    • 縮小: 最近傍法(Nearest Neighbour)
    • オーバーサンプリング: 1.00
    • 早期リサンプリング: オフ
    • スクリーンショット 2024-09-13 172446.png
  8. 結果以下のような感じになった。
    • スクリーンショット 2024-09-09 161427.png

海底地形図のエクスポート

  1. 次に地図を画像としてエクスポートする。メニュー > プロジェクト > インポートとエクスポート > 地図を画像にエクスポートの順に選択
    • スクリーンショット 2024-09-09 161620.png
  2. 地図を画像として保存ダイアログを表示
    • 縮尺ドロップリストから1:1000000を選択
    • ブックマークドロップリストから北海道から九州までを選択(必ず縮尺を変更した後に操作すること)
    • 解像度を調整して出力幅が上述の9933[px]に近くなるように設定
      • 今回は140[dpi] : 10003[px] x 11406[px]を選択
      • スクリーンショット 2024-09-13 173353.png
  3. 保存ボタンを押下して、適当な名前で保存
    • 今回は300-seamap.pngとして保存
  4. 最後にプロジェクトを保存して閉じる
    • 今回は300-seamap.qgzとして保存

作成した地図は以下の通り(記事用に縮小している)
300-seamap-small.png

海岸線(日本の陸地)図の作成

これまで作成してきた陰影起伏図に、海底地形図を重ねて目的の地図としたい。
海底地形図のうち、陸地部分を透明にすることで、この目的を達成する。
まずは、陸地部分だけの地図を作成する。

  1. メニュー > プロジェクト > 新規 を選択して新しいプロジェクトを開始
  2. ブラウザパネルのXYZ Tilesノード配下にある地理院陰影起伏図をダブルクリックしてレイヤに追加
  3. レイヤパネル > 地理院陰影起伏図 上で右クリックして、コンテキストメニューのプロパティを選択、レイヤプロパティダイアログを表示
  4. シンボロジプロパティを選択
    • Polygonsフィルタルール: OFF
    • Linesフィルタルール: ON、レイヤ属性: coastline
    • Pointsフィルタルール: OFF
    • スクリーンショット 2024-09-12 143911.png
  5. Linesフィルタルールをダブルクリックしてシンボルセレクタダイアログを表示、以下のように設定してOK押下
    • : 黒(R:0, G:0, B:0)
    • ストローク幅: 1.0 ピクセル
    • ストロークスタイル: 実線
    • スクリーンショット 2024-09-12 145818.png
  6. メニュー > プロジェクト > インポートとエクスポート > 地図を画像にエクスポートの順に選択して、地図を画像として保存ダイアログを表示
  7. 縮尺ドロップリストから1:2000000を選択
  8. ブックマークドロップリストから、保存済みの北海道から九州までを選択、先に定めた領域を設定
  9. 解像度を調整して出力幅が上述の9933[px]に近くなるように設定
    • 今回は279dpi: 9962[px] x 11353[px]を選択
  10. 保存ボタンを押下して、適当な名前で保存
    • 今回は320-coastline.pngとして保存
  11. 最後にプロジェクトを保存して閉じる
    • 今回は320-coastline.qgzとして保存

記事用に稚内付近をトリムしたものが以下の図。
320-coastline-trim.png

以下図は記事用に縮小したもので、海岸線がうっすらと見える。
320-coastline-small.png

ここまでのまとめ

この章ではQGISを使って以下の地図を作成、画像としてエクスポートした。

  • 水域つきの陰影起伏図: 000-base.png
    000-base-small.png
  • 海底地形図: 300-seamap.png
    300-seamap-small.png
  • 海岸線(日本の陸地)図: 320-seacoast.png
    320-coastline-small.png

次章ではImageMagickを使って画像を加工、重ね合わせて最終出力を作成する。

レイヤ画像の加工と最終画像の作成

ImageMagickのインストール

ImageMagickはコマンドラインで画像を処理するアプリケーション。以下のリンクから選択してインストールできる。

ここでは、ImageMagick-7.1.1-38-Q16-HDRI-x64-dll.exeをダウンロードし起動した。セットアップウィザードにしたがえばインストールが完了する。
以降はコマンドプロンプト cmd.exe上での操作となる。カレントディレクトリを画像を保存したディレクトリに変更しておく

cd your-map-image-saved-directory

海岸線(日本の陸地)図の加工

海岸線図を加工およびリサイズする。

この記事と同様にして、海岸線の外側を透明背景にしたい。コマンドはIM7用のものを採用する。
海岸線図の左上角から、海岸線の外側の領域(つまり海域)を透明にする。
同時に画像サイズも幅9933[pixel]に変更する。

magick -monitor 320-coastline.png -background none -alpha set -channel RGBA -fill "#00000000" -fuzz 5% -draw "alpha 1,1 floodfill" -resize 9933 330-coastline-sea-fill.png

以下のようなメッセージの後に、330-coastline-sea-fill.pngが出来上がる。

load image[320-coastline.png]: 11352 of 11353, 100% complete
resize image[320-coastline.png]: 21252 of 21253, 100% complete
save image[330-coastline-sea-fill.png]: 11319 of 11320, 100% complete

稚内付近を拡大してみると、比較的小さな島も含めて陸地が抽出できていることがわかる(図はGIMPで同ファイルを表示したときのもの)。
スクリーンショット 2024-09-17 111714.png

海底地形図のリサイズと陸地部分を透明に加工

まず、海底地形図を所定の大きさに変更する。

magick -monitor 300-seamap.png -resize 9933 310-seamap-resized.png

以下のようなメッセージの後に、330-coastline-sea-fill.pngが出来上がる。

load image[300-seamap.png]: 11407 of 11408, 100% complete
resize image[300-seamap.png]: 21282 of 21283, 100% complete
save image[310-seamap-resized.png]: 11349 of 11350, 100% complete

次に、海底地形図に海岸線(日本の陸地)図を重ねる。このとき陸地部分が海底地形図で使っていない白(R:255, G:255, B:255)であることがポイント。

magick composite -monitor 330-coastline-sea-fill.png 310-seamap-resized.png temp.png

以下のようなメッセージの後に、temp.pngが出来上がる。

load image[330-coastline-sea-fill.png]: 11319 of 11320, 100% complete
load image[310-seamap-resized.png]: 11349 of 11350, 100% complete
mogrify image[310-seamap-resized.png]: 1 of 2, 100% completeete
save image[temp.png]: 11349 of 11350, 100% complete1350, 99% complete

スクリーンショット 2024-09-17 112409.png

このtemp.pngの白領域を透明にする。

magick -monitor temp.png -transparent white 340-sea.png

以下のようなメッセージの後に、340-sea.pngが出来上がる。

load image[temp.png]: 11349 of 11350, 100% complete
set transparent color in image[temp.png]: 11349 of 11350, 100% complete
save image[340-sea.png]: 11349 of 11350, 100% complete50, 100% complete

陸地部分が透明になっていることが分かる
スクリーンショット 2024-09-17 112114.png

全体図は以下の通り(ここでは透過色が白塗りにみえている)
340-sea-small.png

水域つきの陰影起伏図のリサイズと海底地形図の合成

あとは、これまでのコマンドを繰り返すだけ。
まずは、陰影起伏図をリサイズする。

magick -monitor 000-base.png -resize 9933 002-base-resized.png

以下のようなメッセージの後に、002-base-resized.pngが出来上がる。

load image[000-base.png]: 11406 of 11407, 100% complete
resize image[000-base.png]: 21258 of 21259, 100% complete
save image[002-base-resized.png]: 11325 of 11326, 100% complete

最後に海底地形図を重ねる。

magick composite -monitor 340-sea.png 002-base-resized.png 900-japan.png

以下のようなメッセージの後に、900-japan.pngが出来上がる。

load image[340-sea.png]: 11349 of 11350, 100% complete
load image[002-base-resized.png]: 11325 of 11326, 100% complete
mogrify image[002-base-resized.png]: 1 of 2, 100% complete
Composite/Image[002-base-resized.png]: 11325 of 11326, 100% complete
save image[900-japan.png]: 11325 of 11326, 100% complete

900-japan-small.png

彩度をあげる

出来上がってみると、色合いが渋いので、以下のコマンドで彩度を高めた。

magick -monitor 900-japan.png -modulate 100,200 910-japan.png

910-japan-small.png

まとめ

QGISとImageMagickを使って、ポスターサイズの日本地図を作成した。
陰影起伏図で塗られてしまう海域に、日本の陸地部分を透明化した海底地形図を重ねることで、陸地・海底ともに起伏がわかる地図となった。

今回は、画像形式で出力することにこだわった。
エクスポートも、画像ではなくベクトル(PDF)を選択するほうが、高精細な結果を期待できることは分かっていた。ただPDF形式は取り扱いづらいため、最終印刷時の解像度を満たせばよいというように割り切って作業を進めたためである。

付記 —— 精細かつ広域な地図

地理院地図では、ズームレベルに応じて表示できる地物が決まっている。

印刷レイアウト機能を少し試してみたが、ズームレベルが表示する範囲に即した小さいものになってしまうため、日本全体を表示しつつ表示可能ズームレベルが大きな地物を表示することは難しかった。(できるのかもしれないが、方法を見つけられなかった)。

このような場合でも、QGISの地図を画像でエクスポート機能を使うと、指定の縮尺(ズームレベル)かつ指定の範囲を含む画像を出力することができる。

例えば、全国の鉄道路線を描きたい場合、ズームレベル4では新幹線のみ、ズームレベル6でも主要な鉄道のみとなっており、すべてを描画するにはズームレベルを8以上にする必要がある。この記事のように画像でエクスポートすれば、ズームレベル8の精細さを全国広域にわたらせたような路線図を描画することもできる。

922-japan-small.png

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2