ruby-robotの夢

cygwin-ruby,qgisの達人を目指す奮闘記

QGIS ベクトルデータ統合 バッチ処理に挑戦(問題解消2019.10.23)

QGIS(3.6madeira)のベクトルデータ統合のバッチ処理に挑戦 2019/09/04

これを使おうと挑戦したが、結果は、失敗。

同じ失敗を繰り返さないため、メモを残す。

バッチ処理では、以下の情報を入力する。

①入力レイヤ

②入力CRS

③出力ファイル

 

①入力レイヤ

 A.読み込み済みレイヤと、B.外部ファイルの選択があり、複数選択可能

 B.について、shpのzip形式と、shpの場合

  ネットワークドライブでうまくいかなかったため、内部ドライブのファイル、

  漢字含みファイルと無しファイル

 等を試した。

②入力CRS

 WGS84 4326 で。

③出力ファイル

 A.qgkpファイルと、B.shpファイル の選択があり、それぞれ、新規であることを求められる。新規でない場合、上書きするよう。

 塗りつぶしの設定を求められる。(意味は不明)

試験結果

試したデータはエリアデータ。

網羅的に組み合わせを調べたわけではないが、①A、③A..の場合で、①で複数選択していても、末尾の1ファイル分のみ入力・出力が可能だった。

バッチ処理の保存をしようとすると、エラーが出る場合には、試行も失敗する。

今後の予定

バグが有るかもしれないので、アップデート後に調べる。

これに関するWEB情報等を調べる。(今のところ、有効なレポートはない)

バッチではなく、Pythonスクリプトを調べてみる。いくつか参考になりそうだが、まだ使い方はわからない。

補足レポート(2019.10.23) QGIS2.18での解消

QGISプラグインには、日本語名フォルダに対応していないものも多い。との記載があった。

上記の失敗時には、日本語名フォルダ・ファイルをもちいていたため、これを、ascii文字だけのファイルにしてみた、何も変化は生じなかった。(QGIS3.4)

 

最後に、QGIS2.18で、同様のことをやってみると、問題なく統合ができた。

shpには、CRS設定のprjファイルがなければプロジェクトCRSが使用される。

また、漢字のフォルダ、ファイルでも問題が無かった。

3.4と2.18ではプロジェクトファイル形式が異なり、使い分けは面倒であるが、

3.4での解消法が見つかるまでバッチ処理時には2.18を使うこととしよう。

バッチ処理jsonファイル作成

バッチ処理は、json形式ファイルに保存が可能である。

多数の処理を行う場合、バッチの設定も大変なので、このjsonファイルの作成をプログラムで作成することとしよう。

バッチ処理にあたっての留意点

バッチ処理で、zipファイルをそのまま使うことができるが、複数shpを含む場合、1個目のshpのみを処理する。W05では、NodePointとStream(Line)を含むが、Pointのみになる。各zipファイルの中身を把握し、解凍してshpをそのまま使う方がよさそうである。

ちなみに、W05を統合する際のプログラムは、下記のとおり。

ここで、kokudosフォルダには、W05-07_07_河川、W05-08_08_河川、W05-08_09_河川があり、そこに各県のダウンロードshpが入っている。

require "json"
kens=%w[ 07 08 09];kenp="0[789]";ken_=kens[-1]
pat="W05-"
nfo_json="W05.json"

Dir.chdir("kokudos");pwd=`cygpath -w $PWD`.chomp
typs=%w[RiverNode Stream]
fo_json=open(nfo_json,"w")
contents=
typs.each{|typ|
fs=Dir.glob("#{pat}*#{kenp}*/#{pat}??*#{typ}*.shp").sort
print "fs",fs
dir=File.dirname(fs[-1])
next if fs==

nfo=dir.sub(/_#{kenp}_/,"_ken_")+"_#{typ}.shp"
next if File.exists?(nfo)
print "nfo",nfo
layers='"'+fs.map{|f|
fw=f.sub(/\//,"\\")
"#{pwd}\\#{fw}"}*";"+'"'
contents.push({"OUTPUTS":{"OUTPUT":"#{pwd}\\#{nfo}"},
"PARAMETERS":{"LAYERS":layers}})
}

json=JSON.generate(contents)
print json
fo_json.print json
fo_json.close
print `ls -o #{nfo_json}`.chomp

__END__