paddingでやるみたい
pyrcc5を実行すると「指定されたモジュールが見つかりません」
QGISと同時にインストールされるpyrcc5.batを実行してもエラーが発生してコンパイルができない
C:\OSGeo4W\bin>C:\OSGeo4W\apps\Python37\Scripts\pyrcc5.bat Traceback (most recent call last): File "C:\OSGeo4W\apps\Python37\lib\runpy.py", line 193, in _run_module_as_main "__main__", mod_spec) File "C:\OSGeo4W\apps\Python37\lib\runpy.py", line 85, in _run_code exec(code, run_globals) File "C:\OSGeo4W\apps\Python37\lib\site-packages\PyQt5\pyrcc_main.py", line 21, in <module> from PyQt5.QtCore import PYQT_VERSION_STR, QDir, QFile ImportError: DLL load failed: 指定されたモジュールが見つかりません。
‘pyrcc5’ is not recognized as an internal or external commandにずばり答えが記載されている
予め以下のBATを実行してから
call "C:\Program Files\QGIS 3.0\bin\o4w_env.bat" call "C:\Program Files\QGIS 3.0\bin\qt5_env.bat" call "C:\Program Files\QGIS 3.0\bin\py3_env.bat"
pyrccコマンドを実行する
pyrcc5 -o resources.py resources.qrc
QGISのシンボル用SVGをサイズ指定してQLIstViewに表示
QGISのシンボル用SVGはStroke,Fillの色や透明度を変更できるように独自の記述になっている。
<path d="M 293.39062 35.525391 A 256 256 0 0 0 37.390625 291.52539 A 256 256 0 0 0 293.39062 " fill="param(fill)" fill-opacity="param(fill-opacity)" stroke="param(outline)" stroke-opacity="param(outline-opacity)" stroke-width="param(outline-width)" id="path6220" /> </svg>
このSVGファイルをQSvgRendererを使って描画しても正しく描画できないためFillやStrokeを編集してから描画する。
self.model = QStandardItemModel(self) fp = open('c:\\3Dkaoku\\svg\\circle.svg', 'r') datas = fp.read() fp.close() datas = datas.replace('param(fill)', '#000000') datas = datas.replace('param(fill-opacity)', '1') datas = datas.replace('param(outline)', 'none') datas = datas.replace('param(outline-opacity)', '0') datas = datas.replace('param(outline-width)', '0') bytearray = datas.encode(encoding='utf-8') bArray = QByteArray(bytearray) img = QImage(24, 24, QImage.Format_ARGB32) img.fill(Qt.white) painter = QPainter(img) renderer = QtSvg.QSvgRenderer(bArray) renderer.render(painter) pix = QPixmap.fromImage(img) icon = QIcon(pix) item = QStandardItem(icon, 'hello') self.model.appendRow(item) self.listView.setIconSize(QSize(200,200)) self.listView.setUniformItemSizes(True) self.listView.setModel(self.model)
QLIstViewにSVGをサイズ指定して表示
QtデザイナでQListViewをダイアログに配置
表示するSVGのサイズは縦横500pix
これを24pixのサイズでListViewに表示
self.model = QStandardItemModel(self) img = QImage(24, 24, QImage.Format_ARGB32) img.fill(Qt.white) painter = QPainter(img) renderer = QtSvg.QSvgRenderer('c:\\3Dkaoku\\svg\\circle2.svg') renderer.render(painter)
DSMの値を読み込む
DSM、DEMは標高値を持ったラスタデータ。
DSMは植生等を含んだ標高値、DEMは地表の標高値。
それぞれのセル(画像データのピクセルのようなもの)の値に標高値を持っている。
標高値のみをもっている場合はバンド数=1であり、それ以外にも値を持っていればバンド数=2となる。
バンド数=レイヤ数のようなもの
以下の画像の赤で囲った箇所がセル
QGISで見るとバンド1の値を793という値が見える
この値をPythonで照会するには以下のコードで実行すればよい
rlayer = QgsRasterLayer("C:\\dsm.tif", "MYDSM") rlayer.dataProvider().sample(QgsPointXY(-31952.63,-51051.98),1) (830.0, True)
Featureを削除したらエラー!
ShapeFileのFeatureを削除したらREPACKエラーが発生しました。
REPACKエラーはShapeファイルのサイズをコンパクトにする際に発生したようだ!
ちなみに以下が削除のコード
iface.activeLayer().startEditing() iface.activeLayer().deleteSelectedFeatures() iface.activeLayer().commitChanges()
削除は以下でもOK
iface.activeLayer().deleteFeature(2)
どうやらテストで使ったShapeファイルが壊れていたみたい!
シンボルについて
SVGファイルをシンボルに使う
Pythonコンソールにて
dict = {} dict['fill'] = '#FFFF00' dict['name'] = 'c:\\work\\abc.svg' dict['size'] = '10' sl = QgsSvgMarkerSymbolLayer.create(dict) sym = QgsSymbol.defaultSymbol(QgsWkbTypes.PointGeometry) sym.changeSymbolLayer(0, sl) renderer = QgsSingleSymbolRenderer(sym) iface.activeLayer().setRenderer(renderer) iface.activeLayer().triggerRepaint()
QGIS Pythonプラグインで起動時に地図を表示
Pythonで作成したプラグインで起動時に地図を表示すると、
起動後「現在のプロジェクトを保存しますか」の問い合わせメッセージが表示される。
サンプルコードでは関数:initGuiの中でプロジェクトの投影を設定する。
プラグインはQGIS起動時にロードされるようにプラグインのチェックをONにする
def initGui(self): 途中省略 new_crs = QgsCoordinateReferenceSystem('EPSG:2451') QgsProject.instance().setCrs(new_crs)
これで起動後に以下のメッセージが表示される
QGISのソースをチェックはしていないが、プラグインがQgsProjectを操作した後にQGISのappクラスでQgsProjectを操作しようとしてこのような動作になっていると思われる。
これを避けるためにはQGIS起動時に実行されるPythonスクリプトを用意してこのスクリプトで起動時に実行したいスクリプトを呼ぶと期待した動作となる。
ちなみに起動クリプトの内容は以下
from PyQt5.QtCore import QSettings from PyQt5.QtWidgets import QDesktopWidget from qgis.utils import iface import qgis qgis.utils.loadPlugin('プラグイン名') qgis.utils.startPlugin('プラグイン名')