2024/04/18(木) [n年前の日記]
#1 [prog] QGISを試用中。その2
OpenGLで道路を描画するために、道路データが欲しい。QGISというソフトを使うと、現実世界の道路データを取得できるので、試用しているところ。
環境は、Windows10 x64 22H2 + QGIS 3.22.10 LTR。GSI-VTDownloader プラグインも利用している。
環境は、Windows10 x64 22H2 + QGIS 3.22.10 LTR。GSI-VTDownloader プラグインも利用している。
◎ QGISのベクタレイヤ上の座標をエクスポート :
_昨日、
道路の線データ(ラインデータ)を、QGIS上で表示するところまではできた。
このラインデータの座標値を、テキストファイル等で出力したい。
以下が参考になった。ありがたや。
_shpファイル(XY座標データ)をCSVファイル(緯度経度)で保存したい
一応手順をメモ。レイヤー名を右クリック → エクスポート → 新規ファイルに地物を保存、を選ぶ。
「ベクタレイヤを名前を付けて保存」というダイアログが開く。
これで、座標値らしきもの(緯度と経度?)を、csvファイルとして保存することができた。以下は出力サンプル。
_road2.csv
csvの中では、MULTILINESTRING ((...)) という形で座標値が出力されているけれど、x,y値が、空白とカンマ区切りで並んでいるので、エディタで開いて置換をすれば、それらしいデータが得られる。
ただ、一筆書きのラインのように見えつつも、実は分断されていて、複数のラインで構成されてしまっている時がある。そういった状態の場合、出力された csv の中で、座標値が「),(」等で区切られてしまっていたりする。上記のデータも、見事に分断してるデータになっていた…。
できれば、QGIS上で、ちゃんと繋がったラインになるように修正したい。
このラインデータの座標値を、テキストファイル等で出力したい。
以下が参考になった。ありがたや。
_shpファイル(XY座標データ)をCSVファイル(緯度経度)で保存したい
一応手順をメモ。レイヤー名を右クリック → エクスポート → 新規ファイルに地物を保存、を選ぶ。
「ベクタレイヤを名前を付けて保存」というダイアログが開く。
- 形式は、「カンマで区切られた値[CSV]」を選ぶ。
- ファイル名を指定。
- 座標参照系(CRF)は、EPSG:4326 - WGS 84 あたりにしておいた。
- 「レイヤメタデータを保持」のチェックを外す。
- レイヤオプションのGEOMETRYを、「AS_WKT」にする。もし、ラインではなくポイントを出力したい場合は、「AS_XY」を選べば良いらしい。
- 「保存されたファイルを地図に追加する」のチェックを外す。
これで、座標値らしきもの(緯度と経度?)を、csvファイルとして保存することができた。以下は出力サンプル。
_road2.csv
csvの中では、MULTILINESTRING ((...)) という形で座標値が出力されているけれど、x,y値が、空白とカンマ区切りで並んでいるので、エディタで開いて置換をすれば、それらしいデータが得られる。
ただ、一筆書きのラインのように見えつつも、実は分断されていて、複数のラインで構成されてしまっている時がある。そういった状態の場合、出力された csv の中で、座標値が「),(」等で区切られてしまっていたりする。上記のデータも、見事に分断してるデータになっていた…。
できれば、QGIS上で、ちゃんと繋がったラインになるように修正したい。
◎ スナップツールバーの表示 :
ラインの各頂点は、スナップ機能を使うことで、ピッタリ同じ座標にすることができる。そのため、修正作業の前準備として、ツールバー上にスナップツールバーも表示しておいたほうがいい。
ビュー → ツールバー → スナップツールバー、にチェックを入れる。これで、ツールバー上に、スナップツールバーが追加された状態になる。
磁石のようなアイコンをクリックすれば、スナップ機能の有効/無効を切り替えることができる。スナップ機能を有効にすれば、移動中の頂点を、他の頂点にピタリと吸着させることが ―― 移動中の頂点の座標値を、他の頂点の座標値とを全く同じ値にすることができる。
ビュー → ツールバー → スナップツールバー、にチェックを入れる。これで、ツールバー上に、スナップツールバーが追加された状態になる。
磁石のようなアイコンをクリックすれば、スナップ機能の有効/無効を切り替えることができる。スナップ機能を有効にすれば、移動中の頂点を、他の頂点にピタリと吸着させることが ―― 移動中の頂点の座標値を、他の頂点の座標値とを全く同じ値にすることができる。
◎ マーカーラインを使って最初の点と最後の点を表示 :
マーカーラインなる機能を使うと、「最初の点のみ」「最後の点のみ」に、何かしらのマーカーを表示することができるらしい。
_地物のラインに起点終点の表示をしたい
これを使えば、ラインが分断されていた場合、ラインのあちこちにマーカーが表示されるので、どこで分断されているか分かりやすいし、修正作業も楽になる。
ベクタレイヤ名の上で右クリックして「プロパティ」を選択。プロパティウインドウが表示される。
同様に、もう一つシンボルレイヤを追加して、マーカーの位置を「最初の点のみ」にする。
それぞれ、マーカーの見た目を異なる色や形にしておいたほうが見分けやすい。
これで、ラインが分断されているところには、マーカーがついてくれる。
後は、編集モード切替、かつ、スナップ機能を有効にして、分断されている箇所の頂点が同じ位置になるように修正していく。
修正が終わったら、ベクタ → 空間演算ツール → 融合 (dissolve)、を選んで、繋がっているラインに変換。別レイヤとして追加される。
さて、こうして得られた道路データは、正しいデータになっているのだろうか…。何かプログラムを作って、読み込ませて描画して、確認してみないと…。
_地物のラインに起点終点の表示をしたい
これを使えば、ラインが分断されていた場合、ラインのあちこちにマーカーが表示されるので、どこで分断されているか分かりやすいし、修正作業も楽になる。
ベクタレイヤ名の上で右クリックして「プロパティ」を選択。プロパティウインドウが表示される。
- 左側で「シンボロジ」なるタブを選んで、マーカーラインシンボルレイヤを追加していく。
- 右上のほうのプラスアイコンをクリックしてシンボルレイヤを追加。
- シンボルレイヤタイプを「マーカーライン」にする。
- マーカーの位置を、「最後の点のみ」にする。
同様に、もう一つシンボルレイヤを追加して、マーカーの位置を「最初の点のみ」にする。
それぞれ、マーカーの見た目を異なる色や形にしておいたほうが見分けやすい。
これで、ラインが分断されているところには、マーカーがついてくれる。
後は、編集モード切替、かつ、スナップ機能を有効にして、分断されている箇所の頂点が同じ位置になるように修正していく。
修正が終わったら、ベクタ → 空間演算ツール → 融合 (dissolve)、を選んで、繋がっているラインに変換。別レイヤとして追加される。
さて、こうして得られた道路データは、正しいデータになっているのだろうか…。何かプログラムを作って、読み込ませて描画して、確認してみないと…。
◎ Python+pygameで表示してみた :
Python 3.10.10 64bit + pygame 2.5.2 を使って、簡易表示してみることにした。
元のデータは以下。QGISからエクスポートしたcsvを、テキストエディタで修正して、x,y だけが並んでる状態にした。
_housakatouge.csv
_motosuko.csv
QGISのスクリーンショットと、Python + pygame で表示したソレを並べてみる。
一応それらしい形が表示されて喜んだものの、よく見てみると、なんだか縦に潰れてしまっている…。
元のデータはおそらく緯度と経度(経度と緯度?)なのだろうけど、1:1ではないのかもしれない。比率の違いがどの程度なのかググってみたけど、そのものズバリを説明してるページは見当たらず。しかし、たまたま、違いは1.3程度と言及してる箇所に遭遇。その値が本当に正しいのかどうかは分からんけれど、試しに縦方向を1.3倍してみた。
大体似た感じになってるから、これでいいかな…。本来、北や南に行くに従って、地球の円周の長さも変わってくるだろうから、そのあたりを補正しないといけない気もするけれど、正確な形状が欲しいわけでもないので、こんな感じでもいいだろう…。
書いた Pythonスクリプトは以下。
_draw_line.py
カーソルキーの左右、もしくは上下で、カーソル位置を変更する機能もつけておいた。道路の形に沿ってカーソル位置が変わっていくことで、一筆書き状態のデータになっていることも確認できた。
余談。久々に pygame を触ったので使い方を色々忘れてしまっていて、ググって解説ページを眺めつつ作業してみたけれど。昔と違って、pygame の解説ページが随分と増えている印象を受けた。一時期の pygame がオワコン扱いライブラリだったことを思い返すと、なんだか目頭が熱く…。pygame で使ってる SDL が 1.x から 2.x になって描画処理が高速化したことで復権できたのだろうか。いや、tkinter (Tcl/Tk の Tk を Python から利用できるようにしたライブラリ)もそうだけど、Python の人気に引っ張られる形で各ライブラリ/モジュールが再注目されていった面もあるのだろうな…。
元のデータは以下。QGISからエクスポートしたcsvを、テキストエディタで修正して、x,y だけが並んでる状態にした。
_housakatouge.csv
_motosuko.csv
QGISのスクリーンショットと、Python + pygame で表示したソレを並べてみる。
一応それらしい形が表示されて喜んだものの、よく見てみると、なんだか縦に潰れてしまっている…。
元のデータはおそらく緯度と経度(経度と緯度?)なのだろうけど、1:1ではないのかもしれない。比率の違いがどの程度なのかググってみたけど、そのものズバリを説明してるページは見当たらず。しかし、たまたま、違いは1.3程度と言及してる箇所に遭遇。その値が本当に正しいのかどうかは分からんけれど、試しに縦方向を1.3倍してみた。
大体似た感じになってるから、これでいいかな…。本来、北や南に行くに従って、地球の円周の長さも変わってくるだろうから、そのあたりを補正しないといけない気もするけれど、正確な形状が欲しいわけでもないので、こんな感じでもいいだろう…。
書いた Pythonスクリプトは以下。
_draw_line.py
python draw_line.py housakatouge.csv python draw_line.py motosuko.csv
カーソルキーの左右、もしくは上下で、カーソル位置を変更する機能もつけておいた。道路の形に沿ってカーソル位置が変わっていくことで、一筆書き状態のデータになっていることも確認できた。
余談。久々に pygame を触ったので使い方を色々忘れてしまっていて、ググって解説ページを眺めつつ作業してみたけれど。昔と違って、pygame の解説ページが随分と増えている印象を受けた。一時期の pygame がオワコン扱いライブラリだったことを思い返すと、なんだか目頭が熱く…。pygame で使ってる SDL が 1.x から 2.x になって描画処理が高速化したことで復権できたのだろうか。いや、tkinter (Tcl/Tk の Tk を Python から利用できるようにしたライブラリ)もそうだけど、Python の人気に引っ張られる形で各ライブラリ/モジュールが再注目されていった面もあるのだろうな…。
[ ツッコむ ]
以上です。