内挿(ヒートマップ)Pythonコードを教えてください。

348 views
Skip to first unread message

T H

unread,
Jul 4, 2023, 9:58:21 PM7/4/23
to QGIS初心者質問グループ
初心者です。失礼いたします。

QGISのバージョンは3.26 windows11になります。

私は、QGISのPythonを利用して、自動でヒートマップ作成までを行いたいと考えております。

今現状、デスクトップにあるcsvファイルをcsvレイヤーで追加しX軸とY軸は指定しpointとして、データをマッピングとそのマッピングしたデータの持っている特定の列を色を付けた状態が今お見せしている図になります。→ここまではコード実行でできました。スクリーンショット 2023-07-05 102152.png

この後、プロセシングツール>内挿>TIN内挿で、追加したcsvレイヤーを選択し、レイヤーから範囲を計算させて、内挿(ヒートマップ)を作成したいのですが、この部分のコードがうまく読み込んでくれません。
なってほしい姿としては以下になります。
スクリーンショット (38).png
コードは、以下のコードを利用していております。
import processing
from qgis.core import QgsVectorLayer, QgsProject, QgsMarkerSymbol, QgsRendererCategory
from qgis.utils import iface

# csvファイルのパス
file_path = r'C:\QGIS\rssi.csv'

# csvファイルの定義
uri = 'file:///' + file_path + '?delimiter=,&xField=log&yField=lat'

# 読み込み
csv_layer = QgsVectorLayer(uri, 'データ①', 'delimitedtext')

# レイヤに追加
QgsProject.instance().addMapLayer(csv_layer)

# レンダラーの作成
renderer = QgsCategorizedSymbolRenderer('rsrp')

# 値の範囲を設定
lower_value = -120.0
upper_value = -40.0

# カラーランプから色を取得
color_ramp = QgsStyle().defaultStyle().colorRamp('Turbo')

# カテゴリごとにシンボルと色を設定
for value in range(int(lower_value), int(upper_value) + 1):
    # シンボルの作成
    symbol = QgsMarkerSymbol.createSimple({'name': 'circle'})
    # 色を取得
    color = color_ramp.color((value - lower_value) / (upper_value - lower_value))
    # シンボルに色を設定
    symbol.setColor(color)
    # カテゴリを作成してレンダラーに追加
    category = QgsRendererCategory(float(value), symbol, str(value))
    renderer.addCategory(category)

# レイヤにレンダラーを設定
csv_layer.setRenderer(renderer)

# レンダラーを適用
csv_layer.triggerRepaint()

# TIN内挿のパラメータ設定
parameters = {
    'INTERPOLATION_DATA': csv_layer,
    'ATTRIBUTES': '',
    'EXTENT': QgsProcessingFeatureSourceDefinition(csv_layer.source()),
    'OUTPUT': 'memory:'  # 結果をメモリレイヤとして出力
}

# TIN内挿を実行
result = processing.run("native:tininterpolation", parameters)

# 結果のレイヤを取得
interpolated_layer = result['OUTPUT']

# 結果のレイヤをプロジェクトに追加
QgsProject.instance().addMapLayer(interpolated_layer)


エラーとしては、以下になります。
Traceback (most recent call last):
  File "C:\PROGRA~1\QGIS32~1.0\apps\Python39\lib\code.py", line 90, in runcode
    exec(code, self.locals)
  File "<input>", line 1, in <module>
  File "<string>", line 54, in <module>
  File "C:\PROGRA~1/QGIS32~1.0/apps/qgis/./python/plugins\processing\tools\general.py", line 108, in run
    return Processing.runAlgorithm(algOrName, parameters, onFinish, feedback, context)
  File "C:\PROGRA~1/QGIS32~1.0/apps/qgis/./python/plugins\processing\core\Processing.py", line 169, in runAlgorithm
    raise QgsProcessingException(msg)
_core.QgsProcessingException: エラー: アルゴリズム native:tininterpolation が見つかりません

yoichi...@gmail.com

unread,
Jul 4, 2023, 10:22:46 PM7/4/23
to QGIS初心者質問グループ
かやまと申します


>result = processing.run("native:tininterpolation", parameters)


result = processing.run("qgis:tininterpolation", parameters)

にしたらうまくいきませんか?


ここによると

アルゴリズムIDqgis:tininterpolation

とありますのでもしかするとIDがまちがっているのかもしれません。


2023年7月5日水曜日 10:58:21 UTC+9 gmmgm...@gmail.com:

T H

unread,
Jul 5, 2023, 3:21:02 AM7/5/23
to QGIS初心者質問グループ
かやま様
お世話になっております。

本田と申します。よろしくお願いいたします。
一応、result = processing.run("qgis:tininterpolation", parameters)に変更したところ、変更したコードからこのようなエラーが出てきました。

Traceback (most recent call last):
  File "C:\PROGRA~1\QGIS32~1.3\apps\Python39\lib\code.py", line 90, in runcode

    exec(code, self.locals)
  File "<input>", line 1, in <module>
  File "<string>", line 54, in <module>
  File "C:\PROGRA~1/QGIS32~1.3/apps/qgis/./python/plugins\processing\tools\general.py", line 108, in run

    return Processing.runAlgorithm(algOrName, parameters, onFinish, feedback, context)
  File "C:\PROGRA~1/QGIS32~1.3/apps/qgis/./python/plugins\processing\core\Processing.py", line 187, in runAlgorithm
    ret, results = execute(alg, parameters, context, feedback, catch_exceptions=False)
  File "C:\PROGRA~1/QGIS32~1.3/apps/qgis/./python/plugins\processing\gui\AlgorithmExecutor.py", line 72, in execute
    results, ok = alg.run(parameters, context, feedback, {}, False)
_core.QgsProcessingException: Traceback (most recent call last):
  File "C:\PROGRA~1/QGIS32~1.3/apps/qgis/./python/plugins\processing\algs\qgis\TinInterpolation.py", line 125, in processAlgorithm
    interpolationData = ParameterInterpolationData.parseValue(parameters[self.INTERPOLATION_DATA])
  File "C:\PROGRA~1/QGIS32~1.3/apps/qgis/./python/plugins\processing\algs\qgis\ui\InterpolationWidgets.py", line 74, in parseValue
    return ParameterInterpolationData.dataToString(value)
  File "C:\PROGRA~1/QGIS32~1.3/apps/qgis/./python/plugins\processing\algs\qgis\ui\InterpolationWidgets.py", line 79, in dataToString
    for c in data:
TypeError: 'QgsVectorLayer' object is not iterable


これは簡単に言うと、読み込みの反復ができないと読んだのですが、どういった原因が考えられますでしょうか?
2023年7月5日水曜日 11:22:46 UTC+9 yoichi...@gmail.com:

ありた

unread,
Jul 5, 2023, 8:35:45 AM7/5/23
to QGIS初心者質問グループ
こんにちは

プロセシングツールの Python 呼び出しは便利ですが、あくまでプロセシングツールの機能を
呼び出すもので、たとえば TIN 内挿なら、複数のデータソースを登録でき、どの属性を使うか
あるいは Z 座標を使うか。などを入力データとして受け取り、処理するツールになります。

そのためか、入力データは QgsVectorLayer 形式ではなく、データソースならびに属性情報などを
含んだ文字列情報、またはデータソース・属性・型などの情報を複数データという二次元配列状の
コレクション(リスト等)を想定した作りになっています。



エラーのトレースバック情報より該当箇所を確認してもらえばわかると思いますが、文字列でなければ
(二次元配列状データと期待して) for c in data という繰り返し処理をしています。

しかし、想定されていない QgsVectorLayer オブジェクトをパラメータとして渡したため、
このオブジェクトに対し、 for c in data を行おうとし、結果、イテレーティブルでないため
エラーが投げられたものとなります。

最近の QGIS では、プロセシングツールのツールウィンドウを開くと、左下の「詳細パラメータ」より
「Python コマンドとしてコピー」することができ、パラメータの取り方含め確認することが
できますので参考にしてみてください。

T H

unread,
Jul 24, 2023, 9:32:17 PM7/24/23
to QGIS初心者質問グループ
ありたさん

いつもお世話になっております。ご教授いただきありがとうございます。

プロセシングツールから詳細パラメーターで内挿までの Python コマンドとしてコピーをすることができました!
(processing.run("qgis:tininterpolation", {
'INTERPOLATION_DATA':'file:///C:\\QGIS\\rssi.csv?delimiter=,&xField=log&yField=lat::~::0::~::2::~::0',
'METHOD':0,
'EXTENT':'0.002000000,35.424000000,-52.699000000,7.694000000',
'PIXEL_SIZE':0.1,
'OUTPUT':'TEMPORARY_OUTPUT'})

しかしその前段階で使用しているコードを今回コピーしたコマンドを並べてもうまく、ヒートマップまでができません。
追加したレイヤーからTIN内挿までのコマンドをご教授ください。
全体のコードはこちらになります。

from qgis.core import QgsApplication, QgsProcessingFeedback
from qgis import processing


# csvファイルのパス
file_path = r'C:\QGIS\rssi.csv'

# csvファイルの定義
uri = 'file:///' + file_path + '?delimiter=,&xField=log&yField=lat'

# 読み込み
csv_layer = QgsVectorLayer(uri, 'rssi', 'delimitedtext')
processing.run("qgis:tininterpolation", {
'INTERPOLATION_DATA':'file:///C:\\QGIS\\rssi.csv?delimiter=,&xField=log&yField=lat::~::0::~::2::~::0',
'METHOD':0,
'EXTENT':'0.002000000,35.424000000,-52.699000000,7.694000000',
'PIXEL_SIZE':0.1,
'OUTPUT':'TEMPORARY_OUTPUT'})




2023年7月5日水曜日 21:35:45 UTC+9 ありた:

ありた

unread,
Jul 26, 2023, 10:05:39 AM7/26/23
to QGIS初心者質問グループ
こんにちは

うまく(ヒートマップまでが)できませんとありますが、エラーがでるのか、ラスタデータが出力されないのか、
出力されたラスタデータが意図通りでないのか。を記載するようにしてください。
エラーや警告メッセージが出ているのなら、そのメッセージを記載してください。(その前後も含め全文)

得られた結果が意図通りでない場合は、あなたが意図した内容は何で、それに対し
結果がどうであったため意図通りとは言えなかったのかを示してください。
意図通りの結果が得られなかった場合はコーディングに問題なくても、パラメータ等が
不適切であるケースや、属性値が適切な型で認識されていないケースも考えられます。



まず一旦 Python のことは忘れて、 QGIS 上の GUI 操作で正しく操作できるか確認します。

・レイヤの追加で CSV ファイルの読み込み
  - 位置を表す属性、属性の形式等を指定
・プロセシングツールの「TIN内挿」を立ち上げる
  - 先ほどのレイヤを選択、補間対象の属性の選択し、追加
  - 範囲、ラスタサイズなど、そのほかのパラメータなどを確認
  - 「詳細パラメータ」より「Python コマンドとしてコピー」しメモ帳などに貼り付け
・「TIN内挿」を実行し、意図通りの結果が得られるか確認



通常の操作を行い、意図通りの結果が得られたことを確認できたら、次に、

・QGIS の Python コンソールを開く
・そこに先ほど入手した processing.run からはじまる Python コマンドを張り付けて実行
・一時フォルダ内にファイルが保存され、そのファイルのパスが得られるはずです
  - そのフォルダを開き、ファイルが存在すること
  - QGIS に読み込み、意図通りの結果であることを確認

なお、見ていただくとわかるとおり、入力データは QGIS 上のレイヤではなくローカルのファイルなので、
現在読み込んでいるレイヤや、そのシンボル設定は無関係です。
また出力データを QGIS にレイヤとして読み込む処理は個別に行う必要があります。

以上を試してみてください。
Reply all
Reply to author
Forward
0 new messages