QGISに付属の便利なコマンド
- ファイルを変換する
- ファイルの座標系を変える
- ファイルをまとめて変換する
- PostGISにインポートする
- GeoPackageにGeoTiffを追加する
- GeoPackageにシェープファイルを追加する
QGISをインストールすると、便利なコマンドが付いてくるので、いくつか使い方を紹介します。 このページではQGISのバージョンは3.6、PowerShellのバージョンは5.1.17763.592を使っています。
こちらのページで紹介した、環境変数の設定までを済ませておいて下さい。
ファイルを変換する
ogr2ogr -f "MapInfo File" 変換後ファイル.mif 変換前ファイル.shp
変換前.shpを変換後ファイル.mifに変換します。-f のオプションに渡す文字列には、変換後のファイルフォーマットを指定します。どんなフォーマットが対応しているかは、次のコマンドで確認できます。
ogrinfo --formats
日本語が文字化けする場合
ogr2ogr -lco ENCODING=cp932 -f "MapInfo File" 変換後ファイル.mif 変換前ファイル.shp
Shift-JISで出力したい場合は、オプションに「-lco ENCODING=cp932」を指定します。
ファイルの座標系を変える
ogr2ogr -t_srs EPSG:2443 -s_srs EPSG:4326 変換後ファイル.mif 変換前ファイル.mif
-t_srsで変換後ファイルの座標系を指定します。
-s_srsで変換前ファイルの座標系を指定します。
ファイルをまとめて変換する
指定したフォルダ内のシェープファイルをKMLに変換するコードです。
$env:GDAL_DATA="C:\Program Files\QGIS 3.6\share\epsg_csv" # GDALが使うデータフォルダ $before=".shp" # 変換前の拡張子 $after=".kml" # 変換後の拡張子 $dir="d:\変換したいファイル" # 変換したいファイルが格納されているフォルダ $type="KML" # 変換後のファイルタイプ New-Item $dir\"conv" -itemType Directory -Force foreach ($s in Get-ChildItem $dir\ -Name *$before) { $new = [System.IO.Path]::ChangeExtension($s, $after) ogr2ogr -f $type $dir\conv\$new $dir\$s }
上のコードの1~5行目を編集して、PowerShellに貼り付けて実行してみてください。
PostGISにインポートする
ogr2ogr -lco encoding=CP932 PG:"host=localhost user=ユーザー名 dbname=インポート先データベース password=〇〇〇〇" -nln レイヤ名 インポートしたいファイル
GeoPackageにGeoTiffを追加する
gdal_translate -of GPKG 追加したいtiff.tif 追加先.gpkg -co APPEND_SUBDATASET=YES -co RASTER_TABLE=テーブル名
追加先.gpkgが存在しない場合は、作成されます。
GeoPackageにシェープファイルを追加する
$dst="F:\〇〇.gpkg" # 追加先のgeopackageファイル foreach ($s in Get-ChildItem .\ -Name *.shp) { ogr2ogr -append $dst $s }
shpが格納されているフォルダに移って、上のコードの1行目を編集して、PowerShellに貼り付けて実行してみてください。
お疲れさまでした。
QGIS3 Plugin Builderでプラグイン作成
- Plugin Builderをインストールする
- Plugin Builderを使ってみる
- 作成したプラグインを実行してみる
- Plugin Builderで作成した雛形に少し手を加える
- metadata.txtを編集後に「属性情報の読み取りエラー」でプラグインが使えなくなる場合
- よく使う雛形
このページでは、QGISのプラグイン「Plugin Builder」についてご紹介していきます。Plugin Builderは、QGISのプラグインの雛形を作成してくれる補助ツールです。このプラグインを使えば、QGISのプラグイン作成が大分楽になります。
Plugin Builderをインストールする
プラグイン管理のダイアログを表示する
QGISを起動して、メニューの『プラグイン』→『プラグインの管理とインストール』を選択して下さい。
Plugin Builderを検索する
Plugin Builderをインストールします。上の赤丸の検索窓で検索すると見つけやすいです。
候補に出てきた『Plugin Builder 3』を選択してインストールして下さい。
メニューに表示される
Plugin Builderがメニューから選択できるようになりました。
Plugin Builderを使ってみる
必要項目を入力する
Plugin Builderが使えるようになったので、試しにPlugin Builderでプラグインのひな型を作成して実行してみます。メニューの『プラグイン』→『Plugin Builder』を実行し、上の画面のように必要事項を入力してNextボタンを押して下さい。
作成するプラグインの説明文を入力する
この辺りは適当に入力して下さい。
追加コンポーネントを選択
今回はそのままにしました。本家サイトを確認しましたが、必須ではないようです。
チェックを全部外して実行してみましたが、問題も発生していません。
プラグインのレポジトリ等
ここもそのままで、ただ一応お試しプラグインなので、赤丸部分のチェックボックスにチェックを入れておきました。
作成するプラグインの保存先を指定します。私は『E:\QGIS Plugin』フォルダを指定しました。赤線部分がこのプラグインの保存先になります。画像では保存先がDドライブになっていますが、気にしないでください。
pyrcc5 was not found ?
「The resource compiler pyrcc5 was not found in your path.」と警告ダイアログが表示されるので、PowerShellを起動して次のコードを入力します。
cd "E:\QGIS Plugin\test_plugin" pyrcc5 -o resources.py resources.qrc
1行目で作成中のプラグインの保存先に移動して、2行目でpyrcc5コマンドを実行しています。
pyrcc5コマンドを実行するにはPathを設定しないといけません。こちらで紹介した設定を済ませていればパスは通っています。
環境変数QGIS_PLUGINPATHの設定
⑦QGISが今作成したプラグインを探せるように、環境変数QGIS_PLUGINPATHを設定します。次のコードをPowerShellに張り付けて実行して下さい。
$old = [System.Environment]::GetEnvironmentVariable("QGIS_PLUGINPATH", "User") $old += ";E:\QGIS Plugin" [System.Environment]::SetEnvironmentVariable("QGIS_PLUGINPATH", $old, "User")
作成したプラグインを実行してみる
環境変数QGIS_PLUGINPATHの設定に問題無ければ、QGISを起動すれば先ほど作成したプラグインはメニューに表示されるはずですが、もし見当たらない場合は次の方法を試してください。
メニューに表示されていればこちらに進んでください。
プラグインを有効にする
QGISに戻って、メニューの『プラグイン』→『プラグインの管理とインストール』を選択して下さい。
検索窓に先ほど作成したプラグインの名前を入力するとプラグインが見つかります。チェックして有効にして下さい。
プラグインを実行する
作成したプラグインがメニューに登録されています。実行してみると...
ウィンドウが表示されました。
Plugin Builderで作成した雛形に少し手を加える
Designerを実行する
フォームに少し手を加えてみます。「Qt Designer」を起動します。スタートボタンを押して、検索窓に「designer」と入力すると、候補が出てきます。上の赤丸を選択してください。
UIファイルを開く
先ほど作成したTest Pluginのフォームを選択します。メニューの「ファイル」→「開く」を選択すると、ファイル選択ダイアログが出るので、「E:\QGIS Plugin\testplugin\test_plugin_dialog_base.ui」を選択すると...
Test Pluginのフォームが表示されました。
Line Editを貼り付けてみる
Line Editを貼り付けます。貼り付けたらメニューの「ファイル」→「保存」を選択して、Designerを終了します。
プラグインに反映されているか確認する
フォームの変更が反映されているか確認してみます。QGISを起動して、Test Pluginボタンをクリックします。Line Editが追加されたフォームが表示されましたでしょうか?
ソースコードを編集する
ソースに少し手を加えてみます。test_plugin.pyを編集します。33行目あたりに次のコードを追加します。
import qgis.core
さらに185行目あたりにあるrunメソッドの「if result:」と書かれたコードの下に次のコードを挿入します。lineEditに指定したシェープファイルを読み込むコードです。
file = self.dlg.lineEdit.text() layer = qgis.core.QgsVectorLayer(file, u"サンプルレイヤ", "ogr") if layer.isValid(): qgis.core.QgsProject.instance().addMapLayer(layer)
実行してみる
QGISを起動して、Test Pluginを実行します。そしてLine Editに適当なシェープファイルのフルパスを指定してOKボタンをクリックします。指定したシェープファイルがQGISに読み込まれると思いますが、うまく表示されたでしょうか?
metadata.txtを編集後に「属性情報の読み取りエラー」でプラグインが使えなくなる場合
metadata.txtをメモ帳で編集して保存すると、そのプラグインが使えなくなってしまうことがあります。BOM付きUTF8で保存してしまっていることが原因なので、BOM無しで保存すればプラグインが使えるようになります。
2020/05/11追記
よく使う雛形
ダイアログ無し
from qgis.PyQt.QtCore import QSettings from qgis.PyQt.QtCore import QSettings from qgis.PyQt.QtGui import QIcon from qgis.PyQt.QtWidgets import QAction # Initialize Qt resources from file resources.py from .resources import * import os.path import qgis from qgis.core import * from qgis.gui import * class NodialogSkelton(QgsMapTool): def start(self): maptool = self # 場合によって書き換えて self.canvas.setMapTool(maptool) self.canvas.mapToolSet.connect(self.unsetTool) # このサンプル実行中に他のアイコンを押した場合 def finish(self): self.canvas.mapToolSet.disconnect(self.unsetTool) def __init__(self, iface): self.plugin_name = 'ダイアログ無し雛形' # プラグイン名 self.menu_pos = '雛形' # プラグインの登録場所(このサンプルの場合、メニューの「プラグイン/雛形/ダイアログ無し雛形」) self.toolbar = True # Trueならツールバーにアイコンを表示する self.checkable = True # Trueならプラグイン実行中はアイコンが凹んだままになる self.iface = iface self.canvas = self.iface.mapCanvas() QgsMapTool.__init__(self, self.canvas) # このプラグイン実行中に他のアイコンが押された場合、アイコンを元の状態に戻す def unsetTool(self, tool): if not isinstance(tool, NodialogSkelton): self.finish() self.action.setChecked(False) def initGui(self): icon = QIcon(os.path.dirname(__file__)+'/icon.png') self.action = QAction(icon, self.plugin_name, self.iface.mainWindow()) self.action.triggered.connect(self.execSample) # アイコンを押下した時に実行されるメソッドを登録 self.action.setCheckable(self.checkable) # Trueだとアイコンを押下したら次に押下するまで凹んだままになる if self.toolbar: self.iface.addToolBarIcon(self.action) # ツールバーにこのツールのアイコンを表示する self.iface.addPluginToMenu(self.menu_pos, self.action) # このプラグインを無効にしたときに呼ばれる def unload(self): self.iface.removePluginMenu(self.menu_pos, self.action) self.iface.removeToolBarIcon(self.action) # このツールのアイコンを押下したときに呼ばれる def execSample(self): if self.checkable: if self.action.isChecked(): # 凹状態になった self.previousMapTool = self.canvas.mapTool() # 現在のマップツールを退避 self.start() else: # 凸状態になった self.finish() self.canvas.setMapTool(self.previousMapTool) # このツール実行前に戻す else: self.start()
ちょっとしたコードを書くときに使っている雛形です。Plugin Builderが出力するコードを参考にしました。別のページでこの雛形を使ったサンプルを作成しようと思います。インストール用zipはこちらに置いてあります。
最後までご覧頂き、ありがとうございました
QGIS3に付属のPython等を使えるようにするためのパス設定
このページでは、QGISに付属しているPythonやコマンドを使えるようにするための設定方法を紹介しています。コマンドが使えるようになると、ファイル形式の変換(例:shp→mif)や等高線作成等のちょっとした作業をバッチ処理できたり何かと便利なのでおすすめです。このページでは、QGIS3.6を使用しています。
環境変数Pathを設定する
PythonやGDALやOGR等のコマンドを使うために環境変数を設定します。環境変数の設定については、こちらのページがとても参考になりました。
【PowerShell】環境変数を設定する | ほそぼそプログラミング日記
PowerShellを起動する
PowerShellを起動します。検索窓?(下の赤丸部分)に『powershell』と入力すると、いくつか候補が出てくるので上の赤丸部分のPowerShellを選択します。
設定のためのコード
下記のコードをコピーします。
$oldSystemPath = [System.Environment]::GetEnvironmentVariable("Path", "User") $oldSystemPath += ";C:\Program Files\QGIS 3.6\apps\qgis\bin" $oldSystemPath += ";C:\Program Files\QGIS 3.6\apps\Python37" $oldSystemPath += ";C:\Program Files\QGIS 3.6\apps\Python37\Scripts" $oldSystemPath += ";C:\Program Files\QGIS 3.6\apps\Qt5\bin" $oldSystemPath += ";C:\Program Files\QGIS 3.6\bin" [System.Environment]::SetEnvironmentVariable("Path", $oldSystemPath, "User") [System.Environment]::SetEnvironmentVariable("QT_QPA_PLATFORM_PLUGIN_PATH", "C:\Program Files\QGIS 3.6\apps\qt5\plugins", "User")
PowerShellにコードを貼り付ける
コピーしたコードを張り付けて、PowerShellを一度閉じて下さい。
Windows10の場合
Windows 10の場合、赤丸部分のパスが一番上にあるとPowerShellやコマンドプロンプトでPythonと入力したときに、ストアが立ち上がってしまって実行できないので、一番下に移動しておいてください。
Pythonプログラミング
ソースコードを書てみる
ここまでの設定で、Pythonが使えるようになっているはずですので、簡単なプログラムを実行してみます。PowerShellを起動して、次のコマンドを入力してメモ帳を起動してください。
notepad test.py
メモ帳が起動したら、次のコードを張り付けて保存して下さい。
import numpy x = 10 y = 10 z = 10 w = 1 mat_heikoido = numpy.matrix([[1, 0, 0, 10], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) vec = numpy.matrix([[x], [y], [z], [w]]) print(mat_heikoido*vec)
プログラムを実行してみる
PowerShellに次のように入力して実行してみてください。上の画像のように出力されましたか?
python test.py
PyGTも使ってみる
PyQTのライブラリを使って、ウィンドウを表示できるかも試してみます。次のコマンドを入力してメモ帳を起動してください。
notepad qttest.py
次のコードをコピーして下さい。このコードは
PyQt5とpython3によるGUIプログラミング[1]のページで紹介されていたコードを使用させていただきました。コピーしたらメモ帳に貼り付けて保存して下さい。
import sys from PyQt5.QtWidgets import * def main(): app = QApplication(sys.argv) w = QWidget() w.resize(250, 150) w.setWindowTitle('Window01') w.show() sys.exit(app.exec_()) if __name__ == '__main__': main()
PyQTを使ったプログラムも実行してみる
④PowerShellで次のコマンドを入力して実行すると、ウィンドウが表示されるはずですが、表示されましたか?
python qttest.py
Plugin開発がしたい
QGISをインストールした環境でPythonプログラミングができるようになり、QGISのプラグイン開発に手を出したくなる方もいらっしゃるかと思いますが、そのためにはもう少し設定が必要です。下のページではプラグイン開発が容易になるプラグイン「Plugin Builder」の紹介をしています。
下のページでは、Visual Studioという開発環境を使って、プラグインのデバッグができるようにする方法を紹介していますので、興味がある方はご覧ください。
最後までご覧頂き、ありがとうございました