ホーム » QGIS (ページ 2)

QGIS」カテゴリーアーカイブ

pyrcc5を実行すると「指定されたモジュールが見つかりません」

QGISと同時にインストールされるpyrcc5.batを実行してもエラーが発生してコンパイルができない
[code]
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: 指定されたモジュールが見つかりません。
[/code]

‘pyrcc5’ is not recognized as an internal or external commandにずばり答えが記載されている

予め以下のBATを実行してから
[code]
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"
[/code]

pyrccコマンドを実行する
[code]
pyrcc5 -o resources.py resources.qrc
[/code]

QGISのシンボル用SVGをサイズ指定してQLIstViewに表示

QGISのシンボル用SVGはStroke,Fillの色や透明度を変更できるように独自の記述になっている。
[code]
<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>
[/code]
このSVGファイルをQSvgRendererを使って描画しても正しく描画できないためFillやStrokeを編集してから描画する。

[code]
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)
[/code]

QLIstViewにSVGをサイズ指定して表示

QtデザイナでQListViewをダイアログに配置

表示するSVGのサイズは縦横500pix

これを24pixのサイズでListViewに表示

[code]
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)
[/code]

DSMの値を読み込む

DSM、DEMは標高値を持ったラスタデータ。

DSMは植生等を含んだ標高値、DEMは地表の標高値。

それぞれのセル(画像データのピクセルのようなもの)の値に標高値を持っている。

標高値のみをもっている場合はバンド数=1であり、それ以外にも値を持っていればバンド数=2となる。

バンド数=レイヤ数のようなもの

以下の画像の赤で囲った箇所がセル

QGISで見るとバンド1の値を793という値が見える

この値をPythonで照会するには以下のコードで実行すればよい

[code]
rlayer = QgsRasterLayer("C:\\dsm.tif", "MYDSM")
rlayer.dataProvider().sample(QgsPointXY(-31952.63,-51051.98),1)
(830.0, True)
[/code]

Featureを削除したらエラー!

ShapeFileのFeatureを削除したらREPACKエラーが発生しました。
REPACKエラーはShapeファイルのサイズをコンパクトにする際に発生したようだ!

ちなみに以下が削除のコード

[code]
iface.activeLayer().startEditing()
iface.activeLayer().deleteSelectedFeatures()
iface.activeLayer().commitChanges()
[/code]

削除は以下でもOK

[code]
iface.activeLayer().deleteFeature(2)
[/code]

どうやらテストで使ったShapeファイルが壊れていたみたい!

シンボルについて

シンボルについて役立つサイト

Symbology of vector layers in QGIS Python Plugins

月の杜

シンボルじゃないけど

Cut polygon shapefile by line shapefile

SVGファイルをシンボルに使う

Pythonコンソールにて

[code]
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()
[/code]

QGIS Pythonプラグインで起動時に地図を表示

Pythonで作成したプラグインで起動時に地図を表示すると、
起動後「現在のプロジェクトを保存しますか」の問い合わせメッセージが表示される。

サンプルコードでは関数:initGuiの中でプロジェクトの投影を設定する。
プラグインはQGIS起動時にロードされるようにプラグインのチェックをONにする

[code]
def initGui(self):
途中省略
new_crs = QgsCoordinateReferenceSystem(‘EPSG:2451’)
QgsProject.instance().setCrs(new_crs)

[/code]

これで起動後に以下のメッセージが表示される

QGISのソースをチェックはしていないが、プラグインがQgsProjectを操作した後にQGISのappクラスでQgsProjectを操作しようとしてこのような動作になっていると思われる。

これを避けるためにはQGIS起動時に実行されるPythonスクリプトを用意してこのスクリプトで起動時に実行したいスクリプトを呼ぶと期待した動作となる。

ちなみに起動クリプトの内容は以下
[code]
from PyQt5.QtCore import QSettings
from PyQt5.QtWidgets import QDesktopWidget
from qgis.utils import iface
import qgis
qgis.utils.loadPlugin(‘プラグイン名’)
qgis.utils.startPlugin(‘プラグイン名’)
[/code]

QGIS3+Eclipse+PyDevでデバッグ

環境

OS Windows10 64bit
QGIS QGIS3.4.4(OSGEO4W 32bit)
Eclipse 2018-12 64bit
Java Oracle JRE 10
PyDev 7.1.0.201902031515

QGISをインストール

OSGEO4W版のインストーラーを起動しC:\OSGEO4Wにインストール

QGISを起動

Eclipse

以下よりEclipseをダウンロード

https://www.eclipse.org/downloads/download.php?file=/oomph/epp/2018-12/R/eclipse-inst-win64.exe

ダウンロードしたeclipse-inst-win64を実行

起動すると以下のメッセージ表示

Eclipseのサイトより「Oracle JRE 10」をダウンロード

https://download.eclipse.org/oomph/jre/index-handler.php?vm=1_1_7_0_64_0&pn=Eclipse%20Installer&pu=http://wiki.eclipse.org/Eclipse_Installer&pi=http://download.eclipse.org/oomph/jre/128×128.png

ダウンロードした「jre-10.0.2_windows-x64_bin」を実行

インストールボタンをクリック

再度「eclipse-inst-win64」を実行

eclipse インストーラーが起動されたら「eclipse IDE for java developers」を選択

証明書の確認

PyDev

Eclipseを起動してHelpメニューの「Install New Software」

「Work With」の「Add」ボタンをクリック

NameにPyDev、Locationに「http://pydev.org/updates」を指定しAddボタンをクリック

PyDevをチェックしてNEXTボタンをクリック

Detaileボタンを押してPydevのインストール先を確認してから「Install Anyway」を実行

PyDevの設定

Eclipseを起動して「Window」→「Preferences」を選択

左のTreeでPyDev-Interpreters-Python Interpreterを選択

QGISが使用するPython.exeを指定するためにQGISを起動してPYTHONHOMEの値を確認

「Browse for pythonpypy exe」ボタンを押してNAMEには任意の名称(ここではpython37)、値には先ほど調べたPython.exeのフルパスを指定。

Librariesは自動でいくつかの参照先が指定されるが手動で不足分を指定

先ほどインストール先を確認したPyDevも指定

Packagesには警告らしき表示があるが無視

Forced Builtinsのタブを表示して「New」ボタンを押してqgisとPyQt5をそれぞれ登録

Environmentoタブを表示して以下の環境変数を設定

「Apply」ボタンを押して「Apply and Close」ボタンを押して設定を反映

設定内容が即反映されないので「Apply」ボタンを押したら暫く待つこと。

※設定が終了する前に画面を閉じると正しく設定が終了しない

デバッグの準備

外部TOOLにQGISを設定

メニュ「Run」-「External Tools Configurations」を指定して外部TOOLとしてQGISを設定

プロジェクトを作成

Eclipseの「New」メニューから-「Project」-「PyDev Project」を選択

以下に従ってプロジェクトの内容を設定しFinishボタンを押す

確認のためにQGISのPlugin Builder3でプラグインを作成して「C:\Users\ユーザー名\AppData\Roaming\QGIS\QGIS3\profiles\default\python\plugins\」に配置

init.pyに以下を記述

[code]
import os,sys
sys.path.append("C:\\Users\\kernel\\.p2\\pool\\plugins\\org.python.pydev.core_7.1.0.201902031515\\pysrc")
import pydevd
pydevd.settrace()
[/code]

sys.pathに追加しているのはPyDev

この記述はEclipseを使用しないときはエラーとなる

これを記述するとclassFactory関数でブレークする

デバッグ実行

ここからの操作は若干確信がないが、とりあえず正しく動作したので良しとして説明

プラグイン「Remote Debug」と「Plugin Reloader」を有効にするためにプラグインの設定で実験的プラグインも表示する

デバッグボタンを押す

「start pydev Server」ボタンをクリック

「外部TOOL QGISを起動」

QgsVectorLayerのQgsCoordinateReferenceSystemを設定

投影情報を持っていないShapeファイルを読み込んで「QgsVectorLayer」を作成した後に投影情報を設定する

訂正

[code]
layer = QgsVectorLayer(Shapeファイルのフルパス, レイヤ名, "ogr")
crs = QgsCoordinateReferenceSystem.fromEpsgId(2451)
layer.setCrs(crs)
× crs = layer.crs()
× crs.createFromString(‘EPSG:2451’)
[/code]