「重なり分析」の作業効率化

1,517 views
Skip to first unread message

KTR

unread,
Feb 3, 2022, 12:51:52 AM2/3/22
to QGIS初心者質問グループ
この度はお世話になります。
初めて投稿させていただきます。

現在QGISを用いて行っている作業で躓いております。
作業のフローとしては以下のとおりです。

 1)ある地域の植生データ(自然環境保全基礎調査)から植生Aを抽出。

 2)1)の範囲をカバーする標準地域250mメッシュを作成(地物数=約90000)。

 3)2)のメッシュの重心から半径500mバッファを作成。

 4)「重なり分析」により、3)の各ポリゴン内に含まれる1)の面積値を取得。

 5)属性結合により3)の面積値を2)に結合。

単純な作業かと思うのですが、メッシュのポリゴン数が多いため処理が進まず、やむを得ずメッシュを各5000程度になるように分割してトライしてみたのですが、それでも1時間で数%しか進まず、、、このままでは何日かかるのだろうという状況です。
取得したい面積値は植生Aだけではなく、植生Bや植生の周長などいろいろあるため、どうにか効率化・高速化させたいと考えております。
何か効率的な方法、そもそも間違えている部分などありましたら、ご教示いただけませんでしょうか。
よろしくお願いいたします。
なお、PCのスペックとしては、Core i5-9500、メモリ32GBです。

wata909

unread,
Feb 4, 2022, 8:22:53 AM2/4/22
to QGIS初心者質問グループ

KTRさま、こんばんは

全体の処理のどこで時間がかかるのかによって、改善の仕方が異なるかなと思います。
おそらく、

>4)「重なり分析」により、3)の各ポリゴン内に含まれる1)の面積値を取得。

の部分の重なり分析に一番時間がかかるのでは・・・と思います。
考えられる対策としては、以下のようなことでしょうか。

1.ShapeFileを使っているのであれば、FlatGeobuf等の空間インデックスのあるファイル形式に変える
  FlatGeobufについては、以下の資料が参考になります
2.重なり分析でなく、交差(intersect)で処理をしてから、面積等を算出する
3.植生図のジオメトリを簡素化する
4.場所による選択コマンドを実行し、選択した地物のみで 重なり分析を行う
5.最後の手段で、PostGISを使う・・・。

ただ、PostGISを使う以外の手段についてちょっと試してみましたが、すごく急激に処理速度が速くなる、という感じではありませんでした。
たとえば、交差(intersect)でshapefileだと10分ぐらいかかっていた処理が、FlatGeobufだと8分ぐらいでした。
劇的な高速化は、難しいかもしれません・・・・
あまり役に立たなくて、すみません。

以下、参考ページです。



2022年2月3日木曜日 14:51:52 UTC+9 KTR:

mooya

unread,
Feb 4, 2022, 8:42:45 AM2/4/22
to QGIS初心者質問グループ
KTRさま、wata909さま
こんばんは

 試していないので、あまりいい加減な事を言ってもいけないなと思いつつですが、
 多分、ベクタとベクタのジオメトリの計算が重たいと思うので、
 植生データをラスタにして、ゾーン統計(ラスタ)のプロセッシングをつかうと、速くなるのではないかと思います。



2022年2月4日金曜日 22:22:53 UTC+9 wata909:

mooya

unread,
Feb 4, 2022, 8:44:16 AM2/4/22
to QGIS初心者質問グループ
訂正です
ゾーン統計(ベクタ)です

2022年2月4日金曜日 22:42:45 UTC+9 mooya:

wata909

unread,
Feb 5, 2022, 12:52:07 AM2/5/22
to QGIS初心者質問グループ
なるほど,確かにラスタにすれば早いですね!

GRASSになっちゃいますが,両方ラスタにする手もありますね。
 r.bufferでラスタのバッファを作り,r.statsで計算する手もありますね!

2022年2月4日金曜日 22:44:16 UTC+9 mooya:

KTR

unread,
Feb 6, 2022, 7:18:49 PM2/6/22
to QGIS初心者質問グループ
wata909さま、mooyaさま

ご回答ありがとうございました。

実は、ある程度自己解決した部分があったのですが、ご報告が遅くなってしまいました。
最初に書いた作業のうち、入力レイヤとする3)のポリゴンについては小区域に分割していたのですが、
オーバーレイレイヤとする植生のポリゴンについては全域のままにしていました。
これがまずかったようで、植生ポリゴンも同じ小区域に分けてやると、かなり早く処理が進むようになりました。
ちょっと手間はかかりますが、現実的な作業時間で進められそうです。
ただ不思議なのが…私がどういう計算処理をしているのか理解できていないだけなのですが…
1小区域の処理時間が1時間だったとして、じゃあ5小区域分をまとめて5時間でいけるかと試してみると、
どうもそれ以上に劇的に遅くなってしまうようです。

御二方からいただいた複数の案、どれも参考になりました。
特にファイル形式については Shapeから抜け出せていないので、これを機に勉強したいと思います。
あとラスタ形式に変換するという発想もありませんでした。
これはうまくいけそうなら試してみたいと思います。

2022年2月5日土曜日 14:52:07 UTC+9 wata909:

wata909

unread,
Feb 8, 2022, 7:26:09 AM2/8/22
to QGIS初心者質問グループ
解決のめどがったようで、なによりです。

>1小区域の処理時間が1時間だったとして、じゃあ5小区域分をまとめて5時間でいけるかと試してみると、

ここについては、空間インデックスが作られてない場合では
入力:小区画1つ、植生図:小区画1
だと、一つの小区画しか重なり合い判定をしないと思います。これが、

入力:小区画1つ、植生図:小区画5
だと、小区画5つ分の重なり合い判定をするのではないかと。なので、

入力:小区画5、植生図:小区画5
だと、単純計算では5×5の25倍時間がかかるのかも、と思いました。

空間インデックスを作成すると、最初に重なっている部分の判定をするので、早くなるかと思います。
(確認はしていませんが、たぶん)(もし空間index作成済みでしたら、申し訳ない)

以下の記事等が参考になるかと思います。
http://geo-sol.co.jp/tech/it/qix%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E8%A6%8B%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86/

というわけで、空間indexをデフフォルトで作ってくれるファイル形式であるFlatGeobufをお勧めしている今日この頃です(笑

2022年2月7日月曜日 9:18:49 UTC+9 KTR:
Reply all
Reply to author
Forward
0 new messages