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('プラグイン名')
カテゴリー: QGIS