14
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

OpenStreetMapAdvent Calendar 2022

Day 7

OpenStreetMapのデータから河川と湖沼だけのポスターを作ってみた話

Last updated at Posted at 2022-12-10

はじめに

2022年12月3日開催のOpenStreetMap(以下OSM)のお祭り、State of the Map Japan 2022 加古川(以下SotMJ)のパネル展示作品として、OSMのデータから北海道と淀川水系の河川と湖沼だけを抽出した2枚のB2版ポスターを作成しました。
作業の振り返りなどまとめます。

Hokkaido_small.png
Yodogawa_small.png
(縮尺表示はB2印刷時のものなので、この縮小画像上では正確な数値ではありません)

作成動機

私は自分の住んでる北海道を中心にOSMのマッピングを続けていて、河川、湖沼、森林など、自然の地物のマッピング比率多めです。
河川マッピング作業中にJOSMのフィルタ機能で河川だけを表示させてみたら、おやこれは美しい。(図は知床半島)
Screenshot from 2022-12-10 18-00-00.png
いつかこれを端末の中だけのデータじゃなくて、ちゃんと形のある地図にしてみたいと心の中で温めること数年。
SotMJに実行委員として携わりながら、そうだあのネタをどうにかして印刷してパネル展示の作品として参加するべ、と思いついたのが開催1週間前のことでした。

とりあえず思い入れ深い北海道の河川データを抽出して完成への道が見えてきたところで、加古川という立地上関西の参加者が多そうだから、ただ北海道の地図展示しても、形がはっきり出るんだねーすごいねーで終わってしまうだろうなと思い、せっかくなら地図を指差しながら地元の川や湖を熱く語れたら楽しいよねと、流域人口の多そうな淀川水系を追加で作ることに。
日本最大の湖が鎮座してるので、日本人なら誰もがその形を知っててわかりやすい北海道とはまた違った意味で、絵になる地図ができそうとも考えました。

作り方

作業環境

  • Ubuntu 22.04 LTS
  • JOSM 18583
  • QGIS 3.22.4 'Białowieża'
  • GIMP 2.10.30
    オープンソースばんざい。
    いずれもマルチプラットフォームなツールなので、WindowsでもMacでもできると思います。たぶん。

JOSMでやる作業

ダウンロード対象オブジェクト

今回ダウンロードして地図にしたいOSMのオブジェクトは次の通り。

  • waterway=river :河川

  • waterway=stream :小川
    この2つはウェイ(閉じていない線)。

  • natural=water :水域
    これはエリア(閉じた線)、またはリレーション(複数のウェイの複合オブジェクト)。
    湖(water=lake)、貯水池(water=reservoir)、池(water=pond)、河川の水域ポリゴン(water=river)などサブタグが色々ありますが、natural=waterだけでサブタグがなくてもOSM標準タイルでは水域としてレンダリングされるので、サブタグが付けられてないnatural=waterも結構あります。
    貯水池が含まれても今回のテーマ的には別に構わないので、サブタグの有無は無視してnatural=waterが付けられたエリアとリレーションを全部ダウンロードすることにします。

  • landuse=reservoir
    貯水池のタグ付けはnatural=water + water=reservoirに変わりましたが、ダム湖などにまだ古い方法でタグ付けされたオブジェクトが残っているので、必要ならこれも含めます。前項と同じくエリアとリレーションです。

JOSMでOverpass APIを使う

Overpass APIとは、OSMのサーバーから指定する条件を満たすデータだけを抽出してダウンロードできる魔術(筆者主観)です。

最初に、JOSMの「表示」をクリックして出てくるメニューの一番下の「上級者モード」にチェックを入れます。
Screenshot from 2022-12-10 18-15-56.png
上級者モードでデータダウンロードボタンをクリックすると、普段使う「OSMからダウンロード」の隣に「Overpass APIからダウンロード」というタブが現れます。
Screenshot from 2022-12-10 18-21-59.png

クエリを作成してOSMデータを抽出ダウンロード

「Overpassクエリ」という欄に何か書いてありますが、詠唱言語を一から学んで入力するのは大変なので、「クエリウィザード」をクリックして魔女さんに頼ります。

「検索文字列」の欄に、waterway=river in 滋賀県と入力して「クエリーを作成」をクリックすると、
Screenshot from 2022-12-10 18-25-01.png

[out:xml][timeout:90];
{{geocodeArea:滋賀県}}->.searchArea;
(
  nwr["waterway"="river"](area.searchArea);
);
(._;>;);
out meta;

というクエリが自動生成されます。
Screenshot from 2022-12-10 18-25-14.png

{{geocodeArea:滋賀県}}は、このクエリの検索対象エリアを示します。
OSM上で行政境界や島などとして既存のエリアやリレーションがある場所を指定できるようで、現在の日本なら都道府県、市町村、(町村の場合は)郡、(北海道や東京都島嶼部などでは)振興局や支庁、淡路島や四国のような島などの単位で検索できるようです。

ちなみにウィザードでin〇〇を指定しないとここは[bbox:{{bbox}}]となって、JOSMで現在表示されている画面の範囲で検索が行われます。バウンディングボックスの意です。

nwr["waterway"="river"](area.searchArea)は、上で定義した検索対象エリアから、waterway=riverというタグがついた node (ノード=点)、 way (ウェイとエリア)、 relation (リレーション)の全てを検索するという意味ですが、今回はウェイだけでいいのでway["waterway"="river"]と書き換えます。
タグのキー(=の左側)も値(右側)もクエリ内ではダブルクオーテーションで囲むのが、この詠唱言語のお約束です。
一つのクエリ内に複数の検索条件を並列させて構わないので、この文法で前述のダウンロード対象オブジェクトを書き加え、

[out:xml][timeout:90];
{{geocodeArea:滋賀県}}->.searchArea;
(
  way["waterway"="river"](area.searchArea);
  way["waterway"="stream"](area.searchArea);
  way["natural"="water"](area.searchArea);
  relation["natural"="water"](area.searchArea);
  way["landuse"="reservoir"](area.searchArea);
  relation["landuse"="reservoir"](area.searchArea);
);
(._;>;);
out meta;

として詠唱を完成させます。
(面倒ならこのコードをまるっとコピペして地名の部分だけ好きな場所に書き換えてください。)

下のダウンロードボタンをクリックしてダウンロードします。
数分かかりますが、琵琶湖を含む滋賀県の湖沼と河川が、データレイヤー1としてダウンロードされました。
Screenshot from 2022-12-10 18-35-13.png

間違ってレイヤーごと消してしまうと悲しいので、一旦適当な名前を付けて任意の場所に保存します。ここではyodogawa.osmとします。*.osmはOSMデータファイルの形式です。
誤ってアップロードしてOSM本家のデータをぶっ壊すことを防ぐために、右クリックから「アップロードを抑制」をチェックしておくのがおすすめです。
Screenshot from 2022-12-10 18-37-58.png
Screenshot from 2022-12-10 18-41-23.png

保存後もどんどんダウンロードデータを追加して上書き保存可能です。
再びダウンロードのOverpassクエリを開き、さっきのクエリが残っているので、滋賀県の箇所だけを手動で京都府に書き換えて、他の条件はそのままで再度ダウンロードを実行します。
滋賀県のデータだけだったyodogawa.osmに、京都府の河川と湖沼が追加されました。

淀川水系は滋賀県、京都府の他、大阪府、奈良県、三重県、兵庫県に及んでますが、これらの府県は府県単位でダウンロードすると削除する河川の方が多くなってしまうので、市町村単位で細かく地図を確認しながらダウンロードしていく方が最終的な手間とサーバーの負荷は減るような気がします。

国交省近畿地方整備局淀川河川事務所Wikipedia等々のサイトを熟読しながら淀川水系と思われる河川が流れる市町村を指定して、追加ダウンロードしていきます。
関西の地理には疎いので、ある意味旅行前のいい復習になりました。

不要データのクリーニング

滋賀県の河川は大半が淀川水系ですが、一部日本海側の小浜に流れる河川があるのをこの作業を通して知りました。
京都府の北の方も日本海側に流れる水系です。
市町村単位で細かくダウンロードしても、奈良市などは一つの市の中に淀川水系と大和川水系があります。

今回の淀川水系というテーマに合わないオブジェクトを、JOSM上で手作業で削除します。
河川だけ表示してもわかりにくいので、地理院標準地図やOpenStreetMap標準タイルを背景にして、適宜切り替えながら目視で読み取り判断してこつこつ削除しました。
OSMの河川ウェイには方向性があるので、小さな矢印を見て流れる方向から淀川水系か否かを読み取ることもできます。

「投げ縄選択モード」にすると、削除したい部分をマウスでぐるっとドラッグして選択でき、Deleteキー一発でざっくり消えます。
細かいところは普通の選択モードで1本選択し、「選択」→「全ての接続されたウェイを選択」(Ctrl+Shift+E)で初期設定なら15階層まで辿ってまとめて選択してくれるので、その状態でDeleteです。
Ctrl+Shift+Eを繰り返すとその度に15階層ずつ接続されたウェイを辿っていきます。
なお「全ての接続されたウェイを選択」は、UtilsPlugin2というJOSMプラグインをインストールすると使えるようになる機能です。

QGISあたりでもっと合理的かつ論理的に作業する方法がありそうですが、難しいことはわからないので慣れたJOSMで原始的な作業です。

淀川河口周辺では、旧淀川など別の河口を持ってるけど淀川水系という川が何本もあり、一方で別の水系である大和川などとも水路で連結されてるので、水系の境界線の見極めに苦労しました。
こういう場所は「接続されたウェイを選択」で機械的にやると消しちゃいけないオブジェクトまで消しちゃうので、怪しい場所は慎重に1本ずつ選択して削除します。

作品に不要なオブジェクトを全部消したら、.osmファイルを上書き保存してJOSMでの作業は終了です。

QGISでやる作業

インポート準備

QGISの作業用にフォルダを作成します。
ここではyodogawaというフォルダ名にします。
このフォルダに、前項で保存したyodogawa.osmファイルを移動もしくはコピーします。

プロジェクト作成

QGISを起動して新規プロジェクトを作成し、前項で作成した作業用フォルダに保存します。
ここではyodogawa.qgzというファイル名にしました。
Screenshot from 2022-12-10 11-04-49.png

背景地図がないと作業しづらいので、最初にOSM標準タイルを表示させます。
レイヤ→レイヤを追加→XYZレイヤを追加で、OpenStreetMapを選択して読み込みをクリックすると、OSMの地図が表示されます。
Screenshot from 2022-12-10 11-06-40.png
Screenshot from 2022-12-10 11-08-27.png
Screenshot from 2022-12-10 11-09-18.png

最初は緯度0経度0の大西洋のど真ん中に飛ばされて青一色の画面でわけがわからないかもしれませんが、その場合はズームなりスクロールでこれから作業する関西あたりに移動しておきます。
Screenshot from 2022-12-10 11-11-20.png

潰れた感じで縦横比がおかしいですが、これは座標参照系の初期設定がWGS84 EPSG:4326というGPSで使用されているものになっていて、地図の投影法が異なるためです。
このまま作業を進めると、淀川水系の地図も潰れた感じにできあがってしまいます。
琵琶湖の形が歪だと、滋賀県民の皆様からクレームが来そうです。

ウインドウ右下のEPSG:4326と表示された部分をクリックして座標参照系の設定画面を開き、フィルタに3857と入力して検索し、WGS84/Pseudo-Mercator EPSG:3857に変更すると、OSMの地図画像が普段見慣れた縦横比になりました。
EPSG:3857はOSMやGoogleマップなどのWEB地図で一般的に使われている、メルカトル図法で地図表示する座標参照系です。
Screenshot from 2022-12-10 11-12-13.png

OSMデータファイルをインポート

QGISのウインドウ左側のブラウザ部分で「プロジェクトホーム」の行の左端の三角をクリックすると、作業用フォルダにあるファイルが展開されます。
先程保存したOSMからのダウンロードデータyodogawa.osmが見えるので、更に三角をクリックして展開すると、

  • lines
  • multilinestrings
  • multipolygons
  • other_relations
  • points
    の5つのレイヤが見えます。
    Screenshot from 2022-12-10 11-16-16.png

河川のウェイはlinesに、湖沼のエリアやリレーションはmultipolygonsに含まれているようです。
この2つをそれぞれ右クリックし、「レイヤをプロジェクトに追加する」を選択します。
自動設定で川っぽさのない色使いですが、とりあえず河川と湖沼が画面上に表示されました。
Screenshot from 2022-12-10 11-22-13.png

linesレイヤを上にすると、水路をつなぐために琵琶湖の中に描かれた河川ウェイも見えてしまって美しくないので、一番上に湖沼が収納されたmultipolygonsレイヤ、次に河川が収納されたlinesレイヤの順に並べ替えます。
OpenStreetMapレイヤは一番下にして、とりあえず非表示にしておきます。
Screenshot from 2022-12-10 12-11-11.png

レイヤスタイルの設定

linesかmultipolygonsのどちらかのレイヤを選択した状態で、レイヤウインドウの一番左のアイコンをクリックし、レイヤスタイルの設定画面を表示させます。
Screenshot from 2022-12-10 12-13-14.png
linesでは直線(Simple Line)を選択し、地図上の河川の色と太さを設定します。
Screenshot from 2022-12-10 12-14-49.png
Screenshot from 2022-12-10 12-14-41.png
multipolygonsではシンプル塗りつぶしを選択し、ストローク色で湖沼の輪郭の色と太さ、塗りつぶし色で湖沼の中身の色を設定します。
Screenshot from 2022-12-10 12-16-27.png

今回の地図では
湖沼の輪郭 #007fff
河川 #3399ff
湖沼の中身 #7abcff
と、青の同系色で明るさだけを変えるスタイルにしました。
線の太さはいずれも0.26mmです。

ポスター用の印刷レイアウトを作成

QGISの画面上で地図が完成したので、印刷用のデータを出力するための新規印刷レイアウトを作成します。
Screenshot from 2022-12-10 12-18-34.png

B2縦ポスターという名前を付けた印刷レイアウトが、別ウインドウで開きました。
ページの何もないところを右クリックしてページのプロパティを表示し、ページサイズを初期設定のA4から今回出力したいB2・縦に変更します。
Screenshot from 2022-12-10 12-25-41.png

地図を追加

メニューの追加→地図を追加(もしくは左端のツールバーの地図を追加ボタン)をクリックし、カーソルが十字になるのでページいっぱいに長方形を作成します。ページの端には自動でスナップしてくれます。
Screenshot from 2022-12-10 12-35-10.png
Screenshot from 2022-12-10 12-35-13.png
しばらく「地図を描画しています」の表示になった後、QGIS本体側のウインドウで表示されている地図がレイアウト画面に表示されますが、縮尺が小さいです。
Screenshot from 2022-12-10 12-38-28.png
メインプロパティの縮尺の欄にあれこれ数字を入れて試行錯誤、このサイズにぎりぎり収めるには270000分の1がちょうどいい感じでした。
今度は位置がずれてるので、メインプロパティの上の「地図範囲をインタラクティブ編集」ボタンをクリックし、地図をドラッグして位置を調整します。
Screenshot from 2022-12-10 12-52-46.png

文字を追加

地図がいい位置に収まったら、タイトルや権利表示等の文字を追加します。
文字は追加→ラベルを追加から。
Screenshot from 2022-12-10 13-22-48.png
ラベルのメインプロパティのところに文字列を入力し、フォント、サイズ、色などはその下の外観のところで設定します。
今回の使用フォントは自家製 Rounded M+で統一し、色も地図本体で使用しているのと同系色でまとめています。
水域の英訳を調べるとbody of waterの方が一般的らしいですが語呂が悪いので、waterbodyという表現もあるということでこちらを採用。
Screenshot from 2022-12-10 13-37-26.png
OSMのデータを使った作品なので、権利表示を記載。(印刷物の場合これで大丈夫だったかな…と実はちょっと自信なし)
Screenshot from 2022-12-10 14-11-26.png

スケールバーと縮尺表示を追加

スケールバーは、追加→スケールバーから。もしくは左端のツールバー中段あたり。
シンプルにまとめたいので、「中央チック」というスタイルを選択します。
Screenshot from 2022-12-10 14-21-08.png
線やフォントの色などは下の方の「表示名」というところを開くと設定できます。
Screenshot from 2022-12-10 14-20-56.png

縮尺表示はもう一つスケールバーを追加して、数値(Numeric)というスタイルを選ぶと「1:270000」のような表示になります。
フォントや色は同じく「表示名」から設定。
Screenshot from 2022-12-10 14-26-54.png

方位記号を追加

方位記号は、追加→方位記号から。もしくは左端のツールバー。
十字カーソルに変わるのでレイアウトの右上にざっくり四角を描いて、アイテムプロパティのSVGブラウザのarrowsを選択し、QGISにいくつかプリインストールされているSVGの方位記号から適当なものを選びます。
Screenshot from 2022-12-10 14-39-14.png
色は下の方のSVGパラメータで設定。
Screenshot from 2022-12-10 14-43-50.png
自作のPNGとかSVGの画像があるならそちらも設定できますが、ここに手間をかける気はなかったのでありあわせで済ませました。

背景を透明化して保存

最後にもう一度ページのプロパティを表示します。(地図が前面にあってページを選択できない場合は地図のチェックを一旦外して非表示に)
Screenshot from 2022-12-10 14-53-03.png
背景が白100%になってますが、このままだと白背景付きでエクスポートされてしまうので、不透明度を0%に変更します。
Screenshot from 2022-12-10 14-50-13.png
地図以外のアイテム、ラベル(文字)や方位記号、スケールにも不要な背景が設定されている場合は透過してから印刷レイアウトを保存します。

印刷用PNG画像をエクスポート

印刷レイアウト画面のレイアウト→画像としてエクスポート、もしくは上のツールバーからアイコンをクリックし、yodogawa.pngという名前を付けてPNG形式で保存します。
Screenshot from 2022-12-10 15-33-50.png
画像エクスポートオプションの画面で解像度などが設定できますが、印刷会社の入稿規定が350dpi指定なので、エクスポート解像度を350dpiとして保存します。
画像自体のサイズはQGISにお任せですが、6889x9742pxと自動計算されました。
Screenshot from 2022-12-10 15-39-04.png
この画像を保存して、QGISでの作業は完了です。

PDF形式、SVG形式でのエクスポート機能もありますが、PSD形式での印刷入稿という用途にはPDFやSVGを選ぶメリットがなかったので、そのまま貼り付けられるPNG形式で出力しました。

GIMPでやる作業

印刷会社のテンプレート

今回の印刷は、オンデマンド印刷でポスター1枚から注文できるグラフィックさんに発注しました。
同社の入稿は商品によって若干異なりますが、基本はIllustratorのai形式かPhotoshopのPSD形式で、PSDの場合は350dpi推奨です。
筆者のUbuntu環境ではGIMPでPSD形式が扱えるので、PSD形式のB2用テンプレートをダウンロードしました。

テンプレートのサイズは塗り足し部分を含めて7179x10114px、ガイドで示されている裁ち切り線(ポスター仕上がり実寸)は7096x10031pxです。
Screenshot from 2022-12-10 16-18-50.png

ここにQGISから出力したさっきのyodogawa.png(6889x9742px)をドラッグするとレイヤとして読み込まれ、キャンバスの中央に配置されますが、テンプレートの裁ち切り線より小さいので余白ができています。
Screenshot from 2022-12-10 16-21-58.png
Screenshot from 2022-12-10 16-23-27.png

QGISから出力した画像でなぜか琵琶湖の島が白く抜けずに湖と同じ色で塗りつぶされてたので、入稿前に島の中をバケツツールで白く塗るというひと手間をかけています。
北海道の方はちゃんと抜けてたので謎ですが、原因突き止めるより塗っちゃった方が早いので。

はみ出したりキャンバスに合わせて縮小されて解像度が変更されたりするわけではないので、べつにいいやーということでこのまま入稿します。
背景がないとイメージしづらいので裁ち切り線に合わせた白背景レイヤーを挿入して確認するとこんな感じです。
Screenshot from 2022-12-10 16-28-41.png
今後修正があった時などのためにひとまずGIMPのxcf形式で保存した後、白背景レイヤーや元々テンプレに入っていた空レイヤーを削除し、読み込んだyodogawa.pngの1枚だけの状態にして、PSD形式でエクスポートして入稿用のデータを作成します。

オンライン入稿

同社のサイトでポスター印刷を注文後、指示に従ってこのPSDファイルをオンライン入稿し、チェック完了のお知らせメールが来たら後は納品を待つだけです。
GIMPはCMYKカラースペースが使えなくてRGBカラースペースで作成するので、会社によると思いますが、グラフィックさんの場合は注文時の無料オプションでRGBデータ入稿を選択する必要があります。更にsRGBとAdobeRGBのどっちかを選べと言われますが、AdobeってことはないはずなのでsRGBでしょう多分。
ちゃんとイメージ通りの色で納品されたので大丈夫だったんでしょう。

日曜夕方に入稿して、その日の23時ぐらいに完了メール来てびびりました。ブラック労働じゃないのか大丈夫か。
今改めてサイト確認したら、PSDファイルにしなくても、スマプリというサイト上の無料デザインツールでポスター入稿もできるので、QGISからサイズと解像度を合わせて出力したPNGファイルをそのままスマプリに放り込んでもたぶん行けてたような気がしてきましたが、今後の勉強になったと思うことにします。

納品&展示

合成マット紙B2縦1枚オンデマンド印刷で2160円、3日納期で京都のグラフィックさんから出荷され、チェックイン日に合わせ翌日には神戸の宿泊先に配達されました。(もっとお金払えば1日納期でもやってもらえるらしいすごい)
関西から北海道の自宅まで送ってもらうと3〜4日かかるので間に合わないところでした。雪で通行止めとかあると更に納期延びるし。

一般的なポスターのスタンダード光沢紙なら1枚1830円ともう少し安いですが、紙だと使い捨てになってしまうので、展示後家に持ち帰って貼ったり、別のOSM関係イベントに使いまわすことを考えて、合成紙を選択。
会場のパネルとテープの相性が悪く貼り直したりすることになったので、合成紙は大正解でした。

感想とまとめ

SotMJ会場では、このポスターがきっかけでいろいろな方とお話できました。
淀川水系の方では、このあたりは水路が縦横に張り巡らされてて水田地帯なのがよくわかるねとか、琵琶湖疏水の話とか、矢橋帰帆島の埋め立ての話とか、急がば回れの語源はここだよとか。
皆さん地図とかまちおこしをテーマに集まってるだけあって、地元の地図を目の前にするといろんな引き出しからあれこれ飛び出してくるので、関西の地理や風土をよく知らない私も楽しかったです。
北海道版も特に来道したことのある方から、日高山脈の分水嶺がはっきりわかるとか川がないので羊蹄山がわかるねとか、川だけで細い野付半島まで浮き出るのすごいとか、いろんなコメントがありました。

作った私がすごいのではなくて、自然がすごいのと、これらの河川や湖沼をインポートしたり1本1本マッピングしたマッパー諸氏がすごいのですが、
「これをおかずに飯が食える」
地図好きから地図好きへの最上級の賛辞、いただきました!

14
8
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
14
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?