いつも頼りになるQGISが動かなくなった。未解決だが,後々何かに役に立つかもしれないのでドキュメントにしておく。ここじゃあなくてQGISの開発元に問い合わせろという話だけれども面倒で……
何をしていたか
例のプラグイン(https://gitlab.com/jtagusari/hrisk-noisemodelling)の開発。延べダウンロード数が2000を超え,界隈でわずかに注目を集めている模様。
このプラグインの中にはいくつかアルゴリズムを実装しているのだけれども,それらをまとめて実行するアルゴリズムを動かしていたときに事件は起こった。
何が起こったか
座標系の変換が出来なくなった。
正確にいえば,座標系の名称は変わるのに,その中身が変わらないという現象が起こった。
具体的に,以下のfence_extent
をEPSG:32654
のポリゴンに変えたいという需要があった。
>> fence_extent
'15760145.941800000,15760790.769700000,5329154.958400000,5329538.435600000 [EPSG:3857]'
これをこうして,こうじゃ。
from qgis.core import QgsApplication, QgsCoordinateReferenceSystem, QgsCoordinateTransform, QgsProject, QgsPointXY
from qgis import processing
fence_layer = processing.run(
"native:extenttolayer",
{
"INPUT": fence_extent,
"OUTPUT": "TEMPORARY_OUTPUT"
},
)["OUTPUT"]
fence_transformed = processing.run(
"native:reprojectlayer",
{
"INPUT": fence_layer,
"TARGET_CRS": "EPSG:32654",
"OUTPUT": "TEMPORARY_OUTPUT"
},
)["OUTPUT"]
で,これ
>> fence_transformed.getFeature(1).geometry().asWkt()
'Polygon ((15760145.94180000014603138 5329154.95839999988675117, 15760790.76970000006258488 5329154.95839999988675117, 15760790.76970000006258488 5329538.43560000043362379, 15760145.94180000014603138 5329538.43560000043362379, 15760145.94180000014603138 5329154.95839999988675117))'
座標がびくともしていない!
ChatGPTに聞いてみた
藁にもすがる思い。QgsCoordinateTransform
の動作を確認せよ,との指示。
source_crs = QgsCoordinateReferenceSystem("EPSG:3857")
destination_crs = QgsCoordinateReferenceSystem("EPSG:32654")
transform = QgsCoordinateTransform(source_crs, destination_crs, QgsProject.instance())
extent_coords = [
(15760145.941800000, 5329154.958400000),
(15760790.769700000, 5329154.958400000),
(15760790.769700000, 5329538.435600000),
(15760145.941800000, 5329538.435600000)
]
transformed_coords = [transform.transform(QgsPointXY(x, y)) for x, y in extent_coords]
で,これ
>> for point in transformed_coords:
print(f"Manually Transformed Point: {point.x()}, {point.y()}")
Manually Transformed Point: 15760145.9418, 5329154.9584
Manually Transformed Point: 15760790.7697, 5329154.9584
Manually Transformed Point: 15760790.7697, 5329538.4356
Manually Transformed Point: 15760145.9418, 5329538.4356
Manuallyにも出来てない!
これはおおもとからダメなようです。
原因と対策
原因不明。ただ,たくさんのアルゴリズムをqgis.processing
で動かしているようなときに起こる。(並列ではなくて直列。)
一度この状態になってしまうと,QGISを再起動しないと座標系の変換が復活しない。
開発中のアルゴリズムについては,とりあえずなくても大丈夫なものなので,横に避けておくことにする。
対策
再現性のあるエラーが確保できたので原因らしきものがわかった。
どうやら,プロジェクトのCRS・レイヤーのCRS・変換元のCRS・変換先のCRS,などが異なるとうまく動かないらしい。特に,変換元/先のCRSをプロジェクトのCRSに合わせないといけないようだ。
プロジェクトのCRSはQgsProject.instance().crs()
で取得できる。変換元からこのCRSに変換して,それから変換先のCRSに変換してやればよい。