271 Views
September 20, 24
スライド概要
FOSS4G 山陰Meetup 2024 もくもく会で @picaosgeoさんが行われた、QGIS Processing でのGRASSのエラーの調査に付いての報告。
OSGeo.JPの中の人
QGIS processing の GRASS/SAGA バッチ 処理時の unicode エラーについての調査 FOSS4G ⼭陰 Meetup 2024 @picaosgeo QGIS の processing ツ ー ル に お い て 、 GRASS/SAGA の フ ァ ン ク シ ョ ン を バ ッ チ 処 理 す る 際 に UnicodeDecodeError が発⽣するケースが存在することについて、原因と対応状況をまとめました。 【現象報告と経過】 2022 年 11 ⽉ 14 ⽇⽉曜⽇ 16:15:11 UTC+9 GuLaNak 22: いつもお世話になっております。 私は GRASS 機能の v.set.distance 機能を⽤いて、点から避難施設位置への最短経路探索を⾏い、 避難者の割り当てを⾏いたいのですが、エラーで UnicodeDecodeError: 'cp932' codec can't decode byte 0x84 in position 35: illegal multibyte sequence と出てしまい、これは⽂字コードの違いによるエラーとはわかるの ですが、これは⽤いているレイヤのデータの⽂字コードを shift-JIS にしなければいけないという認識でよろ しいでしょうか? それともパスに全⾓⽂字が含まれてはいけないという認識でしょうか? 私はユーザーフォルダ名に全⾓⽂字とスペースが使われておりますが、違うアカウントでユーザー名に半⾓ しか⽤いていないアカウントでも同様のエラーが発⽣してしまいます。 もしなにか解決策があればお願いします。 これ以外に必要な情報があればお願いします。 初めての質問で、ご迷惑をおかけします QGIS のバージョン:3.22.10 OS:Windows 10 2022 年 11 ⽉ 14 ⽇⽉曜⽇ 17:01:06 UTC+9 GuLaNak 22: エラーメッセージ Traceback (most recent call last): File "C:\PROGRA~1/QGIS32~1.10/apps/qgis-ltr/./python/plugins\grassprovider\Grass7Algorithm.py", line 433, in
processAlgorithm Grass7Utils.executeGrass(self.commands, feedback, self.outputCommands) File "C:\PROGRA~1/QGIS32~1.10/apps/qgis-ltr/./python/plugins\grassprovider\Grass7Utils.py", line 397, in executeGrass for line in iter(proc.stdout.readline, ''):UnicodeDecodeError: 'cp932' codec can't decode byte 0x84 in position 35: illegal multibyte sequence Execution failed after 0.62 秒(seconds) 出⼒レイヤの読み込み 次のレイヤは正しく⽣成されませんでした。 C:/Users/○○○○/AppData/Local/Temp/processing_odreTI/38bad66d5c174a9295bf22b9d4ad8c6a/output. gpkg QGIS メインウィンドウの"ログメッセージパネル"をチェックすると、アルゴリズムの実⾏に関する詳 細情報が表⽰されます。 2022 年 11 ⽉ 14 ⽇⽉曜⽇ 17:01:06 UTC+9 GuLaNak 22: 嘉⼭と申します (ご本⼈には重複返信してしまったかもしれません) このエラーは以前も報告されていて GRASS のコマンドを QGIS の Python の⼦プロセスとして 動かしてみて、その時の出⼒結果⽂字列を Python プログラム内で取り込んで解釈しようとしたら デコードできなかったという話だったと思います。 データやら実⾏環境やらをいろいろ変えてもうまくいかなかったです。 エラーの修正はむつかしそうなので 単体の GRASS で同じデータに対して処理を⾏ったらうまくいったと いう話が以前はありました。去年の今頃の話題になってました。 Windows での問題で Mac や Linux ではうまくいくみたいな話だったかな ワールドワイド⾔語サポートで Unicode UTF-8 を使⽤という設定にすると警告: マップセットの平⾏ロック はウィンドウズではサポートされていません。が出るという感じだったかな。 早い解決策はコマンドラインの GRASS で処理してみるのがいいみたいです。 mooya 2022/11/15 12:09:32 To: QGIS 初⼼者質問グループ こんにちは 3.16 の exe 版をインストールして、with Grass のショートカットで起動すると使えると思います。この場 合も多バイト⽂字は使えません。 https://download.qgis.org/downloads/QGIS-OSGeo4W-3.16.16-1-Setup-x86_64.exe 本家にも issue が上がっますが、なかなか、 、
https://github.com/qgis/QGIS/issues/29712 Missing CP949 (Korean) encoding at GRASS processing #29712 https://github.com/qgis/QGIS/issues/29712 v.clean UnicodeDecodeError when special character (German Umlaute) in path #29845 https://github.com/qgis/QGIS/issues/29845 【バグフィックス】 本件に関して、MIERUNE の Kanahiro Iguchi さんがパッチを提供して、Sep 26, 2022 でマージされていま す。 Fix GRASS7/SAGA UnicodeDecodeError in QGIS of Windows-Japanese or others #49226 https://github.com/qgis/QGIS/pull/49226 https://github.com/qgis/QGIS/pull/49226/commits/3908efb4ba1db51394c17dcebc14eab98067a781 python/plugins/grassprovider/Grass7Utils.py ex) C:\Program Files\QGIS 3.34.10\apps\qgis-ltr\python\plugins\grassprovider\Grass7Utils.py 原因:GRASS の stdout の⽂字列リードに失敗した場合、エラーとして''(空⽂字)を返していた。 変更:UnicodeDecodeError の場合に''(空⽂字)を返す様にした。 上記のファイルの python コードを確認して、 def readline_with_recover(stdout): """A method wrapping stdout.readline() with try-except recovering. detailed in https://github.com/qgis/QGIS/pull/49226 Args: stdout: io.TextIOWrapper - proc.stdout Returns: str: read line or replaced text when recovered """ try: return stdout.readline() except UnicodeDecodeError: return '' # replaced-text この様になっていれば、発⽣しないということになっています。 対応/⾮対応のチェック結果は下記の通りです。 QGIS3.1.x〜QGIS3.21.x:パッチ⾮対応(未チェック) QGIS3.22.0:パッチ⾮対応
QGIS3.24.3:パッチ⾮対応 QGIS3.28.0:パッチ対応済 QGIS3.28.1:パッチ対応済 QGIS3.34.1:パッチ対応済 旧バージョンで発⽣する場合、Grass7Utils.py の該当箇所を同じ様に修正すると良いと思われます。 なお SAGA についても同様のパッチがマージされています。 【その他の確認事項】 QGIS から GRASS processing サービスの起動については下図のバッチ処理を経由しています。 ・apps\grass\grass84\etc\env.bat(13)で、GRASS_PYTHON 環境変数を作成する ・bin\grass84.bat(18)で、%GRASS_PYTHON% %GISBASE%\etc\grass84.py %* を ⼦プロセス起動する ・bipython-grass84.bat(16)で、%GRASS_PYTHON% %* を ⼦プロセス起動する 上記のバッチ処理部分では、⼦プロセス起動の場合の UTF8 コードページ 65001 を固定しておらず、英語環 境以外では、起動時の状況で 932 からデフォルトのコードページ 437 に変化する可能性があります。 コードページ 65001 の状態では、ANSI 出⼒に UTF8 のテキストが流れてくることを前提にしていて、ANSI 出⼒でテキスト出⼒したりするときに⽂字コードの変換は⾏いませんので、既存の Shift_JIS のテキストを ANSI 出⼒するようなコマンドを実⾏すると標準出⼒が⽂字化けします。 フォントの環境変数の問題 apps\grass\grass84\etc\env.bat(16)で、FONTCONFIG=%GISBASE%\etc\fonts.conf 環境変数が設定され るが windows 版インストーラ版では fonts.conf ファイルがない。 qt および GRASS-GIS/SAGA で画⾯上のフォント表⽰が異常になる場合、fonts.conf を参照しようとして失敗 したあとの処理に問題があると考えられます。 processing についてはコミット:3908efb4ba1db51394c17dcebc14eab98067a781 で回避されるはずです。 -以上-