0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

QgsCoordinateTransformが動くのをやめた話

Last updated at Posted at 2024-06-27

いつも頼りになるQGISが動かなくなった。未解決だが,後々何かに役に立つかもしれないのでドキュメントにしておく。ここじゃあなくてQGISの開発元に問い合わせろという話だけれども面倒で……

何をしていたか

例のプラグイン(https://gitlab.com/jtagusari/hrisk-noisemodelling)の開発。延べダウンロード数が2000を超え,界隈でわずかに注目を集めている模様。

このプラグインの中にはいくつかアルゴリズムを実装しているのだけれども,それらをまとめて実行するアルゴリズムを動かしていたときに事件は起こった。

何が起こったか

座標系の変換が出来なくなった。
正確にいえば,座標系の名称は変わるのに,その中身が変わらないという現象が起こった。

具体的に,以下のfence_extentEPSG: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に変換してやればよい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?