Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
FOSS4G 山陰Meetup 2024/ QGIS Processing でのGRASSのエ...
Search
OSGeo.JP
September 20, 2024
0
7
FOSS4G 山陰Meetup 2024/ QGIS Processing でのGRASSのエラーの調査
FOSS4G 山陰Meetup 2024 もくもく会で @picaosgeoさんが行われた、QGIS Processing でのGRASSのエラーの調査に付いての報告。
OSGeo.JP
September 20, 2024
Tweet
Share
More Decks by OSGeo.JP
See All by OSGeo.JP
Advancing the 3D Geospatial Ecosystem in Japan via Global Collaborations
osgeojp
0
830
農業用ダム監視を目的とした衛星SAR 干渉解析の適用性について
osgeojp
0
840
FOSS4G 2023 Japan@FUKUI 佐橋 功一様、 新垣 仁様 発表資料
osgeojp
0
210
FOSS4G 2023 Japan@FUKUI 白土 洋介様 発表資料
osgeojp
0
610
FOSS4G 2023 Japan@FUKUI 熊谷康太様発表資料
osgeojp
0
170
FOSS4G 2023 Japan@FUKUI 小林裕之様発表資料
osgeojp
0
570
吉中輝彦様 QGISで扱うラスタレイヤ (FOSS4G 2022 Japan Online)
osgeojp
0
53
原田 豊様 Windows版『聞き書きマップ』のQGISプラグイン化
osgeojp
0
340
吉中輝彦様 QGISと点群とPLATEAUと
osgeojp
0
1.8k
Featured
See All Featured
The World Runs on Bad Software
bkeepers
PRO
67
11k
Build The Right Thing And Hit Your Dates
maggiecrowley
34
2.6k
Statistics for Hackers
jakevdp
798
220k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
12k
GraphQLとの向き合い方2022年版
quramy
45
14k
Designing for humans not robots
tammielis
250
25k
4 Signs Your Business is Dying
shpigford
183
22k
How STYLIGHT went responsive
nonsquared
99
5.4k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
7.1k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.5k
[RailsConf 2023] Rails as a piece of cake
palkan
53
5.4k
StorybookのUI Testing Handbookを読んだ
zakiyama
28
5.6k
Transcript
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 コードを確認して、 この様になっていれば、発⽣しないということになっています。 対応/⾮対応のチェック結果は下記の通りです。 QGIS3.1.x〜QGIS3.21.x:パッチ⾮対応(未チェック) QGIS3.22.0:パッチ⾮対応 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.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 で回避されるはずです。 -以上-