QGISでバッチ処理(その2):CSVの読み込み

2019/6/11追記:複数csvの読み込みからラスタ作成までをPythonでできるようにしました→QGISでバッチ処理(その3)

QGISでバッチ処理の続き。前回は複数の標高ラスタ(Geotiff)の傾斜量図をバッチ処理で作成した。今回は位置座標を持つCSVファイルを「複数」「一度に」読み込めるかどうか、試してみた。

QGISでは「デリミティッドテキストレイヤ」という扱いで、位置座標を持ったテキストファイルを読み込める(参考:XYZ形式のDEMデータをラスタに変換する(その2))。この機能はバッチ処理に対応していない。少し調べたら、Pythonコードを使うらしい。

とりあえず、前回使った国土地理院10mDEM5枚をgdal2xyzを使ってCSVに変換した(参考:QGISでラスタデータをXYZ形式に変換する)。もちろんバッチ処理。

スクリーンショット 2018-09-07 18.49.41.png

「コンマ区切りの値を出力する」を「はい」にする。出力先は同一フォルダで、処理したくないCSVファイルは除いておく。次いで、各CSVファイルに以下のようなヘッダを付ける。今回の場合、単にx, y, zで良い。

スクリーンショット 2018-09-07 19.53.49.png
スクリーンショット 2018-09-07 19.40.23.png

次にメニュー→プラグインからPythonコンソールを呼び出す。パネルが表示されるので、下側の入力ペインに以下のコードを入力してPythonのアイコンをクリックする(あるいはShift+Enter)。

import glob, os

# Define path to directory of your csv files
path_to_csv = "CSVの入ったフォルダのパス"

# Set current directory to path of csv files
os.chdir(path_to_csv) 
# Find each .csv file and load them as vector layers
for fname in glob.glob("*.csv"): 
    uri = "file:///" + path_to_csv + fname + "?delimiter=%s&crs=epsg:4326&xField=%s&yField=%s" % (",", "x", "y")
    name = fname.replace('.csv', '')
    lyr = QgsVectorLayer(uri, name, 'delimitedtext')
    QgsProject.instance().addMapLayer(lyr)

参考リンクのAdd multiple csv files to QGIS quickly…のコードです。元のコードはQGIS2.*用でQGIS3.*だと動かなかったので、ちょこっといじってます。QGIS2.*と3.*ではPythonのバージョンが違うので、同じコードはほぼ動きません。

4行目でCSVファイルの入ったフォルダを指定して、7行目でそこに移動。中のCSVファイルに対して、地理座標系(”epsg:4326″ / WGS84)とデリミタ(”,”)とX・Yのヘッダ(”x”, “y”)を与えて順次読み込ませ、レイヤ名を付けてQGISにロードという流れ。

実行結果。ちゃんと5つのファイルを読み込んでくれた。速度もそこそこ。

1

ちゃんと読み込めているか標高で色分けして確認。大丈夫そう。

2.png

結果、意外にすんなりできました。地理座標系が同じでないといけないけど。Pythonコンソール、勉強したら面白いかも。

※CSVを含むテキストファイルの改行コードについて注記。デフォルトの改行コードはMacがLF、WindowsがCR+LF。QGISは起動してるOSの改行コードに従うため、同じOSなら問題ないが、Mac⇄Windows間のやりとりは要注意。改行コードが認識できず、一行で読もうとする。MacでもExcelで保存したテキストファイルはCR+LFになってしまうので、CotEditorで修正するか、ファイルサイズが大きい場合はnkf(homebrewとかでインストールしてね)を使う。nkfでLFに変換して上書きする場合は以下の通り。

nkf -Lu --overwrite hogehoge.txt

参考リンク:

Stack Exchange: Loading Multiple CSV Files into QGIS 2.10

Blog "Geo-code": Add multiple csv files to QGIS quickly...

Stack Exchange: Is QgsMapLayerRegistry removed in QGIS3?

QGISでバッチ処理(その2):CSVの読み込み」への1件のフィードバック

  1. ピンバック: OGR:CSVをシェープファイルに変換する | Crackpot

コメントを残す