2019/6/11追記:複数csvの読み込みからラスタ作成までをPythonでできるようにしました→QGISでバッチ処理(その3)
QGISでバッチ処理の続き。前回は複数の標高ラスタ(Geotiff)の傾斜量図をバッチ処理で作成した。今回は位置座標を持つCSVファイルを「複数」「一度に」読み込めるかどうか、試してみた。
QGISでは「デリミティッドテキストレイヤ」という扱いで、位置座標を持ったテキストファイルを読み込める(参考:XYZ形式のDEMデータをラスタに変換する(その2))。この機能はバッチ処理に対応していない。少し調べたら、Pythonコードを使うらしい。
とりあえず、前回使った国土地理院10mDEM5枚をgdal2xyzを使ってCSVに変換した(参考:QGISでラスタデータをXYZ形式に変換する)。もちろんバッチ処理。
「コンマ区切りの値を出力する」を「はい」にする。出力先は同一フォルダで、処理したくないCSVファイルは除いておく。次いで、各CSVファイルに以下のようなヘッダを付ける。今回の場合、単にx, y, zで良い。
次にメニュー→プラグインから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つのファイルを読み込んでくれた。速度もそこそこ。
ちゃんと読み込めているか標高で色分けして確認。大丈夫そう。
結果、意外にすんなりできました。地理座標系が同じでないといけないけど。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?
ピンバック: OGR:CSVをシェープファイルに変換する | Crackpot